diff options
author | Karl Berry <karl@freefriends.org> | 2009-11-19 18:31:55 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2009-11-19 18:31:55 +0000 |
commit | 6f0fb49f5f8c48e2f746b8a6f622eb0d67f53dbf (patch) | |
tree | e7146aa56a6c2bf8d75a52d78d6efc157532d40d /Master/texmf-dist | |
parent | 2cb60fc86b08390069a4d06b0f41c60a4515edf9 (diff) |
new xetex package xeindex
git-svn-id: svn://tug.org/texlive/trunk@16078 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist')
-rw-r--r-- | Master/texmf-dist/doc/xelatex/xeindex/README | 23 | ||||
-rw-r--r-- | Master/texmf-dist/doc/xelatex/xeindex/xeindex.pdf | bin | 0 -> 78300 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/xelatex/xeindex/xeindex.tex | 571 | ||||
-rw-r--r-- | Master/texmf-dist/tex/xelatex/xeindex/xeindex.sty | 166 |
4 files changed, 760 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/xelatex/xeindex/README b/Master/texmf-dist/doc/xelatex/xeindex/README new file mode 100644 index 00000000000..fd11de2f3d0 --- /dev/null +++ b/Master/texmf-dist/doc/xelatex/xeindex/README @@ -0,0 +1,23 @@ +This is the README file for xeindex.sty v.0.1. +Read xeindex.pdf for the documentation. + +XeIndex, based on XeSearch, automatically +indexes words or phrases in a XeLaTeX +document. + +Both the documentation (xeindex.pdf) and +the file (xeindex.sty) are produced from +xeindex.tex with the CodeDoc class. + +To typeset the documentation, run XeLaTeX +on xeindex.tex with the 'produce' option +commented out on line 4. + +To create xeindex.sty, run (Xe)LaTeX again, +but uncomment 'produce' on the same line. + +Licensing of this package is covered by LPPL. + +Any reaction is welcome: zappathustra@free.fr + +Paul Isambert
\ No newline at end of file diff --git a/Master/texmf-dist/doc/xelatex/xeindex/xeindex.pdf b/Master/texmf-dist/doc/xelatex/xeindex/xeindex.pdf Binary files differnew file mode 100644 index 00000000000..ac077efc140 --- /dev/null +++ b/Master/texmf-dist/doc/xelatex/xeindex/xeindex.pdf diff --git a/Master/texmf-dist/doc/xelatex/xeindex/xeindex.tex b/Master/texmf-dist/doc/xelatex/xeindex/xeindex.tex new file mode 100644 index 00000000000..13d4b4b4d05 --- /dev/null +++ b/Master/texmf-dist/doc/xelatex/xeindex/xeindex.tex @@ -0,0 +1,571 @@ +\ifnum\month<10 \edef\month{0\the\month}\else \edef\month{\the\month}\fi +\ifnum\day<10 \edef\day{0\the\day}\else \edef\day{\the\day}\fi +\documentclass[% +%produce,% Uncomment this line to produce xeindex.sty +]{codedoc} + +\usepackage{xeindex} + +\usepackage{silence,xcolor,xltxtra} +\WarningFilter{latex}{Marginpar} +\setmainfont[Mapping=tex-text]{Bodoni MT} +\setmonofont[Mapping=tex-text,Scale=.75]{Lucida Console} +\setsansfont[Mapping=tex-text]{Arial} +\usepackage[paperwidth=23cm,paperheight=17.5cm,top=1.5cm,bottom=1.5cm,textwidth=14.5cm,right=1.5cm]{geometry} + +\ProduceFile{xeindex.sty}[xeindex][v.0.1][\the\year/\month/\day] +\let\printmacro\PrintMacro +\newskip\macroskip +\def\PrintMacro#1{% + \ifdim\macroskip=0pt + \midbreak + \fi + \noindent + \setbox0=\hbox{% + \lower\macroskip\hbox{% + \llap{% + \textcolor{red!80!black}{\texttt{#1}}% + \enspace + }% + }% + }% + \dp0=0pt + \box0 + \macroskip0pt + \ignorespaces + } +\ShortVerb" +\CodeFont{\ttfamily\color{red!80!black}} +\LineNumber{code}{\footnotesize}{1em} + +\newskip\midskip +\midskip=6pt plus 4pt minus 4pt +\def\midbreak{\vskip\midskip} +\RenewExample{example}{\ttfamily#}{}{\midbreak\noindent\CodeInput\midbreak} + +\title{\FileName\\\FileVersion} +\author{Paul Isambert\\\texttt{zappathustra@free.fr}} +\date{\FileDate} + +\def\xeindex{\Xe\kern-.1em Index} +\def\xesearch{\Xe\kern-.1em Search} +\def\XeLaTeX{\Xe\kern-.1em L\kern-.3em\raise.15em\hbox{\scriptsize A}\kern-.1em\TeX} +\SearchList{logos}{\csname#1\endcsname}{xe?,*Xe?} +\SearchList{logos2}{\XeTeX}{xetex} + +\begin{document} + +%\maketitle + +{\Huge\hfill\FileName}\par +\hfill\FileVersion\par +\hfill\FileDate\par +\hfill Paul Isambert\par +\hfill\texttt{zappathustra@free.fr}\par + + +\begin{abstract} +xeindex is a package based on xesearch that automatically +indexes words in a XeLaTeX document. Words or phrases +(possibly underspecified) are declared in a list and +each of their occurrences then creates an index entry, +whose content might be freely specified beforehand. +\end{abstract} + +\thispagestyle{empty} +Automatic indexes are bad. You know that. Hence the severe +look of this documentation. So: don't use xeindex. +Or: use it as a tool to generate an index whose relevance +you then check. Or: use it for entries that are generally indexed +on every occurrence, like proper names. Or: do bad indexes. + +You load xeindex in the usual way: + +\VerbCommand!() +\begin{example} +!StopSearching()\usepackage{xeindex} +\end{example} +\UndoVerbCommand + +\noindent +There's only one package option, namely \texttt{mark}, which +prefixes all index entries generated by xeindex with +"***["\meta{word}":"\meta{line number}"]", where \meta{word} +is the word that generated the entry and \meta{line number} +the line where you can find it in the ".tex" file. Moreover, +if a word appears more than once on a page, and thus generates +several index entries although they'll be merged in the +typeset index, with this option each entry is listed along +with each occurrence of the word. +So these entries end up at the beginning of the index, sorted with +symbols, apart from the entries generated by the usual +"\index" command. Thus they can be easily checked and prevented +if irrelevant. + +\DescribeMacro\makeindex\macroskip\baselineskip +\DescribeMacro\printindex\macroskip2\baselineskip +\DescribeMacro{\index\marg{entry}} +xeindex loads the \texttt{makeidx} package, so "\makeindex" and "\printindex", +which should be executed as usual, as well as the usual "\index" command, +are available. (If you don't know what I'm talking about, then you +don't know how to produce an index. You should read the \texttt{makeidx} +documentation at least, or the rest of this document might seem cryptic.) + +\DescribeMacro{\IndexList\meta{*}\marg{name}\marg{list of entries}} +This is xeindex's main command. The star is optional and \meta{list of entries} is +made of \meta{word}\textcolor{red!80!black}{$=$\meta{entry}} pairs +separated by commas, with the part in red optional too. +Let's see the simplest possibility first: + +\begin{example} +\IndexList{mylist}{alley cat,dog,gnu} +\end{example} + +\noindent +This will index \emph{alley cat} on every occurrence of \emph{alley cat} +in your document, \emph{dog} on every occurrence of \emph{dog}, +and \emph{gnu} on every occurrence of \emph{gnu}. +But this will also index \emph{alley cat} when seeing \emph{Alley cat}, +\emph{dog} when seeing \emph{dOg}, and \emph{gnu} when +seeing \emph{GNU}. In other words, xeindex is case-% +insensitive by default, and the index entries are put +in lower case. Most of the time, that's useful. But a gnu +is not GNU, so sometimes you want a different behavior. +In this case, put a "*" before the word, e.g.: + +\begin{example} +\IndexList{mylist}{alley cat,DOG,gnu,*GNU} +\end{example} + +\noindent +Now xeindex will index \emph{gnu} when seeing \emph{gnu} +or \emph{Gnu}, but it will index \emph{GNU} when seeing +\emph{GNU}. Note that \texttt{DOG} without a star will +index \emph{dog} in any case display, and the index entry +will be \emph{dog}, not \emph{DOG}. +You can also make a whole list case-sensitive, +by adding the star just after "\IndexList", as in: + +\begin{example} +\IndexList{mylist}{alley cat,dog,gnu} +\IndexList*{mylist}{GNU} +\end{example} + +\noindent +All words in a "*"-marked list are case-sensitive, and +you should not add another star before them. Note that you +can use the same list with different case-sensitivies each +time, as in the above example. + +Case-sensitity is useful mostly to index proper names. + +\midbreak + +The words in a list need not be fully specified. You can +index all words beginning or ending with some letters. To +do so, use "?" for the unspecified part. For instance, + +\begin{example} +\IndexList{mylist}{cat?,?mals,*?NU} +\end{example} + +\noindent +will find and index \emph{cat}, \emph{cats}, \emph{catheter}, +\emph{animals}, \emph{mammals}, \emph{GNU}, \emph{gNU}, but +not \emph{gnu}, because "*?NU" means `a word that ends with +``NU'' in upper case.' +Each of these words will be indexed in its own entry, +so there'll be a \emph{cat} and a \emph{cats} entry, but we'll +learn how to have them grouped presently. If a word matches several +underspecified forms, the more specific wins, e.g. +\emph{mammals} matches \texttt{mam?} and not \texttt{ma?}, +and `starting-with' forms always win against `ending-with' ones, +no matter the degree of specificity, e.g. \emph{cat} matches +\texttt{c?} and not \texttt{?at}. Phrases, i.e. words +separated by blanks (like \emph{alley cat} above) can be +underspecified only at the end, i.e. you can say +\texttt{alley ca?} but not \texttt{?ley cat} (actually +you can try but it won't work). Finally, underspecified +parts are only the beginning or the end of a word, i.e. +you can't say \texttt{c?t}, and there should be only +one underspecification, i.e. \texttt{?a?} is forbidden. + +\midbreak + +Now we come to the interesting part in +\meta{word}\textcolor{red!80!black}{$=$\meta{entry}}, namely the +red part: \meta{entry} should be a pseudo-index entry, +as it were, i.e. it can be a normal index entry, as in + +\begin{example} +\IndexList{another list}{% + dog=mammal|textit, + snail=Obviously Not Mammal, + cat=mammal!pet, + horse?=horse@{\bfseries horse}} +\end{example} + +\noindent +Here, every occurrence of \emph{dog} will produce +an index entry at \emph{mammal} with the page number +in italic, \emph{snail} will index \emph{Obviously Not Mammal}, +\emph{cat} will create a sub-entry \emph{pet} in the +\emph{mammal} entry and \emph{horse}, \emph{horses}, +\emph{horseshoe}, etc., will create a bold entry +at \emph{horse}. So, as you can see, the left part +of the expression specifies which words should generate +an index entry, and the right part is the index entry +that should be generated. The latter is not case-insensitive +anymore: although \texttt{snail} is case-insensitive +and will fire on \emph{snail}, \emph{Snail} or +\emph{SNaIl}, the index entry itself will be as specified, i.e. +\emph{Obviously Not Mammal} and not \emph{obviously not mammal}. + +Now you can index variations of a word under the +same entry. As I've just said, \emph{horse} and \emph{horses} +will both be indexed under \emph{horse}, as well as +all their case-variants, as we already know. +(\emph{Horseshoe} will go in that entry too, so beware). + +The right part of those pairs is a `pseudo-index entry,' +and not a proper index entry, because the word to index +can be omitted, in which case the word that fires the +index entry will be used instead. More precisely, whenever +xeindex encounters one of the usual MakeIndex operators, +namely "!" (for a sub-entry), "|" (for a control sequence) +and "@" (to indicate the form of the entry irrespective +of alphabetical order), at the beginning of an index entry, +it reinterprets this entry with the the firing +word or phrase on its left. I.e. + +\begin{example} +\IndexList{yet another list}{% + dog=@dog (canis lupus familiaris), + cat=!basic definition, + horse?=|textbf} +\end{example} + +\noindent +indexes every occurence of \emph{dog} as \emph{dog (canis lupus familiaris)}, +but with the alphabetical order of \emph{dog}, +every occurrence of \emph{cat} as a \emph{basic definition} subentry +in the \emph{cat} entry, and every occurrence of a word beginning with +\emph{horse} as an entry for this word with the page number in boldface. +Remember that the "\index" command is still available, so you can still +index \emph{cat} as \emph{cat} in your document. + +It's obviously a very bad idea to say something like +"\IndexList{mylist}{cat=|(}", since this will fire "\index{cat|(}" +on every occurrence of \emph{cat}. So page ranges can't be declared +by xeindex (it would be a very bad idea anyway). On the other +hand, MakeIndex automatically creates page ranges as soon as +an entry is found on at least three successive pages, unless you run it +with the "-r" option. + +\DescribeMacro{\StopIndexList\marg{lists}}\macroskip\baselineskip +\DescribeMacro{\StopIndex}\macroskip2\baselineskip +\DescribeMacro{\NoIndex\marg{text}} +Here are some additional macros to let you regulate the flow of +the indexing frenzy. +"\StopIndexList" takes a comma-separated list of lists and turn them off. +"\StopIndex" turns off all lists. +"\NoIndex" simply prevents \meta{text} from being indexed. It's very important, +because it lets you prevent irrelevant indexation in the body of your +document. + +That's all you need to know to use xeindex. The next paragraph +describes how xeindex sets the parameters of xesearch; so if +you don't know xesearch and don't intend to use it, there's no need to +read what follows. + +\midbreak + +xeindex keeps xesearch's default search order, namely full words before +prefixes before suffixes, with case-sensitive tests first each time. +Affixes are modified, however: they're sorted by length (longer ones first) +and not kept in the order they were declared, and only one affix fires +in case of a successful test, instead of all the affixes of a given +test. You can modify these specifications since xeindex uses "!"-marked +replacement texts, so they won't embed each other, but then you might +end up with multiple entries and a lack of consistency. + +You can use "\StartSearching" and "\StopSearching" instead of "\StopIndex", +which for the moment renders all lists unavailable. The former two +commands, however, will stop all lists defined by xesearch. + +The default set of boundaries is left untouched, i.e. its members are: +".,;:-`'()[]{}" + + + + + +\section*{Implementation} + +\let\PrintMacro\printmacro +\DocStripMarginpar + +Basic declarations and definitions. + +\BoxTolerance\maxdimen +\ShortCode/ +\CodeEscape! +\StopSearching +/ +\ProvidesPackage{!FileName}[!FileDate !FileVersion Automatic index for XeLaTeX.] +/ +\UndoCodeEscape +\StartSearching + +/ +\RequirePackage{makeidx,xesearch} +\makeatletter +\newif\ifxi@mark +\DeclareOption{mark}{\xi@marktrue} +\ProcessOptions +/ + +\DefineMacro\xi@Mark +\DefineMacro\xi@empty +\DefineMacro\xi@end +\DefineMacro\xi@Lists +"\xi@Mark" either shows the word and the corresponding line, +or it gobbles it. It is placed at the beginning of +the "\index" command, whose expansion is delayed accordingly. +/ +\ifxi@mark + \def\xi@Mark#1{***[#1:\the\inputlineno] } +\else + \def\xi@Mark#1{} +\fi +\def\xi@empty{} +\def\xi@end{\xi@end} +\def\xi@Lists{} +/ + +\DefineMacro\IndexList +\DefineMacro\xi@IndexList +Most of the job is done by xesearch. What we need to do +is properly analyze the entry to launch an adequate search. +/ +\def\IndexList{% + \@ifstar{\def\xi@cs{*}\xi@IndexList}{\def\xi@cs{}\xi@IndexList}% + } +\def\xi@IndexList#1#2{% + \def\xi@ListName{#1}% + \edef\xi@Lists{\xi@Lists#1,}% + \unless\ifcsname#1@xeindex\endcsname + \csname#1@xeindex\endcsname +/ + +\noindent +When a index list is created, we associate five xesearch +lists with it: one is for words and affixes that should index +themselves in lower case. +/ + \SearchList{#1@xeindex@ncs@normal@list}{% + \def\xi@Word{##1}% + \lowercase{\expandafter\index\expandafter{\xi@Mark\xi@Word##1}}}{}% +/ + +\noindent +Another one is for case-sensitive words and affixes. +/ + \SearchList{#1@xeindex@cs@normal@list}{% + \expandafter\index\expandafter{\xi@Mark{##1}##1}}{}% +/ + +\noindent +And the last three are for words and affixes that launch +a special entry, which is stored in an associated command. +/ + \SearchList{#1@xeindex@ncs@special@list}{% + \lowercase{\csname##1@#1@xeindex@entry\endcsname}{##1}}{}% + \SearchList{#1@xeindex@cs@special@list}{% + \csname##1@#1@xeindex@entry\endcsname{##1}}{}% + \SearchList{#1@xeindex@affix@special@list}{% + \csname\AffixFound @#1@xeindex@entry\endcsname{##1}}{}% + \fi + \xi@ParseList#2,\xi@end,% + } +/ + +\DefineMacro\xi@ParseList +This macro recursively tests each entry in "\SearchList" +and feed it to "\xi@ParseEntry" with an additional "=" +to check for the right part. It also adds "\xi@cs", which +was defined do "*" in case "\SearchList" was starred. +/ +\def\xi@ParseList#1,{% + \def\xi@temp{#1}% + \ifx\xi@temp\xi@end + \let\xi@next\relax + \else + \expandafter\xi@ParseEntry\xi@cs#1=\xi@end + \let\xi@next\xi@ParseList + \fi\xi@next + } +/ + + +\DefineMacro\xi@ParseEntry +This one analyses the entry. If the third argument +is empty, then there is no $=$\meta{entry} part +in the entry. In this case we add the word or +affix to one of the two simple lists, depending +on its case-sensitivity. +/ +\def\xi@ParseEntry#1#2=#3\xi@end{% + \def\xi@temp{#3}% + \ifx\xi@temp\xi@empty + \expandafter\if\noexpand#1*% + \AddToList!{\xi@ListName @xeindex@cs@normal@list}{#1#2}% + \else + \AddToList!{\xi@ListName @xeindex@ncs@normal@list}{#1#2}% + \fi +/ + +\noindent +Otherwise we feed the right part to "\xi@MakeEntry" which +sets the "\ifxi@NoWord" switch. We also check whether the +word is an affix or not, and whether it is case-sensitive. +The word is then associated to the right list and an +associated macro is created. +/ + \else + \xi@MakeEntry#3% + \expandafter\if\noexpand#1*% + \xi@CheckAffix#2?\xi@end + \ifxi@Affix + \AddToList!{\xi@ListName @xeindex@affix@special@list}{#1#2}% + \expandafter\edef\csname\xi@Affix @\xi@ListName @xeindex@entry\endcsname##1{% + \unexpanded{\expandafter\index\expandafter}{% + \noexpand\xi@Mark{##1}\ifxi@NoWord##1\fi\unexpanded\expandafter{\xi@temp}}% + }% + \else + \AddToList!{\xi@ListName @xeindex@cs@special@list}{#1#2}% + \expandafter\edef\csname#2@\xi@ListName @xeindex@entry\endcsname##1{% + \unexpanded{\expandafter\index\expandafter}{% + \noexpand\xi@Mark{##1}\ifxi@NoWord#2\fi\unexpanded\expandafter{\xi@temp}}% + }% + \fi + \else + \xi@CheckAffix#1#2?\xi@end + \ifxi@Affix + \AddToList!{\xi@ListName @xeindex@affix@special@list}{#1#2}% + \expandafter\edef\csname\xi@lcAffix @\xi@ListName @xeindex@entry\endcsname##1{% + \unexpanded{\def\xi@Word}{##1}% + \noexpand\lowercase{ + \unexpanded{\expandafter\index\expandafter}{% + \unexpanded{\xi@Mark{\xi@Word}}% + \ifxi@NoWord##1\fi\unexpanded\expandafter{\xi@temp}}% + }% + }% + \else + \AddToList!{\xi@ListName @xeindex@ncs@special@list}{#1#2}% + \lowercase{% + \expandafter\edef\csname#1#2@\xi@ListName @xeindex@entry\endcsname##1{% + \unexpanded{\def\xi@Word}{##1}% + \unexpanded{\expandafter\index\expandafter}{% + \unexpanded{\xi@Mark{\xi@Word}}% + \ifxi@NoWord#1#2\fi\unexpanded\expandafter{\xi@temp}}% + }% + }% + \fi + \fi + \fi + } +/ + +\DefineMacro\xi@MakeEntry +This determines whether the entry starts with one +of the MakeIndex operators. +/ +\newif\ifxi@NoWord +\def\xi@MakeEntry#1#2={% + \def\xi@temp{#1#2}% + \xi@NoWordtrue + \expandafter\unless\expandafter\if\noexpand#1!% + \expandafter\unless\expandafter\if\noexpand#1@% + \expandafter\unless\expandafter\if\noexpand#1|% + \xi@NoWordfalse + \fi + \fi + \fi + } +/ + +\DefineMacro\xi@CheckAffix +If the first argument is "?", then the word is +unspecified at the beginning. Otherwise, if +the third argument is not empty, then it is unspecified +at the end (because we added a "?" when giving the +word to this macro). In case the "?" is misplaced, +xesearch will detect it later. +/ +\newif\ifxi@Affix +\def\xi@CheckAffix#1#2?#3\xi@end{% + \xi@Affixfalse + \expandafter\if\noexpand#1?% + \xi@Affixtrue + \def\xi@Affix{#2}% + \lowercase{\def\xi@lcAffix{#2}}% + \else + \def\xi@@temp{#3}% + \unless\ifx\xi@@temp\xi@empty + \xi@Affixtrue + \def\xi@Affix{#1#2}% + \lowercase{\def\xi@lcAffix{#1#2}}% + \fi + \fi + } +/ + +\DefineMacro\StopIndexList +\DefineMacro\xi@StopIndexList +\DefineMacro\StopIndex +\DefineMacro\NoIndex +These are straightforward. +/ +\def\StopIndexList#1{% + \xi@StopIndexList#1,\xi@end,% + }% +\def\xi@StopIndexList#1,{% + \def\xi@temp{#1}% + \ifx\xi@temp\xi@end + \let\xi@next\relax + \else + \StopList{% + #1@xeindex@ncs@normal@list,% + #1@xeindex@cs@normal@list,% + #1@xeindex@cs@normal@list,% + #1@xeindex@ncs@special@list,% + #1@xeindex@cs@special@list,% + #1@xeindex@affix@special@list% + }% + \let\xi@next\xi@StopIndexList + \fi\xi@next + } +\def\StopIndex{% + \expandafter\xi@StopIndexList\xi@Lists\xi@end,% + } +\def\NoIndex#1{% + \bgroup + \StopIndex + #1% + \egroup + } +/ + +\DefineMacro\xi@PrintIndex +Finally, we patch "\printindex" so it won't be searched, +and sets xesearch's parameters. +/ +\let\xi@PrintIndex\printindex +\def\printindex{\StopIndex\xi@PrintIndex} +\SortByLength{pPsS} +\SearchOnlyOne{pPsS} +\makeatother +/ +\end{document} +
\ No newline at end of file diff --git a/Master/texmf-dist/tex/xelatex/xeindex/xeindex.sty b/Master/texmf-dist/tex/xelatex/xeindex/xeindex.sty new file mode 100644 index 00000000000..098e44a34ac --- /dev/null +++ b/Master/texmf-dist/tex/xelatex/xeindex/xeindex.sty @@ -0,0 +1,166 @@ +% This is xeindex, produced by the CodeDoc class +% with the `produce' option on. +% +% To create the documentation, compile xeindex.tex +% without the `produce' option. +% +% SOURCE: xeindex.tex +% DATE: 2009/10/24 +% VERSION: v.0.1 +\ProvidesPackage{xeindex}[2009/10/24 v.0.1 Automatic index for XeLaTeX.] +\RequirePackage{makeidx,xesearch} +\makeatletter +\newif\ifxi@mark +\DeclareOption{mark}{\xi@marktrue} +\ProcessOptions +\ifxi@mark + \def\xi@Mark#1{***[#1:\the\inputlineno] } +\else + \def\xi@Mark#1{} +\fi +\def\xi@empty{} +\def\xi@end{\xi@end} +\def\xi@Lists{} +\def\IndexList{% + \@ifstar{\def\xi@cs{*}\xi@IndexList}{\def\xi@cs{}\xi@IndexList}% + } +\def\xi@IndexList#1#2{% + \def\xi@ListName{#1}% + \edef\xi@Lists{\xi@Lists#1,}% + \unless\ifcsname#1@xeindex\endcsname + \csname#1@xeindex\endcsname + \SearchList{#1@xeindex@ncs@normal@list}{% + \def\xi@Word{##1}% + \lowercase{\expandafter\index\expandafter{\xi@Mark\xi@Word##1}}}{}% + \SearchList{#1@xeindex@cs@normal@list}{% + \expandafter\index\expandafter{\xi@Mark{##1}##1}}{}% + \SearchList{#1@xeindex@ncs@special@list}{% + \lowercase{\csname##1@#1@xeindex@entry\endcsname}{##1}}{}% + \SearchList{#1@xeindex@cs@special@list}{% + \csname##1@#1@xeindex@entry\endcsname{##1}}{}% + \SearchList{#1@xeindex@affix@special@list}{% + \csname\AffixFound @#1@xeindex@entry\endcsname{##1}}{}% + \fi + \xi@ParseList#2,\xi@end,% + } +\def\xi@ParseList#1,{% + \def\xi@temp{#1}% + \ifx\xi@temp\xi@end + \let\xi@next\relax + \else + \expandafter\xi@ParseEntry\xi@cs#1=\xi@end + \let\xi@next\xi@ParseList + \fi\xi@next + } +\def\xi@ParseEntry#1#2=#3\xi@end{% + \def\xi@temp{#3}% + \ifx\xi@temp\xi@empty + \expandafter\if\noexpand#1*% + \AddToList!{\xi@ListName @xeindex@cs@normal@list}{#1#2}% + \else + \AddToList!{\xi@ListName @xeindex@ncs@normal@list}{#1#2}% + \fi + \else + \xi@MakeEntry#3% + \expandafter\if\noexpand#1*% + \xi@CheckAffix#2?\xi@end + \ifxi@Affix + \AddToList!{\xi@ListName @xeindex@affix@special@list}{#1#2}% + \expandafter\edef\csname\xi@Affix @\xi@ListName @xeindex@entry\endcsname##1{% + \unexpanded{\expandafter\index\expandafter}{% + \noexpand\xi@Mark{##1}\ifxi@NoWord##1\fi\unexpanded\expandafter{\xi@temp}}% + }% + \else + \AddToList!{\xi@ListName @xeindex@cs@special@list}{#1#2}% + \expandafter\edef\csname#2@\xi@ListName @xeindex@entry\endcsname##1{% + \unexpanded{\expandafter\index\expandafter}{% + \noexpand\xi@Mark{##1}\ifxi@NoWord#2\fi\unexpanded\expandafter{\xi@temp}}% + }% + \fi + \else + \xi@CheckAffix#1#2?\xi@end + \ifxi@Affix + \AddToList!{\xi@ListName @xeindex@affix@special@list}{#1#2}% + \expandafter\edef\csname\xi@lcAffix @\xi@ListName @xeindex@entry\endcsname##1{% + \unexpanded{\def\xi@Word}{##1}% + \noexpand\lowercase{ + \unexpanded{\expandafter\index\expandafter}{% + \unexpanded{\xi@Mark{\xi@Word}}% + \ifxi@NoWord##1\fi\unexpanded\expandafter{\xi@temp}}% + }% + }% + \else + \AddToList!{\xi@ListName @xeindex@ncs@special@list}{#1#2}% + \lowercase{% + \expandafter\edef\csname#1#2@\xi@ListName @xeindex@entry\endcsname##1{% + \unexpanded{\def\xi@Word}{##1}% + \unexpanded{\expandafter\index\expandafter}{% + \unexpanded{\xi@Mark{\xi@Word}}% + \ifxi@NoWord#1#2\fi\unexpanded\expandafter{\xi@temp}}% + }% + }% + \fi + \fi + \fi + } +\newif\ifxi@NoWord +\def\xi@MakeEntry#1#2={% + \def\xi@temp{#1#2}% + \xi@NoWordtrue + \expandafter\unless\expandafter\if\noexpand#1!% + \expandafter\unless\expandafter\if\noexpand#1@% + \expandafter\unless\expandafter\if\noexpand#1|% + \xi@NoWordfalse + \fi + \fi + \fi + } +\newif\ifxi@Affix +\def\xi@CheckAffix#1#2?#3\xi@end{% + \xi@Affixfalse + \expandafter\if\noexpand#1?% + \xi@Affixtrue + \def\xi@Affix{#2}% + \lowercase{\def\xi@lcAffix{#2}}% + \else + \def\xi@@temp{#3}% + \unless\ifx\xi@@temp\xi@empty + \xi@Affixtrue + \def\xi@Affix{#1#2}% + \lowercase{\def\xi@lcAffix{#1#2}}% + \fi + \fi + } +\def\StopIndexList#1{% + \xi@StopIndexList#1,\xi@end,% + }% +\def\xi@StopIndexList#1,{% + \def\xi@temp{#1}% + \ifx\xi@temp\xi@end + \let\xi@next\relax + \else + \StopList{% + #1@xeindex@ncs@normal@list,% + #1@xeindex@cs@normal@list,% + #1@xeindex@cs@normal@list,% + #1@xeindex@ncs@special@list,% + #1@xeindex@cs@special@list,% + #1@xeindex@affix@special@list% + }% + \let\xi@next\xi@StopIndexList + \fi\xi@next + } +\def\StopIndex{% + \expandafter\xi@StopIndexList\xi@Lists\xi@end,% + } +\def\NoIndex#1{% + \bgroup + \StopIndex + #1% + \egroup + } +\let\xi@PrintIndex\printindex +\def\printindex{\StopIndex\xi@PrintIndex} +\SortByLength{pPsS} +\SearchOnlyOne{pPsS} +\makeatother |