%PDF- %PDF-
| Direktori : /proc/self/root/data/old/usr/share/texlive/texmf-dist/tex/xetex/xesearch/ |
| Current File : //proc/self/root/data/old/usr/share/texlive/texmf-dist/tex/xetex/xesearch/xesearch.sty |
% 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: 2009/11/04
% VERSION: v.0.1
\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}[2009/11/04 v.0.1 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=255
\chardef\xs@lrDel=254
\chardef\xs@Classes=253
\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}{<words>} 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
\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