% This is xesearch, produced by the CodeDoc class % with the `produce' option on. % % To create the documentation, compile xesearch.tex % without the `produce' option. % % SOURCE: xesearch.tex % DATE: 2019/04/24 % VERSION: v.0.2 \ifx\csname XeTeXrevision\endcsname\relax \errmessage{You need XeTeX to run xesearch. It won't be loaded.} \expandafter\endinput \else \expandafter\ifx\csname xs@ChangeCatcodes\endcsname\relax \else \expandafter\expandafter\expandafter\endinput \fi \fi \catcode`@=11 \def\xs@ChangeCatcodes{% \chardef\xs@questioncode=\catcode`\?% \chardef\xs@exclamationcode=\catcode`\!% \chardef\xs@commacode=\catcode`\,% \chardef\xs@starcode=\catcode`\*% \chardef\xs@semicoloncode=\catcode`\;% \catcode`\?12 \catcode`\!12 \catcode`\,12 \catcode`\*12 \catcode`\;12 } \def\xs@RestoreCatcodes{% \catcode`\?\xs@questioncode \catcode`\!\xs@exclamationcode \catcode`\,\xs@commacode \catcode`\*\xs@starcode \catcode`\;\xs@semicoloncode } \xs@ChangeCatcodes \ifdefined\ProvidesPackage \def\xs@err#1{\PackageError{xesearch}{#1}{}} \ProvidesPackage{xesearch}[2019/04/24 v.0.2 Searching documents.] \else \def\MessageBreak{^^J} \def\xs@err#1{% \bgroup \newlinechar`\^^J% \errorcontextlines=0 \errmessage{xsearch error: #1}% \egroup } \fi \ifcsname xs@contextmodule\endcsname \let\xs@unexpanded\normalunexpanded \else \let\xs@unexpanded\unexpanded \fi \def\xs@end{\xs@end} \def\xs@empty{} \def\xs@star{*} \def\xs@exclamation{!} \def\xs@question{?} \def\xs@starexclam{*!} \def\xs@exclamstar{!*} \def\xs@words{words} \def\xs@prefixes{prefixes} \def\xs@suffixes{suffixes} \def\xs@gobble#1{} \def\xs@Lowercase#1#2{\lowercase{\def#2{#1}}} \let\xs@relax\relax \newcount\xs@TempCount \newcount\xs@CaseSensitive \newcount\xs@TempLength \newcount\xs@Length \newbox\xs@Box \newif\ifxs@Concatenate \newif\ifxs@String \newif\ifxs@Affix \newif\ifxs@Prefix \newif\ifxs@Suffix \newif\ifxs@BadWord \newif\ifxs@Star \newif\ifxs@Phrase \newif\ifxs@Match \newtoks\xs@DefToks \newtoks\xs@NoReplaceToks \chardef\xs@NatDel=\e@alloc@intercharclass@top \chardef\xs@lrDel=\numexpr\e@alloc@intercharclass@top-1\relax \chardef\xs@Classes=\numexpr\e@alloc@intercharclass@top-2\relax \chardef\xs@Classless=0 \XeTeXinterchartoks\xs@lrDel\xs@Classless={\xs@LearnLetter} \XeTeXinterchartoks\xs@NatDel\xs@Classless={\xs@LearnLetter} \XeTeXinterchartoks\xs@NatDel\xs@lrDel{\xs@EndString} \xs@TempCount\xs@Classes \def\xs@Delimiters{} \def\xs@MakeDel#1{% \ifx#1\xs@end \let\xs@next\relax \else \let\xs@next\xs@MakeDel \unless\ifnum\the\XeTeXcharclass`#1=7 \unless\ifnum\the\XeTeXcharclass`#1=8 \XeTeXcharclass`#1=\xs@lrDel \expandafter\def\expandafter\xs@Delimiters\expandafter{\xs@Delimiters#1}% \fi \fi \fi\xs@next} \xs@MakeDel\{\}.,;:!?[()]-'`\xs@end \def\MakeBoundary#1{% \xs@MakeDel#1\xs@end } \def\UndoBoundary#1{% \xs@UndoBoundary#1\xs@end } \def\xs@UndoBoundary#1{% \def\xs@temp{#1}% \ifx\xs@temp\xs@end \let\xs@next\relax \else \ifnum\the\XeTeXcharclass`#1=\xs@lrDel \def\xs@RemoveFromDelimiters##1#1##2\xs@end{% \def\xs@Delimiters{##1##2}% }% \expandafter\xs@RemoveFromDelimiters\xs@Delimiters\xs@end \fi \XeTeXcharclass`#1=0 \let\xs@next\xs@UndoBoundary \fi\xs@next } \def\xs@Letters{}% \def\xs@CreateLetter#1{% \ifx#1\xs@end \let\xs@next\relax \else \expandafter\def\expandafter\xs@Letters\expandafter{\xs@Letters#1}% \XeTeXcharclass`#1=\xs@TempCount \expandafter\def\csname\the\xs@TempCount @xstring@letter\endcsname{#1}% \edef\xs@PolyglossiaPatch{% \xs@unexpanded{\XeTeXinterchartoks\xs@TempCount7}{% \xs@unexpanded{\xdef\xs@String{\xs@String#1}\xs@EndString}% \the\XeTeXinterchartoks0 7}% \xs@unexpanded{\XeTeXinterchartoks\xs@TempCount8}{% \xs@unexpanded{\xdef\xs@String{\xs@String#1}\xs@EndString}% \the\XeTeXinterchartoks0 8}% \xs@unexpanded{\XeTeXinterchartoks8\xs@TempCount}{% \the\XeTeXinterchartoks8 0 \xs@unexpanded{\xs@StartSring}}% }% \xs@PolyglossiaPatch \XeTeXinterchartoks\xs@TempCount\xs@Classless{% \xdef\xs@String{\xs@String#1}% \xs@LearnLetter}% \XeTeXinterchartoks\xs@lrDel\xs@TempCount{% \xs@StopTracing \xs@StartString }% \XeTeXinterchartoks\xs@NatDel\xs@TempCount{% \xs@StopTracing \xs@StartString }% \XeTeXinterchartoks\xs@TempCount\xs@lrDel{% \xdef\xs@String{\xs@String#1}\xs@EndString}% \XeTeXinterchartoks\xs@TempCount\xs@NatDel{% \xdef\xs@String{\xs@String#1}% \ifcsname\xs@String @xs@phrases@cs\endcsname \XeTeXinterchartokenstate0 \xdef\xs@Stack{% \xs@String\noexpand\xs@end\xs@unexpanded\expandafter{\xs@Stack}% }% \edef\xs@String{\xs@unexpanded\expandafter{\xs@String} }% \XeTeXinterchartokenstate1 \else \expandafter\xs@Lowercase\expandafter{\xs@String}\xs@lcString \ifcsname\xs@lcString @xs@phrases@ncs\endcsname \XeTeXinterchartokenstate0 \xdef\xs@Stack{% \xs@String\noexpand\xs@end\xs@unexpanded\expandafter{\xs@Stack}% }% \edef\xs@String{\xs@unexpanded\expandafter{\xs@String} }% \XeTeXinterchartokenstate1 \else \expandafter\expandafter\expandafter\xs@EndString \fi \fi }% \xs@TempCount\xs@Classes \xs@MakeInterCharToks#1% \advance\xs@TempCount-1 \let\xs@next\xs@CreateLetter \fi\xs@next } \def\xs@MakeInterCharToks#1{% \ifnum\xs@TempCount=\XeTeXcharclass`#1 \XeTeXinterchartoks\xs@TempCount\xs@TempCount{\xdef\xs@String{\xs@String#1}}% \let\xs@next\relax \else\let\xs@next\relax \expandafter\expandafter\expandafter% \xs@Xict\csname\the\xs@TempCount @xstring@letter\endcsname% \xs@TempCount{\XeTeXcharclass`#1}% \xs@Xict#1{\XeTeXcharclass`#1}\xs@TempCount \advance\xs@TempCount-1 \def\xs@next{\xs@MakeInterCharToks#1}% \fi\xs@next} \def\xs@Xict#1#2#3{% \XeTeXinterchartoks#2#3{\xdef\xs@String{\xs@String#1}}% } \def\xs@PendingLetters{}% \def\xs@LearnLetter#1{% \xs@CreateLetter#1\xs@end \ifxs@String \xdef\xs@PendingLetters{\xs@PendingLetters#1}% \fi #1} \def\SearchList{% \xs@ChangeCatcodes \xs@StarOrExclam\xs@Search } \def\xs@StarOrExclam#1#2#{% \def\xs@temp{#2}% \ifx\xs@temp\xs@star \xs@CaseSensitive2 \xs@Concatenatefalse \else \ifx\xs@temp\xs@exclamation \xs@CaseSensitive0 \xs@Concatenatetrue \else \ifx\xs@temp\xs@starexclam \xs@CaseSensitive2 \xs@Concatenatetrue \else \ifx\xs@temp\xs@exclamstar \xs@CaseSensitive2 \xs@Concatenatetrue \else \xs@CaseSensitive0 \xs@Concatenatefalse \fi \fi \fi \fi#1% } \def\xs@Search#1#2#3{% \ifcsname#1@xs@searchlist\endcsname \xs@err{% `#1' already exists.\MessageBreak Use \string\AddToList{#1}{} to add words to it% }% \else \def\xs@ListName{#1}% \expandafter\def\csname\xs@ListName @words\endcsname{}% \expandafter\def\csname #1@xs@searchlist\endcsname##1{#2}% \expandafter\def\csname #1@xs@searchlist@noreplace\endcsname##1{#2}% \expandafter\xs@MakeWord#3,\xs@end,% \xs@RestoreCatcodes \fi } \def\AddToList{% \xs@ChangeCatcodes \xs@StarOrExclam\xs@AddToList } \def\xs@AddToList#1#2{% \ifcsname#1@xs@searchlist\endcsname \def\xs@ListName{#1}% \expandafter\xs@MakeWord#2,\xs@end,% \xs@RestoreCatcodes \else \xs@err{`#1' is not a list}% \fi \xs@RestoreCatcodes } \def\xs@MakeWord#1,{% \def\xs@TempWord{#1}% \ifx\xs@TempWord\xs@end \let\xs@next\relax \else \ifcsname\ifnum\xs@CaseSensitive=2*\fi#1@\xs@ListName\endcsname \xs@err{You have already specified `\ifnum\xs@CaseSensitive=2*\fi#1'% in `\xs@ListName'. \MessageBreak You can't do it twice}% \else \csname#1@\xs@ListName\endcsname \edef\xs@TempWord{#1}% \chardef\xs@ParseState=0 \xs@BadWordfalse \xs@Starfalse \xs@Prefixfalse \xs@Suffixfalse \xs@ParseWord#1\xs@end \unless\ifxs@BadWord \ifxs@Star \xs@CaseSensitive1 \expandafter\xs@SuppressPrefix\xs@TempWord\xs@end \fi \ifxs@Prefix \expandafter\xs@SuppressSuffix\xs@TempWord \else \ifxs@Suffix \expandafter\xs@SuppressPrefix\xs@TempWord\xs@end \fi \fi \def\xs@Phrase{}% \ifcase\xs@CaseSensitive \expandafter\xs@Lowercase\expandafter{\xs@TempWord}\xs@TempWord \def\xs@cs{ncs}% \expandafter\xs@CheckSpaces\xs@TempWord\xs@end \or \def\xs@cs{cs}% \expandafter\xs@CheckSpaces\xs@TempWord\xs@end \xs@CaseSensitive0 \or \def\xs@cs{cs}% \expandafter\xs@CheckSpaces\xs@TempWord\xs@end \fi \ifxs@Prefix \xs@MakePrefix \def\xs@WordType{prefixes}% \expandafter\xs@PatchDef\csname\xs@ListName @xs@searchlist\endcsname \else \ifxs@Suffix \xs@MakeSuffix \def\xs@WordType{suffixes}% \expandafter\xs@PatchDef\csname\xs@ListName @xs@searchlist\endcsname \else \def\xs@WordType{words}% \expandafter\xs@PatchDef\csname\xs@ListName @xs@searchlist\endcsname \fi \fi \fi \fi \let\xs@next\xs@MakeWord \fi\xs@next } \def\xs@ParseWord#1{% \def\xs@temp{#1}% \ifx\xs@temp\xs@end \let\xs@next\relax \ifxs@Suffix \ifnum\xs@ParseState=3 \xs@err{You can't have a prefix and a suffix in the same word.\MessageBreak `\xs@unexpanded\expandafter{\xs@TempWord}' won't be searched}% \xs@BadWordtrue \fi \fi \else \let\xs@next\xs@ParseWord \expandafter\ifcat\noexpand#1\relax \xs@BadChar#1{control sequences are forbidden}% \else \ifcase\xs@ParseState \chardef\xs@TempNum=\XeTeXcharclass`#1 % \ifx\xs@temp\xs@star \xs@Startrue \chardef\xs@ParseState=1 \let\xs@next\xs@ParseWord \else \ifx\xs@temp\xs@question \xs@Suffixtrue \chardef\xs@ParseState=2 \let\xs@next\xs@ParseWord \else \ifnum\xs@TempNum>\xs@Classes \xs@BadChar#1{it's already a string delimiter}% \else \chardef\xs@ParseState=2 \ifnum\xs@TempNum=0 \xs@CreateLetter#1\xs@end \let\xs@next\xs@ParseWord \fi \fi \fi \fi % \or \chardef\xs@ParseState=2 \chardef\xs@TempNum=\XeTeXcharclass`#1 % \let\xs@next\xs@ParseWord \ifx\xs@temp\xs@question \xs@Suffixtrue \else \ifnum\xs@TempNum>\xs@Classes \xs@BadChar#1{it's already a string delimiter}% \else \ifnum\xs@TempNum=0 \xs@CreateLetter#1\xs@end \let\xs@next\xs@ParseWord \fi \fi \fi % \or \let\xs@next\xs@ParseWord \chardef\xs@TempNum=\XeTeXcharclass`#1 % \ifx\xs@temp\xs@question \xs@Prefixtrue \chardef\xs@ParseState=3 \else \ifnum\xs@TempNum>\xs@Classes \xs@BadChar#1{it's already a string delimiter}% \else \let\xs@next\xs@ParseWord \fi \fi \or \xs@BadChar?{it's already a string delimiter}% \fi \fi \fi\xs@next } \def\xs@BadChar#1#2{% \def\xs@next##1\xs@end{}% \xs@BadWordtrue \xs@err{% You can't use `\noexpand#1' in `\xs@unexpanded\expandafter{\xs@TempWord}',\MessageBreak #2.\MessageBreak `\xs@unexpanded\expandafter{\xs@TempWord}' won't be searched }% } \def\xs@CheckSpaces#1\xs@end{% \xs@@CheckSpaces#1 \xs@end } \def\xs@@CheckSpaces#1 #2\xs@end{% \def\xs@temp{#2}% \ifx\xs@temp\xs@empty \let\xs@next\relax \else \expandafter\xs@MakePhrase\xs@Phrase\xs@end#1\xs@end \def\xs@next{\xs@@CheckSpaces#2\xs@end}% \fi\xs@next } \def\xs@MakePhrase#1\xs@end#2\xs@end{% \ifx\xs@Phrase\xs@empty \expandafter\def\csname#2@xs@phrases@\xs@cs\endcsname{}% \edef\xs@Phrase{#2}% \else \expandafter\def\csname#1 #2@xs@phrases@\xs@cs\endcsname{}% \edef\xs@Phrase{#1 #2}% \fi }% \def\xs@GetFirstLetter#1#2\xs@end{% \def\xs@FirstLetter{#1}% } \def\xs@MakePrefix{% \expandafter\ifx\csname\xs@TempWord @\xs@cs @xs@prefixes\endcsname\relax \expandafter\xs@GetFirstLetter\xs@TempWord\xs@end \ifcsname xs@prefixes@\xs@FirstLetter @\xs@cs\endcsname \expandafter\edef\csname xs@prefixes@\xs@FirstLetter @\xs@cs\endcsname{% \csname xs@prefixes@\xs@FirstLetter @\xs@cs\endcsname\xs@TempWord,}% \def\xs@Sign{<}% \xs@Insert{\xs@TempWord}{\csname xs@prefixes@\xs@FirstLetter @\xs@cs @longer\endcsname}% \def\xs@Sign{>}% \xs@Insert{\xs@TempWord}{\csname xs@prefixes@\xs@FirstLetter @\xs@cs @shorter\endcsname}% \else \expandafter\edef\csname xs@prefixes@\xs@FirstLetter @\xs@cs\endcsname{\xs@TempWord,}% \expandafter\edef\csname xs@prefixes@\xs@FirstLetter @\xs@cs @longer\endcsname{\xs@TempWord,}% \expandafter\edef\csname xs@prefixes@\xs@FirstLetter @\xs@cs @shorter\endcsname{\xs@TempWord,}% \fi \fi } \def\xs@GetLastLetter#1{% \ifx#1\xs@end \let\xs@next\relax \else \let\xs@next\xs@GetLastLetter \def\xs@LastLetter{#1}% \fi\xs@next } \def\xs@MakeSuffix{% \expandafter\ifx\csname\xs@TempWord @\xs@cs @xs@suffixes\endcsname\relax \expandafter\xs@GetLastLetter\xs@TempWord\xs@end \ifcsname xs@suffixes@\xs@LastLetter @\xs@cs\endcsname \expandafter\edef\csname xs@suffixes@\xs@LastLetter @\xs@cs\endcsname{% \csname xs@suffixes@\xs@LastLetter @\xs@cs\endcsname\xs@TempWord,}% \def\xs@Sign{<}% \xs@Insert{\xs@TempWord}{\csname xs@suffixes@\xs@LastLetter @\xs@cs @longer\endcsname}% \def\xs@Sign{>}% \xs@Insert{\xs@TempWord}{\csname xs@suffixes@\xs@LastLetter @\xs@cs @shorter\endcsname}% \else \expandafter\edef\csname xs@suffixes@\xs@LastLetter @\xs@cs\endcsname{\xs@TempWord,}% \expandafter\edef\csname xs@suffixes@\xs@LastLetter @\xs@cs @longer\endcsname{\xs@TempWord,}% \expandafter\edef\csname xs@suffixes@\xs@LastLetter @\xs@cs @shorter\endcsname{\xs@TempWord,}% \fi \fi } \def\xs@SuppressPrefix#1#2\xs@end{\def\xs@TempWord{#2}} \def\xs@SuppressSuffix#1?{\def\xs@TempWord{#1}} \def\xs@CountLetter#1{% \ifx#1\xs@end \let\xs@next\relax \else \advance\xs@Length1 \let\xs@next\xs@CountLetter \fi\xs@next } \def\xs@SortList#1,{% \ifx#1\xs@end \edef\xs@templist{\xs@templist\xs@TempAffix,}% \let\xs@next\relax \else \xs@Length0 \xs@CountLetter#1\xs@end \ifnum\xs@Length\xs@Sign\xs@AffixLength \edef\xs@templist{\xs@templist\xs@TempAffix,#1,}% \let\xs@next\xs@EndList \else \edef\xs@templist{\xs@templist#1,}% \let\xs@next\xs@SortList \fi \fi\xs@next } \def\xs@EndList#1\xs@end,{% \edef\xs@templist{\xs@templist#1}% } \def\xs@Insert#1#2{% \def\xs@TempAffix{#1}% \xs@Length0 \expandafter\xs@CountLetter#1\xs@end \chardef\xs@AffixLength\xs@Length \def\xs@templist{}% \expandafter\expandafter\expandafter\xs@SortList#2\xs@end, \expandafter\let#2\xs@templist } \def\xs@PatchDef#1{% \expandafter\edef\csname\xs@ListName @words\endcsname{% \csname\xs@ListName @words\endcsname \xs@TempWord:::\xs@cs:::\xs@WordType:::\ifxs@Concatenate!\fi:::% }% \expandafter\ifx\csname\xs@TempWord @\xs@cs @xs@\xs@WordType\endcsname\relax% \xs@DefToks{\xs@FinalString}% \else \xs@DefToks\expandafter\expandafter\expandafter{% \csname\xs@TempWord @\xs@cs @xs@\xs@WordType\endcsname}% \fi \expandafter\ifx\csname\xs@TempWord @\xs@cs @xs@\xs@WordType @noreplace\endcsname\relax \xs@NoReplaceToks{}% \else \xs@NoReplaceToks\expandafter\expandafter\expandafter{% \csname\xs@TempWord @\xs@cs @xs@\xs@WordType @noreplace\endcsname}% \fi \ifxs@Concatenate \expandafter\edef\csname\xs@TempWord @\xs@cs @xs@\xs@WordType\endcsname{\the\xs@DefToks}% \expandafter\edef\csname\xs@TempWord @\xs@cs @xs@\xs@WordType @noreplace\endcsname{% \the\xs@NoReplaceToks \xs@unexpanded{\expandafter#1\expandafter{\xs@String}}% }% \else \expandafter\edef\csname\xs@TempWord @\xs@cs @xs@\xs@WordType\endcsname{% \noexpand\expandafter\noexpand#1\noexpand\expandafter{\the\xs@DefToks}% }% \fi } \def\StopList{% \xs@ChangeCatcodes \xs@StopList } \def\xs@StopList#1{% \xs@@StopList#1,\xs@end,% \xs@RestoreCatcodes } \def\xs@@StopList#1,{% \def\xs@temp{#1}% \ifx\xs@temp\xs@end \let\xs@next\relax \else \ifcsname#1@xs@searchlist\endcsname \unless\ifcsname#1@xs@stoppedlist\endcsname \csname#1@xs@stoppedlist\endcsname \expandafter\def\expandafter\xs@ToRemove\expandafter{% \csname#1@xs@searchlist\endcsname }% \expandafter\expandafter\expandafter% \xs@PatchWords\csname #1@words\endcsname\xs@end::::::::::::% \fi \else \xs@err{`#1' is not a list}% \fi \let\xs@next\xs@@StopList \fi\xs@next } \def\xs@PatchWords#1:::#2:::#3:::#4:::{% \def\xs@TempWord{#1}% \ifx\xs@TempWord\xs@end \let\xs@next\relax \else \def\xs@temp{#4}% \ifx\xs@temp\xs@exclamation \expandafter\expandafter\expandafter% \xs@RemoveFromNoReplace\expandafter\xs@ToRemove\csname#1@#2@xs@#3@noreplace\endcsname \fi \def\xs@cs{#2}% \def\xs@WordType{#3}% \expandafter\xs@RemoveFromDef\csname#1@#2@xs@#3\endcsname \let\xs@next\xs@PatchWords \fi\xs@next } \def\xs@RemoveFromNoReplace#1#2{% \def\xs@Erase##1\expandafter#1\expandafter##2##3\xs@end{% \def#2{##1##3}% \ifx#2\xs@empty \let#2\relax \fi }% \expandafter\xs@Erase#2\xs@end } \def\xs@final{\xs@FinalString} \def\xs@TempDef{} \def\xs@RemoveFromDef#1{% \def\xs@TempDef{}% \def\xs@Def{\xs@FinalString}% \unless\ifx#1\xs@final \expandafter\xs@Extract#1% \fi \let#1\xs@Def \ifx#1\xs@final \expandafter\ifx\csname\expandafter\xs@gobble\string#1@noreplace\endcsname\relax \ifx\xs@WordType\xs@words \let#1\relax \else \xs@RemoveFromAffixes \fi \fi \fi } \def\xs@Extract\expandafter#1\expandafter#2{% \def\xs@temp{#1}% \unless\ifx\xs@temp\xs@ToRemove \edef\xs@TempDef{% \noexpand#1,% \xs@unexpanded\expandafter{\xs@TempDef}% }% \fi \def\xs@temp{#2}% \ifx\xs@temp\xs@final \def\xs@next{% \expandafter\xs@Rebuild\xs@TempDef\xs@end,% }% \else \def\xs@next{% \xs@Extract#2% }% \fi\xs@next } \def\xs@Rebuild#1,{% \ifx#1\xs@end \let\xs@next\relax \else \let\xs@next\xs@Rebuild \edef\xs@Def{% \xs@unexpanded{\expandafter#1\expandafter}% \noexpand{% \xs@unexpanded\expandafter{\xs@Def}% \noexpand}% }% \fi\xs@next }% \def\xs@RemoveFromAffixes{% \ifx\xs@WordType\xs@prefixes \expandafter\xs@GetFirstLetter\xs@TempWord\xs@end \let\xs@Letter\xs@FirstLetter \else \expandafter\xs@GetLastLetter\xs@TempWord\xs@end \let\xs@Letter\xs@LastLetter \fi \def\xs@templist{}% \expandafter\expandafter\expandafter% \xs@CleanList\csname xs@\xs@WordType @\xs@Letter @\xs@cs\endcsname\xs@end,% \expandafter\let\csname xs@\xs@WordType @\xs@Letter @\xs@cs\endcsname\xs@templist \def\xs@templist{}% \expandafter\expandafter\expandafter% \xs@CleanList\csname xs@\xs@WordType @\xs@Letter @\xs@cs @shorter\endcsname\xs@end,% \expandafter\let\csname xs@\xs@WordType @\xs@Letter @\xs@cs @shorter\endcsname\xs@templist \def\xs@templist{}% \expandafter\expandafter\expandafter% \xs@CleanList\csname xs@\xs@WordType @\xs@Letter @\xs@cs @longer\endcsname\xs@end,% \expandafter\let\csname xs@\xs@WordType @\xs@Letter @\xs@cs @longer\endcsname\xs@templist \expandafter\let\csname\xs@TempWord @\xs@cs @xs@\xs@WordType\endcsname\relax } \def\xs@CleanList#1,{% \def\xs@temp{#1}% \ifx\xs@temp\xs@end \let\xs@next\relax \else \let\xs@next\xs@CleanList \unless\ifx\xs@temp\xs@TempWord \edef\xs@templist{\xs@templist#1,}% \fi \fi\xs@next } \def\xs@Stack{} \def\xs@Remainder{} \def\xs@StartString{% \xs@Stringtrue \let\xs@StartString\relax \def\xs@String{}% \def\PrefixFound{}% \def\SuffixFound{}% \def\AffixFound{}% \def\xs@Stack{}% \def\xs@Remainder{}% \xs@Phrasefalse \setbox\xs@Box=\hbox\bgroup } \let\xs@@StartString\xs@StartString \def\xs@EndString{% \ifxs@String \egroup \xs@Stringfalse \expandafter\xs@CreateLetter\xs@PendingLetters\xs@end \gdef\xs@PendingLetters{}% \xs@Evaluate \xs@Restore \xs@StartTracing \expandafter\xs@Remainder \fi } \def\xs@@F@Test{% \expandafter\unless\expandafter\ifx\csname\xs@String @cs@xs@words\endcsname\relax \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter% \def% \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter% \xs@FinalString% \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter{% \csname\xs@String @cs@xs@words\endcsname}% \expandafter\unless\expandafter\ifx\csname\xs@String @cs@xs@words@noreplace\endcsname\relax \edef\xs@NoReplace{% \xs@unexpanded\expandafter{\xs@NoReplace}% \xs@unexpanded\expandafter{\csname\xs@String @cs@xs@words@noreplace\endcsname}% }% \fi \xs@Matchtrue \xs@relax \xs@relax \fi } \def\xs@@f@Test{% \expandafter\xs@Lowercase\expandafter{\xs@String}\xs@lcString \expandafter\unless\expandafter\ifx\csname\xs@lcString @ncs@xs@words\endcsname\relax \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter% \def% \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter% \xs@FinalString% \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter{% \csname\xs@lcString @ncs@xs@words\endcsname}% \expandafter\unless\expandafter\ifx\csname\xs@lcString @ncs@xs@words@noreplace\endcsname\relax \edef\xs@NoReplace{% \xs@unexpanded\expandafter{\xs@NoReplace}% \xs@unexpanded\expandafter{\csname\xs@lcString @ncs@xs@words@noreplace\endcsname}% }% \fi \xs@Matchtrue \xs@relax \xs@relax \fi } \def\xs@@p@Test{% \xs@Affixfalse \expandafter\xs@GetFirstLetter\xs@lcString\xs@end \ifcsname xs@prefixes@\xs@FirstLetter @ncs\endcsname \let\xs@@String\xs@lcString \def\xs@cs{ncs}% \let\xs@WhatNext\xs@p@WhatNext \expandafter\expandafter\expandafter% \xs@CheckPrefixes\csname xs@prefixes@\xs@FirstLetter @ncs\p@order\endcsname\xs@end,% \fi \ifxs@Affix \xs@Affixfalse \xs@Matchtrue \xs@relax \xs@relax \fi } \def\xs@@P@Test{% \xs@Affixfalse \expandafter\xs@GetFirstLetter\xs@String\xs@end \ifcsname xs@prefixes@\xs@FirstLetter @cs\endcsname \let\xs@@String\xs@String \def\xs@cs{cs}% \let\xs@WhatNext\xs@P@WhatNext \expandafter\expandafter\expandafter% \xs@CheckPrefixes\csname xs@prefixes@\xs@FirstLetter @cs\P@order\endcsname\xs@end,% \fi \ifxs@Affix \xs@Affixfalse \xs@Matchtrue \xs@relax \xs@relax \fi } \def\xs@CheckPrefixes#1,{% \def\xs@temp{#1}% \ifx\xs@temp\xs@end \let\xs@next\relax \else \def\xs@TestPrefix##1#1##2\xs@end{% \def\xs@temp{##1}% \ifx\xs@temp\xs@empty \xs@Affixtrue \def\PrefixFound{#1}% \def\AffixFound{#1}% \let\xs@next\xs@WhatNext \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter% \def% \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter% \xs@FinalString% \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter{% \csname#1@\xs@cs @xs@prefixes\endcsname}% \expandafter\unless\expandafter\ifx\csname#1@\xs@cs @xs@prefixes@noreplace\endcsname\relax \edef\xs@NoReplace{% \xs@unexpanded\expandafter{\xs@NoReplace}% \xs@unexpanded\expandafter{\csname#1@\xs@cs @xs@prefixes@noreplace\endcsname}% }% \fi \else \let\xs@next\xs@CheckPrefixes \fi }% \expandafter\xs@TestPrefix\xs@@String#1\xs@end \fi\xs@next } \def\xs@@S@Test{% \xs@Affixfalse \expandafter\xs@GetLastLetter\xs@String\xs@end \ifcsname xs@suffixes@\xs@LastLetter @cs\endcsname \let\xs@@String\xs@String \def\xs@cs{cs}% \let\xs@WhatNext\xs@S@WhatNext \expandafter\expandafter\expandafter% \xs@CheckSuffixes\csname xs@suffixes@\xs@LastLetter @cs\S@order\endcsname\xs@end,% \fi \ifxs@Affix \xs@Affixfalse \xs@Matchtrue \xs@relax \xs@relax \fi } \def\xs@@s@Test{% \xs@Affixfalse \expandafter\xs@GetLastLetter\xs@lcString\xs@end \ifcsname xs@suffixes@\xs@LastLetter @ncs\endcsname \let\xs@@String\xs@lcString \def\xs@cs{ncs}% \let\xs@WhatNext\xs@s@WhatNext \expandafter\expandafter\expandafter% \xs@CheckSuffixes\csname xs@suffixes@\xs@LastLetter @ncs\s@order\endcsname\xs@end,% \fi \ifxs@Affix \xs@Affixfalse \xs@Matchtrue \xs@relax \xs@relax \fi } \def\xs@CheckSuffixes#1,{% \def\xs@temp{#1}% \ifx\xs@temp\xs@end \let\xs@next\relax \else \def\xs@TestSuffix##1#1##2\xs@end{% \def\xs@@temp{##2}% \ifx\xs@temp\xs@@temp \xs@Affixtrue \def\SuffixFound{#1}% \def\AffixFound{#1}% \let\xs@next\xs@WhatNext \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter% \def% \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter% \xs@FinalString% \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter% {% \csname#1@\xs@cs @xs@suffixes\endcsname}% \expandafter\unless\expandafter\ifx\csname#1@\xs@cs @xs@suffixes@noreplace\endcsname\relax \edef\xs@NoReplace{% \xs@unexpanded\expandafter{\xs@NoReplace}% \xs@unexpanded\expandafter{\csname#1@\xs@cs @xs@suffixes@noreplace\endcsname}% }% \fi \else% \let\xs@next\xs@CheckSuffixes \fi }% \expandafter\xs@TestSuffix\xs@@String#1\xs@end \fi\xs@next } \def\SearchOrder{% \xs@ChangeCatcodes \xs@SearchOrder } \def\xs@SearchOrder#1{% \def\xs@Order{}% \xs@@SearchOrder#1\xs@end;% \edef\xs@Evaluate{% \xs@unexpanded{% \XeTeXinterchartokenstate=0 \def\xs@NoReplace{}% \let\xs@FinalString\xs@String \expandafter\xs@Lowercase\expandafter{\xs@String}\xs@lcString }% \xs@unexpanded\expandafter{% \xs@Order \ifxs@Match \def\xs@next{% \xs@FinalString }% \else \unless\ifx\xs@Stack\xs@empty \xs@Phrasetrue \expandafter\xs@PopStack\xs@Stack\xs@@end \let\xs@next\xs@Evaluate \else \ifxs@Phrase \def\xs@Stack{}% \def\xs@next{\xs@String\xs@Restore}% \else \def\xs@next{\unhbox\xs@Box\xs@Restore}% \fi \fi \fi\xs@next }% }% \let\xs@f@Test\xs@@f@Test \let\xs@F@Test\xs@@F@Test \let\xs@p@Test\xs@@p@Test \let\xs@P@Test\xs@@P@Test \let\xs@s@Test\xs@@s@Test \let\xs@S@Test\xs@@S@Test \xs@RestoreCatcodes } \def\xs@@SearchOrder#1#2;{% \def\xs@temp{#1#2}% \ifx#1\xs@end \let\xs@next\relax \else \def\xs@Inhibit{}% \xs@MakeInhibit#2\xs@end \expandafter\expandafter\expandafter\xs@PatchTest\csname xs@@#1@Test\endcsname#1% \edef\xs@Order{% \xs@unexpanded\expandafter{\xs@Order}% \xs@unexpanded\expandafter{\csname xs@#1@Test\endcsname}}% \let\xs@next\xs@@SearchOrder \fi\xs@next } \def\xs@MakeInhibit#1{% \def\xs@temp{#1}% \ifx#1\xs@end \let\xs@next\relax \else \let\xs@next\xs@MakeInhibit \unless\ifx\xs@temp\xs@exclamation% \edef\xs@Inhibit{% \xs@unexpanded\expandafter{\xs@Inhibit \expandafter\let\csname xs@#1@Test\endcsname\relax}% }% \fi \fi\xs@next } \def\xs@PatchTest#1\xs@relax#2\xs@relax#3#4{% \expandafter\edef\csname xs@@#4@Test\endcsname{% \xs@unexpanded{#1}% \xs@unexpanded\expandafter{\expandafter\xs@relax\xs@Inhibit\xs@relax\fi}% }% } \def\xs@Restore{% \xs@Matchfalse \let\xs@f@Test\xs@@f@Test \let\xs@F@Test\xs@@F@Test \let\xs@p@Test\xs@@p@Test \let\xs@P@Test\xs@@P@Test \let\xs@s@Test\xs@@s@Test \let\xs@S@Test\xs@@S@Test \let\xs@StartString\xs@@StartString \edef\xs@Remainder{% \xs@unexpanded\expandafter{\xs@NoReplace}% \xs@unexpanded\expandafter{\xs@Remainder}% }% \XeTeXinterchartokenstate=1 } \def\xs@PopWord#1\xs@end#2\xs@end{% \def\xs@String{#2}% \def\xs@@PopWord#2##1\xs@end{% \edef\xs@Remainder{##1\xs@unexpanded\expandafter{\xs@Remainder}% }% }% \xs@@PopWord#1\xs@end } \def\xs@PopStack#1\xs@end#2\xs@@end{% \def\xs@Stack{#2}% \expandafter\xs@PopWord\xs@String\xs@end#1\xs@end } \def\SortByLength#1{% \def\xs@temp{#1}% \ifx\xs@temp\xs@star \def\xs@AffixOrder{@shorter}% \let\xs@next\xs@SortByLength \else \def\xs@AffixOrder{@longer}% \def\xs@next{\xs@@SortByLength#1\xs@end}% \fi \xs@next}% \def\xs@SortByLength#1{% \xs@@SortByLength#1\xs@end } \def\xs@@SortByLength#1{% \ifx#1\xs@end \let\xs@next\relax \else \expandafter\let\csname #1@order\endcsname\xs@AffixOrder \let\xs@next\xs@@SortByLength \fi\xs@next } \def\DoNotSort{% \def\xs@AffixOrder{}% \xs@SortByLength } \def\SearchAll#1{% \xs@SearchAll#1\xs@end } \def\xs@SearchAll#1{% \ifx#1\xs@end \let\xs@next\relax \else\let\xs@next\xs@SearchAll \if#1p% \let\xs@p@WhatNext\xs@CheckPrefixes \else \if#1P \let\xs@P@WhatNext\xs@CheckPrefixes \else \if#1s \let\xs@s@WhatNext\xs@CheckSuffixes \else \let\xs@S@WhatNext\xs@CheckSuffixes \fi \fi \fi \fi\xs@next } \def\SearchOnlyOne#1{% \xs@SearchOne#1\xs@end } \def\xs@SearchOne#1{% \ifx#1\xs@end \let\xs@next\relax^^I \else \let\xs@next\xs@SearchOne \expandafter\def\csname xs@#1@WhatNext\endcsname##1\xs@end,{}% \fi\xs@next } \def\StopSearching{% \let\xs@StartString\relax } \def\StartSearching{% \let\xs@StartString\xs@@StartString } \let\xs@OldOutput\relax \def\PatchOutput{% \ifx\xs@OldOutput\relax \edef\xs@PatchOutput{% \noexpand\def\noexpand\xs@OldOutput{% \the\output }% \noexpand\output{% \noexpand\StopSearching \the\output \noexpand\StartSearching }% }% \expandafter\xs@PatchOutput \else \xs@err{Output already patched}% \fi } \def\NormalOutput{% \ifx\xs@OldOutput\relax \xs@err{Output has not been patched}% \else \expandafter\output\expandafter{% \xs@OldOutput }% \let\xs@OldOutput\relax \fi } \def\PatchTracing{% \def\xs@StopTracing{% \chardef\xs@tracingcommands\tracingcommands \chardef\xs@tracingmacros\tracingmacros \tracingcommands0 \tracingmacros0\relax }% \def\xs@StartTracing{% \tracingcommands\xs@tracingcommands \tracingmacros\xs@tracingmacros }% } \def\NormalTracing{% \let\xs@StopTracing\relax \let\xs@StartTracing\relax } \NormalTracing \xs@RestoreCatcodes \catcode`@=12 \SearchOrder{ F!fPpSs; f!PpSs; P!pSs; p!Ss; S!s; s; } \DoNotSort{pPsS} \SearchAll{pPsS} \XeTeXinterchartokenstate1 \endinput