% \iffalse
% ====================================================================
%  @LaTeX-style-file{
%     author          = "David M. Jones",
%     version         = "3.04",
%     date            = "07 March 1994",
%     time            = "20:45:05 EST",
%     filename        = "index.doc",
%     address         = "MIT Laboratory for Computer Science
%                        Room NE43-316
%                        545 Technology Square
%                        Cambridge, MA 02139
%                        USA",
%     telephone       = "(617) 253-5936",
%     FAX             = "(617) 253-3480",
%     checksum        = "27647 1505 7071 54892",
%     email           = "[email protected]",
%     codetable       = "ISO/ASCII",
%     keywords        = "LaTeX, index",
%     supported       = "yes",
%     docstring       = "This is a reimplementation of LaTeX's
%                        indexing macros to provide better support
%                        for indexing in LaTeX.  For example, it
%                        supports multiple indexes in a single
%                        document and provides a more robust \index
%                        command.
%
%                        The checksum field above contains a CRC-16
%                        checksum as the first value, followed by
%                        the equivalent of the standard UNIX wc
%                        (word count) utility output of lines,
%                        words, and characters.  This is produced
%                        by Robert Solovay's checksum utility.",
%
%  }
% ====================================================================
% \fi
%
% \iffalse
%
% HOW TO INSTALL THIS FILE:
%
% If you have the latest versions of DocStrip and doc.sty installed on
% your system, type "tex index.doc" to unpack the files index.sty and
% sample.tex.  Then install index.sty wherever style files belong on
% your system and read the comments at the beginning of sample.tex to
% see how to run the test.  Finally, format the documentation by
% executing the following three commands:
%
%    latex index.doc
%    makeindex -s gind.ist index
%    latex index.doc
%
% If you don't already have DocStrip and doc.sty installed on your
% system, you should get them from one of the following sources:
%
% ftp.uni-stuttgart.de:soft/tex/macros/latex/distribs/doc
% pip.shsu.edu:tex-archive/macros/latex/distribs/doc
% ftp.tex.ac.uk:tex-archive//macros/latex/distribs/doc
%
% If for some reason you really can't install the doc package on your
% system, then you can name this file index.sty and use it as a style
% file.  However, you will likely notice some slowness in loading this
% file, due to the large number of comments that have to be skipped
% over.
%
% CAUTION: Use only as directed.  Do not take internally.  May cause
% rash if applied directly to skin.  Federal law prohibits
% distributing without a proscription.
%
%     __           __
%    /  \         /  \
%   /    \       /    \
%  /  \   \     /  \   \
% /    )   \   /    )   \
% \   (    /   \   (    /
%  \   \  /     \   \  /
%   \    /       \    /
%    \__/         \__/
%     ||           ||
%     ||           ||
%   ------       ------
%
% Now the real fun starts.  This file is designed to serve 4 (or 5, if
% you prefer) distinct functions:
%
% (1) In the absence of DocStrip, it can be named index.sty and used
% as a LaTeX style file.
%
% (2) It is a DocStrip batch file that can be used to unpack index.sty
% and sample.tex.  This function is triggered when the file is used as
% an input file for plain TeX, i.e., when the command "tex index.doc"
% is executed.
%
% (3) It is the driver file for the documentation of index.sty.  This
% function is triggered when the file is used as an input file for
% LaTeX, i.e., when the command "latex index.doc" is executed.
%
% (4) It is the source file for steps 2 and 3.
%
% To make this work, we have to be able to determine which of these
% cases we are in and take appropriate action.
%
% The next few lines of code accomplish this.  First, note that if
% this file is used as input to the doc.sty \DocInput command, then
% the \iffalse ... \fi will cause this code to be ignored.  Similarly,
% the <install> guard prevents this code from being copied into any
% output files by DocStrip.
%
% Next comes the more interesting code.  We need two auxiliary
% commands to make sure that the correct commands get executed at the
% correct time.  In order to avoid impinging on the user's namespace,
% I use two macro names from index.sty.
%
% \proofmodetrue: This is a no-op, unless we are producing
%     documentation (i.e., the user has typed "latex index.doc"), in
%     which case it expands to the appropriate initialization code,
%     namely a \documentstyle command, plus \MakePercentIgnore to set
%     things up for doc.sty, and a call to \csname iffalse\endcsname
%     to match the fi that follows.  (The earlier iffalse was ignored
%     because when that line was read, % was still a comment character
%     and not an ignored character.)
%
% \renewindex: This eats its argument unless this file is being used
%     as a DocStrip batchfile (i.e., the user has typed "tex
%     index.doc"), in which case it simply regurgitates its argument.
%     The commands inside the \renewindex commands are just normal
%     DocStrip batchfile commands.
%
% Before doing anything else, we check to make sure that \newindex is
% not already defined.  If it is, that means this file has already
% been loaded once as a style file (or else someone else has already
% defined a \newindex command), which means we should not load the
% file a second time.  (This is the same test that will be used later
% to determine whether or not index.sty has already been loaded.  So,
% if you are using index.doc as index.sty, this test will actually be
% made twice, but that should be ok.)
%
% Finally, we determine whether we are inside plain TeX or LaTeX by
% checking to see if \documentstyle is defined.  If we are inside
% LaTeX, we check to see if we are being used as a style file or a
% documentation file by checking to see if the \catcode of @ is 11
% (letter) or not.
%
% The braces around the first two blocks of code below are necessary
% because DocStrip will open this file and start reading it
% line-by-line.  The braces ensure that the entire \ifx ... \fi
% structures are picked up at once.
%
% No doubt strange and terrible things will happen if you feed this
% file to any dialect of TeX other than plain TeX or LaTeX.
%
% The blame for much of the following code goes to David Wald
% <[email protected]>, who forced me to adopt this approach
% after I had already come up with a safer alternative that was almost
% as easy to unpack.  If anything goes wrong, it's his fault.
%
% \fi
%
% \iffalse
%<*install>
{\expandafter\ifx\csname newindex\endcsname\relax\else\endinput\fi}
{
   \global\let\proofmodetrue\relax
   \expandafter\ifx\csname documentstyle\endcsname\relax
       \gdef\renewindex#1{#1}
   \else
       \gdef\renewindex#1{}
       \ifcat a\noexpand @\else
           \gdef\proofmodetrue{%
               \documentstyle[doc]{article}\MakePercentIgnore
               \csname iffalse\endcsname
           }
       \fi
   \fi
}
\renewindex{\def\batchfile{index.doc}}
\renewindex{\input docstrip.tex }
\renewindex{\generateFile{index.sty}{t}{\from{index.doc}{style}}}
\renewindex{\generateFile{sample.tex}{t}{\from{index.doc}{sample}}}
\renewindex{\endinput}
\proofmodetrue
%</install>
% \fi

\def\fileversion{v3.04}
\def\filedate{7 March 1994}
\def\docdate {7 March 1994}

%% \CheckSum{760}
%% \CharacterTable
%%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%%   Digits        \0\1\2\3\4\5\6\7\8\9
%%   Exclamation   \!     Double quote  \"     Hash (number) \#
%%   Dollar        \$     Percent       \%     Ampersand     \&
%%   Acute accent  \'     Left paren    \(     Right paren   \)
%%   Asterisk      \*     Plus          \+     Comma         \,
%%   Minus         \-     Point         \.     Solidus       \/
%%   Colon         \:     Semicolon     \;     Less than     \<
%%   Equals        \=     Greater than  \>     Question mark \?
%%   Commercial at \@     Left bracket  \[     Backslash     \\
%%   Right bracket \]     Circumflex    \^     Underscore    \_
%%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%%   Right brace   \}     Tilde         \~}
%%
%
% \DoNotIndex{\!,\/,\?,\@,\^,\_}
% \DoNotIndex{\@@par,\@M,\@auxout,\@bsphack,\@esphack,\@depth,\@ehc}
% \DoNotIndex{\@for,\@flushglue,\@gobble,\@gobbletwo,\@height,\@idxitem}
% \DoNotIndex{\@ifnextchar,\@ifstar,\@ifundefined,\@input,\@latexerr}
% \DoNotIndex{\@makeschapterhead,\@namedef,\@nameuse,\@nil}
% \DoNotIndex{\@nobreakfalse,\@restonecolfalse,\@restonecoltrue}
% \DoNotIndex{\@tempa,\@tempf,\@temptokena,\@themark,\@width}
% \DoNotIndex{\active,\aindex,\baselineskip,\begin,\begingroup,\box}
% \DoNotIndex{\c@page,\catcode,\chapter,\char,\chardef,\closeout}
% \DoNotIndex{\CodelineIndex,\sp,\sb,\label,\leavevmode,\mark}
% \DoNotIndex{\mark,\newinsert,\newwrite,\newtoks,\xdef}
% \DoNotIndex{\columnsep,\columnseprule,\columnwidth,\csname,\def}
% \DoNotIndex{\dimen,\do,\DocInput,\documentstyle,\edef,\else,\em}
% \DoNotIndex{\EnableCrossrefs,\end,\endcsname,\endgroup,\endinput}
% \DoNotIndex{\everypar,\expandafter,\fi,\filedate,\fileversion}
% \DoNotIndex{\footnotesize,\gdef,\global,\glossary,\hangindent}
% \DoNotIndex{\if@filesw,\if@nobreak,\if@twocolumn,\if@twoside}
% \DoNotIndex{\hsize,\hskip,\ifhmode,\ifmmode,\ifodd,\ifvmode,\ifx}
% \DoNotIndex{\immediate,\insert,\item,\jobname,\long}
% \DoNotIndex{\let,\lineskip,\marginparsep,\marginparwidth,\maxdimen}
% \DoNotIndex{\makeatletter,\noexpand,\openout,\protect,\rlap}
% \DoNotIndex{\min,\newpage,\nobreak,\normalbaselineskip}
% \DoNotIndex{\normallineskip,\p@,\par,\parfillskip,\parindent,\parskip}
% \DoNotIndex{\penalty,\relax,\section,\sin,\sloppy,\space,\string}
% \DoNotIndex{\tableofcontents,\the,\thepage,\thispagestyle,\toks,\tt}
% \DoNotIndex{\twocolumn,\typeout,\uppercase,\vbox,\vrule,\vskip,\vss}
% \DoNotIndex{\write,\z@,\z@skip}
%
% \MakeShortVerb{\=}
%
% \setcounter{StandardModuleDepth}{1}
%
% \newcommand{\email}[1]{$\langle${\tt#1}$\rangle$}
%
% \newcommand{\vdate}[1]{$\langle$#1$\rangle$}
%
% \newcommand{\file}[1]{{\tt#1}}
%
% \newcommand{\bundle}[1]{{\tt#1}}
%
% \newcommand{\program}[1]{{\sf#1}}
%
% \newcommand{\Ltag}[1]{{\tt\bslash#1}}
%
% \CodelineIndex
%
% \title{A new implementation of \LaTeX's indexing
%        commands\thanks{This file has version number \fileversion,
%        last revised \filedate, documentation dated \docdate.  The
%        definitive version of this file is
%        \file{theory.lcs.mit.edu:pub/tex/index.doc}.}}
%
% \author{David M. Jones}
%
% \date{\filedate}
%
% \begin{document}
%
% \maketitle
%
% \section{Introduction}
%
% This style file reimplements \LaTeX's indexing macros to provide
% better and more robust support for indexes.  In particular, it
% provides the following features:
% \begin{enumerate}
%
% \item
% Support for multiple indexes.
%
% \item
% Indexing of items by counters other than the page number.
%
% \item
% A $*$-variant of the =\index= command that, in addition to putting
% it's argument in the index, also typesets it in the running text.
%
% \item
% A =\shortindexingon= command that makes =^= and =_= shorthand for
% =\index= and =\index*=, respectively (but only outside of math mode,
% of course).  This can be turned of with the =\shortindexingoff=
% command.
%
% \item
% The \bundle{showidx} style option has been merged into this file.
% The command =\proofmodetrue= can be used to enable the printing of
% index entries in the margin of pages.  The size and style of font
% can be controlled with the =\indexproofstyle= command.
%
% \item
% A two-stage process, similar to that used to create tables of
% contents, for creating the raw index files.  This means that when
% processing a portion of a document using the =\includeonly= command,
% the index entries from the rest of the document are not lost.
%
% \item
% A more robust =\index= command.  In particular, it no longer depends
% on =\catcode= changes to work properly, so the new =\index= command
% can be used in places that the original couldn't, such as inside the
% arguments of other macros.
%
% \end{enumerate}
%
%
% \section{Creating an index with \LaTeX}
%
% Conceptually, there are four stages to creating an index.  First,
% \LaTeX\ must be informed of your intention to include an index in
% your document.  Second, you must add appropriate markup commands to
% your document to tell \LaTeX\ what to put in the index.  Third,
% after \LaTeX\ has been run on your document, the raw index
% information must be processed and turned into a form that \LaTeX\
% can process to typeset the index.  Finally, the finished index must
% be inserted at the appropriate point in your document.
%
% In \LaTeX, these steps are accomplished with the commands
% =\makeindex=, =\index=, =\printindex=, and (typically) with the
% auxiliary program \program{MakeIndex}.  For example, assuming that
% your main file is called \file{foo.tex}, =\makeindex= opens the
% file \file{foo.idx} and initializes it for holding the raw index
% entries, and =\index= is used to add raw index entries into
% \file{foo.idx}.  Then the raw index file is processed by
% \program{MakeIndex}, which puts the finished index in
% \file{foo.ind}.  Finally, the =\printindex= command is used in
% your \LaTeX\ document to indicate where the file \file{foo.idx}
% should be inserted, i.e., where the index should appear in your
% document.
%
% The \bundle{index} package modifies the =\makeindex=, =\index=, and
% =\printindex= commands, as described below.
%
%
% \section{The user interface}
%
% There are four pieces of information associated with each index:
% \begin{enumerate}
%
% \item
% A short, unique tag that identifies the index.
%
% \item
% The extension of the output file where the raw index information
% will be put by \LaTeX.
%
% \item
% The extension of the input file where the processed information
% created by \program{MakeIndex} will be stored to be read in later by
% \LaTeX.
%
% \item
% The title of the index.
%
% \end{enumerate}
%
% \DescribeMacro{\newindex}
% Correspondingly, the =\newindex= command has four required
% arguments.  For example, to declare an author index, you might use
% the following:
% \begin{verbatim}
%   \newindex{aut}{adx}{and}{Name Index}\end{verbatim}
% Here, =aut= is the tag used to identify the author index, and ``Name
% Index'' is the title of the index.  If the name of your main file is
% \file{root.tex}, then \LaTeX\ will write the raw index entries
% to the file \file{root.adx}, and you will execute the following
% \program{MakeIndex} command to process the author index:
% \begin{verbatim}
%   makeindex -o root.and root.adx\end{verbatim}
%
% By default, the =\index= tags its argument with the page number
% (i.e., the value of =\thepage=), but occasionaly you may want to
% index items according to a different counter.  For example, you may
% want an index that contains figure numbers instead of page numbers.
% To accomodate, this, the =\newindex= command takes an optional
% argument, which is the name of the command that generates the number
% that should be included in the index.  For instance, to include the
% number of a figure, you might say
% \begin{verbatim}
%   \newindex[thefigure]{fig}{fdx}{fnd}{Figures}\end{verbatim}
%
% However, this introduces a new technicality: When creating an index
% with page numbers, the choice of which page number is to be written
% to the =aux= file should be deferred until the page containing the
% entry is shipped out to the =dvi= file, otherwise the wrong number
% will sometimes be chosen.  However, when using counters other than
% the page counter, one normally wants the opposite behaviour: the
% number written to the =aux= file should be chosen immediately,
% otherwise every item on a given page will be tagged with the number
% of the last item on that page.  So, when a counter is specified
% using the optional argument of =\newindex=, it is assumed that the
% counter should be evaluated immediately.  If for some reason you
% need the choice to be deferred until the page is written to the
% =dvi= file, you can force this behaviour by putting a $*$ {\em
% after\/} the optional argument:
% \begin{verbatim}
%   \newindex[thefigure]*{fig}{fdx}{fnd}{Figures}\end{verbatim}
% (One consequence of this scheme is that if, for some reason, you
% need the choice of page number to be made immediately instead of
% being deferred until a page is shipped out to the =dvi= file, you
% can acomplish this by beginning your index declaration with
% \begin{verbatim}
%   \newindex[thepage]*\end{verbatim}
%
%
% \DescribeMacro{\renewindex}
% The =\renewindex= command takes the same arguments as the
% =\newindex= command and can be used to redefine indexes that have
% been previously declared.
%
%
% \DescribeMacro{\makeindex}
% For backwards compatibility, the =\makeindex= command is redefined
% to use =\newindex=.  It is essentially equivalent to
% \begin{verbatim}
%   \newindex{default}{idx}{ind}{Index}\end{verbatim}
% The index labeled =default= is special: it is the one that will be
% used by =\index= and =\printindex= unless another index is
% specified (see below).
%
%
% \DescribeMacro{\printindex}
% The =\printindex= command is modified by the addition of an optional
% argument, which is the tag of the index that should be printed.
%
%
% \DescribeMacro{\index}
% The =\index= command is modified in two ways.  First, there is a
% $*$-variant of the command that, in addition to putting its argument
% into an index, also typesets it on the page.  Second, =\index= now
% takes an optional argument to indicate which index the new entry
% should be added to.  If given, the optional argument should be the
% identifying tag of a previously-defined index.  If no such tag is
% supplied, the =default= index (such as that opened by =\makeindex=
% above) is used.
%
%
% \DescribeMacro{\shortindexingon}
% \DescribeMacro{\shortindexingoff}
% Perhaps the most dubious feature of \bundle{index.sty} is that it
% allows you to define the characters =^= and =_= to be abbreviations
% for =\index*= and =\index= outside of math mode.  These
% abbreviations are enabled by the =\shortindexingon= command and
% disabled by the =\shortindexingoff= command.  The scope of both of
% these latter commands is local to the current group.  (This might be
% useful, for example, if you wanted the abbreviations turned on
% throughout most of the documentation, but turned off in one
% particular environment.)  In addition,
% \DescribeEnv{shortindexingon}=shortindexingon= can be used as an
% environment if that seems appropriate.
%
%
% \DescribeMacro{\proofmodetrue}
% \DescribeMacro{\proofmodefalse}
% \DescribeMacro{\indexproofstyle}
% As mentioned above, the \bundle{showidx} document-style option has
% been merged into \bundle{index.sty}.  It can be turned on with
% =\proofmodetrue= and turned off with =\proofmodefalse=.  When it is
% turned on, all index entries\footnote{Well, most, at least.  There
% are some circumstances under which the index entries won't show up
% in the proofs, although they will show up in the index.} will be put
% in the margin of the page where they appear.  By default, they
% appear in the typewriter font at =\footnotesize=, but the user can
% override this with the =\indexproofstyle= command; for example,
% \begin{verbatim}
%   \indexproofstyle{\footnotesize\it}\end{verbatim}
% will cause them to be put in italics instead.
%
%
% \DescribeMacro{\disableindex}
% There are some circumstances where it might be helpful to suppress
% the writing of a particular index.  The =\disableindex= command is
% provided for this purpose.  It takes one argument, a comma-separated
% list of tags of the indexes that should be disabled.  This command
% should come {\em before\/} the declarations for the indexes that are
% being disabled\footnote{This limits its usefulness somewhat, but
% since the output file for an index is opened when the index is
% declared, the damage has already been done.  We could close the
% file, but we can't prevent a new output stream from being allocated
% and we can't keep the old file from being truncated.}.  One
% situation where the =\disableindex= command might be useful is if
% there are so many indexes that you are exhausting \TeX's supply of
% output streams\footnote{\TeX\ only has 16 output streams, which are
% allocated with the {\tt\string\newwrite} command.  The standard
% \LaTeX\ styles use from 3 to 7 of these, which should leave room for
% up to 9 indexes.  Of course, if you have extra output files, then
% there will be fewer output streams left for indexes.}.  For example,
% suppose you have 10 indexes, but only 5 output streams available for
% indexes.  Then you could add a =\disableindex= command to the top of
% your file to suppress the writing of all but 5 of the indexes.
% (Note that the index entries would still get written to the =aux=
% file; they just wouldn't get copied to the individual raw index
% files at the end of the run.)  At the end of the run, you could then
% re-run your main file a couple of times with different indexes
% disabled until you had created all of the raw index files.  This is
% somewhat clumsy, but safer than any alternative I've come up
% with\footnote{A less clumsy (for the user, at least) solution would
% be to read the =aux= file multiple times at the end of the run, each
% time writing just one of the raw index files.  The main disadvantage
% of this scheme at present is that it would require a modification of
% {\tt\string\enddocument}.}.
%
%
% \section{Caveats}
%
% In order to implement this style file, it's been necessary to modify
% a number of \LaTeX\ commands seemingly unrelated to indexing,
% namely, =\@starttoc=, =\raggedbottom=, =\flushbottom=,
% =\addcontentsline=, =\markboth=, and =\markright=.  Naturally, this
% could cause incompatibilities between \bundle{index.sty} and any
% style files that either redefine these same commands or make
% specific assumptions about how they operate.  See
% Section~\ref{sec:thecode} for explanations of why these various
% commands needed modification.
%
% It's also been necessary to modify the =\theindex= environment, but
% I've tried to do so very conservatively.  If your style file uses
% =\indexname= and your definition of =\theindex= doesn't take any
% arguments, you should be ok.  Otherwise, you'll need to redefine the
% =\theindex= environment yourself if you don't want the \LaTeX\
% \bundle{book.sty} default.
%
% In the current implementation, \bundle{index.sty} uses one output
% stream for each index.  Since there are a limited number of output
% indexes, this means that there is a limit on the number of indexes
% you can have in a document.  See the description of =\disableindex=
% for a fuller discussion of this problem and one way around it.
%
%
% \section{To do's}
%
% The entire package should be rewritten as a
% \LaTeX\kern.15em$2_{\textstyle\varepsilon}$ package.
%
% It might be nice if the =\index*= command parsed its argument so
% that, for example, instead of writing `=\index{sin@$\sin$}$\sin$=',
% one could write `=\index*{sin@$\sin$}='.  However, this is fraught
% with numerous dangers, and I'm both too lazy and too cowardly to
% undertake it now.
%
% Maybe the user should be given the option of deciding which
% characters are used for the shortindexing abbreviations
%
% It would be reasonable to add support for =\makeglossary= and
% similar things, if they were well-defined enough to decide what the
% general syntax for defining them should be.
%
% The documentation should be carefully read, edited, and finished.
% (In particular, I should add some scathing comments about some of
% the problems that made it necessary to redefine so many of \LaTeX's
% commands.  This wouldn't necessarily do any good, but it would make
% me feel better.)
%
% Maybe it would be nice if this package were compatible with plain
% \TeX.
%
% \StopEventually{}
%
% \section{The code}
% \label{sec:thecode}
%
% As is customary, we first make sure the file is loaded only once.
% Then we print an identifying message to the terminal.
%    \begin{macrocode}
%<*style>
\@ifundefined{newindex}{}{\endinput}

\typeout{Style-Option: `index' \fileversion\space <\filedate> (dmj)}
%    \end{macrocode}
%
% \begin{macro}{\@ifundefined}
% We begin by redefining the \LaTeX\ command =\@ifundefined= to
% prevent it from expanding its arguments prematurely.  This also
% requires us to redefine =\@leftmark= and =\@rightmark= to make them
% =\long=. The following three definitions are borrowed from
% \bundle{amsart.sty}, v1.1b \vdate{31 Jul 1991}.  I rely heavily upon
% this more robust definition of =\@ifundefined=.
%    \begin{macrocode}
\long\def\@ifundefined#1{%
   \expandafter\ifx\csname#1\endcsname\relax
       \expandafter\@leftmark
   \else
       \expandafter\@rightmark
   \fi
}

\long\def\@leftmark#1#2{#1}
\long\def\@rightmark#1#2{#2}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\disableindex}
% The =\disableindex= should come before the declarations of the
% indexes it refers to.  (Question: If an index has been disabled,
% should it show up in index proofs?  Maybe there should be a separate
% command to disable index proofs on and index-by-index basis.)
%    \begin{macrocode}
\def\disableindex#1{%
   \@for\@tempa:=#1\do{%
       \@namedef{disable@\@tempa}{}%
       \@ifundefined{tf@\@tempa}{}{%
           \typeout{index.sty> Warning! It's too late to disable the
               `\@tempa' index; the output}%
           \typeout{index.sty> file \jobname.\@tempa\space has already
               been opened for output. You should}%
           \typeout{index.sty> put the \string\disableindex\space
               command before the declaration of the}%
           \typeout{index.sty> `\@tempa' index.}%
       }%
   }%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\if@newindex}
% \begin{macro}{\newindex}
% \begin{macro}{\renewindex}
% The =\newindex= and =\renewindex= commands are defined on analogy
% with the =\[re]newcommand= macros.  Each index is identified by a
% unique tag, which is specified in the first required argument of
% =\newindex=.  Much of the information about the index labeled
% \meta{tag} is kept in the macro =\idx@=\meta{tag}, so we can check
% to see if a particular index has already been defined by checking
% whether =\idx@=\meta{tag} is defined.  =\newindex= and =\renewindex=
% both check to see if their first argument is already associated with
% an index and then either issue an appropriate error message or call
% =\def@index=.
%
% The =\if@newindex= flag will be used to keep =\renewindex= from
% re-allocating =\write= and =\toks= registers later.
%    \begin{macrocode}
\newif\if@newindex

\def\newindex{%
   \@tempswafalse
   \@ifnextchar[{\@tempswatrue\x@newindex}{\x@newindex[thepage]}%
}

\def\x@newindex[#1]{%
   \@ifstar {\@tempswafalse\y@newindex{#1}}
            {\y@newindex{#1}}%
}

\def\y@newindex#1#2{%
   \@ifundefined{idx@#2}%
       {\@newindextrue\def@index{#1}{#2}}%
       {%
           \@latexerr{Index type `\string#2' already defined}\@ehc
           \expandafter\@gobble\@gobbletwo
       }%
}

\def\renewindex{%
   \@tempswafalse
   \@ifnextchar[{\@tempswatrue\x@renewindex}{\x@renewindex[thepage]}%
}

\def\x@renewindex[#1]{%
   \@ifstar {\@tempswafalse\y@renewindex{#1}}
            {\y@renewindex{#1}}%
}

\def\y@renewindex#1#2{%
   \@ifundefined{idx@#2}%
       {%
           \@newindextrue
           \@latexerr{Index type `\string#2' not defined}\@ehc
       }%
       {\@newindexfalse}%
   \def@index{#1}{#2}%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@preamblecmds}
% Neither =\newindex=, =\renewindex=, nor =\disableindex= should be
% used anywhere except inside style files or in the preamble of a
% document, so we add them to the =\@preamblecmds= list.
%    \begin{macrocode}
\begingroup
   \def\do{\noexpand\do\noexpand}%
   \xdef\@preamblecmds{%
       \@preamblecmds
       \do\newindex
       \do\renewindex
       \do\disableindex
   }
\endgroup
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\def@index}
% =\def@index= does most of the work.  First, it picks up the first
% three arguments of the =\[re]newindex= command and stores the second
% two in an appropriate =\idx@= macro.  The title of the index is
% treated differently, however, since it is potentially fragile in a
% particularly odd way.  To prevent mishaps, it is stored in a token
% register.  In addition to stashing away the information about the
% index, =\def@index= also opens an appropriate output file if we are
% writing auxiliary files (i.e., unless =\nofiles= is in effect).
%
% \begin{macro}{\my@newtoks}
% Since we need to declare new token registers on the fly, we need a
% non-=\outer= version of =\newtoks=.
%    \begin{macrocode}
\def\my@newtoks{\csname newtoks\endcsname}

\def\def@index#1#2#3#4{%
   \@namedef{idx@#2}{#3:#4:#1}%
   \expandafter\let\csname if@immediate@#2\endcsname\if@tempswa
   \if@filesw
       \if@newindex
           \expandafter\my@newtoks\csname idxtitle@#2\endcsname
       \fi
       \@ifundefined{disable@#2}{%
           \if@newindex
               \expandafter\newwrite\csname tf@#2\endcsname
           \else
               \immediate\closeout\@nameuse{tf@#2}%
           \fi
           \immediate\openout\@nameuse{tf@#2}=\jobname.#3 %
           \typeout{index.sty> Writing index file \jobname.#3 }%
       }
       {\typeout{index.sty> Index `#2' disabled -- not opening
                     \jobname.#3 }}%
   \fi
   \expandafter\csname idxtitle@#2\endcsname
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@second}
% \begin{macro}{\@third}
% These are useful macros for retrieving the second and third field of
% an index specification.
%    \begin{macrocode}
\def\@second#1:#2:#3\@nil{#2}

\def\@third#1:#2:#3\@nil{#3}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@nearverbatim}
% \begin{macro}{\@meaning}
% =\@nearverbatim\foo= is much like =\meaning\foo=, except that it
% suppresses the ``=macro ->='' string produced when =\meaning=
% expands a macro.  It is used by =\@wrindex= and =\@vwritefile= to
% produce an ``almost verbatim'' copy of their arguments.  This method
% replaces the use of =\@sanitize= from latex.tex and allows indexing
% macros to be used in places (such as inside macro arguments) where
% the original =\index= command could not.  Thanks to Donald Arseneau
% \email{[email protected]} for pointing out this
% trick to me.  (For more information on this trick, see Dirty Trick
% \#3 of the \TeX book, page 382).
%
% As defined, \@nearverbatim only works on macros.  It would be nice
% if it could work with other tokens, but it's more important that it
% work only by expansion, which means we can't put in tests to see
% what the next token is.
%    \begin{macrocode}
\def\@nearverbatim{\expandafter\@meaning\meaning}

\def\@meaning#1>{}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% Now we define the =\index= macro itself.  The following definitions
% are adapted from \bundle{latex.tex} v2.09 \vdate{25 March
% 1992}.
%
% \begin{macro}{\makeindex}
% First we redefine =\makeindex= to define the default index using
% =\newindex=.  We use =\edef= to make sure that =\indexname= gets
% expanded here.  Otherwise we'll get into an infinite loop later on
% when we try to redefine =\indexname= inside the =\theindex=
% environment.
%    \begin{macrocode}
\edef\makeindex{%
   \noexpand\newindex{default}{idx}{ind}{%
       \expandafter\ifx\csname indexname\endcsname\relax
           Index%
       \else
           \indexname
       \fi
   }%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\if@silentindex}
% \begin{macro}{\if@addtoindex}
% \begin{macro}{\if@proofmode}
% We need three new flags.  The first, =\if@silentindex=, indicates
% whether the entry should be typeset in running text, as well as
% written out to the index; this is used to implement the =\index*=
% command.  The second, =\if@addtoindex=, indicates whether entries
% should be written to the index; this is used to disable the =\index=
% command inside of page headings and tables of contents.  The third,
% =\ifproofmode=, indicates whether index entries should be put in the
% margin of the page for proofing purposes.
%    \begin{macrocode}
\newif\if@silentindex\@silentindextrue

\newif\if@addtoindex\@addtoindextrue

\newif\ifproofmode\proofmodefalse
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\index}
% \begin{macro}{\p@index}
% \begin{macro}{\x@index}
% =\index= will be made self-protecting (a la =\em=, etc.) so it can
% be used inside, for example, sectioning commands.  Unfortunately, to
% really make =\index= robust, we have to redefine some of \LaTeX's
% commands for dealing with tables of contents and page headings.
% (See below.) $*$sigh$*$
%    \begin{macrocode}
\def\index{\protect\p@index}

\def\p@index{%
   \if@silentindex\@bsphack\fi
   \@ifstar{\@silentindexfalse\@xindex}{\@silentindextrue\@xindex}%
}

\def\@xindex{\@ifnextchar[{\@index}{\@index[default]}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@index}
% \begin{macro}{\@@index}
% \begin{macro}{\@wrindex}
% The following is much more complicated than it should have to be.
% First, note the check to see if =\index= is equal to =\@gobble=.
% This is so I don't have to redefine =\@outputpage=, which
% temporarily disables =\label=, =\index=, and =\glossary= by
% =\let='ing them equal to =\@gobble=.  (For this reason, we have to
% be very careful to make sure that =\index= has expanded to
% =\p@index= before it gets to =\@outputpage=.)  Second, note that if
% =\if@addtoindex= is false, we don't complain about undefined index
% types.  This is because if your page headings, for example, are
% being typeset in all uppercase, you might end up with something like
% =\index[AUT]{...}= instead of =\index[aut]{...}=.
%    \begin{macrocode}
\def\@index[#1]{%
   \ifx\index\@gobble
       \@addtoindexfalse
   \fi
   \def\@tempf{\@@index{#1}}%
   \if@addtoindex
       \@ifundefined{idx@#1}%
           {%
             \def\@tempf{%
                 \@latexerr{Index type `\string#1' undefined}%
                 \@ehc
                 \@silentindextrue
                 \@gobble
             }%
           }%
           {}%
   \fi
   \@tempf
}

\def\@@index#1#2{%
   \if@addtoindex
       \if@filesw\@wrindex{#1}{#2}\fi
       \ifproofmode\@showidx{#2}\fi
   \fi
   \if@silentindex\expandafter\@esphack\else\@silentindextrue#2\fi
}

\def\@wrindex#1#2{%
   \begingroup
       \def\@tempa{#2}%
       \edef\@tempb{\@nameuse{idx@#1}}%
       \edef\@tempb{\expandafter\@third\@tempb\@nil}%
       \csname if@immediate@#1\endcsname \else
           \expandafter\let\csname\@tempb\endcsname\relax
       \fi
       \edef\@tempa{%
          \write\@auxout{%
             \string\@vwritefile{#1}{%
                 \string\indexentry{\@nearverbatim\@tempa}%
                                   {\@nameuse{\@tempb}}%
             }%
          }%
       }%
   \expandafter\endgroup\@tempa
   \if@nobreak\ifvmode\nobreak\fi\fi
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\seename}
% \begin{macro}{\see}
% \begin{macro}{\printindex}
% \begin{macro}{\@printindex}
% The following are adapted from \bundle{makeidx.sty}, v2.09 \vdate{21
% Oct 91}.
%    \begin{macrocode}
\@ifundefined{seename}{\def\seename{see}}{}

\def\see#1#2{{\em \seename\/} #1}

\def\printindex{\@ifnextchar[{\@printindex}{\@printindex[default]}}

\def\@printindex[#1]{%
   \def\@indextype{#1}%
   \@ifundefined{idx@#1}%
       {\@latexerr{Index type `\string#1' undefined}\@ehc}%
       {%
           \edef\@tempa{\@nameuse{idx@#1}}%
           \@input{\jobname.\expandafter\@second\@tempa\@nil}%
       }%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@indexstar@}
% Now we set things up for =\shortindexing=.  First, we define a
% one-token shorthand for =\index*=.  This will be needed in the
% definition of =\idx@activehat=.
%    \begin{macrocode}
\def\@indexstar@{\index*}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\idx@activehat}
% \begin{macro}{\idx@activebar}
% Next, we define the values that =^= and =_= will have when
% shortindexing is turned on.
%    \begin{macrocode}
\def\idx@activehat{%
   \relax
   \ifmmode\expandafter\sp\else\expandafter\@indexstar@\fi
}

\def\idx@activebar{%
   \relax
   \ifmmode\expandafter\sb\else\expandafter\index\fi
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\shortindexingon}
% \begin{macro}{\shortindexingoff}
% Now we define the =\shortindexingon= and =\shortindexinoff= commands
% to turn shortindexing on and off (surprise!).  =\shortindexingon=
% saves the old definitions and =\catcode='s of =^= and =_= so they
% can later be restored by =\shortindexingoff=.  Both of these make
% their changes local to any enclosing group, so they can be used as
% declarations to disable or enable shortindexing temporarily.  In
% addition, =shortindexingon= can also be used as an environment.
%
% This is potentially very confusing.  My basic rationale (if it can
% be described as such) was that under normal circumstances, one would
% put =\shortindexingon= in the preamble of one's document, and never
% want to turn it off.  =\shortindexingoff= is an attempt to make
% allowance for the contingency that someone might want to turn
% shortindexing off, either permanently or temporarily.
%    \begin{macrocode}
\newif\if@shortindexing

\begingroup

   \catcode`\^=\active
   \catcode`\_=\active

   \gdef\shortindexingon{%
       \@shortindexingtrue
       \chardef\old@idxhatcode=\catcode`\^\relax
       \chardef\old@idxbarcode=\catcode`\_\relax
       \catcode`\^=\active
       \catcode`\_=\active
       \let\old@idxhat=^%
       \let\old@idxbar=_%
       \let^\idx@activehat
       \let_\idx@activebar
   }

   \gdef\shortindexingoff{%
       \if@shortindexing
           \@shortindexingfalse
           \let^=\old@idxhat
           \let_=\old@idxbar
           \catcode`\^=\old@idxhatcode
           \catcode`\_=\old@idxbarcode
       \fi
   }

\endgroup
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% Now we redefine =\theindex=.  We try to make the minimal possible
% change, but if the user's style doesn't know about =\indexname=, we
% have no alternative but to redefine the entire environment and issue
% a warning.
%
% Thanks to Alan Jeffrey \email{[email protected]} for
% pointing out how the package should behave when =\indexname= is
% already defined and for the code to implement that case.
%    \begin{macrocode}
\expandafter\ifx\csname indexname\endcsname\relax

   \typeout{index.sty> Uh oh!  It looks like your document style
       doesn't use \string\indexname.}
   \typeout{index.sty> I'll have to redefine the
       \string\theindex\space environment, using}
   \typeout{index.sty> the `book' style default.}

   \def\indexname{Index}
%    \end{macrocode}
% The following is adapted from \bundle{book.sty} v2.09 \vdate{14 Jan
% 92}.
%    \begin{macrocode}
   \def\theindex{%
       \@restonecoltrue
       \if@twocolumn\@restonecolfalse\fi
       \columnseprule\z@ \columnsep 35\p@
       \edef\@indexname{%
           \expandafter\the\@nameuse{idxtitle@\@indextype}%
       }%
       \twocolumn[\@makeschapterhead{\@indexname}]%
       \@mkboth{\uppercase{\@indexname}}{\uppercase{\@indexname}}%
       \thispagestyle{plain}%
       \parindent\z@
       \parskip\z@ plus .3\p@\relax\let\item\@idxitem
   }

\else

   \@temptokena={%
      \edef\indexname{\the\@nameuse{idxtitle@\@indextype}}%
   }
   \toks0=\expandafter{\theindex}%
   \edef\theindex{\the\@temptokena\the\toks0}%

\fi
%    \end{macrocode}
%
% \begin{macro}{\@vwritefile}
% \begin{macro}{\x@vwritefile}
% \begin{macro}{\y@vwritefile}
% Now we define the =\@vwritefile= macro, which copies information
% from the =aux= file to one of the other auxiliary files.
% =\@vwritefile= performs essentially the same function as
% =\@writefile=, except that it does not expand it second argument
% (i.e., it writes it out verbatim (well, almost verbatim)).
%
% NOTE: There doesn't seem to be any reason why =\@writefile= *should*
% expand its second argument and in fact, we later redefine
% =\addcontentsline= to use =\@vwritefile= instead of =\@writefile=.
% A slight extension of this idea could be used to solve part the
% problem of fragility in sectioning commands.
%
% =\@vwritefile=, like =\@writefile=, should be disabled when the
% =aux= file is being read by =\begin{document}=.  To avoid having to
% redefine =\document=, we make the behaviour of =\@vwritefile=
% conditional on the current meaning of =\@writefile=.
%    \begin{macrocode}
\def\@vwritefile{%
   \ifx\@writefile\@gobbletwo
       \expandafter\@gobbletwo
   \else
       \expandafter\x@vwritefile
   \fi
}

\def\x@vwritefile#1{%
   \@ifundefined{tf@#1}{\@gobbletwo}{\y@vwritefile}{#1}%
}

\long\def\y@vwritefile#1#2{%
   \def\@tempa{#2}%
   \immediate\write\csname tf@#1\endcsname{\@nearverbatim\@tempa}%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% Now we take some code from \bundle{showidx.sty} and merge it into our
% new system.  There are four reasons for redefining the commands here
% rather than just inputting \bundle{showidx.sty} (or requiring the user
% to do so).  First, \bundle{showidx.sty} ends with a call to
% =\flushbottom=, which I want to avoid.  Second, the instructions for
% successfully using \bundle{showidx.sty} along with \bundle{index.sty}
% would be somewhat tricky.  This way, I can just tell users not to
% use \bundle{showidx.sty} at all.  Third, I need to make some
% alterations to =\@showidx= anyway.  In particular, (a) I need to add
% the =\@sanitizeat= command so this works correctly with AMS-\LaTeX\
% and (b) I want to add the =\indexproofstyle= command so the user can
% customize the size and font used for the index proofs.  Finally,
% \bundle{showidx.sty} has at least two annoying bugs in it.  See the
% edit-history for version 2.01 for a description.
%
% \begin{macro}{\@indexbox}
% This code is adapted from \bundle{showidx.sty}, v2.09 \vdate{16 Jun
% 1991}.
%    \begin{macrocode}
\newinsert\@indexbox

\dimen\@indexbox=\maxdimen
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@sanitizeat}
% The definition of =\@sanitizeat= is slightly tricky, since we need
% =@= to be active when this macro is defined, but we also need it to
% be part of the control sequence name.
%    \begin{macrocode}
\begingroup
   \catcode`\@=\active
   \expandafter\gdef\csname\string @sanitizeat\endcsname
       {\def @{\char`\@}}
\endgroup
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\indexproofstyle}
% \begin{macro}{\@showidx}
% \begin{macro}{\@leftidx}
% \begin{macro}{\@rightidx}
% \begin{macro}{\@mkidx}
% \begin{macro}{\raggedbottom}
% \begin{macro}{\flushbottom}
% \begin{macro}{\@texttop}
% Note the cautious way of calling =\reset@font=, which is necessary
% for this to work correctly under both the Old and New Font Selection
% Schemes.
%    \begin{macrocode}
\newtoks\indexproofstyle

\indexproofstyle{\footnotesize\csname reset@font\endcsname\tt}

\def\@showidx#1{%
   \insert\@indexbox{%
       \@sanitizeat
       \the\indexproofstyle
       \hsize\marginparwidth
       \hangindent\marginparsep \parindent\z@
       \everypar{}\let\par\@@par \parfillskip\@flushglue
       \lineskip\normallineskip
       \baselineskip .8\normalbaselineskip\sloppy
       \raggedright \leavevmode
       \vrule \@height .7\normalbaselineskip \@width \z@\relax#1\relax
       \vrule \@height\z@ \@depth.3\normalbaselineskip \@width\z@\relax
   }%
   \ifhmode\penalty\@M \hskip\z@skip\fi
}

\def\@leftidx{\hskip-\marginparsep \hskip-\marginparwidth}

\def\@rightidx{\hskip\columnwidth \hskip\marginparsep}

\def\@mkidx{%
   \vbox to \z@{%
       \rlap{%
           \if@twocolumn
               \if@firstcolumn \@leftidx \else \@rightidx \fi
           \else
               \if@twoside
                   \ifodd\c@page \@rightidx \else \@leftidx \fi
               \else
                   \@rightidx
               \fi
           \fi
           \box\@indexbox
       }%
       \vss
   }%
}

\def\raggedbottom{%
   \def\@textbottom{\vskip\z@ plus.0001fil}%
   \let\@texttop\@mkidx
}

\def\flushbottom{\let\@textbottom\relax \let\@texttop\@mkidx}

\let\@texttop\@mkidx
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% Now, this next bit really gets up my nose.  The only way to make
% sure that the =\index= command gets handled correctly when used
% inside of sectioning commands is to redefine a bunch of \LaTeX's
% table of contents and running-heads macros. $*$blech$*$ Fragility
% rears its ugly head again.  (Incidentally, it should be possible to
% use the =\@nearverbatim= trick to make arguments of sectioning
% commands robust.  I'll have to explore this.)
%
% These are based on \bundle{latex.tex} 2.09 \vdate{25 March
% 1992}.
%
% \begin{macro}{\addcontentsline}
% We need to redefine =\addcontentsline= to keep it from expanding
% =\index= commands too far.  In particular, we have removed =\index=
% from the list of macros that are set equal to =\@gobble= and we
% substitute =\@vwritefile= for =\@writefile=.  This latter change
% also means that we can simplify the definition of =\protect=
% somewhat.
%    \begin{macrocode}
\def\addcontentsline#1#2#3{%
   \if@filesw
       \begingroup
           \let\label\@gobble
           \let\glossary\@gobble
           \def\protect##1{\string##1\space}%
           \@temptokena{\thepage}%
           \edef\@tempa{%
              \write\@auxout{%
                 \string\@vwritefile{#1}{\string\contentsline{#2}{#3}%
                                         {\the\@temptokena}}%
              }%
           }%
           \@tempa
       \endgroup
       \if@nobreak\ifvmode\nobreak\fi\fi
   \fi
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@starttoc}
% We need to redefine =\@starttoc= to =\@addtoindexfalse= so that items
% don't get written to the index from within tables of contents.  The
% only change here is the addition of =\@addtoindexfalse=.
%    \begin{macrocode}
\def\@starttoc#1{%
   \begingroup
       \@addtoindexfalse
       \makeatletter
       \@input{\jobname.#1}%
       \if@filesw
           \expandafter\newwrite\csname tf@#1\endcsname
           \immediate\openout \csname tf@#1\endcsname \jobname.#1\relax
       \fi
       \global\@nobreakfalse
   \endgroup
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\markboth}
% \begin{macro}{\markright}
% Finally, we have to redefine =\markboth= and =\markright= to keep
% them from disabling the expansion of =\index= while putting section
% heads into the =\mark=.  Otherwise, we'd end up with ``=\index='' in
% the mark, which would cause problems when =\@outputpage= redefines
% =\index= to be equal to =\@gobble=.  Instead, we want =\index= to
% expand to =\p@index= in the =\mark=, so we retain control over what
% happens in =\@outputpage=.
%
% This time, the only change is to remove =\index= from the list of
% macros that are =\let= equal to =\relax=.
%    \begin{macrocode}
\def\markboth#1#2{%
   \gdef\@themark{{#1}{#2}}%
   \begingroup
       \let\protect\noexpand
       \let\label\relax
       \let\glossary\relax
       \mark{\@themark}%
   \endgroup
   \if@nobreak\ifvmode\nobreak\fi\fi
}

\def\markright#1{%
   \begingroup
       \let\protect\noexpand
       \let\label\relax
       \let\glossary\relax
       \expandafter\@markright\@themark{#1}%
       \mark{\@themark}%
   \endgroup
   \if@nobreak\ifvmode\nobreak\fi\fi
}
%</style>
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \section{Glossaries}
%
%
% \section{Edit history}
%
% \begin{description}
%
% \item[v1.00 (4 Mar 1993)]
% initial version, posted to comp.text.tex.
%
% \item[v1.01 (4 Mar 1993)]
% added =\renewindex= command and checking to make sure index is (or
% is not) defined in =\newindex=, =\index= and =\printindex=.  Also
% tightened up the code in various places and added check to make sure
% file is only loaded once.
%
% \item[v2.00 (24 Mar 1993)]
% added support for =\index*=, proofmode, =\shortindexingon= and
% =\shortindexingoff=.
%
% \item[v2.01 (24 Jun 1993)]
% Fixed 3 bugs.  (1) If proofmode was turned on, then something like
% ``=\index{WORD}WORD='' would suppress the hyphenation of WORD.  This
% was fixed by adding ``=\penalty\@M\hskip\z@skip='' to the end of
% =\@showidx=.  (This is just the definition of =\allowhyphens=
% borrowed from \bundle{german.sty}, v2 \vdate{4 Nov 1988}).  (2) The
% =\hbox= in =\@mkidx= was being set at its natural width, which had a
% tendency to interfere with the width of the page.  The =\hbox= is
% now replaced by =\rlap=.  (3) If the title of an index (i.e., the
% fourth argument of =\newindex=) contained a particularly fragile
% command like~=\d=, havoc would ensue when =\theindex= tried to
% extract the title.  Titles are now kept in token registers to
% prevent such unpleasantness.  Bugs (2) and (3) were reported by
% Dominik Wujastyk \email{[email protected]} on 24 June
% 1993.  Note that bugs (1) and (2) are actually bugs in showidx.sty,
% v2.09 \vdate{16 Jun 1991}.
%
% \item[v2.02 (25 Jun 1993)]
% Rewrote the code that implements the short indexing commands (=^=
% and =_=) to make index.sty compatible with other style files that
% need to make =^= and =_= active in some contexts.  See the code for
% more details.
%
% \item[v2.03 (30 Jun 1993)]
% Once again rewrote the code that implements the short indexing
% commands.  Dumped the shortindexing environment and rewrote the
% =\shortindexingon= and =\shortindxingoff= commands to save and
% restore the =\catcode='s and meanings of =^= and =_= in the safest
% possible (I hope) order.  Also added the =\if@shortindexing= flag to
% keep =\shortindexingoff= from doing anything if it is called outside
% of the scope of a =\shortindexingon= command.  (Question: Should
% =\shortindexingon= check that flag before doing anything?)
%
% \item[v2.04 (beta) (14 Jul 1993)]
% Added =\disableindex= command.  Added =\newindex= and =\renewindex=
% to =\@preamblecmds=.  Added =\if@newindex= flag to =\@newindex= to
% prevent =\renewindex= from re-allocating new =\write= and =\toks=
% registers.  Rewrote using \bundle{doc.sty} and \program{DocStrip}.
% Also cleaned up the code somewhat.
%
% \item[v3.00 (15 Jul 1993)]
% Made further minor tweaks to code and internal documentation.
% Booted version number up to 3.00 and released on the world.
%
% \item[v3.01 (19 Jul 1993)]
% Fixed \program{DocStrip} CheckSum.
%
% \item[v3.02 (15 Sep 1993)]
% Corrected spelling of =\@shortindexingfalse= in definition of
% =\shortindexingoff=.  Thanks to Hendrik G. Seliger
% \email{[email protected]} for this bug report.  Also
% added redefinitions of =\@leftmark= and =\@rightmark= to fix a bug
% reported by Dominik Wujastyk \email{[email protected]}.
%
% \item[v3.03 (beta) (20 Feb 1994)]
% Added =\long= to the definition of =\@ifundefined= to cover the
% unlikely contingency that someone wanted to use, for example,
% =\string\par= in the middle of a control sequence name.  Added an
% optional argument to =\newindex= to specify which counter to use in
% place of =\thepage=.  The first change was suggested by Martin
% Schroeder \email{[email protected]}; the second was suggested
% independently by Schroeder and Stefan Heinrich Hoening
% \email{[email protected]}.  The =\@newindex=
% command was renamed =\def@index=.  Also fixed the =\disableindex=
% command.
%
% \item[v3.04 (7 Mar 1994)]
% Rewrote the user documentation (Sections 1--5) and released on the
% world.  Also deleted some extraneous spaces that had crept into some
% macros.
%
% \end{description}
%
% \DisableCrossrefs
%
% \section{The sample file}
%
%    \begin{macrocode}
%<sample>%% latex sample.tex
%<sample>%% makeindex sample
%<sample>%% makeindex -o sample.and sample.adx
%<sample>%% makeindex -o sample.nnd sample.ndx
%<sample>%% makeindex -o sample.lnd sample.ldx
%<sample>%% latex sample.tex
%<sample>
%<sample>\documentstyle[index]{book}
%<sample>
%<sample>\makeindex
%<sample>\newindex{aut}{adx}{and}{Name Index}
%<sample>\newindex{not}{ndx}{nnd}{List of Notation}
%<sample>
%<sample>\newindex[theenumi]{list}{ldx}{lnd}{Items}
%<sample>
%<sample>\shortindexingon
%<sample>
%<sample>\proofmodetrue
%<sample>
%<sample>\def\aindex{\index*[aut]}
%<sample>
%<sample>\begin{document}
%<sample>
%<sample>\tableofcontents
%<sample>
%<sample>\newpage
%<sample>
%<sample>\chapter{Here is a ^[aut]{chapter} title}
%<sample>
%<sample>\section{Section header\index[aut]{section}}
%<sample>
%<sample>Here is some text.\index{subject}
%<sample>
%<sample>Here is \index[not]{notation}some more \index[not]{sin@$\sin$}
%<sample>text.
%<sample>
%<sample>\newpage
%<sample>
%<sample>Here is some ^{more} _[not]{notation} text.
%<sample>
%<sample>Here is yet more \aindex{text}.
%<sample>
%<sample>\section{Another Section header _[aut]{section2}}
%<sample>
%<sample>And here is some math: $x^1_b$.
%<sample>
%<sample>Here is an ^[aut]{index} entry \fbox{inside an
%<sample>\index[not]{min@$\min$}fbox}
%<sample>
%<sample>\fbox{Here is an ^[aut]{entry} in a box.}
%<sample>
%<sample>\section{An indexed list environment}
%<sample>
%<sample>\begin{enumerate}
%<sample>
%<sample>\item
%<sample>First item
%<sample>
%<sample>\item
%<sample>Second item\index[list]{second item}
%<sample>
%<sample>\item
%<sample>Third item
%<sample>
%<sample>\newpage
%<sample>
%<sample>\item
%<sample>Fourth item
%<sample>
%<sample>\item
%<sample>Fifth item\index[list]{fifth item}
%<sample>
%<sample>\item
%<sample>Sixth item
%<sample>
%<sample>\end{enumerate}
%<sample>
%<sample>\printindex[not]
%<sample>
%<sample>\printindex[aut]
%<sample>
%<sample>\printindex[list]
%<sample>
%<sample>\printindex
%<sample>
%<sample>\end{document}
%    \end{macrocode}
%
% \PrintIndex
% \PrintChanges
%
% \Finale
%
% \end{document}
\endinput