diff options
author | Karl Berry <karl@freefriends.org> | 2009-11-17 01:34:23 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2009-11-17 01:34:23 +0000 |
commit | cc7d43c984b1c36a0176b26f83368faa465d37c4 (patch) | |
tree | c92cc545a6e697c41cef2bf7ad47fefb7f1a383a /Master/texmf-dist/tex/xetex/xesearch | |
parent | 1ad8bd42c0daa12218f5c3328beca12f02a114ac (diff) |
new xetex package xesearch (4nov09)
git-svn-id: svn://tug.org/texlive/trunk@16041 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/xetex/xesearch')
-rw-r--r-- | Master/texmf-dist/tex/xetex/xesearch/t-xesearch.tex | 24 | ||||
-rw-r--r-- | Master/texmf-dist/tex/xetex/xesearch/xesearch.sty | 1109 |
2 files changed, 1133 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/xetex/xesearch/t-xesearch.tex b/Master/texmf-dist/tex/xetex/xesearch/t-xesearch.tex new file mode 100644 index 00000000000..e16a4cf2ca6 --- /dev/null +++ b/Master/texmf-dist/tex/xetex/xesearch/t-xesearch.tex @@ -0,0 +1,24 @@ +% This is t-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 +%D \module +%D [ file=t-xesearch, +%D version=2009.11.04, +%D title=\CONTEXT\ User Module, +%D subtitle=XeSearch, +%D author=Paul Isambert, +%D date=\currentdate, +%D copyright=Paul Isambert, +%D email=zappathustra@free.fr, +%D license=LaTeX Project Public License] + +\writestatus{loading}{ConTeXt User Module / XeSearch} +\csname xs@contextmodule\endcsname +\input xesearch.sty +\endinput diff --git a/Master/texmf-dist/tex/xetex/xesearch/xesearch.sty b/Master/texmf-dist/tex/xetex/xesearch/xesearch.sty new file mode 100644 index 00000000000..f6d049325ac --- /dev/null +++ b/Master/texmf-dist/tex/xetex/xesearch/xesearch.sty @@ -0,0 +1,1109 @@ +% 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 |