You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1109 lines
31 KiB
1109 lines
31 KiB
% 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}{<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^^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
|
|
|