summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/splitindex
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2009-03-28 00:35:49 +0000
committerKarl Berry <karl@freefriends.org>2009-03-28 00:35:49 +0000
commit26ed61774040442728cbee707dc6e492b5085674 (patch)
tree85c365b3b8cc847e68a312c73b9f8cc1ca083916 /Master/texmf-dist/source/latex/splitindex
parent87a534fcd4ae6214e3b7f9f91977abfee4582fcf (diff)
splitindex is back, will fix man page tomorrow (25mar09)
git-svn-id: svn://tug.org/texlive/trunk@12544 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/splitindex')
-rw-r--r--Master/texmf-dist/source/latex/splitindex/README67
-rwxr-xr-xMaster/texmf-dist/source/latex/splitindex/install.sh229
-rw-r--r--Master/texmf-dist/source/latex/splitindex/install.txt223
-rw-r--r--Master/texmf-dist/source/latex/splitindex/manifest.txt65
-rw-r--r--Master/texmf-dist/source/latex/splitindex/splitidx.dtx1584
-rw-r--r--Master/texmf-dist/source/latex/splitindex/splitidx.ins135
-rwxr-xr-xMaster/texmf-dist/source/latex/splitindex/splitindex-Linux-i386bin0 -> 9924 bytes
-rwxr-xr-xMaster/texmf-dist/source/latex/splitindex/splitindex-OpenBSD-i386bin0 -> 16384 bytes
-rw-r--r--Master/texmf-dist/source/latex/splitindex/splitindex.164
-rw-r--r--Master/texmf-dist/source/latex/splitindex/splitindex.c602
-rw-r--r--Master/texmf-dist/source/latex/splitindex/splitindex.classbin0 -> 9303 bytes
-rwxr-xr-xMaster/texmf-dist/source/latex/splitindex/splitindex.exebin0 -> 18944 bytes
-rw-r--r--Master/texmf-dist/source/latex/splitindex/splitindex.java441
-rwxr-xr-xMaster/texmf-dist/source/latex/splitindex/splitindex.pl212
-rw-r--r--Master/texmf-dist/source/latex/splitindex/splitindex.tex189
15 files changed, 3811 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/splitindex/README b/Master/texmf-dist/source/latex/splitindex/README
new file mode 100644
index 00000000000..8b531b75d6b
--- /dev/null
+++ b/Master/texmf-dist/source/latex/splitindex/README
@@ -0,0 +1,67 @@
+Welcome to SplitIndex, the TeX index splitter. SplitIndex creates
+multiple index files from one raw index. See manifest.txt if you want
+to know the files SplitIndex exists of.
+
+There are a lot of alternatives in using SplitIndex, because I wanted
+solutions at every platform. Not all of the programs are distributed
+in binary form. But splitindex.tex will work at every platform. And you
+need only TeX (even not LaTeX) to run it.
+
+Currently I support binaries for the following platforms:
+
+ Linux ELF i386, OpenBSD 3.0 i386, CygWIN Windows 32 Bit i386
+
+If you need support, you can write me a mail. Use
+
+ To: splitindex <komascript(at)gmx.info>
+ Subject: SPLITINDEX: <YourProblem>
+
+And replace <YourProblem> by a short (at least 60 chars) description
+of your problem.
+
+See file install.txt for a description how to install this
+distribution and how to get the manual, which describes how to use
+SplitIndex.
+
+LEGALESE:
+---------
+
+This work may be distributed and/or modified under the conditions of
+the LaTeX Project Public License, version 1.3c of the license.
+The latest version of this license is in
+ http://www.latex-project.org/lppl.txt
+and version 1.3c or later is part of all distributions of LaTeX
+version 2005/12/01 or later and of this work.
+
+This work has the LPPL maintenance status "author-maintained".
+
+The Current Maintainer and author of this work is Markus Kohm.
+
+The list of all files belongig to the SplitIndex bundle is given in
+in the file `manifest.txt'. Files generated by means of unpacking the
+distribution (using, for example, the docstrip program) or by means
+of compiling them from a source file, for example, from splitindex.c
+or splitindex.java may be distributed at the distributor's discretion.
+However if they are distributed then a copy of the SplitIndex bundle
+must be distributed together with them.
+
+The list of derived (unpacked or compiled) files belongig to the
+distribution and covered by LPPL is defined by the unpacking scripts
+(with extension .ins) and the installation script (with name
+install.sh) which are part of the distribution.
+
+Two often ignorred clauses from LPPL 1.3c you should not ignore:
+----------------------------------------------------------------
+
+2. You may distribute a complete, unmodified copy of the Work as you
+ received it. Distribution of only part of the Work is considered
+ modification of the Work, and no right to distribute such a Derived
+ Work may be assumed under the terms of this clause.
+3. You may distribute a Compiled Work that has been generated from a
+ complete, unmodified copy of the Work as distributed under Clause 2
+ above, as long as that Compiled Work is distributed in such a way that
+ the recipients may install the Compiled Work on their system exactly
+ as it would have been installed if they generated a Compiled Work
+ directly from the Work.
+
+Enjoy, Markus.
diff --git a/Master/texmf-dist/source/latex/splitindex/install.sh b/Master/texmf-dist/source/latex/splitindex/install.sh
new file mode 100755
index 00000000000..b66b343f0bf
--- /dev/null
+++ b/Master/texmf-dist/source/latex/splitindex/install.sh
@@ -0,0 +1,229 @@
+#!/bin/sh
+
+archbin=false
+tdsarchive=false
+
+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
+ ;;
+ --archbin)
+ archbin=true
+ shift 1
+ ;;
+ --tdsarchive)
+ tdsarchive=true
+ 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 "--archbin install binaries at arch depending directories at bindir"
+ echo "--mandir=<DIR> install manuals at <DIR>"
+ echo "--texmf=<DIR> install packages and TeX programs at <DIR>/tex/latex/splitindex,"
+ echo " documentation (dvi and pdf) at <DIR>/doc/latex/splitindex and"
+ echo " sources at <DIR>/source/latex/splitindex"
+ echo " (default: \$TEXMFLOCAL if you are root and \$HOMETEXMF if"
+ echo " you are not root)"
+ exit 0
+ ;;
+ --dist)
+ mkdir -p splitidx
+ cp -L splitindex splitindex-Linux-i386
+ cp -L 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 +%F`.tar.bz2 splitidx
+ cd splitidx
+ rm -r chroot
+ ./install.sh --texmf ../chroot/texmf --tdsarchive
+ cd ..
+ rm -r splitidx
+ cd chroot/texmf
+ zip -r ../../splitindex-`date +%F`.tds.zip *
+ cd ../..
+ find chroot/texmf/ | \
+ sed 's/chroot\//+-/g;s/[a-z0-9-]*\//-/g'
+ mkdir chroot/splitindex
+ cp -R -p -L chroot/texmf/source/latex/splitindex/* chroot/splitindex
+ cp -R -p -L chroot/texmf/doc/latex/splitindex/* chroot/splitindex
+ cd chroot
+ zip -r ../splitindex-`date +%F`.CTAN.zip splitindex
+ cd ..
+ rm -r chroot
+ 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
+ cp -p splitindex splitindex-`uname -s`-`uname -m`
+ 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 -v -m 755 -d $texmf/doc/latex/splitindex
+install -v -m 755 -d $texmf/tex/latex/splitindex
+install -v -m 755 -d $texmf/source/latex/splitindex
+
+if $tdsarchive; then
+ install -v -m 755 -d $texmf/scripts/splitindex/perl
+ install -v -m 755 splitindex.pl $texmf/scripts/splitindex/perl
+ install -v -m 644 splitindex.1 $texmf/doc/latex/splitindex
+elif $archbin; then
+ install -v -m 755 -d $bindir
+ install -v -m 755 -d $bindir/i386-linux
+ install -v -m 755 -d $bindir/i386-openbsd
+ install -v -m 755 -d $bindir/i386-cygwin
+ install -v -m 755 -d $bindir/any
+ install -v -m 755 splitindex-Linux-i386 $bindir/i386-linux/splitindex
+ install -v -m 755 splitindex-OpenBSD-i386 $bindir/i386-openbsd/splitindex
+ install -v -m 755 splitindex.exe $bindir/i386-cygwin/splitindex.exe
+ install -v -m 755 splitindex.pl $bindir/any
+ install -v -m 644 splitindex.class $bindir/any
+ install -v -m 755 -d $mandir/man1
+ install -v -m 644 splitindex.1 $mandir/man1
+else
+ install -v -m 755 -d $bindir
+ install -v -m 755 $splitindex splitindex.pl $bindir
+ install -v -m 644 splitindex.class $bindir
+fi
+
+install -v -m 644 splitindex.tex splitidx.sty $texmf/tex/latex/splitindex
+
+install -v -m 644 README install.txt splitidx.pdf $texmf/doc/latex/splitindex
+
+install -v -m 644 \
+ splitindex.1 splitindex.c splitindex.java splitindex.class \
+ splitindex.tex\
+ README splitidx.dtx splitidx.ins manifest.txt install.txt \
+ $texmf/source/latex/splitindex
+install -v -m 755 \
+ install.sh \
+ splitindex.pl splitindex.exe \
+ splitindex-Linux-i386 splitindex-OpenBSD-i386 \
+ $texmf/source/latex/splitindex
diff --git a/Master/texmf-dist/source/latex/splitindex/install.txt b/Master/texmf-dist/source/latex/splitindex/install.txt
new file mode 100644
index 00000000000..353a37af06a
--- /dev/null
+++ b/Master/texmf-dist/source/latex/splitindex/install.txt
@@ -0,0 +1,223 @@
+ SplitIndex Installation Guide
+
+ 2009-03-18
+
+
+INTRODUCTION
+============
+
+If you know how to install LaTeX packages and how to install binary
+programs, just do it. If you don't know, read the following. If you
+are using Linux-i386 or OpenBSD-i386 or another Unix like environment
+with installed Gnu fileutils and installed Gnu-C-Compiler, you may try
+install.sh for installation. See
+
+ ./install.sh --help
+
+for more information. If you don't have GCC, Linux-i386 or
+OpenBSD-i386 you may also use install.sh, but you have to compile
+and link splitindex.c before. See the splitidx manual for this.
+
+But you may also try the following step by step installation:
+
+HOW TO INSTALL SplitIndex FROM A TDS-ARCHIVE
+============================================
+
+Some distributors may use a SplitIndex TDS-archive for distributing
+SplitIndex. SplitIndex TDS-archive may be installed very easily.
+The SplitIndex TDS-archive has following contents:
+
+ +- doc/
+ | +- latex/
+ | +- splitindex/
+ | +- install.txt
+ | +- README
+ | +- splitidx.pdf
+ | +- splitindex.1
+ +- tex/
+ | +- latex/
+ | +- splitindex/
+ | +- splitidx.sty
+ | +- splitindex.tex
+ +- scripts/
+ | +- splitindex/
+ | +- perl/
+ | +- splitindex.pl
+ +- source/
+ +- latex/
+ +- splitindex/
+ +- install.sh
+ +- install.txt
+ +- manifest.txt
+ +- README
+ +- splitidx.dtx
+ +- splitidx.ins
+ +- splitindex.1
+ +- splitindex.c
+ +- splitindex.class
+ +- splitindex.exe
+ +- splitindex.java
+ +- splitindex-Linux-i386
+ +- splitindex-OpenBSD-i386
+ +- splitindex.pl
+ +- splitindex.tex
+
+If you don't have such an archive, continue reading at 1st step of ``HOW TO
+GENERATE THE splitidx PACKAGE''. If you have such an archive - we will use
+the file name ``splitindex.tds.zip'' in the following - you may continue
+with:
+
+A) Have a look where your LaTeX Distribution searchs for files.
+ With teTeX you can ask kpathsea for this, e.g. using a unix
+ shell:
+
+ kpsexpand \$TEXMFLOCAL
+
+ to use the local texmf tree or:
+
+ kpsexpand \$HOMETEXMF
+
+ to use your private texmf tree. Following uses ``<TEXMF>'' to
+ be a synonym for the texmf tree you want to use.
+
+B) Extract splitindex.tds.zip at <TEXMF> with all the subdirectories of
+ the splitindex.tds.zip but without generating additional
+ subdirectories, e.g., using:
+
+ cd <TEXMF>
+ unzip splitindex.tds.zip
+
+ or any other zip extraction programm.
+
+C) Continue with 5th to 9th step of ``HOW TO INSTALL THE BINARIES''.
+
+D) Call the program, which is used to update the filename data
+ base, e.g., texhash or mktexlsr if you are using teTeX/TeX Live.
+
+E) Read ``HOW TO TEST YOUR INSTALLATION'' at the end of this
+ documentation.
+
+
+HOW TO GENERATE THE splitidx PACKAGE
+====================================
+
+You need this only, if you don't have a SplitIndex TDS-archive, but want
+to install SplitIndex from a basic SplitIndex distribution. If you have
+already done the SplitIndex TDS-archive installation discribed above, you
+should skip this section.
+
+1st) Process splitidx.ins with TeX or LaTeX, e.g. using the following
+ input at a command shell (e.g. bash or command.com):
+
+ latex splitidx.ins
+
+ Maybe you'll be asked, if you want to overwrite existing files.
+ Answer this question with yes.
+
+2nd) Have a look where your LaTeX Distribution searchs for files.
+ With teTeX you can ask kpathsea for this, e.g. using a unix
+ shell:
+
+ kpsexpand \$TEXMFLOCAL
+
+ to use the local texmf tree or:
+
+ kpsexpand \$HOMETEXMF
+
+ to use your private texmf tree. Following uses ``<TEXMF>'' to
+ be a synonym for the texmf tree you want to use.
+
+3rd) Create folder <TEXMF>/tex/latex/splitindex (at Windows:
+ <TEXMF>\tex\latex\splitindex), if it doesn't exist. Copy
+ splitidx.sty to this folder.
+
+4th) Call the program, which is used to update the filename data
+ base, e.g. texhash or mktexlsr if you are using teTeX/TeX Live.
+
+
+HOW TO INSTALL THE BINARIES
+===========================
+
+You need only one of the binaries splitindex (compiled from splitindex.c),
+splitindex.class (compiled from splitindex.java) or splitindex.pl (using a
+perl interpreter). Following steps will install all these binaries.
+Please do them all, before asking for support.
+
+5th) Rename the suitable binary (e.g. splitindex-Linux-i386, if you're
+ using Linux-i386) to splitindex or compile splitindex.c to generate
+ a binary named splitindex using e.g.
+ gcc -O3 -Wall -o splitindex splitindex.c
+ or
+ gcc -O3 -Wall -DNO_LONGOPT -o splitindex splitindex.c
+
+6th) Copy splitindex.java to the binary search path of SUN JAVA
+ 1.4.1.
+
+7th) Copy splitindex.pl and splitindex or splitindex.exe somewhere to
+ your binary search path (ask environment variable PATH).
+
+8th) Copy the manual page splitindex.1 to your manual seach path. If you are
+ using Linux or OpenBSD, this may be, e.g., /usr/local/man/man1/ (ask
+ environment variable MANPATH).
+
+9th) Copy splitindex.tex to the same location you've copied
+ splitidx.sty to and do 4th step again.
+
+
+HOW TO GENERATE THE MANUAL
+==========================
+
+10th) process splitidx.dtx with LaTeX to generate the user manual of
+ splitidx and SplitIndex, e.g. using the following input at a
+ command shell:
+
+ latex splitidx.dtx
+ latex splitidx.dtx
+ mkindex splitidx
+ latex splitidx.dtx
+
+ or (if you do not have the mkindex script):
+
+ latex splitidx.dtx
+ latex splitidx.dtx
+ makeindex -s gind.ist splitidx
+ makeindex -s gglo.ist -o splitidx.gls splitidx.glo
+ latex splitidx.dtx
+
+ You may print the resulting splitidx.dvi. If you prefere PDF
+ files, use pdflatex instead of latex.
+
+11th) read the manual you produced at 10th step.
+
+
+HOW TO TEST YOUR INSTALLATION
+=============================
+
+Use the following LaTeX source to test the installation. See
+splitidx.dvi or splitidx.pdf to see how to do this.
+
+\documentclass{article} % We use \Class{article} class ...
+\usepackage{splitidx} % ... and the \Package{splitidx} package
+\makeindex % And we want index generation
+\usepackage{hyperref}
+% We define 4 indices:
+\newindex[General Index]{idx} % Name and shortcut of the 1st index
+\newindex[Index of Animals]{ani} % ... 2nd index
+\newindex[Index of Fruits]{fru} % ... 3rd index
+\newindex[Index of Vegetables]{veg} % ... \dots\ 4th index
+
+\begin{document}
+Apples\sindex[fru]{apple} % an entry to fru index
+and oranges\sindex[fru]{orange} % an entry to fru index
+are fruits\sindex{fruits}. % an implicite entry to idx index
+Tomatos\sindex[veg]{tomato} % an entry to veg index
+are vegetables\index{vegetables}. % an implicite entry to idx index
+Cats\sindex[ani]{cat} % an entry to ani index
+are animals\sindex[idx]{animals}. % an explicite entry to idx index
+
+\twocolumn[%
+ \section*{Indices}%
+ \markboth{Indices}{Indices}%
+]
+\printsubindex* % print all indices
+\end{document}
diff --git a/Master/texmf-dist/source/latex/splitindex/manifest.txt b/Master/texmf-dist/source/latex/splitindex/manifest.txt
new file mode 100644
index 00000000000..ba62ed064dd
--- /dev/null
+++ b/Master/texmf-dist/source/latex/splitindex/manifest.txt
@@ -0,0 +1,65 @@
+%
+% The following files form the SplitIndex Bundle and also every
+% SplitIndex Distribution since 2002.
+%
+%
+% CONTENTS OF THE SplitIndex DISTRIBUTION
+% =======================================
+%
+% Documentation:
+% --------------
+%
+% manifest.txt -- This file.
+% install.txt -- How to install SplitIndex (overview).
+% README -- Should be read first.
+% splitindex.1 -- The unix manual page of all SplitIndex
+% programs.
+%
+%
+% LaTeX files:
+% ------------
+%
+% splitidx.dtx -- The source of the splitidx package and of the
+% manual.
+% splitidx.ins -- The installation script for the splitidx
+% package.
+%
+%
+% Program sources:
+% ----------------
+%
+% splitindex.pl -- The source of the reference implementation of
+% the SplitIndex program.
+% splitindex.java -- The source of the SUN JAVA 1.4.1 implementation
+% of the SplitIndex program.
+% splitindex.c -- The source of the C implementation of the
+% SplitIndex program.
+% splitindex.tex -- The source of the TeX implementation of the
+% SplitIndex program.
+%
+%
+% Programs (binaries):
+% --------------------
+%
+% splitindex.pl -- Perl is an interpreter, so this is the source
+% and the program itself (but not binary)
+% splitindex.class -- The SUN JAVA 1.4.1 bitcode of the SplitIndex
+% program.
+% splitindex-Linux-i386
+% -- The Linux-i386-ELF binary of the SplitIndex
+% program.
+% splitindex-OpenBSD-i386
+% -- The OpenBSD-i386 binary of the SplitIndex
+% program.
+% splitindex.exe -- The CygWin-i386 (Win32) binary the SplitIndex
+% program.
+%
+%
+% Installation programs:
+% ----------------------
+%
+% install.sh -- See `install.txt' for more information about
+% this.
+%
+% ====================================================================
+%
diff --git a/Master/texmf-dist/source/latex/splitindex/splitidx.dtx b/Master/texmf-dist/source/latex/splitindex/splitidx.dtx
new file mode 100644
index 00000000000..a0bae1a464e
--- /dev/null
+++ b/Master/texmf-dist/source/latex/splitindex/splitidx.dtx
@@ -0,0 +1,1584 @@
+% \CheckSum{604}
+% \iffalse
+% ======================================================================
+% splitidx.dtx
+% Copyright (c) Markus Kohm, 2002-2009
+%
+% $Id: splitidx.dtx,v 1.6 2009-03-20 14:55:11 mjk Exp $
+%
+% This file is part of the SplitIndex bundle.
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, version 1.3c of the license.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later and of this work.
+%
+% This work has the LPPL maintenance status "author-maintained".
+%
+% The Current Maintainer and author of this work is Markus Kohm.
+%
+% The list of all files belongig to the SplitIndex bundle is given in
+% in the file `manifest.txt'. Files generated by means of unpacking the
+% distribution (using, for example, the docstrip program) or by means
+% of compiling them from a source file, for example, from splitindex.c
+% or splitindex.java may be distributed at the distributor's discretion.
+% However if they are distributed then a copy of the SplitIndex bundle
+% must be distributed together with them.
+%
+% The list of derived (unpacked or compiled) files belongig to the
+% distribution and covered by LPPL is defined by the unpacking scripts
+% (with extension .ins) and the installation script (with name
+% install.sh) which are part of the distribution.
+%
+% Two often ignorred clauses from LPPL 1.3c you should not ignore:
+% ----------------------------------------------------------------
+% 2. You may distribute a complete, unmodified copy of the Work as you
+% received it. Distribution of only part of the Work is considered
+% modification of the Work, and no right to distribute such a Derived
+% Work may be assumed under the terms of this clause.
+% 3. You may distribute a Compiled Work that has been generated from a
+% complete, unmodified copy of the Work as distributed under Clause 2
+% above, as long as that Compiled Work is distributed in such a way that
+% the recipients may install the Compiled Work on their system exactly
+% as it would have been installed if they generated a Compiled Work
+% directly from the Work.
+% ======================================================================
+%
+%<*dtx>
+% \fi
+\ProvidesFile{splitidx.dtx}[%
+% \iffalse
+%</dtx>
+%<driver>\ProvidesFile{splitidx.drv}[%
+%<package>\ProvidesPackage{splitidx}[%
+% \fi
+ 2009/02/28 v1.1a multiple indices for LaTeX]
+% \iffalse
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{color,alltt}
+\newcommand*{\Prompt}{{\color{green}\textbf{\$}}}
+\newcommand*{\Package}{}\let\Package\textsf
+\newcommand*{\Class}{}\let\Class\textsf
+\newcommand*{\Program}{}\let\Program\textsf
+\newcommand*{\File}{}\let\File\texttt
+\newcommand*{\Cmdline}{}\let\Cmdline\texttt
+\providecommand*{\url}{\texttt}
+\CodelineIndex
+\RecordChanges
+\EnableCrossrefs
+\GetFileInfo{splitidx.dtx}
+\title{Creating More Than One Index Using \Package{splitidx} And
+ \Program{SplitIndex}\thanks{This file is version \fileversion{} of file
+ \File{\filename}. Nevertheless it should be stable.}}
+\author{Markus Kohm\thanks{Markus Kohm \textless komascript\textcircled{\tiny at}gmx.info\textgreater}}
+\date{\filedate}
+\begin{document}
+\maketitle
+\begin{abstract}
+ With \Package{makeidx} there's a standard package at \LaTeX{} to create
+ one index to each document. But some times more than one index is
+ needed. There are different packages with different solutions and different
+ problems to achieve multiple indices. Here is one more.
+\end{abstract}
+\tableofcontents
+\DocInput{splitidx.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \DoNotIndex{\DeclareOption,\AtEndOfPackage,\renewcommand,\g@addto@macro}
+% \DoNotIndex{\renewcommand,\ProcessOptions,\relax,\newcommand,\emph}
+% \DoNotIndex{\providecommand,\@bsphack,\@esphack,\@sanitize,\typeout}
+% \DoNotIndex{\begingroup,\endgroup,\jobname,\ifx,\else,\fi,\expandafter}
+% \DoNotIndex{\csname,\endcsname,\protected@write,\AtBeginDocument}
+% \DoNotIndex{\ifHy@hyperindex,\@indexfile,\thepage,\Hy@temp@A}
+% \DoNotIndex{\HyInd@ParenLeft,\HyInd@ParenRight,\string,\@ifstar,\@input@}
+% \DoNotIndex{\@ifnextchar,\edef,\let,\@empty,\@for,\@tempa,\xdef,\def}
+% \DoNotIndex{\catcode,\lowercase,\do,\@ifundefined,\PackageError}
+% \DoNotIndex{\MessageBreak,\gdef,\@namedef,\setcounter,\@gobble.\-,\\}
+% \DoNotIndex{\@onlypreamble,\@tempb,\@wrindex,\immediate,\newif,\newwrite}
+% \DoNotIndex{\openout,\@gobble}
+%
+% \section{Introduction}
+%
+% First of all you have to know how index generation normally would be
+% done. Read \cite{makeindex} and e.g. \cite{makeindexmanual} if you
+% don't.
+%
+% Generally you load a package e.g. \Package{makeidx}, put \cs{index} commands
+% into your document, which are written as \cs{indexentry} commands to the raw
+% index file ``\File{\cs{jobname}.idx}''. Then you call an \emph{index
+% processor} like \Program{MakeIndex} or \Program{xindy}, which generates a
+% sorted index file ``\File{\cs{jobname}.ind}''. This will be included with a
+% command like \cs{printindex} at the end of your document.
+%
+% Most packages, which allows more than one index, open more than one raw
+% index file. Each of these files costs a write file handle. \TeX{} has only
+% 16 of these. \LaTeX{} itself needs some of these for e.g. \File{.aux},
+% \File{.toc}, \File{.lot}, \File{.lof} and maybe other more or less temporary
+% files depends on what you are doing. With package option \texttt{split}
+% package \Package{splitidx} works like those packages.
+%
+% Without option \texttt{split} the \Package{splitidx} package needs only one
+% raw index file like \Package{makeidx} would. This one raw index files
+% contains all the index entries for all the indices you defined. But to do so
+% \Package{splitidx} and the index processor need help. Before calling the
+% index processor the one raw index file has to be splitted into multiple raw
+% index files. Each of these contains the index entries of one index. This
+% splitting can be done with the \Program{splitindex} program.
+%
+% There is not only one \Program{SplitIndex} program, there are
+% \Program{SplitIndex} programs in different programming languages:
+% \begin{description}
+% \item[\Program{splitindex.pl}] This is written in perl. You need a perl
+% interpreter to run it. If you are a Unix user, you have a perl interpreter
+% and you can call \Program{splitindex.pl} like you would call a binary
+% program or a shell script from your shell. This is the reference
+% implementation. I prefers to use this\,---\,because it was the first, the
+% easiest and the shortest to be written.
+% \item[\Program{splitindex.jar}] This is written using Sun Java 1.4.1. You
+% can find the source at \File{splitindex.java}. I wrote it, because Java is
+% everywhere and may be installed everywhere and a lot of people are able to
+% understand Java source files. But if you don't have Sun Java 1.4 the start
+% of this program will result in errors\,---\,e.g.
+% \begin{quote}
+% \texttt{Exception in thread "main" java.util.zip.ZipException: No such
+% file or directory}
+% \end{quote}
+% if you try to start it with Sun Java 1.3.
+% \item[\Program{splitindex-Linux-i386}] This is a Linux-i386-ELF binary from
+% the C source file \File{splitindex.c}. It will be renamed to
+% \Program{splitindex} during installation, if you are using Linux-i386. At
+% section~\ref{C} you find a introduction in how to compile
+% \File{splitindex.c} yourself e.g. if you are using Linux-PPC. I wrote the
+% C source, because a lot of people like to have a binary and most software
+% authors understand C and some people want fast binaries instead of slow
+% Java bit code\,---\,even, if the Java program is fast enough.
+% \item[\Program{splitindex-OpenBSD-i386}] This is a OpenBSD-i386 binary from
+% the C source file \File{splitindex.c}. It will be renamed to
+% \Program{splitindex} during installation, if you are using
+% OpenBSD-i386. It is almost the same like
+% \Program{splitindex-Linux-i386}\,---\,but it doesn't understand long
+% option names.
+% \item[\Program{splitindex.exe}] This is a CygWin binary from the C source
+% file \File{splitindex.c}. A CygWin binary is a Windows (Win32) binary
+% using the CygWin DLL. At section~\ref{C} you find a introduction in how to
+% use a CygWin binary without installing a whole CygWin
+% environment\,---\,nevertheless it is nice to have a almost complete
+% CygWin.
+% \item[\Program{splitindex.tex}] This is a \TeX{} version of the
+% program. Yes, you are right: it is a program written in \TeX{}. It has not
+% the whole functionality of the other programs (see section~\ref{TeX}), but
+% it is system independent and you don't need to install a other program
+% like perl or Sun Java 1.4. It is not impossible to fix all the
+% disadvantages of this program\,---\,but it isn't easy and much more work
+% than all the other program.
+% \end{description}
+% Without the \TeX{} version of \Program{splitindex} all of these programs are
+% also able to call the index processor after creating the raw index files.
+%
+% And where is the lisp, the smalltalk, the prolog, the \dots{} version of
+% \Program{splitindex}? Hey, four languages are enough for me! If you need one
+% more, write it!
+%
+%
+% \section{Using the \Package{splitidx} package}
+% \label{package}
+%
+%
+% \subsection{Generating a raw index}
+%
+% You may use \Package{splitidx} as a drop-in-replacement for
+% \Package{makeidx}. If you do so, you just have to replace:
+% \begin{verbatim}
+% \usepackage{makeidx}
+% \end{verbatim}\vspace{-\baselineskip}
+% by
+% \begin{verbatim}
+% \usepackage{splitidx}
+% \end{verbatim}\vspace{-\baselineskip}
+%
+% \DescribeMacro{\makeindex}
+% To activate index generation you may use \cs{makeindex}, which is declared
+% by the \LaTeX{} kernel.
+% You may also load the package with option
+% \texttt{makeindex}:
+% \begin{verbatim}
+% \usepackage[makeindex]{splitidx}
+% \end{verbatim}\vspace{-\baselineskip}
+% which is almost the same like:
+% \begin{verbatim}
+% \usepackage{splitidx}\makeindex
+% \end{verbatim}\vspace{-\baselineskip}
+%
+% \DescribeMacro{\index}
+% After loading the package you may use command \cs{index}. You can find the
+% description of the argument and features of this command at
+% \cite{makeindex}. The \Program{splitindex} programs (see
+% section~\ref{program}) put all index entries, which are produced with
+% \cs{index} to the index with shortcut ``\texttt{idx}''.
+%
+% \DescribeMacro{\sindex}
+% The \Package{splitidx} package also defines the command \cs{sindex} with the
+% syntax:
+% \begin{quote}
+% \cs{sindex}\oarg{shortcut}\marg{index-entry}
+% \end{quote}
+% to be used to put an index
+% entry into the index with the optional given shortcut. If you omit optional
+% \meta{shortcut} the shortcut ``\texttt{idx}'' will be used.
+% If you use \cs{sindex} you need to split the raw index file into several raw
+% index files, before generating the index with an index processor like
+% \Program{MakeIndex}. See section~\ref{program} for more information about
+% splitting the raw index file.
+%
+% The shortcut is used not only to distinguish between the different
+% indices. It is also used as part of the name of the raw index file generated
+% by a \Program{splitindex} program (see section~\ref{program}) and the
+% corresponding index file generated by an index processor like
+% \Program{MakeIndex} (see \cite{makeindexmanual}). So you should not use
+% characters or symbols at \meta{shortcut} which are not allowed at
+% filenames. At file systems, which are not case sensitive, you should not mix
+% upper and lower case letters. Best would be, if you'll use only lower case
+% letters.
+%
+% Under some unfortunate circumstances you may be forced to put all your index
+% entries back to one index. The easiest way to do this without changing all
+% \cs{sindex} commands into \cs{index} commands is the package option
+% \texttt{allatone}. If you load the package with:
+% \begin{verbatim}
+% \usepackage[allatone]{splitidx}
+% \end{verbatim}\vspace{-\baselineskip}
+% or
+% \begin{verbatim}
+% \usepackage[allatone,makeindex]{splitidx}
+% \end{verbatim}\vspace{-\baselineskip}
+% \cs{sindex}\oarg{shortcut}\marg{indexentry} will result in
+% \cs{index}\marg{indexentry}.
+%
+% If you like, you may also declare that \cs{index} should be the same
+% like command \cs{sindex}. In this case, you may use package
+% option \texttt{useindex}, e.g.:
+% \begin{verbatim}
+% \usepackage[useindex]{splitidx}
+% \end{verbatim}\vspace{-\baselineskip}
+% This may be usefull using packages like \textsf{jurabib} that expects
+% \cs{index} to be the index command.
+%
+% \emph{Note: Currently only one of the options \texttt{allatone} and
+% \texttt{useindex} can be used at same time. If you are using both
+% \texttt{useindex} will be disabled! This may result in many error
+% messages!}
+%
+% \DescribeMacro{\AtWriteToIndex}
+% \Package{splitidx} uses \cs{protected@write} to write the index entries to
+% the raw index files. The second argument of \cs{protected@write} will be
+% executed immediatly before writing to the raw index file. With
+% \begin{quote}
+% \cs{AtWriteToIndex}\marg{shortcut}\marg{commands}
+% \end{quote}
+% you may add \marg{commands} to this argument. This may be usefull,
+% if you do not want to reference the page number but another counter. You
+% may, e.g., use
+% \begin{verbatim}
+% \AtWriteToIndex{idx}{\let\thepage\thesection}
+% \end{verbatim}
+% to write the current section number instead of the page number to the main
+% index. But be carefull: If you do not use option \texttt{useindex}, command
+% \cs{index} will still write the page number to the index. This may be used
+% only at the document preamble.
+%
+% \DescribeMacro{\AtNextWriteToIndex}
+% Somethimes it may be usefull to have the same like \cs{AtWriteToIndex} only
+% for the next write. So you may use
+% \begin{quote}
+% \cs{AtNextWriteToIndex}\marg{shortcut}\marg{commands}
+% \end{quote}
+% instead of using \cs{AtWriteToIndex}.
+%
+% \subsection{Printing an index}
+%
+% \DescribeMacro{\newindex}
+% If you want to generate more than one index without shortcut, you should
+% declare this using \cs{newindex} with syntax:
+% \begin{quote}
+% \cs{newindex}\oarg{index name}\marg{shortcut}.
+% \end{quote}
+% The mandatory argument \meta{shortcut} is used to distinguish the different
+% indices. See description of \cs{sindex} for more information about this. The
+% optional argument \meta{index name} is the name of the index. This is also
+% the default heading of this index used from \cs{printindex} and
+% \cs{printsubindex}. If you omit \meta{index name} the shortcut will be used
+% as index name.
+%
+% Some people do not like to call an extra program like
+% \Program{splitindex}. For those the package option \texttt{split} has been
+% implemented. With this option \Package{splitidx} opens a new file for each
+% index, which is declared using \cs{newindex}. If you are using this option,
+% you have to declare all indices you want to use at the preamble of your
+% document. This also uses the default \File{idx} file for index entries to
+% index with shortcut \texttt{idx}. The number of index files, you can open is
+% limited, if you are using this option. This is because of the limitation of
+% output streams \TeX{} provides. With this option not only \cs{newindex} may
+% result in an error but also \cs{tableofcontents}, \cs{listoffigures},
+% \cs{listoftables} and each other command, which allocates an output stream.
+%
+% Some people do not like to write \cs{sindex[foo]}\marg{entry}. They want to
+% write \cs{foo}\marg{entry}. For those of you the package option
+% `\texttt{idxcommands}' has been implemented. This defines a command with the
+% name of the \meta{shortcut} for each declared index. If you are using this
+% option, you'll get an error, if a shortcut is the name of an already defined
+% command. And if you are using this option, the characters of the shortcuts
+% must be letters.
+%
+% \DescribeMacro{\newprotectedindex}
+% Using standard index package \textsf{makeidx} the \LaTeX{} kernel command
+% \cs{index} may expand the argument of \cs{index}. The kernel uses
+% \cs{@santize} to avoid this in some cases. But this fails, if the argument
+% was already read e.g. by another macro. So if you define a macro, that reads
+% an argument, does something with the argument and write it to the index this
+% may expand the argument. Try following:
+% \begin{verbatim}
+% \documentclass{article}
+% \usepackage{ngerman}
+% \usepackage{makeidx}\makeindex
+% \newcommand*{\Test}[1]{#1\index{#1}}
+% \begin{document}
+% \Test{"Anderung}
+% "Anderung\index{"Anderung}
+% \end{document}
+% \end{verbatim}\vspace{-\baselineskip}
+% This will result in two entries at the \texttt{.idx} file:
+% \begin{verbatim}
+% \indexentry{\active@dq \dq@prtct{A}nderung}{1}
+% \indexentry{"Anderung}{1}
+% \end{verbatim}\vspace{-\baselineskip}
+% The first one is something expanded that is not wanted. Package
+% \textsf{splitindx} behaves same by default. But if you are using
+% \cs{newprotectedindex} to define a new index, it uses a trick so avoid
+% expansion. If all indices should behave like this, you may simply use
+% package option \texttt{protected}.
+% \begin{verbatim}
+% \documentclass{article}
+% \usepackage{ngerman}
+% \usepackage[protected,useindex,makeindex]{makeidx}
+% \newcommand*{\Test}[1]{#1\index{#1}}
+% \begin{document}
+% \Test{"Anderung}
+% "Anderung\index{"Anderung}
+% \end{document}
+% \end{verbatim}\vspace{-\baselineskip}
+% Will result in two entries at the \texttt{.idx} file:
+% \begin{verbatim}
+% \indexentry{"Anderung}{1}
+% \indexentry{"Anderung}{1}
+% \end{verbatim}\vspace{-\baselineskip}
+% If you want to know more about the trick, see command
+% \cs{@onelevel@sanitize} at the \LaTeX{} kernel documentation,
+% \texttt{source2e}.
+%
+%
+% \DescribeMacro{\printindex}
+% \changes{v0.2a}{2003/01/05}{fix of documentation bug}
+% The \cs{printindex} command is used to print one index or all indices, which
+% are declared using \cs{newindex}. How it behaves depends on the syntax you
+% are using.
+%
+% With syntax
+% \begin{quote}
+% \cs{printindex}\oarg{shortcut}\oarg{index name}
+% \end{quote}
+% the index file with the optional shortcut will be loaded and titled with
+% optional given index name. If \meta{index name} is omitted the default index
+% name declared with \cs{newindex} will be used.
+%
+% If the both optional arguments, \meta{shortcut} and \meta{index name}, are
+% omitted and you are using simply
+% \begin{quote}
+% \cs{printindex}
+% \end{quote}
+% it behaves like \cs{printindex} from package \Package{makeidx}. You should
+% not use this, if you are using \cs{sindex} with optional argument.
+%
+% You may also print all indices, which were declared using \cs{newindex}. Use
+% syntax:
+% \begin{quote}
+% \cs{printindex*}
+% \end{quote}
+% to do so. The indices will be printed in the order you declared them using
+% \cs{newindex}.
+%
+% \cs{printindex} uses the default index output of the class and the
+% index processor you are using. Most this will be \texttt{theindex}
+% environment, but it needn't. But \cs{printindex} will fail to set the name
+% of the index if \cs{indexname} isn't use to print the name of the
+% index. This would be a failure of the class not of the \Package{splitidx}
+% package. I don't know any class with this failure.
+%
+%
+% \DescribeMacro{\printsubindex}
+% The \cs{printsubindex} command behaves like \cs{printindex} with same syntax
+% but it does some redefinitions before printing the index, to:
+% \begin{itemize}
+% \item use \cs{section} instead of \cs{chapter} level at classes, which have
+% \cs{chapter} and \cs{subsection} instead of \cs{section} level at classes,
+% which haven't \cs{chapter},
+% \item deactivate \cs{onecolumn}, \cs{twocolumn} and \cs{clearpage},
+% \cs{cleardoublepage} to start a new page at each index,
+% \item change the mark mechanism not to use \cs{markboth} but \cs{markright}
+% for setting up the running headline.
+% \end{itemize}
+% Using this you can print multiple indices at one chapter, if you are using a
+% class with \cs{chapter}, or at one section, if you are using a class without
+% \cs{chapter}.
+%
+%
+% \DescribeMacro{\setindexpreamble}
+% If you are using a KOMA-Script class, you'll know this command. Package
+% \Package{splitidx} redefines this command to syntax:
+% \begin{quote}
+% \cs{setindexpreamble}\oarg{shortcut}\marg{preamble}
+% \end{quote}
+% So you can define a preamble for each index. Note: Package
+% \Package{splitidx} doesn't print the preamble itself. But it lets
+% \cs{index@preamble} to be the preamble of the index with the actual
+% shortcut, before printing an index using \cs{printindex} or
+% \cs{printsubindex}.
+%
+%
+% \DescribeMacro{\useindexpreamble}
+% If you are defining your own index environment or if you extend
+% \texttt{theindex} environment using e.g. \cs{extendtheindex}, you may use
+% \cs{useindexpreamble} with syntax:
+% \begin{quote}
+% \cs{useindexpreamble}\oarg{additional commands}
+% \end{quote}
+% to print the preamble of the actual index, which was set using
+% \cs{setindexpreamble}. This is not related to the KOMA-Script classes, it
+% can also be used e.g. with the standard classes. The commands from optional
+% argument \meta{additional commands} are only used, if the preamble is
+% defined and not empty.
+%
+%
+% \DescribeMacro{\indexshortcut}
+% The macro \cs{indexshortcut} is only defined at \cs{printindex} and
+% \cs{printsubindex}. It expands to the shortcut of the actual index. So you
+% may use it at your own index environment or extending the \texttt{theindex}
+% environment using e.g. \cs{extendtheindex}.
+%
+%
+% \DescribeMacro{\extendtheindex}
+% Most classes define the environment \texttt{theindex} to be used for
+% printing the index. Using \cs{extendtheindex} with syntax
+% \begin{quote}
+% \cs{extendtheindex}\marg{before begin}\marg{after begin}^^A
+% \marg{before end}\mbox{\marg{after end}}
+% \end{quote}
+% you may extend this command. The commands from \meta{before begin} are used
+% at \cs{begin\{theindex\}} just after starting the group but before starting
+% the index. The commands from \meta{after begin} are used after
+% \cs{begin\{theindex\}}. The commands from \meta{before end} are used before
+% \cs{end\{theindex\}}. The commands from \meta{after end} are used at
+% \cs{end\{theindex\}} just after ending the index but just before ending the
+% group.
+%
+%
+% \subsection{Examples}
+% \label{examples}
+%
+% Let's see how you may get more than one index. The text of the example is
+% silly, so don't think about the text, think about the usage of
+% \Package{splitidx}.
+%
+% \begin{flushleft}\ttfamily
+% \cs{documentclass}\{article\} \percentchar \textit{ We use \Class{article}
+% class \dots}\\
+% \cs{usepackage}\{splitidx\} \percentchar \textit{ \dots\ and the
+% \Package{splitidx} package}\\
+% \cs{makeindex} \percentchar \textit{ And we want index generation}\\
+% ~\\
+% \percentchar \textit{ We define 4 indices:}\\
+% \cs{newindex}[General Index]\{idx\} \percentchar \textit{ Name and shortcut
+% of the 1st index}\\
+% \cs{newindex}[Index of Animals]\{ani\} \percentchar \textit{ \dots\ 2nd
+% index}\\
+% \cs{newindex}[Index of Fruits]\{fru\} \percentchar \textit{ \dots\ 3rd
+% index}\\
+% \cs{newindex}[Index of Vegetables]\{veg\} \percentchar \textit{ \dots\ 4th
+% index}\\
+% ~\\
+% \cs{begin}\{document\}\\
+% Apples\cs{sindex}[fru]\{apple\} \percentchar \textit{ an entry to
+% }fru\texttt{ index}\\
+% and oranges\cs{sindex}[fru]\{orange\} \percentchar \textit{ an entry to
+% }fru\texttt{ index}\\
+% are fruits\cs{sindex}\{fruits\}.\ \percentchar \textit{ an implicit entry
+% to }idx\textit{ index}\\
+% Tomatoes\cs{sindex}[veg]\{tomato\} \percentchar \textit{ an entry to
+% }veg\textit{ index}\\
+% are\\
+% vegetables\cs{index}\{vegetables\}.\ \percentchar \textit{ an implicit
+% entry to }idx\textit{ index}\\
+% Cats\cs{sindex}[ani]\{cat\} \percentchar \textit{ an entry to
+% }ani\textit{ index}\\
+% are animals\cs{sindex}[idx]\{animals\}.\ \percentchar \textit{ an explicite
+% entry to }idx\textit{ index}\\
+% ~\\
+% \cs{printindex*} \percentchar \textit{ print all indices}\\
+% \cs{end}\{document\}
+% \end{flushleft}
+% After processing the file above with \LaTeX{} you'll get a raw index file
+% with following contents:
+% \begin{verbatim}
+% \indexentry[fru]{apple}{1}
+% \indexentry[fru]{orange}{1}
+% \indexentry{fruits}{1}
+% \indexentry[veg]{tomato}{1}
+% \indexentry{vegetables}{1}
+% \indexentry[ani]{cat}{1}
+% \indexentry[idx]{animals}{1}
+% \end{verbatim}\vspace{-\baselineskip}
+% Section~\ref{program} shows, how you can process this raw index file to get
+% several raw index files and several index files. You will get four index
+% files. Each of it will be input with the single \cs{printindex*} command at
+% the example above. Each will produce a single section starting on an new
+% page with one column section headings ``General Index'', ``Index of
+% Animals'', ``Index of Fruits'' and ``Index of Vegetables''. Each index is
+% printed in twocolumn mode.
+%
+% Maybe you would like to have all indices being subsections at one
+% section. You can do this, if you replace the \cs{printindex*} command at the
+% example above by the following:
+% \begin{flushleft}\ttfamily
+% \cs{twocolumn}[\percentchar\textit{ set the title onecolumn}\\
+% \ \cs{section*}\{Indices\} \percentchar\textit{ the section with the
+% indices}\percentchar\\
+% \ \cs{markboth}\{Indices\}\{Indices\} \percentchar\textit{ setting up the
+% running headline }\percentchar\\
+% ]\percentchar\textit{ but the indices twocolumn}\\
+% \cs{printsubindex*} \percentchar\textit{ print all indices}
+% \end{flushleft}
+% Note that I've used \cs{printsubindex*} instead of \cs{printindex*} at this
+% modification. You don't need to setup the running headline, if you are using
+% page style \texttt{plain}, which is default at \Class{article} class. But if
+% you're using page style \texttt{headings} you should do this, if you are
+% using \cs{section*}. If you are using a KOMA-Script class, you can use
+% \cs{addsec} or \cs{addsec*} instead of \cs{section*} to not need manual
+% updating of the running headline.
+%
+% Maybe you want the general index to be the section, while the other indices
+% should be subsections of the general index. Maybe you'll try to replace the
+% above by the following:
+% \begin{flushleft}\ttfamily
+% \percentchar\textit{\#\#\#\#\# This will not do the thing you wanted!
+% \#\#\#\#\#}\\
+% \cs{printindex}[idx] \percentchar\textit{ print index }idx\textit{ as
+% section}\\
+% \cs{printsubindex}[ani] \percentchar\textit{ print index }ani\textit{ as
+% subsection}\\
+% \cs{printsubindex}[fru] \percentchar\textit{ print index }fru\textit{ as
+% subsection}\\
+% \cs{printsubindex}[veg] \percentchar\textit{ print index }veg\textit{ as
+% subsection}\\
+% \end{flushleft}
+% But this will result in a twocolumn section with general index \texttt{idx}
+% and three onecolumn subsections with the other indices and a page break
+% after the general index. Why? At the end of \texttt{theindex} environment of
+% \cs{printindex} the onecolumn mode, which was valid before \cs{printindex}
+% will be restored. If twocolumn mode was valid before \cs{printindex} a
+% \cs{clearpage} command will be included at the end of \texttt{theindex}.
+% So what's the solution? Remembering the \cs{extendtheindex} command you can
+% write:
+% \begin{flushleft}\ttfamily
+% \cs{begingroup} \percentchar\textit{ hold following extension local to this
+% group}\\
+% \ \cs{extendtheindex}\percentchar \textit{ some changes of
+% }theindex\textit{ environment}\\
+% \ \ \{\}\percentchar\textit{ no change before beginning}\\
+% \ \ \{\}\percentchar\textit{ no change after beginning}\\
+% \ \ \{\cs{let}\cs{onecolumn}\cs{relax} \percentchar\textit{ deactivate
+% \cs{onecolumn} before ending}\\
+% \ \ \ \cs{let}\cs{clearpage}\cs{relax} \percentchar\textit{ deactivate
+% \cs{clearpage} before ending}\\
+% \ \ \}\percentchar \textit{ changes before ending}\\
+% \ \ \{\}\percentchar\textit{ no change after ending}\\
+% \ \cs{printindex}[idx] \percentchar\textit{ print index }idx\textit{ as
+% section}\\
+% \cs{endgroup} \percentchar\textit{ end group with extended }theindex\textit{
+% environment}\\
+% \cs{printsubindex}[ani] \percentchar\textit{ print index }ani\textit{ as
+% subsection}\\
+% \cs{printsubindex}[fru] \percentchar\textit{ print index }fru\textit{ as
+% subsection}\\
+% \cs{printsubindex}[veg] \percentchar\textit{ print index }veg\textit{ as
+% subsection}\\
+% \cs{onecolumn} \percentchar\textit{ finish the indices}
+% \end{flushleft}
+% With this extension the whole index will be set twocolumn with no page break
+% before the first subsection. But you have to switch back to onecolumn mode
+% manually at the end of the indices.
+%
+% The example above may be modified, if you want a onecolumn index:
+% \begin{flushleft}\ttfamily
+% \cs{begingroup} \percentchar\textit{ hold following extension local to this
+% group}\\
+% \ \cs{makeatletter} \percentchar\textit{ allow }@\textit{ at macro names}\\
+% \ \cs{extendtheindex}\percentchar \textit{ some changes of
+% }theindex\textit{ environment}\\
+% \ \ \{\cs{let}\cs{twocolumn}\cs{@firstoptofone} \percentchar\textit{
+% deactivate \cs{twocolumn}}\\
+% \ \ \ \cs{let}\cs{onecolumn}\cs{@firstoptofone} \percentchar\textit{
+% deactivate \cs{twocolumn}}\\
+% \ \ \ \cs{let}\cs{clearpage}\cs{relax} \percentchar\textit{ deactivate
+% \cs{clearpage}}\\
+% \ \ \}\percentchar \textit{ changes before beginning}\\
+% \ \ \{\}\percentchar\textit{ no change after beginning}\\
+% \ \ \{\}\percentchar\textit{ no change before ending}\\
+% \ \ \{\}\percentchar\textit{ no change after ending}\\
+% \ \cs{makeatother} \percentchar\textit{ deactivate \cs{makeatletter}}\\
+% \ \cs{printindex} \percentchar\textit{ print index}\\
+% \cs{endgroup} \percentchar\textit{ end group with extended }theindex\textit{
+% environment}
+% \end{flushleft}
+% This not only works with splitted index. You may use this also with one
+% single index.
+%
+% I hope, that these examples were useful to understand, how to use
+% \Package{splitidx}. Next section will show you, how to generate the indices
+% from a single raw index.
+%
+%
+% \section{Splitting the index}
+% \label{program}
+%
+% At most you'll call one of the \Program{splitindex} programs with one
+% parameter, the name of the raw index file, to split the raw index file into
+% several raw index files and call the index processor
+% \Program{MakeIndex}. Some of you will also set options to use another index
+% processor e.g. \Program{xindy} or to set some options of the index processor
+% e.g. ``\Cmdline{-g}'' to use German sorting with \Program{MakeIndex}. Only
+% few of you will also change the parsing of the raw index file and the
+% generation if the filenames and contents of the several new raw index files.
+%
+% The names of the options and the syntax of the Arguments is same at all of
+% the programs except \Program{splitindex.tex} (see section~\ref{TeX}):
+% \begin{description}\setlength{\labelsep}{1em}
+% \item[\texttt{--help}]
+% \item[{\makebox[1.2em][l]{\texttt{-h}}}]\vspace{-2\itemsep}
+% Show information about usage, options and arguments and terminate without
+% processing a index file.
+% \item[\texttt{--makeindex} \meta{program name}]~
+% \item[\texttt{-m} \meta{program name}]\vspace{-2\itemsep}
+% Call \meta{program name}
+% instead of \Program{makeindex} to process each generated raw index
+% file. You may set this variable to an empty value. How this may be done
+% depends on the shell, which you are using. Using bash you may achieve an
+% empty value e.g. using \texttt{""} or \texttt{''}. An empty value means:
+% Don't call an index processor.
+% \item[\texttt{--identify} \meta{regular expression}]~
+% \item[\texttt{-i} \meta{regular expression}]\vspace{-2\itemsep}
+% Uses \meta{regular
+% expression} to identify the index short cut and the contents of the
+% raw index file with this shortcut. The default value is:
+% ``\verb|^(\\indexentry)\[([^]]*)\](.*)$|''. This means:
+% \begin{description}
+% \item[{\makebox[1em][l]{\texttt{\textasciicircum}}}]
+% Search from beginning of the line.
+% \item[\texttt{(\string\\indexentry)}]~\par
+% Search for ``\verb|\indexentry|'' and
+% set group 1 to this.
+% \item[{\makebox[1em][l]{\texttt{\string\[}}}]
+% Search for ``\verb|[|'' and ignore it.
+% \item[\texttt{([\textasciicircum]]*)}]~\par
+% Search for any character which is not ``]'' and set group 2 to this.
+% \item[{\makebox[1em][l]{\texttt{\string\]}}}]
+% Search for ``\verb|]|'' and ignore it.
+% \item[\texttt{(.*)\$}]~\par
+% Search for all characters till end of line and set group 3 to these.
+% \end{description}
+% The \meta{regular expression} is POSIX~1003.2 compatible.
+% \item[\texttt{--resultis} \meta{pattern}]~
+% \item[\texttt{-r} \meta{pattern}]\vspace{-2\itemsep}
+% Set the lines, which are written to the
+% generated raw index files after identification (see option
+% \texttt{--identify}) to \meta{pattern}. Each \texttt{\$}\meta{digit} at
+% \meta{pattern} will be replaced by the corresponding group, e.g. \verb|$1|
+% will be replaced by the first group (see \texttt{--identify}). The default
+% is: ``\verb|$1$3|'', which means: contents of group 1 and group 3.
+%
+% If the \meta{regular expression} of option \texttt{--identify} doesn't
+% match a line at the raw index file the line itself will be written.
+% \item[\texttt{--suffixis} \meta{pattern}]~
+% \item[\texttt{-s} \meta{pattern}]\vspace{-2\itemsep}
+% Set the suffix of the names of the generated raw index files after
+% identification (see option \texttt{--identify}) to \meta{pattern}. Each
+% \texttt{\$}\meta{digit} at \meta{pattern} will be replaced by the
+% corresponding group, e.g. \verb|$1| will be replaced by the first group
+% (see \texttt{--identify}). The default is: ``\verb|-$2|'', which means:
+% character `\texttt{-}' followed by contents of group 2.
+%
+% If the \meta{regular expression} of option \texttt{--ifentify} doesn't
+% match a line at the raw index file, all groups will be set to
+% ``\texttt{idx}''.
+% \item[\texttt{--verbose}]
+% \item[{\makebox[1.2em][l]{\texttt{-v}}}]\vspace{-2\itemsep}
+% Increase verbosity by one. More verbose means: tell the user more about,
+% what the program is doing.
+% \item[\texttt{--version}]
+% \item[{\makebox[1.2em][l]{\texttt{-V}}}]\vspace{-2\itemsep}
+% Show information about program version and terminate without processing a
+% index file.
+% \end{description}
+% The OpenBSD binary \Program{splitindex-OpenBSD-i386} doesn't understand the
+% long option names (\texttt{--makeindex}, \texttt{--identify} \dots). But you
+% can use the alternative short option names (\texttt{-m}, \texttt{-i} \dots).
+%
+% The first no-option-argument at the command line is the name if the raw
+% index file, which has to be processed. All arguments, which follow the
+% argument ``\texttt{--}'' are interpreted as no-optional-arguments. All but
+% the first no-option-arguments will be passed to the index processor.
+%
+% You will find some examples at the following subsections.
+%
+%
+% \subsection{Using \Program{splitindex.pl}}
+% \label{perl}
+%
+% This is the reference implementation. Let's use an example to demonstrate,
+% how it works. If you have following \LaTeX{} file ``\File{allabout.tex}'':
+% \begin{verbatim}
+% \documentclass{article}
+% \usepackage[makeindex]{splitidx}
+% \begin{document}
+% Apples\sindex[fru]{apple} and oranges\sindex[fru]{orange} are
+% fruits\sindex{fruits}.
+% Tomatos\sindex[veg]{tomato} are vegetables\sindex{vegetables}.
+% Cats\sindex[ani]{cat} are animals\sindex[idx]{animals}.
+% \end{document}
+% \end{verbatim}\vspace{-\baselineskip}
+% this generates a file ``File{allabout.idx}'':
+% \begin{verbatim}
+% \indexentry[fru]{apple}{1}
+% \indexentry[fru]{orange}{1}
+% \indexentry{fruits}{1}
+% \indexentry[veg]{tomato}{1}
+% \indexentry{vegetables}{1}
+% \indexentry[ani]{cat}{1}
+% \indexentry[idx]{animals}{1}
+% \end{verbatim}\vspace{-\baselineskip}
+%
+% This file can't be processed by a index processor like
+% \Program{MakeIndex}. If you want so split these raw index file into several
+% and run the default index processor, you do the following call (the
+% \Prompt{} is a symbol for the shell prompt):
+% \begin{quote}
+% \Prompt{}\verb|splitindex.pl allabout.idx|
+% \end{quote}
+% You may omit the extension ``\File{.idx}'':
+% \begin{quote}
+% \Prompt{}\verb|splitindex.pl allabout|
+% \end{quote}
+% Both commands will result in a file \File{allabout-fru.idx}:
+% \begin{verbatim}
+% \indexentry[fru]{apple}{1}
+% \indexentry[fru]{orange}{1}
+% \end{verbatim}\vspace{-\baselineskip}
+% a file \File{allabout-idx.idx}
+% \begin{verbatim}
+% \indexentry{fruits}{1}
+% \indexentry{vegetables}{1}
+% \indexentry{animals}
+% \end{verbatim}\vspace{-\baselineskip}
+% a file \File{allabout-veg.idx}:
+% \begin{verbatim}
+% \indexentry[veg]{tomato}{1}
+% \end{verbatim}\vspace{-\baselineskip}
+% and a file \File{allabout-ani.idx}:
+% \begin{verbatim}
+% \indexentry[ani]{cat}{1}
+% \end{verbatim}\vspace{-\baselineskip}
+% After generation of these files, it calls the default index processor using
+% the command lines:
+% \begin{verbatim}
+% makeindex allabout-fru.idx
+% makeindex allabout-idx.odx
+% makeindex allabout-veg.idx
+% makeindex allabout-ani.idx
+% \end{verbatim}\vspace{-\baselineskip}
+% These calls create the raw index files \File{allabout-fru.ind},
+% \File{allabout-idx.ind}, \File{allabout-veg.ind} and
+% \File{allabout-ani.ind}, which can be loaded to the document using
+% e.g. \cs{printindex} from package \Package{splitidx}.
+%
+% If you don't want \Program{splitindex} to call any index processor, use
+% \begin{quote}
+% \Prompt{}\verb|splitindex.pl -m "" allabout|
+% \end{quote}
+% instead of the shell command above.
+%
+% You may achieve the same files like above using (it's one input line not two
+% like shown here):
+% \begin{quote}\raggedright
+% \Prompt{}\verb|splitindex.pl -i '^\\indexentry\[([^]]*)\](.*)$'|
+% \verb|-s '-$1'| \verb|-r '\\indexentry$2' allabout|
+% \end{quote}
+%
+% If you want \Program{splitindex} to call \Program{makeindex} with additional
+% options ``\verb|-s foo.ist|'' to use the MakeIndex style file
+% \File{foo.ist}, you can do this call:
+% \begin{quote}
+% \Prompt{}\verb|splitindex.pl allabout -- -s foo.ist|
+% \end{quote}
+% As you see ``\verb|--|'' is used to tell \Program{splitindex} to not
+% interprete ``\verb|-s foo.ist|'' as option ``\verb|--suffixis foo.ist|''.
+% All \Program{splitindex} options must be put before ``\verb|--|'' but you
+% can put the raw file argument ``\verb|allabout|'' after that:
+% \begin{quote}
+% \Prompt{}\verb|splitindex.pl -- allabout -s foo.ist|
+% \end{quote}
+%
+% If you want so use index processor \Program{xindy} instead of default index
+% processor \Program{MakeIndex} you can do this call:
+% \begin{quote}
+% \Prompt{}\verb|splitindex.pl -m xindy allabout|
+% \end{quote}
+% If this is not at the standard \texttt{PATH} you may set the whole path:
+% \begin{quote}
+% \Prompt{}\verb|splitindex.pl -m /home/me/bin/xindy allabout|
+% \end{quote}
+% With most perl implementations perl module \verb|Getopt::Long| allows to
+% put options after no-option-arguments. So you may also write:
+% \begin{quote}
+% \Prompt{}\verb|splitindex.pl allabout -m /home/me/bin/xindy|
+% \end{quote}
+% with the same result.
+%
+%
+% \subsection{Using \Program{splitindex.jar}}
+% \label{Java}
+%
+% This should also be portable. If you are not using Sun Java 1.4.1 you may
+% try to recompile this using the shell command:
+% \begin{quote}
+% \Prompt{}\verb|javac splitindex.java|
+% \end{quote}
+% This should result in a new \File{splitindex.class}. But it will fail
+% e.g. with Sun Java 1.3, because regular expressions are needed, which are
+% not available at Sun Java 1.3.
+%
+% The call of \Program{splitindex.class} is almost the same like shown at
+% section~\ref{perl} for \Program{splitindex.pl}, but you have to replace
+% ``\verb|splitindex.pl|'' by ``\verb|java splitindex|''. So the last example
+% from section~\ref{perl} becomes:
+% \begin{quote}
+% \Prompt{}\verb|java splitindex allabout -m /home/me/bin/xindy|
+% \end{quote}
+%
+%
+% \subsection{Using \Program{splitindex} or \Program{splitindex.exe}}
+% \label{C}
+%
+% The Linux program \Program{splitindex} was compiled using glibc, so it works
+% same like \Program{splitindex.pl} and you may use not only:
+% \begin{quote}
+% \Prompt{}\verb|splitindex -m /home/me/bin/xindy allabout|
+% \end{quote}
+% but also:
+% \begin{quote}
+% \Prompt{}\verb|splitindex allabout -m /home/me/bin/xindy|
+% \end{quote}
+%
+% But the CygWin program \Program{splitindex.exe} was compiled using a
+% CygWin library. Because of this all options must be put before the first
+% no-option-argument. So you have to use:
+% \begin{quote}
+% \Prompt{}\verb|splitindex.exe -m /home/me/bin/xindy allabout|
+% \end{quote}
+% At:
+% \begin{quote}
+% \Prompt{}\verb|splitindex.exe allabout -m /home/me/bin/xindy|
+% \end{quote}
+% the arguments ``\verb|-m /home/me/bin/xindy|'' will be passed to the default
+% index processor \Program{MakeIndex}!
+%
+% You need the CygWin-DLL \File{cygwin1.dll} to run
+% \Program{splitindex.exe}. If you haven't already installed it, you may
+% download the DLL from \url{http://cygwin.com/snapshots}. You need
+% \Program{bzip2}, which can be found at \url{http://source.redhat.com/bzip2},
+% to decompress it. You may use \url{http://cygwin.com/setup.exe} to download
+% and install a minimal CygWin environment alternatively.
+%
+% The Linux-i386-ELF binary \Program{splitindex} was compiled and linked
+% using:
+% \begin{quote}\raggedright
+% \Prompt{}\verb|gcc -O3 -Wall -osplitindex splitindex.c|\\
+% \Prompt{}\verb|strip splitindex|\\
+% \end{quote}
+% The \Program{gcc} was:
+% \begin{verbatim}
+% gcc (GCC) 3.2
+% Copyright (C) 2002 Free Software Foundation, Inc.
+% \end{verbatim}\vspace{-\baselineskip}
+% The used \Program{glibc} is version 2.1.
+%
+% If you compile another binary e.g. for BSD, please contact me, so we may put
+% the new binary into the distribution or can build another binary
+% distribution.
+%
+%
+% \subsection{Using \Program{splitindex.tex}}
+% \label{TeX}
+%
+% The \TeX{} or \LaTeX{} program \Program{splitindex.tex} doesn't know any
+% options or arguments. It number of files, which can be generated, is limited
+% to to number of \TeX's free write handles. If there are other lines than
+% ``\verb|\indexentry|''-lines at the raw index file, running
+% \Program{splitindex.tex} will result in an error.
+%
+% You may use \Program{splitindex.tex} interactive:
+% \begin{quote}
+% \Prompt{}\verb|tex splitindex|
+% \end{quote}
+% or
+% \begin{quote}
+% \Prompt{}\verb|latex splitindex|
+% \end{quote}
+% If you do so, you will be asked for the name of the raw index file. You have
+% to omit the extension ``\File{.idx}'' answering that question.
+%
+% You may also use the \Program{splitindex.tex} not interactive e.g. if you
+% are working with a batch. To do so you have to define macro \cs{IDX} to the
+% name of the raw index file without extension ``\texttt{.idx}''. So the first
+% example of section~\ref{perl} would become:
+% \begin{quote}
+% \Prompt{}\verb|tex \def\IDX{allabout}\input splitindex|
+% \end{quote}
+% You may also use \LaTeX{} instead of \TeX:
+% \begin{quote}
+% \Prompt{}\verb|latex \def\IDX{allabout}\input splitindex|
+% \end{quote}
+%
+% The current version of \Program{splitindex.tex} doesn't call any index
+% processor. But maybe in future a version will be able to do so.
+%
+% \StopEventually{^^A
+% \begin{thebibliography}{99}
+% \bibitem{makeindex} \textsc{Leslie Lamport}: \textit{MakeIndex: An Index
+% Processor For \LaTeX}, 17 February 1987
+% \bibitem{makeindexmanual} \textsc{Pehong Chen}, \textsc{Rick P. C. Rodgers}:
+% \textit{MAKEINDEX(1L)}, Manual page, 10 December 1991
+% \end{thebibliography}
+% \PrintIndex\PrintChanges}
+%
+%
+% \section{Combining Indices}
+%
+% Now you should know, how to use package \Package{splitidx} and the
+% \Program{SplitIndex} programs to split the index. But what about combining
+% two or more indices to one, e.g. you don't want vegetables and fruits in the
+% same index? Try this:
+% \begin{flushleft}\ttfamily
+% \cs{documentclass}\{article\} \percentchar \textit{ We use \Class{article}
+% class \dots}\\
+% \cs{usepackage}\{splitidx\} \percentchar \textit{ \dots\ and the
+% \Package{splitidx} package}\\
+% \cs{makeindex} \percentchar \textit{ And we want index generation}\\
+% ~\\
+% \percentchar \textit{ We define 4 indices:}\\
+% \cs{newindex}[General Index]\{idx\} \percentchar \textit{ Name and shortcut
+% of the 1st index}\\
+% \cs{newindex}[Index of Animals]\{ani\} \percentchar \textit{ \dots\ 2nd
+% index}\\
+% \cs{newindex}[Index of Fruits And Vegetables]\{fru\} \percentchar
+% \textit{ \dots\ 3rd
+% index}\\
+% ~\\
+% \cs{begin}\{document\}\\
+% Apples\cs{sindex}[fru]\{apple\} \percentchar \textit{ an entry to
+% }fru\texttt{ index}\\
+% and oranges\cs{sindex}[fru]\{orange\} \percentchar \textit{ an entry to
+% }fru\texttt{ index}\\
+% are fruits\cs{sindex}\{fruits\}.\ \percentchar \textit{ an implicit entry
+% to }idx\textit{ index}\\
+% Tomatoes\cs{sindex}[veg]\{tomato\} \percentchar \textit{ an entry to
+% }veg\textit{ index}\\
+% are\\
+% vegetables\cs{index}\{vegetables\}.\ \percentchar \textit{ an implicit
+% entry to }idx\textit{ index}\\
+% Cats\cs{sindex}[ani]\{cat\} \percentchar \textit{ an entry to
+% }ani\textit{ index}\\
+% are animals\cs{sindex}[idx]\{animals\}.\ \percentchar \textit{ an explicite
+% entry to }idx\textit{ index}\\
+% ~\\
+% \cs{printindex*} \percentchar \textit{ print all indices}\\
+% \cs{end}\{document\}
+% \end{flushleft}
+% And do the following call after splitting the index using
+% \Program{SplitIndex}:
+% \begin{quote}\raggedright
+% \Prompt{}\verb|makeindex allabout-veg.idx allabout-fru.idx|\\
+% \end{quote}
+% Alternatively you can concatenate \File{allabout-fru.idx} to
+% \File{allabout-veg.idx} before running the index processor on
+% \File{allabout-veg.idx}.
+%
+%
+%
+% \section{Implementation of \Package{splitidx}}
+%
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% \subsection{Options}
+%
+% The first option is used to activate index generation.
+% \begin{macrocode}
+\DeclareOption{makeindex}{\AtEndOfPackage{\makeindex}}
+% \end{macrocode}
+%
+% \changes{v0.9}{2006/05/07}{new option \texttt{useindex}}
+% With option \texttt{useindex} the original command \cs{index} behaves like
+% \cs{sindex}.
+% \begin{macrocode}
+\DeclareOption{useindex}{%
+ \def\@se@nd@xc@d@{\let\index\sindex}%
+ \AtEndOfPackage{\@se@nd@xc@d@}%
+}
+\let\@se@nd@xc@d@\relax
+% \end{macrocode}
+%
+% There is also an option to make \cs{sindex} ignores the optional argument and
+% behaves like \cs{index}.
+% \begin{macrocode}
+\DeclareOption{allatone}{%
+ \ifx\@se@nd@xc@d@\relax\else
+ \PackageInfo{splitidx}{option `allatone' overwrites option `useindex'}%
+ \let\@se@nd@xc@d@\relax
+ \fi
+ \AtEndOfPackage{%
+ \renewcommand*{\sindex}[1][]{\index}%
+ \g@addto@macro\makeindex{\renewcommand*{\sindex}[1][]{\index}}%
+ }%
+}
+% \end{macrocode}
+%
+% \changes{v0.9}{2006/05/07}{new option \texttt{protected}}
+% Do not expand index arguments.
+% \begin{macrocode}
+\newif\if@verbindex\@verbindexfalse
+\DeclareOption{protected}{\@verbindextrue}
+% \end{macrocode}
+%
+% \changes{v0.2}{2002/11/15}{new option \texttt{idxcommands}}
+% With option \texttt{idxcommands} every \cs{newindex} also defines a new index
+% command.
+% \begin{macrocode}
+\newif\if@newidxcmd\@newidxcmdfalse
+\DeclareOption{idxcommands}{\@newidxcmdtrue}
+% \end{macrocode}
+%
+% \changes{v0.2}{2002/11/15}{new option \texttt{split}}
+% With option \texttt{split} each index uses its own index file.
+% \begin{macrocode}
+\newif\if@splitidx\@splitidxfalse
+\DeclareOption{split}{\@splitidxtrue}
+% \end{macrocode}
+%
+% Processing the options
+% \begin{macrocode}
+\ProcessOptions\relax
+% \end{macrocode}
+%
+%
+% \subsection{Setting an Index Entry}
+%
+% \begin{macro}{\see}
+% \begin{macro}{\seealso}
+% \begin{macro}{\seename}
+% \begin{macro}{\alsoname}
+% These are four standard macros, which are also defined at
+% \Package{makeidx}. Hey, these definitions are stolen from \Package{makeidx}!
+% No, no, I'm not a bad guy, read ``\File{legal.txt}'', which comes with
+% \Package{makeidx}.
+% \begin{macrocode}
+\newcommand*\see[2]{\emph{\seename} #1}
+\providecommand*\seealso[2]{\emph{\alsoname} #1}
+\providecommand\seename{see}
+\providecommand*\alsoname{see also}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\sindex}
+% \begin{macro}{\@wrsindex}
+% \changes{v0.9}{2006/03/07}{optionally do not expand the index argument}
+% \begin{macro}{\@@wrsindex}
+% This works similar to original \cs{index} but uses a splitted index. So it
+% allows an optional argument.
+% \begin{macrocode}
+\newcommand*{\sindex}[2][]{%
+}
+\g@addto@macro\makeindex{%
+ \renewcommand*{\sindex}{%
+ \@bsphack\begingroup
+ \@sanitize
+ \@wrsindex
+ }%
+ \typeout{Using splitted index at \jobname.idx}%
+ \@se@nd@xc@d@
+}
+% \end{macrocode}
+% At the following \cs{@@wrsindex} is used as a hook. If it is defines, it is
+% used to write out the index entry. This hook may be used from
+% e.g. \Package{hyperref} to add \verb|hyperpage| to the font selection of the
+% page number. This only works with \verb+encap |+.
+% \changes{v1.0}{2006/07/30}{one level expansion of \cs{\@tempa} for
+% hyperref hook}
+% \begin{macrocode}
+\newcommand*{\@wrsindex}[2][]{%
+ \ifx\relax#1\relax
+ \if@splitidx
+ \@wrsindex[idx]{#2}%
+ \else
+ \def\@tempa{#2}%
+ \if@verbindex\@onelevel@sanitize\@tempa\fi
+ \@wrindex{\@tempa}%
+ \fi
+ \else
+ \def\@tempa{#2}%
+ \csname index@#1@hook\endcsname
+ \expandafter\ifx\csname @@wrsindex\endcsname\relax
+ \@@@wrsindex{#1}{{\@tempa}{\thepage}}%
+ \else
+ \def\@tempb{\@@wrsindex{#1}}%
+ \expandafter\@tempb\@tempa||\\%
+ \fi
+ \endgroup
+ \@esphack
+ \fi
+}
+\newcommand*{\@@@wrsindex}[2]{%
+ \begingroup
+ \if@splitidx
+ \expandafter\ifx\csname @indexfile@#1\endcsname\relax
+ \PackageError{splitidx}{%
+ Index entry for not existing index%
+ }{%
+ You've tried to set an index to index `#1', without
+ defining\MessageBreak
+ that index before using \string\newindex.\MessageBreak
+ This is only allowed, if you are not using package option
+ `split'.%
+ }%
+ \else
+ \expandafter\protected@write\csname @indexfile@#1\endcsname{%
+ \csname index@#1@writehook\endcsname
+ \csname index@#1@writehook@once\endcsname
+ }{%
+ \string\indexentry#2%
+ }%
+ \fi
+ \else
+ \protected@write\@indexfile{%
+ \csname index@#1@writehook\endcsname
+ \csname index@#1@writehook@once\endcsname
+ }{%
+ \string\indexentry[#1]#2%
+ }%
+ \fi
+ \endgroup
+}
+% \end{macrocode}
+% If \Package{hyperref} was loaded at \cs{begin\{document\}} and
+% \Package{hyperref}-option \texttt{hyperindex} isn't disabled, and the hook
+% is not used, define it:
+% \begin{macrocode}
+\AtBeginDocument{%
+ \begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname ifHy@hyperindex\endcsname\relax
+ \else
+ \csname ifHy@hyperindex\endcsname
+ \expandafter\ifx\csname @@wrsindex\endcsname\relax
+ \def\@@wrsindex#1#2|#3|#4\\{%
+ \ifx\\#3\\%
+ \@@@wrsindex{#1}{{#2|hyperpage}{\thepage}}%
+ \else
+ \def\Hy@temp@A{#3}%
+ \ifx\Hy@temp@A\HyInd@ParenLeft
+ \@@@wrsindex{#1}{{#2|#3hyperpage}{\thepage}}%
+ \else
+ \ifx\Hy@temp@A\HyInd@ParenRight
+ \@@@wrsindex{#1}{{#2|#3hyperpage}{\thepage}}%
+ \else
+ \@@@wrsindex{#1}{{#2|#3}{\thepage}}%
+ \fi
+ \fi
+ \fi
+ }%
+ \fi
+ \csname fi\endcsname
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\AtWriteToIndex}
+% \changes{v1.1}{2009/02/26}{New}
+% Add commands to the write hook.
+% \begin{macrocode}
+\newcommand*{\AtWriteToIndex}[1]{%
+ \expandafter\ifx\csname index@#1@writehook\endcsname\relax
+ \expandafter\let\csname index@#1@writehook\endcsname\@empty
+ \fi
+ \expandafter\g@addto@macro\csname index@#1@writehook\endcsname
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\AtNextWriteToIndex}
+% \changes{v1.1}{2009/02/26}{New}
+% Like \cs{AtWriteToIndex} only once.
+% \begin{macrocode}
+\newcommand*{\AtNextWriteToIndex}[1]{%
+ \expandafter\ifx\csname index@#1@writehook@once\endcsname\relax
+ \expandafter\gdef\csname index@#1@writehook@once\endcsname{%
+ \expandafter\global\expandafter\let\expandafter
+ \csname index@#1@writehook@once\endcsname\relax
+ }%
+ \fi
+ \expandafter\g@addto@macro\csname index@#1@writehook@once\endcsname
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Printing One Or More Indices}
+%
+% \begin{macro}{\printindex}
+% \begin{macro}{\printindex*}
+% This is used to print an index in the normal way. In most cases this uses
+% |theindex| environment, but it need not.
+% \begin{macrocode}
+\newcommand*{\printindex}{%
+% \end{macrocode}
+% The command may be called in the star version, which prints all defined
+% indices. This is same as \cs{printindices}.
+% \begin{macrocode}
+ \@ifstar {%
+ \begingroup
+ \let\printindex@@endhook=\printindex@endhook
+ \let\printindex@endhook=\relax
+ \printindices%
+ \csname printindex@@endhook\endcsname
+ \endgroup
+ }{%
+% \end{macrocode}
+% It may also be called with optional arguments to print one of the indices:
+% \begin{macrocode}
+ \@ifnextchar [\@printindex%] brace check comment
+% \end{macrocode}
+% Or it is called without any parameter and so it is same as at
+% \Package{makeidx} package:
+% \begin{macrocode}
+ {%
+ \@input@{\jobname.ind}%
+ \csname printindex@endhook\endcsname
+ }%
+ }%
+}
+% \end{macrocode}
+% \begin{macro}{\@printindex}
+% This is used to print one of the indices. The optional (here obligatory)
+% argument is the shortcut of the index.
+% \begin{macrocode}
+\newcommand*{\@printindex}{}
+\def\@printindex[#1]{%
+% \end{macrocode}
+% There can be one more optional argument, which is the title of the index. If
+% not, the default title \cs{index@\meta{shortcut}@name} is used.
+% \begin{macrocode}
+ \@ifnextchar [%
+ {\@@printindex[{#1}]}%
+ {\@@printindex[{#1}][\csname index@#1@name\endcsname]}%
+}
+% \end{macrocode}
+% \begin{macro}{\@@pintindex}
+% \changes{v0.2}{2002/11/15}{with option \texttt{split} general index has no
+% suffix}
+% We use the default environment to print one of the indices, but we redefine
+% \cs{indexname} to the title of the wanted index, \cs{indexshortcut} to the
+% shortcut of the wanted index and \cs{index@preamble} to the preamble of the
+% wanted index. We do this in a group so it is local.
+% \begin{macrocode}
+\newcommand*{\@@printindex}{}
+\def\@@printindex[#1][#2]{%
+ \begingroup
+ \edef\indexshortcut{#1}%
+ \def\indexname{#2}%
+ \let\index@preamble\relax
+ \expandafter\let\expandafter\index@preamble
+ \csname index@\indexshortcut @preamble\endcsname
+ \if@splitidx
+ \def\@tempa{idx}\def\@tempb{#1}%
+ \ifx\@tempa\@tempb\let\@indexsuffix\@gobble\fi
+ \fi
+ \@input@{\jobname\@indexsuffix{#1}.ind}%
+ \endgroup
+ \csname printindex@endhook\endcsname
+}
+% \end{macrocode}
+% \begin{macro}{\@indexsuffix}
+% This generated the suffix from the shortcut. You may redefine this
+% function, if you need. I`m using a trick here, to define the macro with
+% proper catcodes but not to define it global. You may also use
+% \cs{@firstofone} instead of \cs{lowercase}.
+% \begin{macrocode}
+\begingroup
+\catcode`\-12
+\lowercase{\endgroup
+ \newcommand*{\@indexsuffix}[1]{-#1}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\printindices}
+% This is used to print all defined indices in the order of their definition
+% and with their default titles. If the list is empty, is behaves like
+% \cs{printindex} without star and optional arguments.
+% \begin{macrocode}
+\newcommand*{\printindices}{%
+ \ifx\@indices\@empty
+ \printindex
+ \else
+ \begingroup
+ \@for\@tempa:=\@indices\do{%
+ \expandafter\printindex\expandafter[\@tempa]%
+ }%
+ \endgroup
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\newindex}
+% \changes{v0.2}{2002/11/15}{optional definition of index-shortcut-command}
+% \changes{v0.2}{2002/11/15}{optional opening a new index file}
+% The definition of a new index has an obligatory argument, the shortcut for
+% this index, and an optional argument, the name of this index. If you omit
+% the optional argument the shortcut is used for the default name if the
+% index. The definition will be done global!
+% \begin{macrocode}
+\newcommand*{\newindex}[2][\relax]{%
+ \@ifundefined{index@#2@name}{%
+ \if@verbindex
+ \expandafter\gdef\csname index@#2@hook\endcsname{%
+ \@onelevel@sanitize\@tempa
+ }%
+ \else
+ \expandafter\gdef\csname index@#2@hook\endcsname{}%
+ \fi
+ \ifx\@indices\@empty
+ \xdef\@indices{#2}%
+ \else
+ \xdef\@indices{\@indices,#2}%
+ \fi
+ \ifx \relax#1
+ \expandafter\xdef\csname index@#2@name\endcsname{#2}%
+ \else
+ \expandafter\xdef\csname index@#2@name\endcsname{#1}%
+ \fi
+ \if@newidxcmd
+ \expandafter\newcommand\expandafter*\csname #2\endcsname{}%
+ \expandafter\gdef\csname #2\endcsname{%
+ \sindex[#2]%
+ }%
+ \fi
+ \if@splitidx
+ \def\@tempa{#2}\def\@tempb{idx}%
+ \ifx\@tempa\@tempb
+ \global\let\@indexfile@idx=\@indexfile
+ \else
+ \expandafter\newwrite\csname @indexfile@#2\endcsname
+ \expandafter\immediate\expandafter\openout
+ \csname @indexfile@#2\endcsname=\jobname-#2.idx
+ \fi
+ \fi
+ }{%
+% \end{macrocode}
+% If the index is already defined, an error occurs:
+% \begin{macrocode}
+ \PackageError{splitidx}{%
+ index `#2' already defined%
+ }{%
+ You have already defined an index with shortcut `#2'.\MessageBreak
+ You can't define a new index with the same shortcut. If you'll continue
+ \MessageBreak
+ The new definition will be ignored.%
+ }%
+ }%
+}
+\if@splitidx
+ \@onlypreamble\newindex
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\newprotectedindex}
+% \changes{v0.9}{2006/07/03}{new command}
+% Same like \cs{newindex} but always define an index with protected arguments.
+% \begin{macrocode}
+\newcommand*{\newprotectedindex}[2][\relax]{%
+ \begingroup\@verbindextrue\newindex[{#1}]{#2}\endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@indices}
+% This macro stores a list of the index shortcuts. This is needed by
+% e.g. \cs{printindices} and build by \cs{newindex}.
+% \begin{macrocode}
+\newcommand*{\@indices}{}
+\gdef\@indices{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\extendtheindex}
+% Extend \verb|theindex| by some macros called before starting the index,
+% after starting the index, before stopping the index and after stopping the
+% index. This may be used to change index behaviour. One additional change is
+% done, which may be useful: before the index \cs{index@preamble} is set to
+% \cs{index@\meta{shortcut}@preamble}.
+% \begin{macrocode}
+\newcommand{\extendtheindex}[4]{%
+ \begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname splitindex@theindex\endcsname\relax
+ \let\splitindex@theindex=\theindex
+ \let\endsplitindex@theindex=\endtheindex
+ \fi
+ \renewcommand*{\theindex}{%
+ #1\splitindex@theindex #2%
+ }%
+ \renewcommand*{\endtheindex}{%
+ #3\endsplitindex@theindex #4%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\setindexpreamble}
+% Set one of the splitted index preambles or the original one.
+% \begin{macrocode}
+\newcommand{\splitindex@setip}{}
+\let\splitindex@setip\setindexpreamble
+\let\setindexpreamble\relax
+\newcommand{\setindexpreamble}[2][]{%
+ \ifx \relax#1\relax
+ \begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname splitindex@setip\endcsname\relax
+ \@namedef{index@preamble}{#2}%
+ \else
+ \splitindex@setip{#2}%
+ \fi
+ \else
+ \@namedef{index@#1@preamble}{#2}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\useindexpreamble}
+% Use the index preamble and optional add additional information after it, if
+% it exists and if it is not empty:
+% \begin{macrocode}
+\newcommand{\useindexpreamble}[1][]{%
+ \begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname index@preamble\endcsname\relax\else
+ \ifx\index@preamble\@empty\else
+ \index@preamble #1%
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\printsubindex}
+% \begin{macro}{\printsubindex*}
+% Works like \cs{printindex} but changes some macros before to level down the
+% headings at the index generation.
+% \begin{macrocode}
+\newcommand*{\printsubindex}{%
+ \begingroup
+ \begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname chapter\endcsname\relax
+ \let\section\subsection
+ \begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname addsec\endcsname\relax\else
+ \def\addsec{\setcounter{secnumdepth}{0}\subsection}%
+ \fi
+ \else
+ \let\chapter\section
+ \def\@makeschapterhead{\section*}
+ \let\@makechapterhead\section
+ \begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname addchap\endcsname\relax\else
+ \let\addchap\addsec
+ \fi
+ \fi
+% \end{macrocode}
+% Also, \cs{onecolumn} and \cs{twocolumn} and even \cs{clearpage} must be
+% disabled. The macros \cs{onecolumn} and \cs{twocolumn} cannot be let
+% \cs{relax} because the have an optional argument which must be used.
+% \begin{macrocode}
+ \let\onecolumn\@firstoptofone
+ \let\twocolumn\@firstoptofone
+ \let\clearpage\relax
+ \let\cleardoublepage\relax
+% \end{macrocode}
+% And the mark mechanism must also use one down:
+% \begin{macrocode}
+ \def\markboth{\expandafter\markright\@gobble}%
+ \ifx\@mkboth\@gobble\else\let\@mkboth\markboth\fi
+% \end{macrocode}
+% And the page style shouldn't change too:
+% \begin{macrocode}
+ \let\thispagestyle\@gobble
+% \end{macrocode}
+% Now, using \cs{printindex} enables all of it's features:
+% \begin{macrocode}
+ \let\printindex@endhook=\endgroup
+ \printindex
+}
+% \end{macrocode}
+% \begin{macro}{\@firstoptofone}
+% Read the optional argument and do it.
+% \begin{macrocode}
+\providecommand{\@firstoptofone}[1][]{#1}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \Finale
+%
+\endinput
+%
+% end of file `splitindex.dtx'
+%%% Local Variables:
+%%% mode: doctex
+%%% TeX-master: t
+%%% End:
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..3fae3305f48
--- /dev/null
+++ b/Master/texmf-dist/source/latex/splitindex/splitidx.ins
@@ -0,0 +1,135 @@
+%%
+%% splitidx.ins
+%% Copyright (c) Markus Kohm, 2002-2009
+%%
+%% $Id: splitidx.ins,v 1.4 2009-03-20 14:55:11 mjk Exp $
+%%
+%% This file is part of the SplitIndex bundle.
+%%
+%% This work may be distributed and/or modified under the conditions of
+%% the LaTeX Project Public License, version 1.3c of the license.
+%% The latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2005/12/01 or later and of this work.
+%%
+%% This work has the LPPL maintenance status "author-maintained".
+%%
+%% The Current Maintainer and author of this work is Markus Kohm.
+%%
+%% 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.
+%%
+%% The list of all files belongig to the SplitIndex bundle is given in
+%% in the file `manifest.txt'. Files generated by means of unpacking the
+%% distribution (using, for example, the docstrip program) or by means
+%% of compiling them from a source file, for example, from splitindex.c
+%% or splitindex.java may be distributed at the distributor's discretion.
+%% However if they are distributed then a copy of the SplitIndex bundle
+%% must be distributed together with them.
+%%
+%% The list of derived (unpacked or compiled) files belongig to the
+%% distribution and covered by LPPL is defined by the unpacking scripts
+%% (with extension .ins) and the installation script (with name
+%% install.sh) which are part of the distribution.
+%%
+%% Two often ignorred clauses from LPPL 1.3c you should not ignore:
+%% ----------------------------------------------------------------
+%% 2. You may distribute a complete, unmodified copy of the Work as you
+%% received it. Distribution of only part of the Work is considered
+%% modification of the Work, and no right to distribute such a Derived
+%% Work may be assumed under the terms of this clause.
+%% 3. You may distribute a Compiled Work that has been generated from a
+%% complete, unmodified copy of the Work as distributed under Clause 2
+%% above, as long as that Compiled Work is distributed in such a way that
+%% the recipients may install the Compiled Work on their system exactly
+%% as it would have been installed if they generated a Compiled Work
+%% directly from the Work.
+%%
+%% 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-2009
+
+This file was generated from file(s) of the `SplitIndex bundle'.
+----------------------------------------------------------------
+
+This work may be distributed and/or modified under the conditions of
+the LaTeX Project Public License, version 1.3c of the license.
+The latest version of this license is in
+ http://www.latex-project.org/lppl.txt
+and version 1.3c or later is part of all distributions of LaTeX
+version 2005/12/01 or later and of this work.
+
+This work has the LPPL maintenance status "author-maintained".
+
+The Current Maintainer and author of this work is Markus Kohm.
+
+This file may only be distributed together with a copy of the
+SplitIndex bundle. You may however distribute the SplitIndex bundle
+without such generated files.
+
+The list of all files belongig to the SplitIndex bundle is given in
+in the file `manifest.txt'. Files generated by means of unpacking the
+distribution (using, for example, the docstrip program) or by means
+of compiling them from a source file, for example, from splitindex.c
+or splitindex.java may be distributed at the distributor's discretion.
+However if they are distributed then a copy of the SplitIndex bundle
+must be distributed together with them.
+
+The list of derived (unpacked or compiled) files belongig to the
+distribution and covered by LPPL is defined by the unpacking scripts
+(with extension .ins) and the installation script (with name
+install.sh) which are part of the distribution.
+
+Two often ignorred clauses from LPPL 1.3c you should not ignore:
+----------------------------------------------------------------
+2. You may distribute a complete, unmodified copy of the Work as you
+ received it. Distribution of only part of the Work is considered
+ modification of the Work, and no right to distribute such a Derived
+ Work may be assumed under the terms of this clause.
+3. You may distribute a Compiled Work that has been generated from a
+ complete, unmodified copy of the Work as distributed under Clause 2
+ above, as long as that Compiled Work is distributed in such a way that
+ the recipients may install the Compiled Work on their system exactly
+ as it would have been installed if they generated a Compiled Work
+ directly from the Work.
+
+\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 100755
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 100755
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.1 b/Master/texmf-dist/source/latex/splitindex/splitindex.1
new file mode 100644
index 00000000000..98188409f60
--- /dev/null
+++ b/Master/texmf-dist/source/latex/splitindex/splitindex.1
@@ -0,0 +1,64 @@
+.TH SPLITINDEX "1" "November 2002" "splitindex 0.2a" "User Commands"
+.SH NAME
+splitindex \- manual page for splitindex 0.2a
+.SH SYNOPSIS
+.B splitindex.pl
+[\fIOPTION\fR]... \fIRAWINDEXFILE \fR[\fIMAKEINDEXOPTION\fR]...
+.PP
+.B splitindex
+[\fIOPTION\fR]... \fIRAWINDEXFILE \fR[\fIMAKEINDEXOPTION\fR]...
+.PP
+.B java splitindex
+[\fIOPTION\fR]... \fIRAWINDEXFILE \fR[\fIMAKEINDEXOPTION\fR]...
+.PP
+.B tex splitindex
+.SH DESCRIPTION
+splitindex 0.2a
+Copyright (c) 2002 Markus Kohm <kohm@gmx.de>
+.PP
+Split a single raw index file into multiple raw index files.
+.PP
+Example: splitindex.pl foo.idx.
+.SH OPTIONS
+.TP
+\fB\-h\fR, \fB\-\-help\fR
+show this help and terminate
+.TP
+\fB\-m\fR, \fB\-\-makeindex\fR PROGNAME
+call PROGNAME instead of default `makeindex'.
+.TP
+\fB\-i\fR, \fB\-\-identify\fR EXPRESSION
+use regular EXPRESSION to match entries
+(see also option \fB\-\-resultis\fR and \fB\-\-suffixis\fR).
+Default is `^(\e\eindexentry)\e[([^]]*)\e](.*)$'.
+.TP
+\fB\-r\fR, \fB\-\-resultis\fR PATTERN
+create line to be written from PATTERN after matching
+lines (see also option \fB\-\-identify\fR).
+Default is `$1$3'.
+.TP
+\fB\-s\fR, \fB\-\-suffixis\fR PATTERN
+create suffix to be used from PATTERN after matching
+lines (see also option \fB\-\-identify\fR).
+Default is `-$2'.
+.TP
+\fB\-v\fR, \fB\-\-verbose\fR
+be more verbose
+(can be used multiple to increase verbosity)
+.TP
+\fB\-\-version\fR
+show version and terminate
+.SH COPYRIGHT
+Copyright \(co 2002 Markus Kohm <kohm@gmx.de>
+.SH "SEE ALSO"
+The full documentation for
+.B splitindex
+is maintained as a LaTeX manual. If the
+.B texdoc
+and
+.B splitindex
+programs are properly installed at your site, the command
+.IP
+.B texdoc splitidx
+.PP
+should give you access to the complete manual.
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..9bd60496103
--- /dev/null
+++ b/Master/texmf-dist/source/latex/splitindex/splitindex.c
@@ -0,0 +1,602 @@
+/*
+ * splitindex.c
+ * Copyright (c) Markus Kohm, 2002
+ *
+ * $Id: splitindex.c,v 1.3 2009-03-20 14:55:11 mjk Exp $
+ *
+ * This file is part of the SplitIndex bundle.
+ *
+ * This work may be distributed and/or modified under the conditions of
+ * the LaTeX Project Public License, version 1.3c of the license.
+ * The latest version of this license is in
+ * http://www.latex-project.org/lppl.txt
+ * and version 1.3c or later is part of all distributions of LaTeX
+ * version 2005/12/01 or later and of this work.
+ *
+ * This work has the LPPL maintenance status "author-maintained".
+ *
+ * The Current Maintainer and author of this work is Markus Kohm.
+ *
+ * The list of all files belongig to the SplitIndex bundle is given in
+ * in the file `manifest.txt'. Files generated by means of unpacking the
+ * distribution (using, for example, the docstrip program) or by means
+ * of compiling them from a source file, for example, from splitindex.c
+ * or splitindex.java may be distributed at the distributor's discretion.
+ * However if they are distributed then a copy of the SplitIndex bundle
+ * must be distributed together with them.
+ *
+ * The list of derived (unpacked or compiled) files belongig to the
+ * distribution and covered by LPPL is defined by the unpacking scripts
+ * (with extension .ins) and the installation script (with name
+ * install.sh) which are part of the distribution.
+ *
+ * Two often ignorred clauses from LPPL 1.3c you should not ignore:
+ * ----------------------------------------------------------------
+ * 2. You may distribute a complete, unmodified copy of the Work as you
+ * received it. Distribution of only part of the Work is considered
+ * modification of the Work, and no right to distribute such a Derived
+ * Work may be assumed under the terms of this clause.
+ * 3. You may distribute a Compiled Work that has been generated from a
+ * complete, unmodified copy of the Work as distributed under Clause 2
+ * above, as long as that Compiled Work is distributed in such a way that
+ * the recipients may install the Compiled Work on their system exactly
+ * as it would have been installed if they generated a Compiled Work
+ * directly from the Work.
+ */
+
+#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 100755
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..b28ae758c2d
--- /dev/null
+++ b/Master/texmf-dist/source/latex/splitindex/splitindex.java
@@ -0,0 +1,441 @@
+/*
+ * splitindex.java
+ * Copyright (c) Markus Kohm, 2002-2009
+ *
+ * $Id: splitindex.java,v 1.3 2009-03-20 14:55:11 mjk Exp $
+ *
+ * This file is part of the SplitIndex bundle.
+ *
+ * This work may be distributed and/or modified under the conditions of
+ * the LaTeX Project Public License, version 1.3c of the license.
+ * The latest version of this license is in
+ * http://www.latex-project.org/lppl.txt
+ * and version 1.3c or later is part of all distributions of LaTeX
+ * version 2005/12/01 or later and of this work.
+ *
+ * This work has the LPPL maintenance status "author-maintained".
+ *
+ * The Current Maintainer and author of this work is Markus Kohm.
+ *
+ * The list of all files belongig to the SplitIndex bundle is given in
+ * in the file `manifest.txt'. Files generated by means of unpacking the
+ * distribution (using, for example, the docstrip program) or by means
+ * of compiling them from a source file, for example, from splitindex.c
+ * or splitindex.java may be distributed at the distributor's discretion.
+ * However if they are distributed then a copy of the SplitIndex bundle
+ * must be distributed together with them.
+ *
+ * The list of derived (unpacked or compiled) files belongig to the
+ * distribution and covered by LPPL is defined by the unpacking scripts
+ * (with extension .ins) and the installation script (with name
+ * install.sh) which are part of the distribution.
+ *
+ * Two often ignorred clauses from LPPL 1.3c you should not ignore:
+ * ----------------------------------------------------------------
+ * 2. You may distribute a complete, unmodified copy of the Work as you
+ * received it. Distribution of only part of the Work is considered
+ * modification of the Work, and no right to distribute such a Derived
+ * Work may be assumed under the terms of this clause.
+ * 3. You may distribute a Compiled Work that has been generated from a
+ * complete, unmodified copy of the Work as distributed under Clause 2
+ * above, as long as that Compiled Work is distributed in such a way that
+ * the recipients may install the Compiled Work on their system exactly
+ * as it would have been installed if they generated a Compiled Work
+ * directly from the Work.
+ */
+
+/*
+ I know, I should never write an application in a single static class
+ like I do here. But I wanted the program at each 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 100755
index 00000000000..70c61720c9b
--- /dev/null
+++ b/Master/texmf-dist/source/latex/splitindex/splitindex.pl
@@ -0,0 +1,212 @@
+#! /usr/bin/perl -w
+eval 'exec perl -S $0 ${1+"$@"}'
+ if 0; #$running_under_some_shell
+
+# ======================================================================
+# splitindex.pl
+# Copyright (c) Markus Kohm, 2002-2009
+#
+# $Id: splitindex.pl,v 1.3 2009-03-20 14:55:11 mjk Exp $
+#
+# This file is part of the SplitIndex bundle.
+#
+# This work may be distributed and/or modified under the conditions of
+# the LaTeX Project Public License, version 1.3c of the license.
+# The latest version of this license is in
+# http://www.latex-project.org/lppl.txt
+# and version 1.3c or later is part of all distributions of LaTeX
+# version 2005/12/01 or later and of this work.
+#
+# This work has the LPPL maintenance status "author-maintained".
+#
+# The Current Maintainer and author of this work is Markus Kohm.
+#
+# The list of all files belongig to the SplitIndex bundle is given in
+# in the file `manifest.txt'. Files generated by means of unpacking the
+# distribution (using, for example, the docstrip program) or by means
+# of compiling them from a source file, for example, from splitindex.c
+# or splitindex.java may be distributed at the distributor's discretion.
+# However if they are distributed then a copy of the SplitIndex bundle
+# must be distributed together with them.
+#
+# The list of derived (unpacked or compiled) files belongig to the
+# distribution and covered by LPPL is defined by the unpacking scripts
+# (with extension .ins) and the installation script (with name
+# install.sh) which are part of the distribution.
+#
+# Two often ignorred clauses from LPPL 1.3c you should not ignore:
+# ----------------------------------------------------------------
+# 2. You may distribute a complete, unmodified copy of the Work as you
+# received it. Distribution of only part of the Work is considered
+# modification of the Work, and no right to distribute such a Derived
+# Work may be assumed under the terms of this clause.
+# 3. You may distribute a Compiled Work that has been generated from a
+# complete, unmodified copy of the Work as distributed under Clause 2
+# above, as long as that Compiled Work is distributed in such a way that
+# the recipients may install the Compiled Work on their system exactly
+# as it would have been installed if they generated a Compiled Work
+# directly from the Work.
+# ======================================================================
+
+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;
+ }
+}
diff --git a/Master/texmf-dist/source/latex/splitindex/splitindex.tex b/Master/texmf-dist/source/latex/splitindex/splitindex.tex
new file mode 100644
index 00000000000..0d7c4ecce52
--- /dev/null
+++ b/Master/texmf-dist/source/latex/splitindex/splitindex.tex
@@ -0,0 +1,189 @@
+% ======================================================================
+% splitindex.tex
+% Copyright (c) Markus Kohm, 2002-2009
+%
+% $Id: splitindex.tex,v 1.3 2009-03-20 14:55:11 mjk Exp $
+%
+% This file is part of the SplitIndex bundle.
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, version 1.3c of the license.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later and of this work.
+%
+% This work has the LPPL maintenance status "author-maintained".
+%
+% The Current Maintainer and author of this work is Markus Kohm.
+%
+% The list of all files belongig to the SplitIndex bundle is given in
+% in the file `manifest.txt'. Files generated by means of unpacking the
+% distribution (using, for example, the docstrip program) or by means
+% of compiling them from a source file, for example, from splitindex.c
+% or splitindex.java may be distributed at the distributor's discretion.
+% However if they are distributed then a copy of the SplitIndex bundle
+% must be distributed together with them.
+%
+% The list of derived (unpacked or compiled) files belongig to the
+% distribution and covered by LPPL is defined by the unpacking scripts
+% (with extension .ins) and the installation script (with name
+% install.sh) which are part of the distribution.
+%
+% Two often ignorred clauses from LPPL 1.3c you should not ignore:
+% ----------------------------------------------------------------
+% 2. You may distribute a complete, unmodified copy of the Work as you
+% received it. Distribution of only part of the Work is considered
+% modification of the Work, and no right to distribute such a Derived
+% Work may be assumed under the terms of this clause.
+% 3. You may distribute a Compiled Work that has been generated from a
+% complete, unmodified copy of the Work as distributed under Clause 2
+% above, as long as that Compiled Work is distributed in such a way that
+% the recipients may install the Compiled Work on their system exactly
+% as it would have been installed if they generated a Compiled Work
+% directly from the Work.
+% ======================================================================
+
+% Set newlinechar
+\newlinechar`\^^J
+
+% Tell program information
+\message{splitindex.tex 0.1^^J%
+ Copyright (c) 2002 Markus Kohm <kohm@gmx.de>^^J^^J}
+
+% Change \catcode of At to be a letter
+\catcode`\@11\relax
+
+% New end processing command (one of these should do the job)
+\def\endprocessing{%
+ \csname @@end\endcsname
+ \csname end\endcsname
+ \csname endinput\endcsname
+}
+
+% Check out, if we are using LaTeX or plainTeX:
+\let\@earlyend\relax
+\def\@tempa{LaTeX2e}
+\expandafter\ifx\csname fmtname\endcsname\@tempa
+\else
+ \def\@tempa{plain}
+ \expandafter\ifx\csname fmtname\endcsname\@tempa
+ \def\newwrite{\alloc@7\write\chardef\sixt@@n}% not longer \outer
+ \chardef\@inputcheck=0\relax
+ \else
+ \message{Unkown format \csname fmtname\endcsname^^J
+ You have to use plainTeX or LaTeX2e to run
+ splitindex.tex!^^J}
+ \let\@earlyend\endprocessing
+ \fi
+\fi
+\@earlyend
+
+% Is \idx defined to the name of the raw index file?
+\expandafter\ifx\csname idx\endcsname\relax
+% no it isn't
+ \message{Enter the name of the idx file to be processed: }%
+ \advance\endlinechar\@M
+ \read\m@ne to\idx
+ \advance\endlinechar-\@M
+\fi
+
+% Sorry to late for log file
+\def\setjobname#1.idx#2\\{\def\jobname{#1}}
+\expandafter\setjobname\idx.idx\\
+
+\let\@earlyend\relax
+\openin\@inputcheck\idx %
+\ifeof\@inputcheck
+ \ifx\jobname\idx
+ \openin\@inputcheck\jobname.idx %
+ \ifeof\@inputcheck
+ \message{Error: Neither file `\idx' nor file `\jobname.idx' found!^^J}%
+ \let\@earlyend\endprocessing
+ \else
+ \xdef\idx{\jobname.idx}%
+ \fi
+ \else
+ \message{Error: File `\idx' not found!^^J}%
+ \let\@earlyend\endprocessing
+ \fi
+\fi
+\@earlyend
+
+\message{Read from file: \idx^^J%
+ Write to files: \jobname-*.idx^^J}
+
+% We are ready to do the processing
+
+% First we have to do the tricky splitting of the input line.
+% We do not allow lines which don't start with \indexentry.
+% We do not support other index file definitions but with an
+% optional argument of \indexentry.
+% We need some catcode changes to read and split the line. So
+% we do this part of the processing at a group.
+\newtoks\verbatim@line
+\begingroup
+\catcode`\^^M\active
+
+\begingroup
+\catcode`\|=0
+\catcode`\\=12
+|gdef|splitidxline\indexentry#1{%
+ |if #1[%
+ |expandafter|@splitidxline%
+ |else%
+ |expandafter |@splitidxline |expandafter i|expandafter d%
+ |expandafter x|expandafter ]|expandafter#1%
+ |fi%
+}
+|endgroup
+
+\gdef\@splitidxline#1]#2^^M{%
+ \idxwrite{#1}{\string\indexentry#2}%
+}
+
+\gdef\processidxline{%\message{\the\verbatim@line}%
+ \expandafter\splitidxline\verbatim@line^^M
+}
+\endgroup
+
+% Now, we can do the main job: writing to the index files
+\def\idxwrite#1#2{%
+ \expandafter\ifx\csname write@#1\endcsname\relax
+ % We need a new file
+ \message{New index file: \jobname-#1.idx^^J}%
+ \expandafter\newwrite\csname write@#1\endcsname
+ \immediate\openout\csname write@#1\endcsname \jobname-#1.idx %
+ % FixMe: Don't close by end TeX run but use \closeout
+ \fi
+ \immediate\write\csname write@#1\endcsname{#2}%
+}
+
+% Read the file verbatim and process the lines
+\newif\ifnoteof
+\newtoks\par@tok\par@tok{\par}
+\def\@makeother#1{\catcode`#112\relax}
+\def\processidxfile{
+ \immediate\openin\@inputcheck \idx %
+ \noteoftrue
+ \loop
+ \ifeof\@inputcheck \noteoffalse\fi
+ \ifnoteof
+ \begingroup
+ \let\do\@makeother\dospecials
+ \immediate\read\@inputcheck to \verbatim@line
+ \if\par@tok\verbatim@line\else
+ \processidxline
+ \fi
+ \endgroup
+ \repeat
+}
+
+\processidxfile
+
+% Trick to end processing in TeX and LaTeX
+\endprocessing
+%%% Local Variables:
+%%% mode: tex
+%%% TeX-master: t
+%%% End: