diff options
Diffstat (limited to 'Master/texmf-dist/source/latex/splitindex/splitidx.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/splitindex/splitidx.dtx | 1584 |
1 files changed, 1584 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/splitindex/splitidx.dtx b/Master/texmf-dist/source/latex/splitindex/splitidx.dtx new file mode 100644 index 00000000000..a0bae1a464e --- /dev/null +++ b/Master/texmf-dist/source/latex/splitindex/splitidx.dtx @@ -0,0 +1,1584 @@ +% \CheckSum{604} +% \iffalse +% ====================================================================== +% splitidx.dtx +% Copyright (c) Markus Kohm, 2002-2009 +% +% $Id: splitidx.dtx,v 1.6 2009-03-20 14:55:11 mjk Exp $ +% +% This file is part of the SplitIndex bundle. +% +% This work may be distributed and/or modified under the conditions of +% the LaTeX Project Public License, version 1.3c of the license. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later and of this work. +% +% This work has the LPPL maintenance status "author-maintained". +% +% The Current Maintainer and author of this work is Markus Kohm. +% +% The list of all files belongig to the SplitIndex bundle is given in +% in the file `manifest.txt'. Files generated by means of unpacking the +% distribution (using, for example, the docstrip program) or by means +% of compiling them from a source file, for example, from splitindex.c +% or splitindex.java may be distributed at the distributor's discretion. +% However if they are distributed then a copy of the SplitIndex bundle +% must be distributed together with them. +% +% The list of derived (unpacked or compiled) files belongig to the +% distribution and covered by LPPL is defined by the unpacking scripts +% (with extension .ins) and the installation script (with name +% install.sh) which are part of the distribution. +% +% Two often ignorred clauses from LPPL 1.3c you should not ignore: +% ---------------------------------------------------------------- +% 2. You may distribute a complete, unmodified copy of the Work as you +% received it. Distribution of only part of the Work is considered +% modification of the Work, and no right to distribute such a Derived +% Work may be assumed under the terms of this clause. +% 3. You may distribute a Compiled Work that has been generated from a +% complete, unmodified copy of the Work as distributed under Clause 2 +% above, as long as that Compiled Work is distributed in such a way that +% the recipients may install the Compiled Work on their system exactly +% as it would have been installed if they generated a Compiled Work +% directly from the Work. +% ====================================================================== +% +%<*dtx> +% \fi +\ProvidesFile{splitidx.dtx}[% +% \iffalse +%</dtx> +%<driver>\ProvidesFile{splitidx.drv}[% +%<package>\ProvidesPackage{splitidx}[% +% \fi + 2009/02/28 v1.1a multiple indices for LaTeX] +% \iffalse +%<*driver> +\documentclass{ltxdoc} +\usepackage{color,alltt} +\newcommand*{\Prompt}{{\color{green}\textbf{\$}}} +\newcommand*{\Package}{}\let\Package\textsf +\newcommand*{\Class}{}\let\Class\textsf +\newcommand*{\Program}{}\let\Program\textsf +\newcommand*{\File}{}\let\File\texttt +\newcommand*{\Cmdline}{}\let\Cmdline\texttt +\providecommand*{\url}{\texttt} +\CodelineIndex +\RecordChanges +\EnableCrossrefs +\GetFileInfo{splitidx.dtx} +\title{Creating More Than One Index Using \Package{splitidx} And + \Program{SplitIndex}\thanks{This file is version \fileversion{} of file + \File{\filename}. Nevertheless it should be stable.}} +\author{Markus Kohm\thanks{Markus Kohm \textless komascript\textcircled{\tiny at}gmx.info\textgreater}} +\date{\filedate} +\begin{document} +\maketitle +\begin{abstract} + With \Package{makeidx} there's a standard package at \LaTeX{} to create + one index to each document. But some times more than one index is + needed. There are different packages with different solutions and different + problems to achieve multiple indices. Here is one more. +\end{abstract} +\tableofcontents +\DocInput{splitidx.dtx} +\end{document} +%</driver> +% \fi +% +% \DoNotIndex{\DeclareOption,\AtEndOfPackage,\renewcommand,\g@addto@macro} +% \DoNotIndex{\renewcommand,\ProcessOptions,\relax,\newcommand,\emph} +% \DoNotIndex{\providecommand,\@bsphack,\@esphack,\@sanitize,\typeout} +% \DoNotIndex{\begingroup,\endgroup,\jobname,\ifx,\else,\fi,\expandafter} +% \DoNotIndex{\csname,\endcsname,\protected@write,\AtBeginDocument} +% \DoNotIndex{\ifHy@hyperindex,\@indexfile,\thepage,\Hy@temp@A} +% \DoNotIndex{\HyInd@ParenLeft,\HyInd@ParenRight,\string,\@ifstar,\@input@} +% \DoNotIndex{\@ifnextchar,\edef,\let,\@empty,\@for,\@tempa,\xdef,\def} +% \DoNotIndex{\catcode,\lowercase,\do,\@ifundefined,\PackageError} +% \DoNotIndex{\MessageBreak,\gdef,\@namedef,\setcounter,\@gobble.\-,\\} +% \DoNotIndex{\@onlypreamble,\@tempb,\@wrindex,\immediate,\newif,\newwrite} +% \DoNotIndex{\openout,\@gobble} +% +% \section{Introduction} +% +% First of all you have to know how index generation normally would be +% done. Read \cite{makeindex} and e.g. \cite{makeindexmanual} if you +% don't. +% +% Generally you load a package e.g. \Package{makeidx}, put \cs{index} commands +% into your document, which are written as \cs{indexentry} commands to the raw +% index file ``\File{\cs{jobname}.idx}''. Then you call an \emph{index +% processor} like \Program{MakeIndex} or \Program{xindy}, which generates a +% sorted index file ``\File{\cs{jobname}.ind}''. This will be included with a +% command like \cs{printindex} at the end of your document. +% +% Most packages, which allows more than one index, open more than one raw +% index file. Each of these files costs a write file handle. \TeX{} has only +% 16 of these. \LaTeX{} itself needs some of these for e.g. \File{.aux}, +% \File{.toc}, \File{.lot}, \File{.lof} and maybe other more or less temporary +% files depends on what you are doing. With package option \texttt{split} +% package \Package{splitidx} works like those packages. +% +% Without option \texttt{split} the \Package{splitidx} package needs only one +% raw index file like \Package{makeidx} would. This one raw index files +% contains all the index entries for all the indices you defined. But to do so +% \Package{splitidx} and the index processor need help. Before calling the +% index processor the one raw index file has to be splitted into multiple raw +% index files. Each of these contains the index entries of one index. This +% splitting can be done with the \Program{splitindex} program. +% +% There is not only one \Program{SplitIndex} program, there are +% \Program{SplitIndex} programs in different programming languages: +% \begin{description} +% \item[\Program{splitindex.pl}] This is written in perl. You need a perl +% interpreter to run it. If you are a Unix user, you have a perl interpreter +% and you can call \Program{splitindex.pl} like you would call a binary +% program or a shell script from your shell. This is the reference +% implementation. I prefers to use this\,---\,because it was the first, the +% easiest and the shortest to be written. +% \item[\Program{splitindex.jar}] This is written using Sun Java 1.4.1. You +% can find the source at \File{splitindex.java}. I wrote it, because Java is +% everywhere and may be installed everywhere and a lot of people are able to +% understand Java source files. But if you don't have Sun Java 1.4 the start +% of this program will result in errors\,---\,e.g. +% \begin{quote} +% \texttt{Exception in thread "main" java.util.zip.ZipException: No such +% file or directory} +% \end{quote} +% if you try to start it with Sun Java 1.3. +% \item[\Program{splitindex-Linux-i386}] This is a Linux-i386-ELF binary from +% the C source file \File{splitindex.c}. It will be renamed to +% \Program{splitindex} during installation, if you are using Linux-i386. At +% section~\ref{C} you find a introduction in how to compile +% \File{splitindex.c} yourself e.g. if you are using Linux-PPC. I wrote the +% C source, because a lot of people like to have a binary and most software +% authors understand C and some people want fast binaries instead of slow +% Java bit code\,---\,even, if the Java program is fast enough. +% \item[\Program{splitindex-OpenBSD-i386}] This is a OpenBSD-i386 binary from +% the C source file \File{splitindex.c}. It will be renamed to +% \Program{splitindex} during installation, if you are using +% OpenBSD-i386. It is almost the same like +% \Program{splitindex-Linux-i386}\,---\,but it doesn't understand long +% option names. +% \item[\Program{splitindex.exe}] This is a CygWin binary from the C source +% file \File{splitindex.c}. A CygWin binary is a Windows (Win32) binary +% using the CygWin DLL. At section~\ref{C} you find a introduction in how to +% use a CygWin binary without installing a whole CygWin +% environment\,---\,nevertheless it is nice to have a almost complete +% CygWin. +% \item[\Program{splitindex.tex}] This is a \TeX{} version of the +% program. Yes, you are right: it is a program written in \TeX{}. It has not +% the whole functionality of the other programs (see section~\ref{TeX}), but +% it is system independent and you don't need to install a other program +% like perl or Sun Java 1.4. It is not impossible to fix all the +% disadvantages of this program\,---\,but it isn't easy and much more work +% than all the other program. +% \end{description} +% Without the \TeX{} version of \Program{splitindex} all of these programs are +% also able to call the index processor after creating the raw index files. +% +% And where is the lisp, the smalltalk, the prolog, the \dots{} version of +% \Program{splitindex}? Hey, four languages are enough for me! If you need one +% more, write it! +% +% +% \section{Using the \Package{splitidx} package} +% \label{package} +% +% +% \subsection{Generating a raw index} +% +% You may use \Package{splitidx} as a drop-in-replacement for +% \Package{makeidx}. If you do so, you just have to replace: +% \begin{verbatim} +% \usepackage{makeidx} +% \end{verbatim}\vspace{-\baselineskip} +% by +% \begin{verbatim} +% \usepackage{splitidx} +% \end{verbatim}\vspace{-\baselineskip} +% +% \DescribeMacro{\makeindex} +% To activate index generation you may use \cs{makeindex}, which is declared +% by the \LaTeX{} kernel. +% You may also load the package with option +% \texttt{makeindex}: +% \begin{verbatim} +% \usepackage[makeindex]{splitidx} +% \end{verbatim}\vspace{-\baselineskip} +% which is almost the same like: +% \begin{verbatim} +% \usepackage{splitidx}\makeindex +% \end{verbatim}\vspace{-\baselineskip} +% +% \DescribeMacro{\index} +% After loading the package you may use command \cs{index}. You can find the +% description of the argument and features of this command at +% \cite{makeindex}. The \Program{splitindex} programs (see +% section~\ref{program}) put all index entries, which are produced with +% \cs{index} to the index with shortcut ``\texttt{idx}''. +% +% \DescribeMacro{\sindex} +% The \Package{splitidx} package also defines the command \cs{sindex} with the +% syntax: +% \begin{quote} +% \cs{sindex}\oarg{shortcut}\marg{index-entry} +% \end{quote} +% to be used to put an index +% entry into the index with the optional given shortcut. If you omit optional +% \meta{shortcut} the shortcut ``\texttt{idx}'' will be used. +% If you use \cs{sindex} you need to split the raw index file into several raw +% index files, before generating the index with an index processor like +% \Program{MakeIndex}. See section~\ref{program} for more information about +% splitting the raw index file. +% +% The shortcut is used not only to distinguish between the different +% indices. It is also used as part of the name of the raw index file generated +% by a \Program{splitindex} program (see section~\ref{program}) and the +% corresponding index file generated by an index processor like +% \Program{MakeIndex} (see \cite{makeindexmanual}). So you should not use +% characters or symbols at \meta{shortcut} which are not allowed at +% filenames. At file systems, which are not case sensitive, you should not mix +% upper and lower case letters. Best would be, if you'll use only lower case +% letters. +% +% Under some unfortunate circumstances you may be forced to put all your index +% entries back to one index. The easiest way to do this without changing all +% \cs{sindex} commands into \cs{index} commands is the package option +% \texttt{allatone}. If you load the package with: +% \begin{verbatim} +% \usepackage[allatone]{splitidx} +% \end{verbatim}\vspace{-\baselineskip} +% or +% \begin{verbatim} +% \usepackage[allatone,makeindex]{splitidx} +% \end{verbatim}\vspace{-\baselineskip} +% \cs{sindex}\oarg{shortcut}\marg{indexentry} will result in +% \cs{index}\marg{indexentry}. +% +% If you like, you may also declare that \cs{index} should be the same +% like command \cs{sindex}. In this case, you may use package +% option \texttt{useindex}, e.g.: +% \begin{verbatim} +% \usepackage[useindex]{splitidx} +% \end{verbatim}\vspace{-\baselineskip} +% This may be usefull using packages like \textsf{jurabib} that expects +% \cs{index} to be the index command. +% +% \emph{Note: Currently only one of the options \texttt{allatone} and +% \texttt{useindex} can be used at same time. If you are using both +% \texttt{useindex} will be disabled! This may result in many error +% messages!} +% +% \DescribeMacro{\AtWriteToIndex} +% \Package{splitidx} uses \cs{protected@write} to write the index entries to +% the raw index files. The second argument of \cs{protected@write} will be +% executed immediatly before writing to the raw index file. With +% \begin{quote} +% \cs{AtWriteToIndex}\marg{shortcut}\marg{commands} +% \end{quote} +% you may add \marg{commands} to this argument. This may be usefull, +% if you do not want to reference the page number but another counter. You +% may, e.g., use +% \begin{verbatim} +% \AtWriteToIndex{idx}{\let\thepage\thesection} +% \end{verbatim} +% to write the current section number instead of the page number to the main +% index. But be carefull: If you do not use option \texttt{useindex}, command +% \cs{index} will still write the page number to the index. This may be used +% only at the document preamble. +% +% \DescribeMacro{\AtNextWriteToIndex} +% Somethimes it may be usefull to have the same like \cs{AtWriteToIndex} only +% for the next write. So you may use +% \begin{quote} +% \cs{AtNextWriteToIndex}\marg{shortcut}\marg{commands} +% \end{quote} +% instead of using \cs{AtWriteToIndex}. +% +% \subsection{Printing an index} +% +% \DescribeMacro{\newindex} +% If you want to generate more than one index without shortcut, you should +% declare this using \cs{newindex} with syntax: +% \begin{quote} +% \cs{newindex}\oarg{index name}\marg{shortcut}. +% \end{quote} +% The mandatory argument \meta{shortcut} is used to distinguish the different +% indices. See description of \cs{sindex} for more information about this. The +% optional argument \meta{index name} is the name of the index. This is also +% the default heading of this index used from \cs{printindex} and +% \cs{printsubindex}. If you omit \meta{index name} the shortcut will be used +% as index name. +% +% Some people do not like to call an extra program like +% \Program{splitindex}. For those the package option \texttt{split} has been +% implemented. With this option \Package{splitidx} opens a new file for each +% index, which is declared using \cs{newindex}. If you are using this option, +% you have to declare all indices you want to use at the preamble of your +% document. This also uses the default \File{idx} file for index entries to +% index with shortcut \texttt{idx}. The number of index files, you can open is +% limited, if you are using this option. This is because of the limitation of +% output streams \TeX{} provides. With this option not only \cs{newindex} may +% result in an error but also \cs{tableofcontents}, \cs{listoffigures}, +% \cs{listoftables} and each other command, which allocates an output stream. +% +% Some people do not like to write \cs{sindex[foo]}\marg{entry}. They want to +% write \cs{foo}\marg{entry}. For those of you the package option +% `\texttt{idxcommands}' has been implemented. This defines a command with the +% name of the \meta{shortcut} for each declared index. If you are using this +% option, you'll get an error, if a shortcut is the name of an already defined +% command. And if you are using this option, the characters of the shortcuts +% must be letters. +% +% \DescribeMacro{\newprotectedindex} +% Using standard index package \textsf{makeidx} the \LaTeX{} kernel command +% \cs{index} may expand the argument of \cs{index}. The kernel uses +% \cs{@santize} to avoid this in some cases. But this fails, if the argument +% was already read e.g. by another macro. So if you define a macro, that reads +% an argument, does something with the argument and write it to the index this +% may expand the argument. Try following: +% \begin{verbatim} +% \documentclass{article} +% \usepackage{ngerman} +% \usepackage{makeidx}\makeindex +% \newcommand*{\Test}[1]{#1\index{#1}} +% \begin{document} +% \Test{"Anderung} +% "Anderung\index{"Anderung} +% \end{document} +% \end{verbatim}\vspace{-\baselineskip} +% This will result in two entries at the \texttt{.idx} file: +% \begin{verbatim} +% \indexentry{\active@dq \dq@prtct{A}nderung}{1} +% \indexentry{"Anderung}{1} +% \end{verbatim}\vspace{-\baselineskip} +% The first one is something expanded that is not wanted. Package +% \textsf{splitindx} behaves same by default. But if you are using +% \cs{newprotectedindex} to define a new index, it uses a trick so avoid +% expansion. If all indices should behave like this, you may simply use +% package option \texttt{protected}. +% \begin{verbatim} +% \documentclass{article} +% \usepackage{ngerman} +% \usepackage[protected,useindex,makeindex]{makeidx} +% \newcommand*{\Test}[1]{#1\index{#1}} +% \begin{document} +% \Test{"Anderung} +% "Anderung\index{"Anderung} +% \end{document} +% \end{verbatim}\vspace{-\baselineskip} +% Will result in two entries at the \texttt{.idx} file: +% \begin{verbatim} +% \indexentry{"Anderung}{1} +% \indexentry{"Anderung}{1} +% \end{verbatim}\vspace{-\baselineskip} +% If you want to know more about the trick, see command +% \cs{@onelevel@sanitize} at the \LaTeX{} kernel documentation, +% \texttt{source2e}. +% +% +% \DescribeMacro{\printindex} +% \changes{v0.2a}{2003/01/05}{fix of documentation bug} +% The \cs{printindex} command is used to print one index or all indices, which +% are declared using \cs{newindex}. How it behaves depends on the syntax you +% are using. +% +% With syntax +% \begin{quote} +% \cs{printindex}\oarg{shortcut}\oarg{index name} +% \end{quote} +% the index file with the optional shortcut will be loaded and titled with +% optional given index name. If \meta{index name} is omitted the default index +% name declared with \cs{newindex} will be used. +% +% If the both optional arguments, \meta{shortcut} and \meta{index name}, are +% omitted and you are using simply +% \begin{quote} +% \cs{printindex} +% \end{quote} +% it behaves like \cs{printindex} from package \Package{makeidx}. You should +% not use this, if you are using \cs{sindex} with optional argument. +% +% You may also print all indices, which were declared using \cs{newindex}. Use +% syntax: +% \begin{quote} +% \cs{printindex*} +% \end{quote} +% to do so. The indices will be printed in the order you declared them using +% \cs{newindex}. +% +% \cs{printindex} uses the default index output of the class and the +% index processor you are using. Most this will be \texttt{theindex} +% environment, but it needn't. But \cs{printindex} will fail to set the name +% of the index if \cs{indexname} isn't use to print the name of the +% index. This would be a failure of the class not of the \Package{splitidx} +% package. I don't know any class with this failure. +% +% +% \DescribeMacro{\printsubindex} +% The \cs{printsubindex} command behaves like \cs{printindex} with same syntax +% but it does some redefinitions before printing the index, to: +% \begin{itemize} +% \item use \cs{section} instead of \cs{chapter} level at classes, which have +% \cs{chapter} and \cs{subsection} instead of \cs{section} level at classes, +% which haven't \cs{chapter}, +% \item deactivate \cs{onecolumn}, \cs{twocolumn} and \cs{clearpage}, +% \cs{cleardoublepage} to start a new page at each index, +% \item change the mark mechanism not to use \cs{markboth} but \cs{markright} +% for setting up the running headline. +% \end{itemize} +% Using this you can print multiple indices at one chapter, if you are using a +% class with \cs{chapter}, or at one section, if you are using a class without +% \cs{chapter}. +% +% +% \DescribeMacro{\setindexpreamble} +% If you are using a KOMA-Script class, you'll know this command. Package +% \Package{splitidx} redefines this command to syntax: +% \begin{quote} +% \cs{setindexpreamble}\oarg{shortcut}\marg{preamble} +% \end{quote} +% So you can define a preamble for each index. Note: Package +% \Package{splitidx} doesn't print the preamble itself. But it lets +% \cs{index@preamble} to be the preamble of the index with the actual +% shortcut, before printing an index using \cs{printindex} or +% \cs{printsubindex}. +% +% +% \DescribeMacro{\useindexpreamble} +% If you are defining your own index environment or if you extend +% \texttt{theindex} environment using e.g. \cs{extendtheindex}, you may use +% \cs{useindexpreamble} with syntax: +% \begin{quote} +% \cs{useindexpreamble}\oarg{additional commands} +% \end{quote} +% to print the preamble of the actual index, which was set using +% \cs{setindexpreamble}. This is not related to the KOMA-Script classes, it +% can also be used e.g. with the standard classes. The commands from optional +% argument \meta{additional commands} are only used, if the preamble is +% defined and not empty. +% +% +% \DescribeMacro{\indexshortcut} +% The macro \cs{indexshortcut} is only defined at \cs{printindex} and +% \cs{printsubindex}. It expands to the shortcut of the actual index. So you +% may use it at your own index environment or extending the \texttt{theindex} +% environment using e.g. \cs{extendtheindex}. +% +% +% \DescribeMacro{\extendtheindex} +% Most classes define the environment \texttt{theindex} to be used for +% printing the index. Using \cs{extendtheindex} with syntax +% \begin{quote} +% \cs{extendtheindex}\marg{before begin}\marg{after begin}^^A +% \marg{before end}\mbox{\marg{after end}} +% \end{quote} +% you may extend this command. The commands from \meta{before begin} are used +% at \cs{begin\{theindex\}} just after starting the group but before starting +% the index. The commands from \meta{after begin} are used after +% \cs{begin\{theindex\}}. The commands from \meta{before end} are used before +% \cs{end\{theindex\}}. The commands from \meta{after end} are used at +% \cs{end\{theindex\}} just after ending the index but just before ending the +% group. +% +% +% \subsection{Examples} +% \label{examples} +% +% Let's see how you may get more than one index. The text of the example is +% silly, so don't think about the text, think about the usage of +% \Package{splitidx}. +% +% \begin{flushleft}\ttfamily +% \cs{documentclass}\{article\} \percentchar \textit{ We use \Class{article} +% class \dots}\\ +% \cs{usepackage}\{splitidx\} \percentchar \textit{ \dots\ and the +% \Package{splitidx} package}\\ +% \cs{makeindex} \percentchar \textit{ And we want index generation}\\ +% ~\\ +% \percentchar \textit{ We define 4 indices:}\\ +% \cs{newindex}[General Index]\{idx\} \percentchar \textit{ Name and shortcut +% of the 1st index}\\ +% \cs{newindex}[Index of Animals]\{ani\} \percentchar \textit{ \dots\ 2nd +% index}\\ +% \cs{newindex}[Index of Fruits]\{fru\} \percentchar \textit{ \dots\ 3rd +% index}\\ +% \cs{newindex}[Index of Vegetables]\{veg\} \percentchar \textit{ \dots\ 4th +% index}\\ +% ~\\ +% \cs{begin}\{document\}\\ +% Apples\cs{sindex}[fru]\{apple\} \percentchar \textit{ an entry to +% }fru\texttt{ index}\\ +% and oranges\cs{sindex}[fru]\{orange\} \percentchar \textit{ an entry to +% }fru\texttt{ index}\\ +% are fruits\cs{sindex}\{fruits\}.\ \percentchar \textit{ an implicit entry +% to }idx\textit{ index}\\ +% Tomatoes\cs{sindex}[veg]\{tomato\} \percentchar \textit{ an entry to +% }veg\textit{ index}\\ +% are\\ +% vegetables\cs{index}\{vegetables\}.\ \percentchar \textit{ an implicit +% entry to }idx\textit{ index}\\ +% Cats\cs{sindex}[ani]\{cat\} \percentchar \textit{ an entry to +% }ani\textit{ index}\\ +% are animals\cs{sindex}[idx]\{animals\}.\ \percentchar \textit{ an explicite +% entry to }idx\textit{ index}\\ +% ~\\ +% \cs{printindex*} \percentchar \textit{ print all indices}\\ +% \cs{end}\{document\} +% \end{flushleft} +% After processing the file above with \LaTeX{} you'll get a raw index file +% with following contents: +% \begin{verbatim} +% \indexentry[fru]{apple}{1} +% \indexentry[fru]{orange}{1} +% \indexentry{fruits}{1} +% \indexentry[veg]{tomato}{1} +% \indexentry{vegetables}{1} +% \indexentry[ani]{cat}{1} +% \indexentry[idx]{animals}{1} +% \end{verbatim}\vspace{-\baselineskip} +% Section~\ref{program} shows, how you can process this raw index file to get +% several raw index files and several index files. You will get four index +% files. Each of it will be input with the single \cs{printindex*} command at +% the example above. Each will produce a single section starting on an new +% page with one column section headings ``General Index'', ``Index of +% Animals'', ``Index of Fruits'' and ``Index of Vegetables''. Each index is +% printed in twocolumn mode. +% +% Maybe you would like to have all indices being subsections at one +% section. You can do this, if you replace the \cs{printindex*} command at the +% example above by the following: +% \begin{flushleft}\ttfamily +% \cs{twocolumn}[\percentchar\textit{ set the title onecolumn}\\ +% \ \cs{section*}\{Indices\} \percentchar\textit{ the section with the +% indices}\percentchar\\ +% \ \cs{markboth}\{Indices\}\{Indices\} \percentchar\textit{ setting up the +% running headline }\percentchar\\ +% ]\percentchar\textit{ but the indices twocolumn}\\ +% \cs{printsubindex*} \percentchar\textit{ print all indices} +% \end{flushleft} +% Note that I've used \cs{printsubindex*} instead of \cs{printindex*} at this +% modification. You don't need to setup the running headline, if you are using +% page style \texttt{plain}, which is default at \Class{article} class. But if +% you're using page style \texttt{headings} you should do this, if you are +% using \cs{section*}. If you are using a KOMA-Script class, you can use +% \cs{addsec} or \cs{addsec*} instead of \cs{section*} to not need manual +% updating of the running headline. +% +% Maybe you want the general index to be the section, while the other indices +% should be subsections of the general index. Maybe you'll try to replace the +% above by the following: +% \begin{flushleft}\ttfamily +% \percentchar\textit{\#\#\#\#\# This will not do the thing you wanted! +% \#\#\#\#\#}\\ +% \cs{printindex}[idx] \percentchar\textit{ print index }idx\textit{ as +% section}\\ +% \cs{printsubindex}[ani] \percentchar\textit{ print index }ani\textit{ as +% subsection}\\ +% \cs{printsubindex}[fru] \percentchar\textit{ print index }fru\textit{ as +% subsection}\\ +% \cs{printsubindex}[veg] \percentchar\textit{ print index }veg\textit{ as +% subsection}\\ +% \end{flushleft} +% But this will result in a twocolumn section with general index \texttt{idx} +% and three onecolumn subsections with the other indices and a page break +% after the general index. Why? At the end of \texttt{theindex} environment of +% \cs{printindex} the onecolumn mode, which was valid before \cs{printindex} +% will be restored. If twocolumn mode was valid before \cs{printindex} a +% \cs{clearpage} command will be included at the end of \texttt{theindex}. +% So what's the solution? Remembering the \cs{extendtheindex} command you can +% write: +% \begin{flushleft}\ttfamily +% \cs{begingroup} \percentchar\textit{ hold following extension local to this +% group}\\ +% \ \cs{extendtheindex}\percentchar \textit{ some changes of +% }theindex\textit{ environment}\\ +% \ \ \{\}\percentchar\textit{ no change before beginning}\\ +% \ \ \{\}\percentchar\textit{ no change after beginning}\\ +% \ \ \{\cs{let}\cs{onecolumn}\cs{relax} \percentchar\textit{ deactivate +% \cs{onecolumn} before ending}\\ +% \ \ \ \cs{let}\cs{clearpage}\cs{relax} \percentchar\textit{ deactivate +% \cs{clearpage} before ending}\\ +% \ \ \}\percentchar \textit{ changes before ending}\\ +% \ \ \{\}\percentchar\textit{ no change after ending}\\ +% \ \cs{printindex}[idx] \percentchar\textit{ print index }idx\textit{ as +% section}\\ +% \cs{endgroup} \percentchar\textit{ end group with extended }theindex\textit{ +% environment}\\ +% \cs{printsubindex}[ani] \percentchar\textit{ print index }ani\textit{ as +% subsection}\\ +% \cs{printsubindex}[fru] \percentchar\textit{ print index }fru\textit{ as +% subsection}\\ +% \cs{printsubindex}[veg] \percentchar\textit{ print index }veg\textit{ as +% subsection}\\ +% \cs{onecolumn} \percentchar\textit{ finish the indices} +% \end{flushleft} +% With this extension the whole index will be set twocolumn with no page break +% before the first subsection. But you have to switch back to onecolumn mode +% manually at the end of the indices. +% +% The example above may be modified, if you want a onecolumn index: +% \begin{flushleft}\ttfamily +% \cs{begingroup} \percentchar\textit{ hold following extension local to this +% group}\\ +% \ \cs{makeatletter} \percentchar\textit{ allow }@\textit{ at macro names}\\ +% \ \cs{extendtheindex}\percentchar \textit{ some changes of +% }theindex\textit{ environment}\\ +% \ \ \{\cs{let}\cs{twocolumn}\cs{@firstoptofone} \percentchar\textit{ +% deactivate \cs{twocolumn}}\\ +% \ \ \ \cs{let}\cs{onecolumn}\cs{@firstoptofone} \percentchar\textit{ +% deactivate \cs{twocolumn}}\\ +% \ \ \ \cs{let}\cs{clearpage}\cs{relax} \percentchar\textit{ deactivate +% \cs{clearpage}}\\ +% \ \ \}\percentchar \textit{ changes before beginning}\\ +% \ \ \{\}\percentchar\textit{ no change after beginning}\\ +% \ \ \{\}\percentchar\textit{ no change before ending}\\ +% \ \ \{\}\percentchar\textit{ no change after ending}\\ +% \ \cs{makeatother} \percentchar\textit{ deactivate \cs{makeatletter}}\\ +% \ \cs{printindex} \percentchar\textit{ print index}\\ +% \cs{endgroup} \percentchar\textit{ end group with extended }theindex\textit{ +% environment} +% \end{flushleft} +% This not only works with splitted index. You may use this also with one +% single index. +% +% I hope, that these examples were useful to understand, how to use +% \Package{splitidx}. Next section will show you, how to generate the indices +% from a single raw index. +% +% +% \section{Splitting the index} +% \label{program} +% +% At most you'll call one of the \Program{splitindex} programs with one +% parameter, the name of the raw index file, to split the raw index file into +% several raw index files and call the index processor +% \Program{MakeIndex}. Some of you will also set options to use another index +% processor e.g. \Program{xindy} or to set some options of the index processor +% e.g. ``\Cmdline{-g}'' to use German sorting with \Program{MakeIndex}. Only +% few of you will also change the parsing of the raw index file and the +% generation if the filenames and contents of the several new raw index files. +% +% The names of the options and the syntax of the Arguments is same at all of +% the programs except \Program{splitindex.tex} (see section~\ref{TeX}): +% \begin{description}\setlength{\labelsep}{1em} +% \item[\texttt{--help}] +% \item[{\makebox[1.2em][l]{\texttt{-h}}}]\vspace{-2\itemsep} +% Show information about usage, options and arguments and terminate without +% processing a index file. +% \item[\texttt{--makeindex} \meta{program name}]~ +% \item[\texttt{-m} \meta{program name}]\vspace{-2\itemsep} +% Call \meta{program name} +% instead of \Program{makeindex} to process each generated raw index +% file. You may set this variable to an empty value. How this may be done +% depends on the shell, which you are using. Using bash you may achieve an +% empty value e.g. using \texttt{""} or \texttt{''}. An empty value means: +% Don't call an index processor. +% \item[\texttt{--identify} \meta{regular expression}]~ +% \item[\texttt{-i} \meta{regular expression}]\vspace{-2\itemsep} +% Uses \meta{regular +% expression} to identify the index short cut and the contents of the +% raw index file with this shortcut. The default value is: +% ``\verb|^(\\indexentry)\[([^]]*)\](.*)$|''. This means: +% \begin{description} +% \item[{\makebox[1em][l]{\texttt{\textasciicircum}}}] +% Search from beginning of the line. +% \item[\texttt{(\string\\indexentry)}]~\par +% Search for ``\verb|\indexentry|'' and +% set group 1 to this. +% \item[{\makebox[1em][l]{\texttt{\string\[}}}] +% Search for ``\verb|[|'' and ignore it. +% \item[\texttt{([\textasciicircum]]*)}]~\par +% Search for any character which is not ``]'' and set group 2 to this. +% \item[{\makebox[1em][l]{\texttt{\string\]}}}] +% Search for ``\verb|]|'' and ignore it. +% \item[\texttt{(.*)\$}]~\par +% Search for all characters till end of line and set group 3 to these. +% \end{description} +% The \meta{regular expression} is POSIX~1003.2 compatible. +% \item[\texttt{--resultis} \meta{pattern}]~ +% \item[\texttt{-r} \meta{pattern}]\vspace{-2\itemsep} +% Set the lines, which are written to the +% generated raw index files after identification (see option +% \texttt{--identify}) to \meta{pattern}. Each \texttt{\$}\meta{digit} at +% \meta{pattern} will be replaced by the corresponding group, e.g. \verb|$1| +% will be replaced by the first group (see \texttt{--identify}). The default +% is: ``\verb|$1$3|'', which means: contents of group 1 and group 3. +% +% If the \meta{regular expression} of option \texttt{--identify} doesn't +% match a line at the raw index file the line itself will be written. +% \item[\texttt{--suffixis} \meta{pattern}]~ +% \item[\texttt{-s} \meta{pattern}]\vspace{-2\itemsep} +% Set the suffix of the names of the generated raw index files after +% identification (see option \texttt{--identify}) to \meta{pattern}. Each +% \texttt{\$}\meta{digit} at \meta{pattern} will be replaced by the +% corresponding group, e.g. \verb|$1| will be replaced by the first group +% (see \texttt{--identify}). The default is: ``\verb|-$2|'', which means: +% character `\texttt{-}' followed by contents of group 2. +% +% If the \meta{regular expression} of option \texttt{--ifentify} doesn't +% match a line at the raw index file, all groups will be set to +% ``\texttt{idx}''. +% \item[\texttt{--verbose}] +% \item[{\makebox[1.2em][l]{\texttt{-v}}}]\vspace{-2\itemsep} +% Increase verbosity by one. More verbose means: tell the user more about, +% what the program is doing. +% \item[\texttt{--version}] +% \item[{\makebox[1.2em][l]{\texttt{-V}}}]\vspace{-2\itemsep} +% Show information about program version and terminate without processing a +% index file. +% \end{description} +% The OpenBSD binary \Program{splitindex-OpenBSD-i386} doesn't understand the +% long option names (\texttt{--makeindex}, \texttt{--identify} \dots). But you +% can use the alternative short option names (\texttt{-m}, \texttt{-i} \dots). +% +% The first no-option-argument at the command line is the name if the raw +% index file, which has to be processed. All arguments, which follow the +% argument ``\texttt{--}'' are interpreted as no-optional-arguments. All but +% the first no-option-arguments will be passed to the index processor. +% +% You will find some examples at the following subsections. +% +% +% \subsection{Using \Program{splitindex.pl}} +% \label{perl} +% +% This is the reference implementation. Let's use an example to demonstrate, +% how it works. If you have following \LaTeX{} file ``\File{allabout.tex}'': +% \begin{verbatim} +% \documentclass{article} +% \usepackage[makeindex]{splitidx} +% \begin{document} +% Apples\sindex[fru]{apple} and oranges\sindex[fru]{orange} are +% fruits\sindex{fruits}. +% Tomatos\sindex[veg]{tomato} are vegetables\sindex{vegetables}. +% Cats\sindex[ani]{cat} are animals\sindex[idx]{animals}. +% \end{document} +% \end{verbatim}\vspace{-\baselineskip} +% this generates a file ``File{allabout.idx}'': +% \begin{verbatim} +% \indexentry[fru]{apple}{1} +% \indexentry[fru]{orange}{1} +% \indexentry{fruits}{1} +% \indexentry[veg]{tomato}{1} +% \indexentry{vegetables}{1} +% \indexentry[ani]{cat}{1} +% \indexentry[idx]{animals}{1} +% \end{verbatim}\vspace{-\baselineskip} +% +% This file can't be processed by a index processor like +% \Program{MakeIndex}. If you want so split these raw index file into several +% and run the default index processor, you do the following call (the +% \Prompt{} is a symbol for the shell prompt): +% \begin{quote} +% \Prompt{}\verb|splitindex.pl allabout.idx| +% \end{quote} +% You may omit the extension ``\File{.idx}'': +% \begin{quote} +% \Prompt{}\verb|splitindex.pl allabout| +% \end{quote} +% Both commands will result in a file \File{allabout-fru.idx}: +% \begin{verbatim} +% \indexentry[fru]{apple}{1} +% \indexentry[fru]{orange}{1} +% \end{verbatim}\vspace{-\baselineskip} +% a file \File{allabout-idx.idx} +% \begin{verbatim} +% \indexentry{fruits}{1} +% \indexentry{vegetables}{1} +% \indexentry{animals} +% \end{verbatim}\vspace{-\baselineskip} +% a file \File{allabout-veg.idx}: +% \begin{verbatim} +% \indexentry[veg]{tomato}{1} +% \end{verbatim}\vspace{-\baselineskip} +% and a file \File{allabout-ani.idx}: +% \begin{verbatim} +% \indexentry[ani]{cat}{1} +% \end{verbatim}\vspace{-\baselineskip} +% After generation of these files, it calls the default index processor using +% the command lines: +% \begin{verbatim} +% makeindex allabout-fru.idx +% makeindex allabout-idx.odx +% makeindex allabout-veg.idx +% makeindex allabout-ani.idx +% \end{verbatim}\vspace{-\baselineskip} +% These calls create the raw index files \File{allabout-fru.ind}, +% \File{allabout-idx.ind}, \File{allabout-veg.ind} and +% \File{allabout-ani.ind}, which can be loaded to the document using +% e.g. \cs{printindex} from package \Package{splitidx}. +% +% If you don't want \Program{splitindex} to call any index processor, use +% \begin{quote} +% \Prompt{}\verb|splitindex.pl -m "" allabout| +% \end{quote} +% instead of the shell command above. +% +% You may achieve the same files like above using (it's one input line not two +% like shown here): +% \begin{quote}\raggedright +% \Prompt{}\verb|splitindex.pl -i '^\\indexentry\[([^]]*)\](.*)$'| +% \verb|-s '-$1'| \verb|-r '\\indexentry$2' allabout| +% \end{quote} +% +% If you want \Program{splitindex} to call \Program{makeindex} with additional +% options ``\verb|-s foo.ist|'' to use the MakeIndex style file +% \File{foo.ist}, you can do this call: +% \begin{quote} +% \Prompt{}\verb|splitindex.pl allabout -- -s foo.ist| +% \end{quote} +% As you see ``\verb|--|'' is used to tell \Program{splitindex} to not +% interprete ``\verb|-s foo.ist|'' as option ``\verb|--suffixis foo.ist|''. +% All \Program{splitindex} options must be put before ``\verb|--|'' but you +% can put the raw file argument ``\verb|allabout|'' after that: +% \begin{quote} +% \Prompt{}\verb|splitindex.pl -- allabout -s foo.ist| +% \end{quote} +% +% If you want so use index processor \Program{xindy} instead of default index +% processor \Program{MakeIndex} you can do this call: +% \begin{quote} +% \Prompt{}\verb|splitindex.pl -m xindy allabout| +% \end{quote} +% If this is not at the standard \texttt{PATH} you may set the whole path: +% \begin{quote} +% \Prompt{}\verb|splitindex.pl -m /home/me/bin/xindy allabout| +% \end{quote} +% With most perl implementations perl module \verb|Getopt::Long| allows to +% put options after no-option-arguments. So you may also write: +% \begin{quote} +% \Prompt{}\verb|splitindex.pl allabout -m /home/me/bin/xindy| +% \end{quote} +% with the same result. +% +% +% \subsection{Using \Program{splitindex.jar}} +% \label{Java} +% +% This should also be portable. If you are not using Sun Java 1.4.1 you may +% try to recompile this using the shell command: +% \begin{quote} +% \Prompt{}\verb|javac splitindex.java| +% \end{quote} +% This should result in a new \File{splitindex.class}. But it will fail +% e.g. with Sun Java 1.3, because regular expressions are needed, which are +% not available at Sun Java 1.3. +% +% The call of \Program{splitindex.class} is almost the same like shown at +% section~\ref{perl} for \Program{splitindex.pl}, but you have to replace +% ``\verb|splitindex.pl|'' by ``\verb|java splitindex|''. So the last example +% from section~\ref{perl} becomes: +% \begin{quote} +% \Prompt{}\verb|java splitindex allabout -m /home/me/bin/xindy| +% \end{quote} +% +% +% \subsection{Using \Program{splitindex} or \Program{splitindex.exe}} +% \label{C} +% +% The Linux program \Program{splitindex} was compiled using glibc, so it works +% same like \Program{splitindex.pl} and you may use not only: +% \begin{quote} +% \Prompt{}\verb|splitindex -m /home/me/bin/xindy allabout| +% \end{quote} +% but also: +% \begin{quote} +% \Prompt{}\verb|splitindex allabout -m /home/me/bin/xindy| +% \end{quote} +% +% But the CygWin program \Program{splitindex.exe} was compiled using a +% CygWin library. Because of this all options must be put before the first +% no-option-argument. So you have to use: +% \begin{quote} +% \Prompt{}\verb|splitindex.exe -m /home/me/bin/xindy allabout| +% \end{quote} +% At: +% \begin{quote} +% \Prompt{}\verb|splitindex.exe allabout -m /home/me/bin/xindy| +% \end{quote} +% the arguments ``\verb|-m /home/me/bin/xindy|'' will be passed to the default +% index processor \Program{MakeIndex}! +% +% You need the CygWin-DLL \File{cygwin1.dll} to run +% \Program{splitindex.exe}. If you haven't already installed it, you may +% download the DLL from \url{http://cygwin.com/snapshots}. You need +% \Program{bzip2}, which can be found at \url{http://source.redhat.com/bzip2}, +% to decompress it. You may use \url{http://cygwin.com/setup.exe} to download +% and install a minimal CygWin environment alternatively. +% +% The Linux-i386-ELF binary \Program{splitindex} was compiled and linked +% using: +% \begin{quote}\raggedright +% \Prompt{}\verb|gcc -O3 -Wall -osplitindex splitindex.c|\\ +% \Prompt{}\verb|strip splitindex|\\ +% \end{quote} +% The \Program{gcc} was: +% \begin{verbatim} +% gcc (GCC) 3.2 +% Copyright (C) 2002 Free Software Foundation, Inc. +% \end{verbatim}\vspace{-\baselineskip} +% The used \Program{glibc} is version 2.1. +% +% If you compile another binary e.g. for BSD, please contact me, so we may put +% the new binary into the distribution or can build another binary +% distribution. +% +% +% \subsection{Using \Program{splitindex.tex}} +% \label{TeX} +% +% The \TeX{} or \LaTeX{} program \Program{splitindex.tex} doesn't know any +% options or arguments. It number of files, which can be generated, is limited +% to to number of \TeX's free write handles. If there are other lines than +% ``\verb|\indexentry|''-lines at the raw index file, running +% \Program{splitindex.tex} will result in an error. +% +% You may use \Program{splitindex.tex} interactive: +% \begin{quote} +% \Prompt{}\verb|tex splitindex| +% \end{quote} +% or +% \begin{quote} +% \Prompt{}\verb|latex splitindex| +% \end{quote} +% If you do so, you will be asked for the name of the raw index file. You have +% to omit the extension ``\File{.idx}'' answering that question. +% +% You may also use the \Program{splitindex.tex} not interactive e.g. if you +% are working with a batch. To do so you have to define macro \cs{IDX} to the +% name of the raw index file without extension ``\texttt{.idx}''. So the first +% example of section~\ref{perl} would become: +% \begin{quote} +% \Prompt{}\verb|tex \def\IDX{allabout}\input splitindex| +% \end{quote} +% You may also use \LaTeX{} instead of \TeX: +% \begin{quote} +% \Prompt{}\verb|latex \def\IDX{allabout}\input splitindex| +% \end{quote} +% +% The current version of \Program{splitindex.tex} doesn't call any index +% processor. But maybe in future a version will be able to do so. +% +% \StopEventually{^^A +% \begin{thebibliography}{99} +% \bibitem{makeindex} \textsc{Leslie Lamport}: \textit{MakeIndex: An Index +% Processor For \LaTeX}, 17 February 1987 +% \bibitem{makeindexmanual} \textsc{Pehong Chen}, \textsc{Rick P. C. Rodgers}: +% \textit{MAKEINDEX(1L)}, Manual page, 10 December 1991 +% \end{thebibliography} +% \PrintIndex\PrintChanges} +% +% +% \section{Combining Indices} +% +% Now you should know, how to use package \Package{splitidx} and the +% \Program{SplitIndex} programs to split the index. But what about combining +% two or more indices to one, e.g. you don't want vegetables and fruits in the +% same index? Try this: +% \begin{flushleft}\ttfamily +% \cs{documentclass}\{article\} \percentchar \textit{ We use \Class{article} +% class \dots}\\ +% \cs{usepackage}\{splitidx\} \percentchar \textit{ \dots\ and the +% \Package{splitidx} package}\\ +% \cs{makeindex} \percentchar \textit{ And we want index generation}\\ +% ~\\ +% \percentchar \textit{ We define 4 indices:}\\ +% \cs{newindex}[General Index]\{idx\} \percentchar \textit{ Name and shortcut +% of the 1st index}\\ +% \cs{newindex}[Index of Animals]\{ani\} \percentchar \textit{ \dots\ 2nd +% index}\\ +% \cs{newindex}[Index of Fruits And Vegetables]\{fru\} \percentchar +% \textit{ \dots\ 3rd +% index}\\ +% ~\\ +% \cs{begin}\{document\}\\ +% Apples\cs{sindex}[fru]\{apple\} \percentchar \textit{ an entry to +% }fru\texttt{ index}\\ +% and oranges\cs{sindex}[fru]\{orange\} \percentchar \textit{ an entry to +% }fru\texttt{ index}\\ +% are fruits\cs{sindex}\{fruits\}.\ \percentchar \textit{ an implicit entry +% to }idx\textit{ index}\\ +% Tomatoes\cs{sindex}[veg]\{tomato\} \percentchar \textit{ an entry to +% }veg\textit{ index}\\ +% are\\ +% vegetables\cs{index}\{vegetables\}.\ \percentchar \textit{ an implicit +% entry to }idx\textit{ index}\\ +% Cats\cs{sindex}[ani]\{cat\} \percentchar \textit{ an entry to +% }ani\textit{ index}\\ +% are animals\cs{sindex}[idx]\{animals\}.\ \percentchar \textit{ an explicite +% entry to }idx\textit{ index}\\ +% ~\\ +% \cs{printindex*} \percentchar \textit{ print all indices}\\ +% \cs{end}\{document\} +% \end{flushleft} +% And do the following call after splitting the index using +% \Program{SplitIndex}: +% \begin{quote}\raggedright +% \Prompt{}\verb|makeindex allabout-veg.idx allabout-fru.idx|\\ +% \end{quote} +% Alternatively you can concatenate \File{allabout-fru.idx} to +% \File{allabout-veg.idx} before running the index processor on +% \File{allabout-veg.idx}. +% +% +% +% \section{Implementation of \Package{splitidx}} +% +% \begin{macrocode} +%<*package> +% \end{macrocode} +% +% \subsection{Options} +% +% The first option is used to activate index generation. +% \begin{macrocode} +\DeclareOption{makeindex}{\AtEndOfPackage{\makeindex}} +% \end{macrocode} +% +% \changes{v0.9}{2006/05/07}{new option \texttt{useindex}} +% With option \texttt{useindex} the original command \cs{index} behaves like +% \cs{sindex}. +% \begin{macrocode} +\DeclareOption{useindex}{% + \def\@se@nd@xc@d@{\let\index\sindex}% + \AtEndOfPackage{\@se@nd@xc@d@}% +} +\let\@se@nd@xc@d@\relax +% \end{macrocode} +% +% There is also an option to make \cs{sindex} ignores the optional argument and +% behaves like \cs{index}. +% \begin{macrocode} +\DeclareOption{allatone}{% + \ifx\@se@nd@xc@d@\relax\else + \PackageInfo{splitidx}{option `allatone' overwrites option `useindex'}% + \let\@se@nd@xc@d@\relax + \fi + \AtEndOfPackage{% + \renewcommand*{\sindex}[1][]{\index}% + \g@addto@macro\makeindex{\renewcommand*{\sindex}[1][]{\index}}% + }% +} +% \end{macrocode} +% +% \changes{v0.9}{2006/05/07}{new option \texttt{protected}} +% Do not expand index arguments. +% \begin{macrocode} +\newif\if@verbindex\@verbindexfalse +\DeclareOption{protected}{\@verbindextrue} +% \end{macrocode} +% +% \changes{v0.2}{2002/11/15}{new option \texttt{idxcommands}} +% With option \texttt{idxcommands} every \cs{newindex} also defines a new index +% command. +% \begin{macrocode} +\newif\if@newidxcmd\@newidxcmdfalse +\DeclareOption{idxcommands}{\@newidxcmdtrue} +% \end{macrocode} +% +% \changes{v0.2}{2002/11/15}{new option \texttt{split}} +% With option \texttt{split} each index uses its own index file. +% \begin{macrocode} +\newif\if@splitidx\@splitidxfalse +\DeclareOption{split}{\@splitidxtrue} +% \end{macrocode} +% +% Processing the options +% \begin{macrocode} +\ProcessOptions\relax +% \end{macrocode} +% +% +% \subsection{Setting an Index Entry} +% +% \begin{macro}{\see} +% \begin{macro}{\seealso} +% \begin{macro}{\seename} +% \begin{macro}{\alsoname} +% These are four standard macros, which are also defined at +% \Package{makeidx}. Hey, these definitions are stolen from \Package{makeidx}! +% No, no, I'm not a bad guy, read ``\File{legal.txt}'', which comes with +% \Package{makeidx}. +% \begin{macrocode} +\newcommand*\see[2]{\emph{\seename} #1} +\providecommand*\seealso[2]{\emph{\alsoname} #1} +\providecommand\seename{see} +\providecommand*\alsoname{see also} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\sindex} +% \begin{macro}{\@wrsindex} +% \changes{v0.9}{2006/03/07}{optionally do not expand the index argument} +% \begin{macro}{\@@wrsindex} +% This works similar to original \cs{index} but uses a splitted index. So it +% allows an optional argument. +% \begin{macrocode} +\newcommand*{\sindex}[2][]{% +} +\g@addto@macro\makeindex{% + \renewcommand*{\sindex}{% + \@bsphack\begingroup + \@sanitize + \@wrsindex + }% + \typeout{Using splitted index at \jobname.idx}% + \@se@nd@xc@d@ +} +% \end{macrocode} +% At the following \cs{@@wrsindex} is used as a hook. If it is defines, it is +% used to write out the index entry. This hook may be used from +% e.g. \Package{hyperref} to add \verb|hyperpage| to the font selection of the +% page number. This only works with \verb+encap |+. +% \changes{v1.0}{2006/07/30}{one level expansion of \cs{\@tempa} for +% hyperref hook} +% \begin{macrocode} +\newcommand*{\@wrsindex}[2][]{% + \ifx\relax#1\relax + \if@splitidx + \@wrsindex[idx]{#2}% + \else + \def\@tempa{#2}% + \if@verbindex\@onelevel@sanitize\@tempa\fi + \@wrindex{\@tempa}% + \fi + \else + \def\@tempa{#2}% + \csname index@#1@hook\endcsname + \expandafter\ifx\csname @@wrsindex\endcsname\relax + \@@@wrsindex{#1}{{\@tempa}{\thepage}}% + \else + \def\@tempb{\@@wrsindex{#1}}% + \expandafter\@tempb\@tempa||\\% + \fi + \endgroup + \@esphack + \fi +} +\newcommand*{\@@@wrsindex}[2]{% + \begingroup + \if@splitidx + \expandafter\ifx\csname @indexfile@#1\endcsname\relax + \PackageError{splitidx}{% + Index entry for not existing index% + }{% + You've tried to set an index to index `#1', without + defining\MessageBreak + that index before using \string\newindex.\MessageBreak + This is only allowed, if you are not using package option + `split'.% + }% + \else + \expandafter\protected@write\csname @indexfile@#1\endcsname{% + \csname index@#1@writehook\endcsname + \csname index@#1@writehook@once\endcsname + }{% + \string\indexentry#2% + }% + \fi + \else + \protected@write\@indexfile{% + \csname index@#1@writehook\endcsname + \csname index@#1@writehook@once\endcsname + }{% + \string\indexentry[#1]#2% + }% + \fi + \endgroup +} +% \end{macrocode} +% If \Package{hyperref} was loaded at \cs{begin\{document\}} and +% \Package{hyperref}-option \texttt{hyperindex} isn't disabled, and the hook +% is not used, define it: +% \begin{macrocode} +\AtBeginDocument{% + \begingroup\expandafter\expandafter\expandafter\endgroup + \expandafter\ifx\csname ifHy@hyperindex\endcsname\relax + \else + \csname ifHy@hyperindex\endcsname + \expandafter\ifx\csname @@wrsindex\endcsname\relax + \def\@@wrsindex#1#2|#3|#4\\{% + \ifx\\#3\\% + \@@@wrsindex{#1}{{#2|hyperpage}{\thepage}}% + \else + \def\Hy@temp@A{#3}% + \ifx\Hy@temp@A\HyInd@ParenLeft + \@@@wrsindex{#1}{{#2|#3hyperpage}{\thepage}}% + \else + \ifx\Hy@temp@A\HyInd@ParenRight + \@@@wrsindex{#1}{{#2|#3hyperpage}{\thepage}}% + \else + \@@@wrsindex{#1}{{#2|#3}{\thepage}}% + \fi + \fi + \fi + }% + \fi + \csname fi\endcsname + \fi +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\AtWriteToIndex} +% \changes{v1.1}{2009/02/26}{New} +% Add commands to the write hook. +% \begin{macrocode} +\newcommand*{\AtWriteToIndex}[1]{% + \expandafter\ifx\csname index@#1@writehook\endcsname\relax + \expandafter\let\csname index@#1@writehook\endcsname\@empty + \fi + \expandafter\g@addto@macro\csname index@#1@writehook\endcsname +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\AtNextWriteToIndex} +% \changes{v1.1}{2009/02/26}{New} +% Like \cs{AtWriteToIndex} only once. +% \begin{macrocode} +\newcommand*{\AtNextWriteToIndex}[1]{% + \expandafter\ifx\csname index@#1@writehook@once\endcsname\relax + \expandafter\gdef\csname index@#1@writehook@once\endcsname{% + \expandafter\global\expandafter\let\expandafter + \csname index@#1@writehook@once\endcsname\relax + }% + \fi + \expandafter\g@addto@macro\csname index@#1@writehook@once\endcsname +} +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Printing One Or More Indices} +% +% \begin{macro}{\printindex} +% \begin{macro}{\printindex*} +% This is used to print an index in the normal way. In most cases this uses +% |theindex| environment, but it need not. +% \begin{macrocode} +\newcommand*{\printindex}{% +% \end{macrocode} +% The command may be called in the star version, which prints all defined +% indices. This is same as \cs{printindices}. +% \begin{macrocode} + \@ifstar {% + \begingroup + \let\printindex@@endhook=\printindex@endhook + \let\printindex@endhook=\relax + \printindices% + \csname printindex@@endhook\endcsname + \endgroup + }{% +% \end{macrocode} +% It may also be called with optional arguments to print one of the indices: +% \begin{macrocode} + \@ifnextchar [\@printindex%] brace check comment +% \end{macrocode} +% Or it is called without any parameter and so it is same as at +% \Package{makeidx} package: +% \begin{macrocode} + {% + \@input@{\jobname.ind}% + \csname printindex@endhook\endcsname + }% + }% +} +% \end{macrocode} +% \begin{macro}{\@printindex} +% This is used to print one of the indices. The optional (here obligatory) +% argument is the shortcut of the index. +% \begin{macrocode} +\newcommand*{\@printindex}{} +\def\@printindex[#1]{% +% \end{macrocode} +% There can be one more optional argument, which is the title of the index. If +% not, the default title \cs{index@\meta{shortcut}@name} is used. +% \begin{macrocode} + \@ifnextchar [% + {\@@printindex[{#1}]}% + {\@@printindex[{#1}][\csname index@#1@name\endcsname]}% +} +% \end{macrocode} +% \begin{macro}{\@@pintindex} +% \changes{v0.2}{2002/11/15}{with option \texttt{split} general index has no +% suffix} +% We use the default environment to print one of the indices, but we redefine +% \cs{indexname} to the title of the wanted index, \cs{indexshortcut} to the +% shortcut of the wanted index and \cs{index@preamble} to the preamble of the +% wanted index. We do this in a group so it is local. +% \begin{macrocode} +\newcommand*{\@@printindex}{} +\def\@@printindex[#1][#2]{% + \begingroup + \edef\indexshortcut{#1}% + \def\indexname{#2}% + \let\index@preamble\relax + \expandafter\let\expandafter\index@preamble + \csname index@\indexshortcut @preamble\endcsname + \if@splitidx + \def\@tempa{idx}\def\@tempb{#1}% + \ifx\@tempa\@tempb\let\@indexsuffix\@gobble\fi + \fi + \@input@{\jobname\@indexsuffix{#1}.ind}% + \endgroup + \csname printindex@endhook\endcsname +} +% \end{macrocode} +% \begin{macro}{\@indexsuffix} +% This generated the suffix from the shortcut. You may redefine this +% function, if you need. I`m using a trick here, to define the macro with +% proper catcodes but not to define it global. You may also use +% \cs{@firstofone} instead of \cs{lowercase}. +% \begin{macrocode} +\begingroup +\catcode`\-12 +\lowercase{\endgroup + \newcommand*{\@indexsuffix}[1]{-#1}% +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\printindices} +% This is used to print all defined indices in the order of their definition +% and with their default titles. If the list is empty, is behaves like +% \cs{printindex} without star and optional arguments. +% \begin{macrocode} +\newcommand*{\printindices}{% + \ifx\@indices\@empty + \printindex + \else + \begingroup + \@for\@tempa:=\@indices\do{% + \expandafter\printindex\expandafter[\@tempa]% + }% + \endgroup + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\newindex} +% \changes{v0.2}{2002/11/15}{optional definition of index-shortcut-command} +% \changes{v0.2}{2002/11/15}{optional opening a new index file} +% The definition of a new index has an obligatory argument, the shortcut for +% this index, and an optional argument, the name of this index. If you omit +% the optional argument the shortcut is used for the default name if the +% index. The definition will be done global! +% \begin{macrocode} +\newcommand*{\newindex}[2][\relax]{% + \@ifundefined{index@#2@name}{% + \if@verbindex + \expandafter\gdef\csname index@#2@hook\endcsname{% + \@onelevel@sanitize\@tempa + }% + \else + \expandafter\gdef\csname index@#2@hook\endcsname{}% + \fi + \ifx\@indices\@empty + \xdef\@indices{#2}% + \else + \xdef\@indices{\@indices,#2}% + \fi + \ifx \relax#1 + \expandafter\xdef\csname index@#2@name\endcsname{#2}% + \else + \expandafter\xdef\csname index@#2@name\endcsname{#1}% + \fi + \if@newidxcmd + \expandafter\newcommand\expandafter*\csname #2\endcsname{}% + \expandafter\gdef\csname #2\endcsname{% + \sindex[#2]% + }% + \fi + \if@splitidx + \def\@tempa{#2}\def\@tempb{idx}% + \ifx\@tempa\@tempb + \global\let\@indexfile@idx=\@indexfile + \else + \expandafter\newwrite\csname @indexfile@#2\endcsname + \expandafter\immediate\expandafter\openout + \csname @indexfile@#2\endcsname=\jobname-#2.idx + \fi + \fi + }{% +% \end{macrocode} +% If the index is already defined, an error occurs: +% \begin{macrocode} + \PackageError{splitidx}{% + index `#2' already defined% + }{% + You have already defined an index with shortcut `#2'.\MessageBreak + You can't define a new index with the same shortcut. If you'll continue + \MessageBreak + The new definition will be ignored.% + }% + }% +} +\if@splitidx + \@onlypreamble\newindex +\fi +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\newprotectedindex} +% \changes{v0.9}{2006/07/03}{new command} +% Same like \cs{newindex} but always define an index with protected arguments. +% \begin{macrocode} +\newcommand*{\newprotectedindex}[2][\relax]{% + \begingroup\@verbindextrue\newindex[{#1}]{#2}\endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@indices} +% This macro stores a list of the index shortcuts. This is needed by +% e.g. \cs{printindices} and build by \cs{newindex}. +% \begin{macrocode} +\newcommand*{\@indices}{} +\gdef\@indices{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\extendtheindex} +% Extend \verb|theindex| by some macros called before starting the index, +% after starting the index, before stopping the index and after stopping the +% index. This may be used to change index behaviour. One additional change is +% done, which may be useful: before the index \cs{index@preamble} is set to +% \cs{index@\meta{shortcut}@preamble}. +% \begin{macrocode} +\newcommand{\extendtheindex}[4]{% + \begingroup\expandafter\expandafter\expandafter\endgroup + \expandafter\ifx\csname splitindex@theindex\endcsname\relax + \let\splitindex@theindex=\theindex + \let\endsplitindex@theindex=\endtheindex + \fi + \renewcommand*{\theindex}{% + #1\splitindex@theindex #2% + }% + \renewcommand*{\endtheindex}{% + #3\endsplitindex@theindex #4% + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\setindexpreamble} +% Set one of the splitted index preambles or the original one. +% \begin{macrocode} +\newcommand{\splitindex@setip}{} +\let\splitindex@setip\setindexpreamble +\let\setindexpreamble\relax +\newcommand{\setindexpreamble}[2][]{% + \ifx \relax#1\relax + \begingroup\expandafter\expandafter\expandafter\endgroup + \expandafter\ifx\csname splitindex@setip\endcsname\relax + \@namedef{index@preamble}{#2}% + \else + \splitindex@setip{#2}% + \fi + \else + \@namedef{index@#1@preamble}{#2}% + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\useindexpreamble} +% Use the index preamble and optional add additional information after it, if +% it exists and if it is not empty: +% \begin{macrocode} +\newcommand{\useindexpreamble}[1][]{% + \begingroup\expandafter\expandafter\expandafter\endgroup + \expandafter\ifx\csname index@preamble\endcsname\relax\else + \ifx\index@preamble\@empty\else + \index@preamble #1% + \fi + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\printsubindex} +% \begin{macro}{\printsubindex*} +% Works like \cs{printindex} but changes some macros before to level down the +% headings at the index generation. +% \begin{macrocode} +\newcommand*{\printsubindex}{% + \begingroup + \begingroup\expandafter\expandafter\expandafter\endgroup + \expandafter\ifx\csname chapter\endcsname\relax + \let\section\subsection + \begingroup\expandafter\expandafter\expandafter\endgroup + \expandafter\ifx\csname addsec\endcsname\relax\else + \def\addsec{\setcounter{secnumdepth}{0}\subsection}% + \fi + \else + \let\chapter\section + \def\@makeschapterhead{\section*} + \let\@makechapterhead\section + \begingroup\expandafter\expandafter\expandafter\endgroup + \expandafter\ifx\csname addchap\endcsname\relax\else + \let\addchap\addsec + \fi + \fi +% \end{macrocode} +% Also, \cs{onecolumn} and \cs{twocolumn} and even \cs{clearpage} must be +% disabled. The macros \cs{onecolumn} and \cs{twocolumn} cannot be let +% \cs{relax} because the have an optional argument which must be used. +% \begin{macrocode} + \let\onecolumn\@firstoptofone + \let\twocolumn\@firstoptofone + \let\clearpage\relax + \let\cleardoublepage\relax +% \end{macrocode} +% And the mark mechanism must also use one down: +% \begin{macrocode} + \def\markboth{\expandafter\markright\@gobble}% + \ifx\@mkboth\@gobble\else\let\@mkboth\markboth\fi +% \end{macrocode} +% And the page style shouldn't change too: +% \begin{macrocode} + \let\thispagestyle\@gobble +% \end{macrocode} +% Now, using \cs{printindex} enables all of it's features: +% \begin{macrocode} + \let\printindex@endhook=\endgroup + \printindex +} +% \end{macrocode} +% \begin{macro}{\@firstoptofone} +% Read the optional argument and do it. +% \begin{macrocode} +\providecommand{\@firstoptofone}[1][]{#1} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macrocode} +%</package> +% \end{macrocode} +% +% \Finale +% +\endinput +% +% end of file `splitindex.dtx' +%%% Local Variables: +%%% mode: doctex +%%% TeX-master: t +%%% End: |