summaryrefslogtreecommitdiff
path: root/help/index.doc
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /help/index.doc
Initial commit
Diffstat (limited to 'help/index.doc')
-rw-r--r--help/index.doc1505
1 files changed, 1505 insertions, 0 deletions
diff --git a/help/index.doc b/help/index.doc
new file mode 100644
index 0000000000..c76b74774b
--- /dev/null
+++ b/help/index.doc
@@ -0,0 +1,1505 @@
+% \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 = "dmjones@theory.lcs.mit.edu",
+% 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
+% <wald@theory.lcs.mit.edu>, 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{asnd@erich.triumf.ca} 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{alanje@cogs.sussex.ac.uk} 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{D.Wujastyk@ucl.ac.uk} 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{hank@Blimp.automat.uni-essen.de} for this bug report. Also
+% added redefinitions of =\@leftmark= and =\@rightmark= to fix a bug
+% reported by Dominik Wujastyk \email{D.Wujastyk@ucl.ac.uk}.
+%
+% \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{l15d@zfn.uni-bremen.de}; the second was suggested
+% independently by Schroeder and Stefan Heinrich Hoening
+% \email{hoening@pool.informatik.rwth-aachen.de}. 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