% \CheckSum{626} % \iffalse % ====================================================================== % splitidx.dtx % Copyright (c) Markus Kohm, 2002-2016 % % $Id: splitidx.dtx 4 2016-02-18 10:13:32Z mjk $ % % 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 "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 % %\ProvidesFile{splitidx.drv}[% %\ProvidesPackage{splitidx}[% % \fi 2016/02/18 v1.2c multiple indices for LaTeX] % \iffalse %<*driver> \documentclass{ltxdoc} \usepackage{color,alltt} \usepackage{hypdoc} \DeclareRobustCommand*{\Prompt}{{\color{green}\textbf{\$}}} \DeclareRobustCommand*{\Package}[1]{\textsf{#1}} \DeclareRobustCommand*{\Class}[1]{\textsf{#1}} \DeclareRobustCommand*{\Program}[1]{\textsf{#1}} \DeclareRobustCommand*{\File}[1]{\texttt{#1}} \DeclareRobustCommand*{\Cmdline}[1]{\texttt{#1}} \providecommand*{\url}{\texttt} \makeatletter \providecommand*{\Autoref}[1]{% \@ifundefined{hyperref}{Section~\ref{#1}}{% \hyperref[#1]{Section~\ref*{#1}}% }% }% \makeatother \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}\ \thanks{Many thanks to Michael Palmer who improved the English user manual of the \Program{SplitIndex}.}} \date{\filedate} \begin{document} \maketitle \begin{abstract} With \Package{makeidx}, there's a standard package in \LaTeX{} to create one index for each document. But sometimes more than one index is needed. There are different packages with different solutions and different problems to generate multiple indices. \Package{splitidx} implements another solution to this problem. In addition, \Package{splitidx} also lets you customize the typesetting and appearance of these indices, as well as the formatting of individual index entries. \end{abstract} \tableofcontents \DocInput{splitidx.dtx} \end{document} % % \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} % % \changes{v1.2}{2013/04/04}{several improvements of the user manual by % Michael Palmer} % % \section{Introduction} % \label{sec:intro} % % Standard \LaTeX\ provides for only a single document index. To produce such % an index, one usually loads \Package{makeidx} and marks up index entries in % the document using the \cs{index} command. When the document is processed % with \LaTeX, the \cs{index} commands from the document are written as % \cs{indexentry} commands to the raw index file % ``\File{\cs{jobname}.idx}''. The raw index file is then processed with % \Program{MakeIndex} or another auxiliary program like \Program{xindy}, which % will produce a sorted index file named ``\File{\cs{jobname}.ind}''. This % file is then included at the end of the document using the \cs{printindex} % command.\footnote{For further details, read \protect\cite{makeindex} and % e.g.\ \protect\cite{makeindexmanual}.} % % The \Package{splitidx} package extends this process to permit the creation % of multiple indices. Separate indices are declared and given unique shortcut % identifiers with the \cs{newindex} command. In the document, individual % index entries are marked up and assigned to specific indices with the % \cs{sindex} command. For each of the declared indices, a separate % \File{.idx} file is generated, each of which is post-processed into a % separate \File{.ind} file. These \File{.ind} files are then included in the % document using a modified version of the \cs{printindex} command. % % The process outlined thus far resembles that of other multi-index packages % such as \Package{multind}. The most straightforward way to implement this % scheme, which is the one used by package \Package{multind} and others, is to % directly write a separate \File{.idx} file for each declared index when % processing the document with \LaTeX, and then to separately post-process % each \File{.idx} file with \Program{MakeIndex}. However, this approach can % run into technical limitations. \TeX{} can have no more than 16 files open % for writing at any one time. Several of these file handles are required by % \LaTeX{} itself for other purposes, such as cross references, the table of % contents, and possibly others, depending on the structure of your % document. Therefore, if you need a large number of separate indices, the % limited number of available file handles may become a problem. The % \Package{splitidx} package provides a solution to this problem. % % If the number of indices can be accommodated within the number of available % file handles, you can use \Package{splitidx} with the package option % \texttt{split}. Then, \Package{splitidx} will directly write multiple raw % index files, that is, it will behave according to the scheme just % described. On the other hand, if the number of indices exceeds the number of % available file handles, you can request \Package{splitidx} to write all % index entries to a single intermediate index file, which must then be % post-processed in order to obtain the separate raw index files. The % post-processing of the intermediate file is done with the % \Program{SplitIndex} program, which exists in several different % implementations (see below). This behavior of \Package{splitidx} is % activated by omitting option \texttt{split}, that is, it is the package's % default behavior. % % In addition to the construction of separate indices, \Package{splitidx} also % offers help with customizing the typesetting and appearance of these % indices, as well as the formatting of individual index entries. % % % \section{The \protect\Program{SplitIndex} program} % \label{sec:splitindex.program} % % \subsection{Purpose} % % While the number of files \TeX{} can open for writing is limited, using % multiple indices is normally limited too. As already mentioned in % \autoref{sec:intro} this limitation may be neutralized using a single % intermediate index file, that will be split into several raw index files by % an external post-processor: \Program{SplitIndex}. % % % \subsection{Implementation} % % The program has been implemented in five different languages, as follows: % % \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 prefer to use this, because it was the first, the % easiest and the shortest to be written. % \item[\Program{splitindex.java}] This is written using Sun Java~1.4.1. I % wrote it because Java is everywhere and may be installed everywhere and a % lot of people are able to understand Java source files. Nevertheless % There's no longer a precompiled version of this in the main distribution. % But you may download it from the repository at % \url{http://sarovar.org/plugins/scmcvs/cvsweb.php/binaries/?cvsroot=splitindex} % \item[\Program{splitindex.c}:] This is a C source of \Program{splitindex}. % I wrote the % C version 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 byte code\,---\,even, if the Java program is fast % enough. Nevertheless, there are no longer binaries of generated from this % source in the main distribution. % \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 \autoref{TeX}), but % it is system-independent and you don't need to install any 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 programs. % \changes{v1.2}{2013/04/04}{new \TeX Lua implementation of % \Program{SplitIndex}} % \item[\Program{splitindex.tlu}:] This is a new \TeX Lua version of the % program. It is platform independent like the perl script. Note, that the % syntax for regular expressions in Lua differs from the perl syntax, if you % use it instead of the perl version. Distributors should prefere the perl % version, if they also provide perl for the installation platform. % \end{description} % With the exception of the \TeX{} version, all of these programs are also % able to call the index processor on each of the resulting raw index files. % % And where is the lisp, the smalltalk, the prolog, the \dots{} version of % \Program{splitindex}? Hey, five languages are enough for me! If you need one % more, write it! % % % \section{Using the \Package{splitidx} package} % \label{package} % % \subsection{Setup} % % You can 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 can use \cs{makeindex}, which is declared % by the \LaTeX{} kernel. % You can also load the package with the 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} % % Other package options are available. The effect of the \texttt{split} option % was already described in \autoref{sec:intro}; further options are % discussed below. % % \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 by the macros \cs{printindex} and % \cs{printsubindex} (see below). If you omit \meta{index name}, the shortcut % will be used as index name. % % While it is always good practice to declare all index explicitly in the % preamble of the document, this \emph{must} be done if you also use the % package option \texttt{split}. In this case, the \cs{newindex} command opens % a raw index file to write to for each declared index. As the only exception, % the raw index file for the index entries with the default shortcut % (\texttt{idx}) will be created automatically. As noted above, the number of % index files that you can create in this way is limited, which is due to the % limited number of output streams provided by \TeX{}. If you exceed this % number, not only the \cs{newindex} macro itself may result in an error, but % also \cs{tableofcontents}, \cs{listoffigures}, \cs{listoftables} and any % other command that implicitly allocates an output stream. % % A unique shortcut declared with \cs{newindex} to refer to a specific % index becomes part of the filenames of the corresponding \File{.idx} and % \File{.ind} files. Therefore, when you choose a shortcut, make sure that you % only use characters or symbols in the \meta{shortcut} that are allowed in % filenames. On file systems that treat file names as case-insensitive, you % should not mix uppercase and lowercase letters. For maximum portability and % minimum hassle, it is best to always use only lowercase letters. % % \subsection{Marking up index entries} % % \DescribeMacro{\index}%^^A % After loading the \Package{splitidx} package, you may use the \cs{index} % command to mark up index entries in your manuscript as usual. You can find % the description of the argument and features of this command in reference % \cite{makeindex}. The \Program{splitindex} program (see % \autoref{program}) will put all index entries that were produced with % \cs{index} into the same raw index file, which is tagged with the unique % shortcut ``\texttt{idx}''; that is, the \cs{index} command does \emph{not} % allow you to assign index entries to separate indices. However, the % \texttt{useindex} option allows you to change this behavior; this is % discussed below. % % \DescribeMacro{\sindex}%^^A % The \Package{splitidx} package also defines the command \cs{sindex} with the % syntax: % \begin{quote} % \cs{sindex}\oarg{shortcut}\marg{index-entry} % \end{quote} % The \cs{sindex} command is \Package{splitidx}' mechanism for placing % individual index entries into specific indices. The target index is % identified by passing its unique shortcut, as declared with \cs{newindex}, % in the optional argument to \cs{sindex}. If not given, the shortcut defaults % to ``\texttt{idx}'', which should therefore be used to identify some sort of % general index. % % If you like, you may also request that \cs{index} should be an alias % for \cs{sindex}. To do so, you use the package % option \texttt{useindex}, e.g.: % \begin{verbatim} % \usepackage[useindex]{splitidx} % \end{verbatim}\vspace{-\baselineskip} % This may be useful when using packages like \textsf{jurabib} that expect % \cs{index} to be the index command. % % \subsection{Suppressing multiple index generation} % % Under some unfortunate circumstances, for example when working with a % publisher that enforces a rigid document format, it may be necessary to % merge the separate indices back into a single index. In this case, it is % \emph{not} necessary to strip out all the individually marked up index % identifiers. Instead, you may load the \Package{splitidx} package with the % \texttt{allintoone} option: % % \begin{verbatim} % \usepackage[allintoone]{splitidx} % \end{verbatim}\vspace{-\baselineskip} % or % \begin{verbatim} % \usepackage[allintoone,makeindex]{splitidx} % \end{verbatim}\vspace{-\baselineskip} % With this option, \Package{splitidx} will do the stripping for you, that is, % \cs{sindex}\oarg{shortcut}\linebreak[1]\marg{indexentry} will be substituted % with \cs{index}\marg{indexentry} during \LaTeX\ processing. % % \emph{Note: Currently only one of the options \texttt{allintoone} and % \texttt{useindex} can be used at same time. If you try to use both, % \texttt{useindex} will be disabled! This may result in many error % messages!} % % \subsection{Customizing index entries} % % \DescribeMacro{\AtWriteToIndex}%^^A % \Package{splitidx} uses \cs{protected@write} to write the index entries to % its output files. The \cs{AtWriteToIndex} macro lets you execute a piece of % code each time an index is written to a specific index. Usage: % \begin{quote} % \cs{AtWriteToIndex}\marg{shortcut}\marg{code} % \end{quote} % This may be useful if you want your index entries to reference not the page % number but some other counter instead. For example, in order to make each % index entry in the general index (identified by the \texttt{idx} shortcut) % point to the corresponding section number, you would write % \begin{verbatim} % \AtWriteToIndex{idx}{\let\thepage\thesection} % \end{verbatim} % Note that this will work only if the shortcut of the index is given % explicitly in each marked-up index entry; for example, % \begin{verbatim} % \sindex[idx]{Roller blades} % \end{verbatim}\vspace{-\baselineskip} % instead of % \begin{verbatim} % \sindex{Roller blades} % \end{verbatim}\vspace{-\baselineskip} % Note, if you want to use command \cs{index} instead of \cs{sindex}, you % should also use the package option \texttt{useindex}; without it, command % \cs{index} will still write the page number to the index. % % The \cs{AtWriteToIndex} command may be used only in the document preamble. % % \DescribeMacro{\AtNextWriteToIndex}%^^A % Sometimes it may be useful to execute some commands only for writing a % single index entry. To do so, you may use % \begin{quote} % \cs{AtNextWriteToIndex}\marg{shortcut}\marg{commands} % \end{quote} % instead of \cs{AtWriteToIndex}. % %\subsection{Automatic custom index commands} % % Some people do not like to write \cs{sindex[foo]}\marg{entry}. They want to % write \cs{foo}\marg{entry}. For these people, the package option % `\texttt{idxcommands}' has been implemented. This option defines a command % with the name of the \meta{shortcut} for each declared index. If you use % this option, you'll get an error if a command with this name is already % defined. Also note that if you are using this option, the characters of the % shortcuts must be letters. % % \subsection{Preventing premature expansion of index entries} % % \DescribeMacro{\newprotectedindex}%^^A % When using the standard index package \textsf{makeidx}, the \LaTeX{} kernel % command \cs{index} may expand its argument. The kernel uses \cs{@sanitize} % to avoid expansion in some cases. But this fails if the argument was already % read by another macro. So if you define a macro that reads its argument, % does something with it and then writes it to the index, this may expand the % argument. For illustration, try the 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 in 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 the same way by default. But if you use % \cs{newprotectedindex} to define a new index, it uses a trick to avoid % expansion. If all indices should behave like this, you may simply use the % package option \texttt{protected}. % \begin{verbatim} % \documentclass{article} % \usepackage{ngerman} % \usepackage[protected,useindex,makeindex]{splitidx} % \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 the command % \cs{@onelevel@sanitize} in the \LaTeX{} kernel documentation, % \texttt{source2e}. % % \subsection{Including the generated indices in your document} % % \DescribeMacro{\printindex}%^^A % \changes{v0.2a}{2003/01/05}{fix of documentation bug}%^^A % The \cs{printindex} command is used to print one index or all indices that % are declared using \cs{newindex}. How it behaves depends on the syntax you % are using. % % Used like this: % \begin{quote} % \cs{printindex}\oarg{shortcut}\oarg{index name} % \end{quote} % the index file with the optional shortcut will be included and printed, with % the optional \meta{index name} being used as the title. If \meta{index name} % is omitted, the default index name declared with \cs{newindex} will be used % instead. If this name was omitted as well, the shortcut itself will be used % as the title. % % If both optional arguments, \meta{shortcut} and \meta{index name}, are % omitted, and you are using simply % \begin{quote} % \cs{printindex} % \end{quote} % this command behaves like \cs{printindex} from package % \Package{makeidx}. You should not use this if you are using multiple % indices. % % You may also print all indices that were declared using \cs{newindex} at % once. Use the syntax: % \begin{quote} % \cs{printindex*} % \end{quote} % to do so. The indices will be printed in the order you declared them using % \cs{newindex}. % % \subsection{Typesetting the generated indices} % % \cs{printindex} uses the default index output of the class and the index % processor you are using. Usually, this will be \texttt{theindex} % environment, but it doesn't have to be this way. Note, however, that % \cs{printindex} expects the name of the index to be contained in the % \cs{indexname} macro; otherwise, it will fail to typeset the index % name.\footnote{This would be a failure of the class or used package, not of % the \Package{splitidx} package. I don't know of any class with this failure, % but package \Package{tcolorbox}'s library \File{documentation} does use % \cs{kvtcb@text@index} instead of \cs{indexname}. Since version~1.2c % \Package{splitidx} therefore also redefines \cs{kvtcb@text@index} locally.} % % \DescribeMacro{\printsubindex}%^^A % The \cs{printsubindex} command is analogous to \cs{printindex}, but it % performs some redefinitions before printing the index, as follows: % \begin{itemize} % \item demote the index heading level by 1, that is, format the index title % using \cs{section*} instead of \cs{chapter*} with classes that define % \cs{chapter} (such as \texttt{book} and \texttt{report}), and using % \cs{subsection*} instead of \cs{section*} with classes that don't define % \cs{chapter} (such as \texttt{article}); % \item deactivate \cs{onecolumn}, \cs{twocolumn} and \cs{clearpage}, % \cs{cleardoublepage} that are otherwise used to start a new page in each % index, % \item change the mark mechanism to use \cs{markright} instead of % \cs{markboth} for setting up the running headers. % \end{itemize} % Using this macro, you can print multiple indices in one chapter, if you are % using a class with \cs{chapter}, or in one section, if you are using a class % without \cs{chapter}. % % % \DescribeMacro{\setindexpreamble}%^^A % If you are using a KOMA-Script class, you'll know this command. Package % \Package{splitidx} redefines this command as follows: % \begin{quote} % \cs{setindexpreamble}\oarg{shortcut}\marg{preamble} % \end{quote} % This allows you to define a separate preamble for each index. Note: Package % \Package{splitidx} doesn't print the preamble itself. Instead, before % typesetting an index with a given shortcut using \cs{printindex} or % \cs{printsubindex}, it assigns the user-defined preamble for this shortcut % to the internal macro \cs{index@preamble}. At the user level, its value can % be accessed with the \cs{useindexpreamble} macro (see below). % % \DescribeMacro{\useindexpreamble}%^^A % If you are defining your own index environment or if you extend the existing % \texttt{theindex} environment using \cs{extendtheindex} or otherwise, you % can use \cs{useindexpreamble} to retrieve the preamble previously defined % for the current index using \cs{setindexpreamble}: % \begin{quote} % \cs{useindexpreamble}\oarg{additional commands} % \end{quote} % This macro is not limited to the KOMA-Script classes; it can also be used % e.g.\ with the standard classes. The commands passed in the optional % argument \meta{additional commands} are only used if the preamble for the % current index is defined and not empty. Authors of wrapper classes may use % this, e.g.\ to add additional vertical spaces after the index preamble if % and only if an index preamble will be printed. % % \DescribeMacro{\indexshortcut}%^^A % The macro \cs{indexshortcut} is only defined within the body of % \cs{printindex} and \cs{printsubindex}. It expands to the shortcut of the % specific index that is being printed. It may be useful when defining your % own index environment or extending the \texttt{theindex} environment using % e.g.\ \cs{extendtheindex}. % % % \DescribeMacro{\extendtheindex}%^^A % Most classes define the environment \texttt{theindex} to be used for % printing the index. Using \cs{extendtheindex} with this 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 environment. The commands passed in \meta{before begin} % are inserted in \cs{begin\{theindex\}} just after starting the group but % before the existing code defined for this code block. The commands passed in % \meta{after begin} are inserted after \cs{begin\{theindex\}}. Analogously, % the commands passed in \meta{before end} are inserted before % \cs{end\{theindex\}}, while those passed in \meta{after end} are used within % \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} % \Autoref{program} explains how to convert this intermediate file into % separate raw index files and index files. In the above example, all four % index files are input with a single \cs{printindex*} command. Each file will % produce a single section that start on a new page. The section headings % ``General Index'', ``Index of Animals'', ``Index of Fruits'' and ``Index of % Vegetables'' will be printed in onecolumn mode, followed by the index % entries printed in twocolumn mode. % % Maybe you would like to format all indices as subsections within one % section. You can do this by replacing the \cs{printindex*} command in the % example above with 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*} in this % modified example. % % We now turn to the running headers for the index pages. If you are using % page style \texttt{plain}, which is default at \Class{article} class, the % running headers are empty, so you don't need to set them up. However, if % you're using page style \texttt{headings} for your index pages and the % \cs{section*} command to format the headings of the several indices, you % should set up the running headers to match the current index titles. If you % are using a KOMA-Script class, you can use \cs{addsec} or \cs{addsec*} % instead of \cs{section*} to format the index titles, in which case you will % not need to manually update the running headers. % % Maybe you want the general index to be the section, while the other indices % should be subsections of the general index. You might then try to replace % the code above with 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 containing the general index % (identified by \texttt{idx}) and three onecolumn subsections containing the % other indices, and a page break after the general index. Why is this? % \LaTeX\ will switch to twocolumn mode as it enters the \texttt{theindex} % environment (which is created by the \cs{printindex} command) and will % revert to onecolumn mode when it exits \texttt{theindex}. If twocolumn mode % was active before \cs{printindex}, a \cs{clearpage} command will be issued % 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{ keep the 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 in twocolumn mode, with no % page break before the first subsection. However, you have to switch back to % onecolumn mode manually at the end of the indices. % % The example above may be modified as follows to obtain 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 indices but also with one % single index. % % I hope that these examples were useful to understand how to format indices % using \Package{splitidx}. The next section will show you how to generate % separate indices from a single intermediate index file. % % % \subsection{Splitting intermediate index files} % \label{program} % % Most commonly, it will be sufficient to call one of the \Program{splitindex} % programs with one parameter, the name of the intermediate index file. This % will split the intermediate file into several raw index files, and then call % \Program{MakeIndex} on each of these. The program \Program{splitindex} can % be instructed to use another index processor such as \Program{xindy}, or to % pass additional options along to the index processor, e.g.\ ``\Cmdline{-g}'' % to use German sorting with \Program{MakeIndex}. While it may be a rare need, % it is also possible to modify the parsing of the intermediate index file and % the generation of the filenames and contents of the resulting 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 % \autoref{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 an 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 using \texttt{""} or \texttt{''}. An empty value means that % no index processor will be called on the generated raw index files. % \item[\texttt{--identify} \meta{regular expression}]~ % \item[\texttt{-i} \meta{regular expression}]\vspace{-2\itemsep} Uses % \meta{regular expression} to identify the index shortcut and the contents % of the raw index file with this shortcut in the intermediate file. The % default value is: ``\verb|^(\\indexentry)\[([^]]*)\](.*)$|'' for all but % \Program{splitindex.tlu}. 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. % For \Program{splitindex.tlu} the default is: % ``\verb|^(\\indexentry)%[([^]]*)%](.*)$|''. % \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|'' for all but % \Program{splitindex.tlu} resp. ``\verb|%1%3|'' for % \Program{splitindex.tlu}, 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|'' resp. ``\verb|-%2|'', which means: % character `\texttt{-}' followed by contents of group 2. % % If the \meta{regular expression} of option \texttt{--identify} 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} % % Some of the binaries compiled from the C source won't understand the long % option names (\texttt{--makeindex}, \texttt{--identify} \dots). In this case % you'd have to use the alternative short option names (\texttt{-m}, % \texttt{-i} \dots). % % The first non-option-argument in the command line is used as the name of the % intermediate index file to be processed. All arguments that follow the % argument ``\texttt{--}'' are interpreted as non-option arguments. All but % the first non-option-arguments will be passed to the index processor. % % You will find some examples in the following subsections. % % % \subsection{Using \Program{splitindex.pl}} % \label{perl} % % This is the reference implementation. Let's use an example to demonstrate % its use. If you have the 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 the intermediate index 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 an index processor like % \Program{MakeIndex}. In order to split this intermediate file into several % raw index files 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} % \begin{sloppypar}\noindent % These calls create the index files \File{allabout-fru.ind}, % \File{allabout-idx.ind}, \File{allabout-veg.ind} and % \File{allabout-ani.ind}, which can be loaded into the document using % e.g.\ \cs{printindex} from package \Package{splitidx}. % \end{sloppypar} % % 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 obtain the same files as above using (it's one input line not two % as 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 the % additional option ``\verb|-s foo.ist|'' to make it use the MakeIndex style % file \File{foo.ist}, you can do so as follows: % \begin{quote} % \Prompt{}\verb|splitindex.pl allabout -- -s foo.ist| % \end{quote} % As you can see ``\verb|--|'' is used to prevent \Program{splitindex} from % interpreting ``\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 the index processor \Program{xindy} instead of default % index processor \Program{MakeIndex}, you can use this call: % \begin{quote} % \Prompt{}\verb|splitindex.pl -m xindy allabout| % \end{quote} % If \Program{xindy} is not in your 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, the 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 implementation should also be portable. If you are not using Sun % Java~1.4.1 or higher, 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 in Sun Java 1.3. % % The call of \Program{splitindex.class} is almost the same as shown for % \autoref{perl} for \Program{splitindex.pl}, but you have to replace % ``\verb|splitindex.pl|'' by ``\verb|java splitindex|''. So the last example % from \autoref{perl} becomes: % \begin{quote} % \Prompt{}\verb|java splitindex allabout -m /home/me/bin/xindy| % \end{quote} % % % \subsection{Using \Program{splitindex.tex}} % \label{TeX} % % The \TeX{} or \LaTeX{} program \Program{splitindex.tex} doesn't know any % options or arguments. The number of files that it can generate is limited % to to number of \TeX's free write handles. If there are any other lines than % ``\verb|\indexentry|''-lines in the raw index file, running % \Program{splitindex.tex} will result in an error. % % You may use \Program{splitindex.tex} interactively: % \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 interactively, 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 the extension ``\texttt{.idx}''. So the % first example of \autoref{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 a future 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} % % % \subsection{Merging 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 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}.%^^A % \changes{v1.2}{2013/04/04}{new option `allintoone'}%^^A % \changes{v1.2}{2013/04/04}{option `allatone' deprecated}%^^A % \begin{macrocode} \DeclareOption{allatone}{% \PackageWarning{splitidx}{Option `allatone' deprecated!\MessageBreak You should replace it by `allintoone'}% \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}}% }% } \DeclareOption{allintoone}{% \ifx\@se@nd@xc@d@\relax\else \PackageInfo{splitidx}{option `allintoone' 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: % \changes{v1.2b}{2014/04/08}{\cs{ifHy@hyperindex} test changed} % \begin{macrocode} \AtBeginDocument{% \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname ifHy@hyperindex\endcsname\relax \else \expandafter\ifx\csname ifHy@hyperindex\expandafter\endcsname \csname iftrue\endcsname \@ifundefined{@@wrsindex}{% \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 \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}% % \end{macrocode} % \changes{v1.2c}{2016/02/18}{workaround for \Package{tcolorbox} library % \File{documentation}}^^A % The \Package{tcolorbox} library \File{documentation} uses % \cs{kvtcb@text@index} instead of \cs{indexname}. So we also redefine this % command. % \begin{macrocode} \def\kvtcb@text@index{#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} % % \end{macrocode} % % \Finale % \endinput % % end of file `splitindex.dtx' %%% Local Variables: %%% mode: doctex %%% TeX-master: t %%% End: