summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/splitindex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/latex/splitindex')
-rw-r--r--Master/texmf-dist/source/latex/splitindex/install.sh178
-rw-r--r--Master/texmf-dist/source/latex/splitindex/splitidx.dtx1393
-rw-r--r--Master/texmf-dist/source/latex/splitindex/splitidx.ins87
-rw-r--r--Master/texmf-dist/source/latex/splitindex/splitindex-Linux-i386bin0 -> 9924 bytes
-rw-r--r--Master/texmf-dist/source/latex/splitindex/splitindex-OpenBSD-i386bin0 -> 16384 bytes
-rw-r--r--Master/texmf-dist/source/latex/splitindex/splitindex.c576
-rw-r--r--Master/texmf-dist/source/latex/splitindex/splitindex.classbin0 -> 9303 bytes
-rw-r--r--Master/texmf-dist/source/latex/splitindex/splitindex.exebin0 -> 18944 bytes
-rw-r--r--Master/texmf-dist/source/latex/splitindex/splitindex.java415
-rw-r--r--Master/texmf-dist/source/latex/splitindex/splitindex.pl186
10 files changed, 2835 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/splitindex/install.sh b/Master/texmf-dist/source/latex/splitindex/install.sh
new file mode 100644
index 00000000000..5d75fb85f7e
--- /dev/null
+++ b/Master/texmf-dist/source/latex/splitindex/install.sh
@@ -0,0 +1,178 @@
+#!/bin/sh
+
+while [ $# -gt 0 ]; do
+ case $1 in
+ --prefix)
+ if [ $# -lt 2 ]; then
+ echo "$0: argument expected after --prefix" >&2
+ exit 1
+ else
+ prefix=$2
+ shift 2
+ fi
+ ;;
+ --prefix=*)
+ prefix=${1#--prefix=}
+ shift 1
+ ;;
+ --bindir)
+ if [ $# -lt 2 ]; then
+ echo "$0: argument expected after --bindir" >&2
+ exit 1
+ else
+ bindir=$2
+ shift 2
+ fi
+ ;;
+ --bindir=*)
+ bindir=${1#--bindir=}
+ shift 1
+ ;;
+ --mandir)
+ if [ $# -lt 2 ]; then
+ echo "$0: argument expected after --mandir" >&2
+ exit 1
+ else
+ mandir=$2
+ shift 2
+ fi
+ ;;
+ --mandir=*)
+ mandir=${1#--mandir=}
+ shift 1
+ ;;
+ --texmf)
+ if [ $# -lt 2 ]; then
+ echo "$0: argument expected after --texmf" >&2
+ exit 1
+ else
+ texmf=$2
+ shift 2
+ fi
+ ;;
+ --texmf=*)
+ texmf=${1#--texmf=}
+ shift 1
+ ;;
+ --version|-v)
+ echo "install.sh v0.1"
+ echo "Copyright (c) Markus Kohm 2002"
+ exit 0
+ ;;
+ --help|-h)
+ echo "Usage: install.sh [OPTIONS]"
+ echo
+ echo "Installs SplitIndex for all unix like environments."
+ echo
+ echo "OPTIONS:"
+ echo "--prefix=<DIR> install binaries at <DIR>/bin and manuals at <DIR>/man"
+ echo " (default: /usr/local)"
+ echo "--bindir=<DIR> install binaries at <DIR>"
+ echo "--mandir=<DIR> install manuals at <DIR>"
+ echo "--texmf=<DIR> install packages and TeX programs at <DIR>/tex/latex/misc,"
+ echo " documentation (dvi and pdf) at <DIR>/doc/latex/splitidx and"
+ echo " sources at <DIR>/source/latex/splitidx"
+ echo " (default: \$TEXMFLOCAL if you are root and \$HOMETEXMF if"
+ echo " you are not root)"
+ exit 0
+ ;;
+ --dist)
+ mkdir splitidx
+ cp -a splitindex splitindex-Linux-i386
+ cp -a splitindex.tex splitindex.pl splitindex.c splitindex.java \
+ splitindex.class splitindex.exe splitidx.dtx splitidx.ins \
+ splitindex-Linux-i386 splitindex-OpenBSD-i386 \
+ splitindex.1 install.txt manifest.txt install.sh \
+ README splitidx
+ tar jcvf splitidx-`date -I`.tar.bz2 splitidx
+ cd splitidx
+ ./install.sh --prefix ../chroot --texmf ../chroot/texmf
+ cd ..
+ rm -r splitidx
+ find chroot | sed 's/chroot\//+-/g;s/[a-z0-9]*\//-/g'
+ exit 0
+ ;;
+ *)
+ echo "unkown option \`$1'" >&2
+ echo "Try \`./install.sh --help' for more information." >&2
+ exit 1;
+ ;;
+ esac
+done
+
+case `uname -s -m` in
+ OpenBSD*i?86*)
+ cp -pf splitindex-OpenBSD-i386 splitindex
+ splitindex=splitindex
+ ;;
+ Linux*i?86*)
+ cp -pf splitindex-Linux-i386 splitindex
+ splitindex=splitindex
+ ;;
+ CYGWIN*i?86*)
+ splitindex=splitindex.exe
+ ;;
+ *)
+ if ! ./splitindex -V; then
+ echo 'Os '`uname -s -m`' not supported!'
+ echo 'Trying to compile the source:'
+ gcc -O3 -Wall -o splitindex splitindex.c || \
+ gcc -O3 -Wall -DNO_LONGOPT -o splitindex splitindex.c || \
+ echo 'You have to compile splitindex.c by your own!'
+ fi
+ if ./splitindex -V; then
+ splitindex=splitindex
+ fi
+ ;;
+esac
+
+if [ -z "$prefix" ]; then
+ prefix=/usr/local
+fi
+if [ -z "$bindir" ]; then
+ bindir=$prefix/bin
+fi
+if [ -z "$mandir" ]; then
+ mandir=$prefix/man
+fi
+if [ -z "$texmf" ]; then
+ if [ "r$USER" = "rroot" ]; then
+ texmf=`kpsexpand '$TEXMFLOCAL'`
+ else
+ texmf=`kpsexpand '$HOMETEXMF'`
+ fi
+ if [ -z "$texmf" ]; then
+ echo "kpsexpand '$TEXMFLOCAL' or kpsexpand '$HOMETEXMF' failed!" >&2
+ echo "You have to use option --texmf=<DIR>." >&2
+ echo "This error is fatal!" >&2
+ exit 1
+ fi
+fi
+
+latex splitidx.ins
+
+latex splitidx.dtx
+latex splitidx.dtx
+mkindex splitidx
+latex splitidx.dtx
+
+pdflatex splitidx.dtx
+pdflatex splitidx.dtx
+mkindex splitidx
+pdflatex splitidx.dtx
+
+install -m 755 -d $bindir
+install -m 755 -d $mandir/man1
+install -m 755 -d $texmf/tex/latex/misc
+install -m 755 -d $texmf/source/latex/splitidx
+install -m 755 -d $texmf/doc/latex/splitidx
+install -m 755 $splitindex splitindex.pl $bindir
+install -m 644 splitindex.class $bindir
+install -m 644 splitindex.1 $mandir/man1
+install -m 644 splitindex.tex splitidx.sty $texmf/tex/latex/misc
+install -m 644 splitidx.dvi splitidx.pdf $texmf/doc/latex/splitidx
+
+install README splitindex.c splitindex.java splitindex.exe \
+ splitindex-Linux-i386 splitindex-OpenBSD-i386 \
+ splitidx.dtx manifest.txt install.txt install.sh \
+ $texmf/source/latex/splitidx
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..68f775c2c26
--- /dev/null
+++ b/Master/texmf-dist/source/latex/splitindex/splitidx.dtx
@@ -0,0 +1,1393 @@
+% \CheckSum{487}
+% \iffalse
+% ======================================================================
+% splitindex.dtx
+% Copyright (c) Markus Kohm, 2002
+%
+% $Id: splitidx.dtx,v 1.14 2003/01/05 10:50:42 mjk Exp $
+%
+% This file is part of the `SplitIndex bundle'.
+% ---------------------------------------------
+%
+% This file can be redistributed and/or modified under the conditions
+% of the LaTeX Project Public License, either version 1.2 of this
+% license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.2 or later is part of all distributions of LaTeX
+% version 1999/12/01 or later.
+%
+% You are not allowed to redistribute this file without all the
+% other files of the `SplitIndex bundle'. The list of all files
+% belonging to the `SplitIndex bundle' is given in the file
+% `manifest.txt'.
+% ======================================================================
+%
+%<*dtx>
+% \fi
+\ProvidesFile{splitidx.dtx}[%
+% \iffalse
+%</dtx>
+%<driver>\ProvidesFile{splitidx.drv}[%
+%<package>\ProvidesPackage{splitidx}[%
+% \fi
+ 2003/01/05 v0.2a 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 kohm@gmx.de\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}.
+%
+%
+% \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{\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}
+%
+% There is also an option to make \cs{sindex} ignores it optional argument and
+% behaves like \cs{index}.
+% \begin{macrocode}
+\DeclareOption{allatone}{%
+ \AtEndOfPackage{%
+ \renewcommand*{\sindex}[1][]{\index}%
+ \g@addto@macro\makeindex{\renewcommand*{\sindex}[1][]{\index}}%
+ }%
+}
+% \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}
+% \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}%
+}
+% \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 |+.
+% \begin{macrocode}
+\newcommand*{\@wrsindex}[2][]{%
+ \ifx\relax#1\relax
+ \if@splitidx
+ \@wrsindex[idx]{#2}%
+ \else
+ \@wrindex{#2}%
+ \fi
+ \else
+ \expandafter\ifx\csname @@wrsindex\endcsname\relax
+ \@@@wrsindex{#1}{{#2}{\thepage}}%
+ \else
+ \@@wrsindex{#1}#2||\\%
+ \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{}{%
+ \string\indexentry#2%
+ }%
+ \fi
+ \else
+ \protected@write\@indexfile{}{%
+ \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}
+%
+%
+% \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}{%
+ \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{%
+ \sindex[#2]%
+ }%
+ \fi
+ \if@splitidx
+ \def\@tempa{#2}\def\@tempb{idx}%
+ \ifx\@tempa\@tempb
+ \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}{\@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: latex
+%%% TeX-master: t
+%%% End:
diff --git a/Master/texmf-dist/source/latex/splitindex/splitidx.ins b/Master/texmf-dist/source/latex/splitindex/splitidx.ins
new file mode 100644
index 00000000000..529b3777771
--- /dev/null
+++ b/Master/texmf-dist/source/latex/splitindex/splitidx.ins
@@ -0,0 +1,87 @@
+%%
+%% splitindex.ins
+%% Copyright (c) Markus Kohm, 2002
+%%
+%% $Id: splitidx.ins,v 1.1 2002/11/08 10:37:38 mjk Exp $
+%%
+%% This file is part of the `SplitIndex bundle'.
+%% ---------------------------------------------
+%%
+%% This file can be redistributed and/or modified under the conditions
+%% of the LaTeX Project Public License, either version 1.2 of this
+%% license or (at your option) any later version.
+%% The latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%% and version 1.2 or later is part of all distributions of LaTeX
+%% version 1999/12/01 or later.
+%%
+%% In particular, NO PERMISSION is granted to modify the contents of this
+%% file since it contains the legal notices that are placed in the files
+%% it generates.
+%%
+%% You are not allowed to redistribute this file without all the
+%% other files of the `SplitIndex bundle'. The list of all files
+%% belonging to the `SplitIndex bundle' is given in the file
+%% `manifest.txt'.
+%%
+%% This file will generate fast loadable files and documentation
+%% driver files from the doc files in this package when run through
+%% LaTeX or TeX.
+%%
+%%
+%% --------------- start of docstrip commands ------------------
+%%
+
+\input docstrip
+
+\preamble
+
+This is a generated file.
+
+Copyright (c) Markus Kohm, 2002
+
+This file was generated from file(s) of the `SplitIndex bundle'.
+----------------------------------------------------------------
+
+It may be distributed and/or modified under the conditions of
+the LaTeX Project Public License, either version 1.2 of this
+license or (at your option) any later version.
+The latest version of this license is in
+ http://www.latex-project.org/lppl.txt
+and version 1.2 or later is part of all distributions of LaTeX
+version 1999/12/01 or later.
+
+This file may only be distributed together with a copy of the
+`SplitIndex bundle'. You may however distribute the `SpitIndex
+bundle' without such generated files.
+
+The list of all files belonging to the `SplitIndex bundle' is
+given in the file `manifest.txt'.
+
+\endpreamble
+
+\keepsilent
+\usedir{tex/latex/misc}
+
+\generate{\file{splitidx.sty}{\from{splitidx.dtx}{package}}}
+
+\Msg{*************************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move `splitidx.sty'}
+\Msg{* files into a directory searched by TeX.}
+\Msg{* Using a TDS compatible TeX distribution, this would be e.g.}
+\Msg{* tex/latex/misc of your main or your local or your private}
+\Msg{* texmf path. If you don't know these paths, have a look}
+\Msg{* at your `texmf.cnf' or try:}
+\Msg{* \space\space kpsexpand \string\$TEXMFMAIN}
+\Msg{* \space\space kpsexpand \string\$TEXMFLOCAL}
+\Msg{* \space\space kpsexpand \string\$HOMETEXMF}
+\Msg{* You may also use another folder at your TEXINPUTS path.}
+\Msg{*}
+\Msg{* To produce the documentation run splitidx.dtx files}
+\Msg{* through LaTeX.}
+\Msg{*}
+\Msg{* Happy TeXing}
+\Msg{************************************************************}
+
+\endbatchfile
diff --git a/Master/texmf-dist/source/latex/splitindex/splitindex-Linux-i386 b/Master/texmf-dist/source/latex/splitindex/splitindex-Linux-i386
new file mode 100644
index 00000000000..42566f25083
--- /dev/null
+++ b/Master/texmf-dist/source/latex/splitindex/splitindex-Linux-i386
Binary files differ
diff --git a/Master/texmf-dist/source/latex/splitindex/splitindex-OpenBSD-i386 b/Master/texmf-dist/source/latex/splitindex/splitindex-OpenBSD-i386
new file mode 100644
index 00000000000..17e865dd061
--- /dev/null
+++ b/Master/texmf-dist/source/latex/splitindex/splitindex-OpenBSD-i386
Binary files differ
diff --git a/Master/texmf-dist/source/latex/splitindex/splitindex.c b/Master/texmf-dist/source/latex/splitindex/splitindex.c
new file mode 100644
index 00000000000..41a092af734
--- /dev/null
+++ b/Master/texmf-dist/source/latex/splitindex/splitindex.c
@@ -0,0 +1,576 @@
+/*
+ * splitindex.c
+ * Copyright (c) Markus Kohm, 2002
+ *
+ * $Id: splitindex.c,v 1.6 2003/01/05 10:50:07 mjk Exp $
+ *
+ * This file is part of the SplitIndex package
+ *
+ * This file can be redistributed and/or modified under the conditions
+ * of the LaTeX Project Public License, either version 1.2 of this
+ * license or (at your option) any later version.
+ * The latest version of this license is in
+ * http://www.latex-project.org/lppl.txt
+ * and version 1.2 or later is part of all distributions of LaTeX
+ * version 1999/12/01 or later.
+ *
+ * You are not allowed to redistribute this file without all the
+ * other files of the SplitIndex package
+ */
+
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include <ctype.h>
+#include <errno.h>
+#include <regex.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+enum {
+ OPT_HELP = 'h', OPT_MAKEINDEX = 'm', OPT_IDENTIFY = 'i',
+ OPT_RESULTIS = 'r', OPT_VERBOSE = 'v', OPT_SUFFIXIS = 's',
+ OPT_VERSION = 'V'
+};
+
+#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined (NO_LONGOPT)
+
+#define HAS_LONGOPT 0
+#define HAPAR ""
+
+#else /* defined(__OpenBSD__) || defined(__FreeBSD__) || defined(NO_LONGOPT) */
+
+#define HAS_LONGOPT 1
+#define HAPAR "\n\t\t"
+
+#include <getopt.h>
+
+static const struct option long_options[] = {
+ { "help", 0, NULL, OPT_HELP },
+ { "makeindex", 1, NULL, OPT_MAKEINDEX },
+ { "identify", 1, NULL, OPT_IDENTIFY },
+ { "resultis", 1, NULL, OPT_RESULTIS },
+ { "suffixis", 1, NULL, OPT_SUFFIXIS },
+ { "verbose", 0, NULL, OPT_VERBOSE },
+ { "version", 0, NULL, OPT_VERSION },
+ { NULL, 0, NULL, 0 },
+};
+
+#endif
+
+static const char short_options[] = {
+ OPT_HELP,
+ OPT_MAKEINDEX, ':',
+ OPT_IDENTIFY, ':',
+ OPT_RESULTIS, ':',
+ OPT_SUFFIXIS, ':',
+ OPT_VERBOSE,
+ OPT_VERSION,
+};
+
+int Verbose = 0;
+
+char *MakeIndex = "makeindex";
+char *Identify = "^(\\\\indexentry)\\[([^]]*)\\](.*)$";
+char *ResultIs = "$1$3";
+char *SuffixIs = "-$2";
+char *IDX = NULL;
+char *Jobname = NULL;
+char * const * MakeIndexArgs = NULL;
+char *prgname = "splitindex";
+int MakeIndexArgc = 0;
+
+static void show_version( void ) {
+ printf( "splitindex 0.2a\n"
+ "Copyright (c) 2002 Markus Kohm <kohm@gmx.de>\n" );
+}
+
+static void show_usage( FILE *out ) {
+ fputs( "Usage: splitindex [OPTION]... RAWINDEXFILE [MAKEINDEXOPTION]...\n",
+ out );
+}
+
+static void usage_error( const char *format, ... ) {
+ if ( format != NULL ) {
+ va_list ap;
+ va_start( ap, format );
+ vfprintf( stderr, format, ap );
+ va_end( ap );
+ }
+ fputs( "Try `splitindex "
+#if HAS_LONGOPT
+ "--help"
+#else
+ "-h"
+#endif
+ "' for more information.\n", stderr );
+ exit( 1 );
+}
+
+static void show_help( void ) {
+ show_version();
+ printf( "\n" );
+ show_usage( stdout );
+ printf(
+ "Split a single raw index file into multiple raw index files.\n"
+ "Example: splitindex.pl foo.idx.\n"
+ "\n"
+ "Options:\n"
+ " -h"
+#if HAS_LONGOPT
+ ", --help "
+#else
+ " "
+#endif
+ "\tshow this help and terminate\n"
+ " -m"
+#if HAS_LONGOPT
+ ", --makeindex"
+#endif
+ " PROGNAME " HAPAR
+ "\tcall PROGNAME instead of default `%s'.\n",
+ MakeIndex
+ );
+ printf(
+ " -i"
+#if HAS_LONGOPT
+ ", --identify"
+#endif
+ " EXPRESSION " HAPAR
+ "\tuse regular EXPRESSION to match entries\n"
+ "\t\t\t(see also option --resultis and --suffixis).\n"
+ "\t\t\tDefault is `%s'.\n",
+ Identify
+ );
+ printf(
+ " -r"
+#if HAS_LONGOPT
+ ", --resultis"
+#endif
+ " PATTERN " HAPAR
+ "\tcreate line to be written from PATTERN after matching\n"
+ "\t\t\tlines (see also option --identify).\n"
+ "\t\t\tDefault is `%s'.\n",
+ ResultIs
+ );
+ printf(
+ " -s"
+#if HAS_LONGOPT
+ ", --suffixis"
+#endif
+ " PATTERN " HAPAR
+ "\tcreate suffix to be used from PATTERN after matching\n"
+ "\t\t\tlines (see also option --identify).\n"
+ "\t\t\tDefault is `%s'.\n",
+ SuffixIs
+ );
+ printf(
+ " -v"
+#if HAS_LONGOPT
+ ", --verbose "
+#else
+ " "
+#endif
+ "\tbe more verbose\n"
+ "\t\t\t(can be used multiple to increase verbosity)\n"
+ " -V"
+#if HAS_LONGOPT
+ ", --version "
+#else
+ " "
+#endif
+ "\tshow version and terminate\n"
+ );
+ exit(0);
+}
+
+static void ScanArguments( int argc, char * const argv[] ) {
+ int retVal;
+ char *hs;
+ if ( argc > 0 )
+ prgname = argv[0];
+#if HAS_LONGOPT
+ while ( ( retVal = getopt_long( argc, argv, short_options,
+ long_options, NULL ) ) != - 1 ) {
+#else
+ while ( ( retVal = getopt( argc, argv, short_options ) ) != - 1 ) {
+#endif
+ switch( retVal ) {
+ case OPT_HELP:
+ show_help();
+ break; /* should never be reached */
+ case OPT_VERSION:
+ show_version();
+ exit( 0 );
+ break; /* should never be reached */
+ case OPT_MAKEINDEX:
+ MakeIndex = optarg;
+ break;
+ case OPT_IDENTIFY:
+ Identify = optarg;
+ break;
+ case OPT_RESULTIS:
+ ResultIs = optarg;
+ break;
+ case OPT_SUFFIXIS:
+ SuffixIs = optarg;
+ break;
+ case OPT_VERBOSE:
+ Verbose++;
+ break;
+ case ':':
+ case '?':
+ usage_error( NULL );
+ break; /* should never be reached */
+ }
+ }
+ if ( optind < argc ) {
+ IDX = argv[optind++];
+ MakeIndexArgc = argc - optind;
+ MakeIndexArgs = argv + optind;
+ } else {
+ usage_error( "missing raw index file\n" );
+ return; /* should never be reached */
+ }
+
+ if ( ( Jobname = strdup( IDX ) ) == NULL ) {
+ perror( prgname );
+ exit( errno );
+ }
+
+ if ( ( ( hs = strrchr( Jobname, '.' ) ) != NULL )
+ && !strcmp( hs, ".idx" ) )
+ *hs = 0;
+}
+
+static char *regsub( const char *string, const char *replace,
+ int nmatch, regmatch_t pmatch[] ) {
+ int pass;
+ int size, n;
+ const char *hs;
+ char c;
+ char *retVal = NULL;
+ char *ts;
+
+ /* Two times parsing to get size and replace */
+ for ( pass = size = 0; pass < 2; pass++ ) {
+ ts = retVal;
+ for ( hs = replace; *hs; hs++ ) {
+ switch( *hs ) {
+ case '$':
+ if ( isdigit( hs[1] ) ) {
+ n = *++hs - '0';
+ if ( ( pmatch[n].rm_so >= 0 )
+ && ( pmatch[n].rm_so < pmatch[n].rm_eo ) ) {
+ /* maybe group n is not empty */
+ if ( pass ) {
+ strncpy( ts,
+ string + pmatch[n].rm_so,
+ pmatch[n].rm_eo - pmatch[n].rm_so );
+ ts += pmatch[n].rm_eo - pmatch[n].rm_so;
+ } else {
+ size += pmatch[n].rm_eo - pmatch[n].rm_so;
+ }
+ }
+ } else {
+ if ( pass ) {
+ *ts++ = '$';
+ } else {
+ size++;
+ }
+ }
+ break;
+ case '\\':
+ switch( c = *++hs ) {
+ case 0: c = '\\'; hs--; break;
+ case 'b': c = '\b'; break;
+ case 'f': c = '\f'; break;
+ case 'n': c = '\n'; break;
+ case 'r': c = '\r'; break;
+ case 't': c = '\t'; break;
+ }
+ if ( pass ) {
+ *ts++ = c;
+ } else {
+ size++;
+ }
+ break;
+ default:
+ if ( pass ) {
+ *ts++ = *hs;
+ } else {
+ size++;
+ }
+ break;
+ }
+ }
+ if ( pass ) {
+ *ts = '\0';
+ } else {
+ if ( ( retVal = malloc( size + 1 ) ) == NULL ) {
+ perror( prgname );
+ exit( 1 );
+ }
+ }
+ }
+
+ return retVal;
+}
+
+static struct list {
+ struct list *next;
+ char *name;
+ FILE *file;
+} *IDXfiles = NULL;
+
+static FILE *findsuffix( const char *name ) {
+ struct list *run;
+ for ( run = IDXfiles;
+ run != NULL;
+ run = run->next ) {
+ const char *suffix = strchr( run->name, '\0' );
+ suffix -= 4; /* .idx */
+ suffix -= strlen( name );
+ if ( ( suffix >= run->name )
+ && !strncmp( suffix, name, strlen( name ) ) ) {
+ return run->file;
+ }
+ }
+ return NULL;
+}
+
+static struct list *addentry( char *name, FILE *file ) {
+ struct list *newentry = malloc( sizeof( struct list ) );
+ if ( !newentry ) {
+ perror( prgname );
+ exit( 1 );
+ }
+ newentry->name = name;
+ newentry->file = file;
+ if ( IDXfiles == NULL ) {
+ newentry->next = NULL;
+ } else {
+ newentry->next = IDXfiles;
+ }
+ IDXfiles = newentry;
+ return IDXfiles;
+}
+
+static FILE *newentry( const char *suffix ) {
+ char *name;
+ FILE *file;
+
+ if ( ( name = malloc( strlen( Jobname ) + strlen( suffix ) + 5 ) ) == NULL ) {
+ perror( prgname );
+ exit( 1 );
+ }
+
+ strcpy( name, Jobname );
+ strcat( name, suffix );
+ strcat( name, ".idx" );
+
+ if ( ( file = fopen( name, "w" ) ) == NULL ) {
+ perror( name );
+ exit( errno );
+ }
+
+ if ( Verbose > 1 )
+ printf( "New index file %s\n", name );
+ addentry( name, file );
+ return file;
+}
+
+static void CloseAllIDX( void ) {
+ struct list *run;
+ for ( run = IDXfiles; run != NULL; run = run->next )
+ if ( fclose( run->file ) ) {
+ perror( run->name );
+ exit( 1 );
+ }
+}
+
+static void CallMakeIndex( void ) {
+ char **argv;
+ int idx;
+ struct list *run, *next;
+
+ if ( ( argv = calloc( MakeIndexArgc + 3, sizeof( char * ) ) ) == NULL ) {
+ perror( prgname );
+ exit( 0 );
+ }
+
+ for ( idx = 0; idx < MakeIndexArgc; idx++ )
+ argv[idx+1] = MakeIndexArgs[idx];
+
+ idx++;
+ argv[0] = MakeIndex;
+
+ for ( run = IDXfiles; run != NULL; run = next ) {
+ pid_t fret;
+ int status;
+ argv[idx] = run->name;
+
+ if ( ( fret = fork() ) == 0 ) {
+ /* This is the child */
+ if ( Verbose > 1 ) {
+ int i;
+ for ( i = 0; argv[i] != NULL; i++ )
+ printf( "\"%s\" ", argv[i] );
+ printf( "\n" );
+ }
+ if ( execvp( MakeIndex, argv ) ) {
+ perror( MakeIndex );
+ exit( 1 );
+ }
+ } else if ( fret == -1 ) {
+ perror( prgname );
+ exit( 1 );
+ } else {
+ /* Parent */
+ waitpid( fret, &status, 0 );
+ if ( ! WIFEXITED( status ) ) {
+ fprintf( stderr, "%s terminated abnormally!\n", MakeIndex );
+ exit( 1 );
+ }
+ }
+
+ free( (void *)run->name );
+ next = run->next;
+ free( run );
+ }
+
+
+}
+
+static void ProcessIDXFile( void ) {
+ FILE *fIDX;
+ char *line;
+ regex_t preg;
+ int retVal;
+ int buffersize = 2050;
+ regmatch_t pmatch[10];
+
+ if ( ( line = malloc( buffersize ) ) == NULL ) {
+ perror( prgname );
+ exit( errno );
+ }
+
+ if ( ( retVal = regcomp( &preg, Identify, REG_EXTENDED ) ) != 0 ) {
+ regerror( retVal, &preg, line, buffersize );
+ fprintf( stderr, "Error at identify: %s\n", line );
+ free( line );
+ exit( 1 );
+ }
+
+ if ( ( fIDX = fopen( IDX, "r" ) ) == NULL ) {
+ if ( !strcmp ( IDX, Jobname ) ) {
+ if ( ( IDX = malloc( strlen( Jobname + 5 ) ) ) == NULL ) {
+ perror( prgname );
+ regfree( &preg );
+ free( line );
+ exit( errno );
+ }
+ strcpy( IDX, Jobname );
+ strcat( IDX, ".idx" );
+ if ( ( fIDX = fopen( IDX, "r" ) ) == NULL ) {
+ fprintf( stderr,
+ "Can read neither file %s nor file %s\n",
+ Jobname, IDX );
+ regfree( &preg );
+ free( line );
+ exit( 1 );
+ }
+ } else {
+ fprintf( stderr,
+ "Can't red file %s\n", IDX );
+ regfree( &preg );
+ free( line );
+ exit( 1 );
+ }
+ }
+
+ while ( fgets( line, buffersize, fIDX ) != NULL ) {
+ char *hs;
+ char *result, *suffix;
+ FILE *f;
+ while ( ( ( hs = strchr( line, '\n' ) ) == NULL )
+ && ! feof( fIDX ) ) {
+ if ( ( line = realloc( line, 2 * buffersize ) ) == NULL ) {
+ perror( prgname );
+ exit( errno );
+ }
+ if ( fgets( line + buffersize - 1, buffersize + 1, fIDX ) == NULL )
+ break;
+ buffersize *= 2;
+ }
+ if ( ferror( fIDX ) )
+ break;
+ if ( ( hs = strchr( line, '\n' ) ) != NULL ) // remove newline
+ *hs = 0;
+ if ( ( retVal = regexec( &preg, line, 10, pmatch, 0 ) ) == 0 ) {
+ result = regsub( line, ResultIs, 10, pmatch );
+ suffix = regsub( line, SuffixIs, 10, pmatch );
+ } else {
+ int i;
+ result = strdup( line );
+ for ( i = 0; i < 10; i++ ) {
+ pmatch[i].rm_so = 0;
+ pmatch[i].rm_eo = 3;
+ }
+ suffix = regsub( "idx", SuffixIs, 10, pmatch );
+ }
+ if ( !result || !suffix ) {
+ perror( prgname );
+ exit ( 1 );
+ }
+
+ if ( ( f = findsuffix( suffix ) ) == NULL )
+ f = newentry( suffix );
+ fprintf( f, "%s\n", result );
+
+ free( suffix );
+ free( result );
+ }
+
+ regfree( &preg );
+ free( line );
+ if ( ferror( fIDX ) ) {
+ perror( IDX );
+ fclose( fIDX );
+ exit( errno );
+ }
+ fclose( fIDX );
+
+ CloseAllIDX();
+
+ CallMakeIndex();
+}
+
+int main( int argc, char * const argv[] ) {
+ int retVal = 0;
+
+ ScanArguments( argc, argv );
+
+ if ( Verbose > 0 ) {
+ show_version();
+ if ( Verbose > 9 ) {
+ int i;
+ printf( "Identify: \"%s\"\n", Identify );
+ printf( "ResultIs: \"%s\"\n", ResultIs );
+ printf( "SuffixIs: \"%s\"\n", SuffixIs );
+ printf( "IDX: \"%s\"\n", IDX );
+ printf( "Jobname: \"%s\"\n", Jobname );
+ printf( "MakeIndex: \"%s\"", MakeIndex );
+ for ( i = 0; i < MakeIndexArgc; i++ )
+ printf( " \"%s\"", MakeIndexArgs[i] );
+ printf( "\n" );
+ }
+ }
+
+ ProcessIDXFile();
+
+ return retVal;
+}
diff --git a/Master/texmf-dist/source/latex/splitindex/splitindex.class b/Master/texmf-dist/source/latex/splitindex/splitindex.class
new file mode 100644
index 00000000000..288ad25d588
--- /dev/null
+++ b/Master/texmf-dist/source/latex/splitindex/splitindex.class
Binary files differ
diff --git a/Master/texmf-dist/source/latex/splitindex/splitindex.exe b/Master/texmf-dist/source/latex/splitindex/splitindex.exe
new file mode 100644
index 00000000000..08aa74d1291
--- /dev/null
+++ b/Master/texmf-dist/source/latex/splitindex/splitindex.exe
Binary files differ
diff --git a/Master/texmf-dist/source/latex/splitindex/splitindex.java b/Master/texmf-dist/source/latex/splitindex/splitindex.java
new file mode 100644
index 00000000000..9b52f9f7fdf
--- /dev/null
+++ b/Master/texmf-dist/source/latex/splitindex/splitindex.java
@@ -0,0 +1,415 @@
+/*
+ * splitindex.java
+ * Copyright (c) Markus Kohm, 2002
+ *
+ * $Id: splitindex.java,v 1.2 2003/01/05 15:05:46 mjk Exp $
+ *
+ * This file is part of the SplitIndex package
+ *
+ * This file can be redistributed and/or modified under the conditions
+ * of the LaTeX Project Public License, either version 1.2 of this
+ * license or (at your option) any later version.
+ * The latest version of this license is in
+ * http://www.latex-project.org/lppl.txt
+ * and version 1.2 or later is part of all distributions of LaTeX
+ * version 1999/12/01 or later.
+ *
+ * You are not allowed to redistribute this file without all the
+ * other files of the SplitIndex package
+ */
+
+/*
+ I know, I should never write an application in a single static class
+ like I do here. But I wanted the program at earch language to be one
+ file.
+*/
+
+import java.util.*;
+import java.util.regex.*;
+import java.io.*;
+
+public final class splitindex {
+ private static ArrayList MakeIndexArgs = new ArrayList();
+// private static String Identify = "^(.*)\\\\UseIndex *\\{([^\\}]*)\\}(.*)$";
+ private static String Identify = "^(\\\\indexentry)\\[([^\\]]*)\\](.*)$";
+ private static String ResultIs = "$1$3";
+ private static String SuffixIs = "-$2";
+ private static int Verbose = 0;
+ private static String IDX = null;
+ private static String Jobname = null;
+ private static HashMap IDXwriters = new HashMap();
+
+ private static void ShowHelp() {
+ String nl = System.getProperty( "line.separator" );
+ ShowVersion();
+ System.out.println();
+ ShowUsage();
+ System.out.println(
+ "Split a single raw index file into multiple raw index files." +nl+
+ "Example: java splitindex foo.idx." +nl+
+ nl+
+ "Options:" +nl+
+ " -h, --help " +
+ "\tshow this help and terminate" +nl+
+ " -m, --makeindex PROGNAME" +nl+
+ "\t\t\tcall PROGNAME instead of default `makeindex'." +nl+
+ " -i, --identify EXPRESSION" +nl+
+ "\t\t\tuse regular EXPRESSION to match entries" +nl+
+ "\t\t\t(see also option --resultis and --suffixis)." +nl+
+ "\t\t\tDefault is \'" + Identify + "\'." +nl+
+ " -r, --resultis PATTERN" +nl+
+ "\t\t\tcreate line to be written from PATTERN after matching" +nl+
+ "\t\t\tlines (see also option --identify)." +nl+
+ "\t\t\tDefault is \'" + ResultIs + "\'." +nl+
+ " -s, --suffixis PATTERN" +nl+
+ "\t\t\tcreate suffix to be used from PATTERN after matching" +nl+
+ "\t\t\tlines (see also option --identify)." +nl+
+ "\t\t\tDefault is \'" + SuffixIs +"\'." +nl+
+ " -v, --verbose " +
+ "\tbe more verbose" +nl+
+ "\t\t\t(can be used multiple to increase verbosity)" +nl+
+ " --version " +
+ "\tshow version and terminate"
+ );
+ System.exit( 0 );
+ }
+
+ private static void ShowVersion() {
+ System.out.println( "splitindex.pl 0.1" );
+ System.out.println( "Copyright (c) 2002 Markus Kohm <kohm@gmx.de>" );
+ }
+
+ private static void ShowUsage( PrintStream out ) {
+ out.println( "Usage: java splitindex [OPTION]... RAWINDEXFILE [MAKEINDEXOPTION]..." );
+ }
+
+ private static void ShowUsage() {
+ ShowUsage( System.out );
+ }
+
+ private static void UsageError( String msg ) {
+ System.err.println( msg );
+ System.err.println( "Try `java splitindex --help' for more information." );
+ System.exit( 1 );
+ }
+
+ private static void ScanArguments(String[] args) {
+ String MakeIndex = "makeindex";
+ for (int i = 0; i < args.length; i++) {
+ if ( args[i].charAt(0) == '-' ) {
+ // Option
+ if ( args[i].charAt(1) == '-' ) {
+ // Long Option
+ if ( args[i].substring(2).equals( "help" ) ) {
+ ShowHelp();
+ System.exit(0);
+ } else if ( args[i].substring(2).equals( "version" ) ) {
+ ShowVersion();
+ System.exit(0);
+ } else if ( args[i].substring(2).equals( "verbose" ) ) {
+ Verbose++;
+ } else if ( args[i].substring(2).equals( "makeindex" ) ) {
+ if ( ++i >= args.length ) {
+ UsageError( "Option makeindex requires an argument" );
+ }
+ MakeIndex = args[i];
+ } else if ( ( args[i].length() >= 11 ) &&
+ ( args[i].substring(2,11).equals( "makeindex=" ) ) ) {
+ MakeIndex = args[i].substring(12);
+ } else if ( args[i].substring(2).equals( "identify" ) ) {
+ if ( ++i >= args.length ) {
+ UsageError( "Option identify requires an argument" );
+ }
+ Identify = args[i];
+ } else if ( ( args[i].length() >= 10 ) &&
+ ( args[i].substring(2,10).equals( "identify=" ) ) ) {
+ Identify = args[i].substring(11);
+ } else if ( args[i].substring(2).equals( "resultis" ) ) {
+ if ( ++i >= args.length ) {
+ UsageError( "Option resultis requires an argument" );
+ }
+ ResultIs = args[i];
+ } else if ( ( args[i].length() >= 10 ) &&
+ ( args[i].substring(2,10).equals( "resultis=" ) ) ) {
+ ResultIs = args[i].substring(11);
+ } else if ( args[i].substring(2).equals( "suffixis" ) ) {
+ if ( ++i >= args.length ) {
+ UsageError( "Option suffixis requires an argument" );
+ }
+ SuffixIs = args[i];
+ } else if ( ( args[i].length() >= 10 ) &&
+ ( args[i].substring(2,10).equals( "suffixis=" ) ) ) {
+ SuffixIs = args[i].substring(11);
+ } else if ( args[i].equals( "--" ) ) {
+ while ( ++i < args.length ) {
+ MakeIndexArgs.add( args[i] );
+ }
+ } else {
+ UsageError( "Unknown option " + args[i].substring(2) );
+ }
+ } else {
+ // Short Option
+ for ( int n = 1; n < args[i].length(); ) {
+ switch( args[i].charAt(n++) ) {
+ case 'h':
+ ShowHelp();
+ System.exit(0);
+ case 'm':
+ if ( n >= args[i].length() ) {
+ if ( ++i >= args.length ) {
+ UsageError( "Option makeindex requires an argument" );
+ } else {
+ MakeIndex = args[i];
+ n = args[i].length();
+ }
+ } else {
+ MakeIndex = args[i].substring( n );
+ n = args[i].length();
+ }
+ break;
+ case 'i':
+ if ( n >= args[i].length() ) {
+ if ( ++i >= args.length ) {
+ UsageError( "Option identify requires an argument" );
+ } else {
+ Identify = args[i];
+ n = args[i].length();
+ }
+ } else {
+ Identify = args[i].substring( n );
+ n = args[i].length();
+ }
+ break;
+ case 'r':
+ if ( n >= args[i].length() ) {
+ if ( ++i >= args.length ) {
+ UsageError( "Option resultis requires an argument" );
+ } else {
+ ResultIs = args[i];
+ n = args[i].length();
+ }
+ } else {
+ ResultIs = args[i].substring( n );
+ n = args[i].length();
+ }
+ break;
+ case 's':
+ if ( n >= args[i].length() ) {
+ if ( ++i >= args.length ) {
+ UsageError( "Option suffixis requires an argument" );
+ } else {
+ SuffixIs = args[i];
+ n = args[i].length();
+ }
+ } else {
+ SuffixIs = args[i].substring( n );
+ n = args[i].length();
+ }
+ break;
+ case 'v':
+ Verbose++;
+ break;
+ }
+ }
+ }
+ } else {
+ MakeIndexArgs.add( args[i] );
+ }
+ }
+
+ // Args --> IDX + Stringarray
+ if ( MakeIndexArgs.isEmpty() ) {
+ UsageError( "missing raw index file" );
+ } else {
+ IDX = (String)MakeIndexArgs.get(0);
+ MakeIndexArgs.remove(0);
+ MakeIndexArgs.add( 0, MakeIndex );
+ }
+
+ if ( IDX.endsWith( ".idx" ) ) {
+ Jobname = IDX.substring( 0, IDX.length() - 4 );
+ } else {
+ Jobname = IDX;
+ }
+ }
+
+ public static void main(String[] args) {
+ ScanArguments(args);
+
+ if ( Verbose > 0 ) {
+ ShowVersion();
+ System.out.println();
+ if ( Verbose > 9 ) {
+ System.out.println( "Identify: \"" + Identify + "\"" );
+ System.out.println( "ResultIs: \"" + ResultIs + "\"" );
+ System.out.println( "SuffixIs: \"" + SuffixIs + "\"" );
+ System.out.println( "IDX: \"" + IDX + "\"" );
+ System.out.println( "Jobname: \"" + Jobname + "\"" );
+ System.out.print( "MakeIndex:" );
+ for ( int i = 0; i < MakeIndexArgs.size(); i++ )
+ System.out.print( " \"" + (String)MakeIndexArgs.get(i) + "\"" );
+ System.out.println();
+ }
+ }
+
+ ProcessIDXFile();
+ }
+
+ private static void ProcessIDXFile() {
+ File fIDX = new File( IDX );
+ LineNumberReader rIDX = null;
+ boolean error = false;
+ if ( !fIDX.canRead() ) {
+ if ( IDX.equals( Jobname ) ) {
+ IDX = IDX.concat( ".idx" );
+ fIDX = new File( IDX );
+ if ( !fIDX.canRead() ) {
+ System.err.println( "Can read neither file " + Jobname +
+ " nor file " + IDX );
+ System.exit( 1 );
+ }
+ } else {
+ System.err.println( "Can't read file " + Jobname );
+ System.exit( 1 );
+ }
+ }
+
+ try {
+ FileReader reader = new FileReader( fIDX );
+ rIDX = new LineNumberReader( reader );
+ } catch ( FileNotFoundException ex ) {
+ System.err.println( ex.getMessage() );
+ System.exit( 1 );
+ }
+
+ try {
+ Pattern search = Pattern.compile( Identify );
+ while ( rIDX.ready() ) {
+ String line = rIDX.readLine();
+ Matcher match = search.matcher( line );
+ String suffix, result;
+
+ try {
+ if ( match.find() ) {
+ suffix = match.replaceFirst( SuffixIs );
+ result = match.replaceFirst( ResultIs );
+ } else {
+ result = line;
+ suffix = SuffixIs.replaceFirst( "\\$\\d", "idx" );
+ }
+ WriteToIndex( Jobname + suffix + ".idx", result );
+ } catch ( Exception ex ) {
+ System.err.println( ex.getMessage() );
+ error = true;
+ break;
+ }
+ }
+
+ if ( ! CloseAllIndex() )
+ error = true;
+ else if ( ! CallAllMakeIndex() )
+ error = true;
+ } catch ( IOException ex ) {
+ System.err.println( ex.getMessage() );
+ }
+
+ try {
+ rIDX.close();
+ } catch ( IOException ex ) {
+ System.err.println( ex.getMessage() );
+ System.exit( 1 );
+ }
+
+ if ( error )
+ System.exit( 1 );
+
+ }
+
+ static void WriteToIndex( String Name, String line )
+ throws FileNotFoundException, SecurityException {
+ PrintWriter fOut;
+ if ( ( fOut = (PrintWriter)IDXwriters.get( Name ) ) == null ) {
+ if ( Verbose > 1 ) {
+ System.out.println( "New index file " + Name );
+ }
+ fOut = new PrintWriter( new FileOutputStream( Name ) );
+ IDXwriters.put( Name, fOut );
+ }
+ fOut.println( line );
+ }
+
+ static boolean CloseAllIndex() {
+ Iterator all = IDXwriters.entrySet().iterator();
+ boolean retVal = true;
+ while ( all.hasNext() ) {
+ Map.Entry entry = (Map.Entry)all.next();
+ PrintWriter writer = (PrintWriter)entry.getValue();
+ if ( Verbose > 1 ) {
+ System.out.println( "Close " + entry.getKey() );
+ }
+ writer.close();
+ if ( writer.checkError() ) {
+ System.err.println( "Error writing " + entry.getKey() );
+ retVal = false;
+ }
+ }
+ return retVal;
+ }
+
+ static boolean CallAllMakeIndex() {
+ Iterator all = IDXwriters.entrySet().iterator();
+ boolean retVal = true;
+ ArrayList processes = new ArrayList();
+ while ( all.hasNext() ) {
+ Map.Entry entry = (Map.Entry)all.next();
+ String name = (String)entry.getKey();
+ try {
+ MakeIndexArgs.add(name);
+ String Args[] = new String[MakeIndexArgs.size()];
+ Args = (String[])MakeIndexArgs.toArray( Args );
+ MakeIndexArgs.remove(MakeIndexArgs.size()-1);
+ if ( Verbose > 1 ) {
+ System.out.print( "MakeIndex:" );
+ for ( int i = 0; i < Args.length; i++ )
+ System.out.print( " \"" + Args[i] + "\"" );
+ System.out.println();
+ }
+ processes.add(Runtime.getRuntime().exec( Args ));
+ } catch ( Exception ex ) {
+ System.err.println( ex.getMessage() );
+ retVal = false;
+ }
+ }
+
+ for ( int i = 0; i < processes.size(); i++ ) {
+ Process p = (Process)processes.get( i );
+ InputStream out = p.getInputStream();
+ byte[] buffer = new byte[1024];
+ for ( boolean oncemore = true; oncemore; ) {
+ oncemore = false;
+ try {
+ while ( out.available() > 0 ) {
+ out.read( buffer );
+ System.out.print( new String(buffer) );
+ }
+ for ( out = p.getErrorStream();
+ out.available() > 0; ) {
+ out.read( buffer );
+ System.err.print( new String( buffer ) );
+ }
+ } catch ( Exception ex ) {
+ System.err.println( ex.getMessage() );
+ retVal = false;
+ }
+ try {
+ if ( p.exitValue() != 0 )
+ retVal = false;
+ } catch ( IllegalThreadStateException ex ) {
+ oncemore = true;
+ }
+ }
+ }
+
+ return retVal;
+ }
+}
diff --git a/Master/texmf-dist/source/latex/splitindex/splitindex.pl b/Master/texmf-dist/source/latex/splitindex/splitindex.pl
new file mode 100644
index 00000000000..378fb25e68c
--- /dev/null
+++ b/Master/texmf-dist/source/latex/splitindex/splitindex.pl
@@ -0,0 +1,186 @@
+#! /usr/bin/perl -w
+eval 'exec perl -S $0 ${1+"$@"}'
+ if 0; #$running_under_some_shell
+
+# ======================================================================
+# splitindex.pl
+# Copyright (c) Markus Kohm, 2002
+#
+# $Id: splitindex.pl,v 1.5 2002/11/05 10:54:27 mjk Exp $
+#
+# This file is part of the SplitIndex package
+#
+# This file can be redistributed and/or modified under the conditions
+# of the LaTeX Project Public License, either version 1.2 of this
+# license or (at your option) any later version.
+# The latest version of this license is in
+# http://www.latex-project.org/lppl.txt
+# and version 1.2 or later is part of all distributions of LaTeX
+# version 1999/12/01 or later.
+#
+# You are not allowed to redistribute this file without all the
+# other files of the SplitIndex package
+# ======================================================================
+
+use strict;
+use Getopt::Long;
+
+my $makeindex = "makeindex";
+# my $identify = "^(.*)\\\\UseIndex *\\{([^\\}]*)\\}(.*)\$";
+my $identify = "^(\\\\indexentry)\\[([^]]*)\\](.*)\$";
+my $suffixis = "-\$2";
+my $lineis = "\$1\$3";
+my $verbose = 0; # option verbose with default value
+my $result = GetOptions(
+ 'help' => sub { help() },
+ 'makeindex=s' => \$makeindex,
+ 'identify=s' => \$identify,
+ 'resultis=s' => \$lineis,
+ 'suffixis=s' => \$suffixis,
+ 'verbose|v+' => \$verbose,
+ 'version' => sub { version(); exit 0; }
+ );
+
+usage("missing raw index file") if ( $#ARGV < 0 );
+
+my $indexinput = shift;
+my $jobname = ( $indexinput =~ /^(.*)\.idx$/ ) ? $1 : $indexinput;
+
+my %idxfile;
+my %linesatidxfile;
+
+version() if ($verbose > 0);
+
+if ( !( open (IDX,"<$indexinput") ) ) {
+ if ( $indexinput ne "$jobname.idx" ) {
+ open (IDX,"<$jobname.idx") ||
+ die "Cannot read raw index file $indexinput nor $jobname.idx";
+ $indexinput = "$jobname.idx";
+ } else {
+ die "Cannot read raw index file $indexinput";
+ }
+}
+
+while (<IDX>) {
+ my $line;
+ my $suffix;
+ if ( /$identify/ ) {
+ my $eval = "\$line = \"$lineis\n\"";
+ eval $eval;
+ $eval = "\$suffix = \"$suffixis\"";
+ eval $eval;
+ } else {
+ $line = $_;
+ $suffix = "";
+ $suffix .= "$1" if ( $suffixis =~ /^(.*)\$/ );
+ $suffix .= "idx";
+ $suffix .= "$1" if ( $suffixis =~ /\$[123456789](.*)$/ );
+ }
+ while ( $suffix =~ /(^[^,]+)(.*)$/ ) {
+ $suffix = $2;
+ writetoidx ($1,$line);
+ }
+}
+
+closeallind();
+
+close(IDX);
+
+generateallind(@ARGV);
+
+exit 0;
+
+sub generateallind {
+ my $name;
+ my $file;
+
+ if ( $makeindex ne "" ) {
+ while (($name,$file) = each %idxfile) {
+ system( "$makeindex @ARGV $jobname$name.idx" );
+ }
+ }
+}
+
+sub closeallind {
+ my $name;
+ my $file;
+ my $lines;
+ while (($name,$file) = each %idxfile) {
+ print "Close $jobname$name.idx\n"
+ if ( $verbose > 1 );
+ close( $file );
+ $idxfile{$name}=0;
+ }
+ if ( $verbose > 0 ) {
+ print "\n";
+ while (($name,$lines) = each %linesatidxfile) {
+ print "$jobname$name.idx with $lines lines\n";
+ }
+ }
+}
+
+sub writetoidx {
+ my $suffix = $_[0];
+ my $line = $_[1];
+ my $file = $idxfile{$suffix};
+ if ( ! $file ) {
+ open ( $file, ">$jobname$suffix.idx" ) ||
+ die "Cannot write to file $jobname$suffix.idx";
+ $idxfile{$suffix} = $file;
+ $linesatidxfile{$suffix} = 0;
+ print( "New index file $jobname$suffix.idx\n" )
+ if ( $verbose > 1 );
+ }
+ print ($file $line);
+ $linesatidxfile{$suffix}++;
+}
+
+sub help {
+ version();
+ print "\n";
+ usage();
+ print
+ "Split a single raw index file into multiple raw index files.\n".
+ "Example: splitindex.pl foo.idx.\n".
+ "\n".
+ "Options:\n" .
+ " -h, --help " .
+ "\tshow this help and terminate\n" .
+ " -m, --makeindex PROGNAME\n" .
+ "\t\t\tcall PROGNAME instead of default \`makeindex\'.\n" .
+ " -i, --identify EXPRESSION\n" .
+ "\t\t\tuse regular EXPRESSION to match entries\n".
+ "\t\t\t(see also option --resultis and --suffixis).\n".
+ "\t\t\tDefault is \'$identify\'.\n".
+ " -r, --resultis PATTERN\n" .
+ "\t\t\tcreate line to be written from PATTERN after matching\n".
+ "\t\t\tlines (see also option --identify).\n".
+ "\t\t\tDefault is \'$lineis\'.\n".
+ " -s, --suffixis PATTERN\n" .
+ "\t\t\tcreate suffix to be used from PATTERN after matching\n".
+ "\t\t\tlines (see also option --identify).\n".
+ "\t\t\tDefault is \'$suffixis\'.\n".
+ " -v, --verbose " .
+ "\tbe more verbose\n".
+ "\t\t\t(can be used multiple to increase verbosity)\n" .
+ " --version " .
+ "\tshow version and terminate\n";
+ exit 0;
+}
+
+sub version {
+ print "splitindex.pl 0.1\n" .
+ "Copyright (c) 2002 Markus Kohm \<kohm\@gmx.de\>\n";
+}
+
+sub usage {
+ my $text = "Usage: splitindex.pl [OPTION]... RAWINDEXFILE [MAKEINDEXOPTION]...\n";
+ if ( $#_ >= 0 ) {
+ print STDERR @_;
+ print STDERR "\n$text";
+ print STDERR "Try \`splitindex.pl --help\' for more information.\n";
+ exit 1;
+ } else {
+ print $text;
+ }
+}