% \iffalse % ==================================================================== % @LaTeX-style-file{ % filename = "index.dtx", % version = "4.02beta", % date = "20 January 2004", % time = "21:15:11 EST", % author = "David M. Jones", % 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 = "39539 1398 6018 50774", % 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.", % % } % ==================================================================== % % This file may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.2 % of this license or (at your option) any later version. % The latest version of this license is in % http://www.latex-project.org/lppl.txt % and version 1.2 or later is part of all distributions of LaTeX % version 1999/12/01 or later. % % CAUTION: Use only as directed. Do not take internally. May cause % rash if applied directly to skin. Federal law prohibits distributing % without a proscription. % % \fi % %% \CheckSum{755} %% \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 \~} % % \iffalse % \begin{macrocode} %<*driver> \ProvidesFile{index.dtx}[1995/09/28 v4.1beta Improved index support (dmj)] % % \end{macrocode} % % \begin{macrocode} %<*driver> \documentclass{ltxdoc} \def\docdate {7 March 1994} % \end{macrocode} % We don't want everything to appear in the index % \begin{macrocode} \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,\em} \DoNotIndex{\EnableCrossrefs,\end,\endcsname,\endgroup,\endinput} \DoNotIndex{\everypar,\expandafter,\filedate,\fileversion} \DoNotIndex{\footnotesize,\gdef,\global,\glossary,\hangindent} \DoNotIndex{\if@filesw,\else,\fi} \DoNotIndex{\if@nobreak,\if@twocolumn,\if@twoside,\fi,\fi,\fi} \DoNotIndex{\hsize,\hskip} \DoNotIndex{\ifhmode,\ifmmode,\ifodd,\ifvmode,\ifx,\fi,\fi,\fi,\fi,\fi} \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,\uppercase,\vbox,\vrule,\vskip,\vss} \DoNotIndex{\write,\z@,\z@skip} % \end{macrocode} % Some useful macros and parameter settings: % \begin{macrocode} \setcounter{StandardModuleDepth}{1} \GetFileInfo{index.dtx} \newcommand*{\email}[1]{$\langle$\texttt{#1}$\rangle$} \newcommand*{\vdate}[1]{$\langle$#1$\rangle$} \newcommand*{\bundle}[1]{\texttt{#1}} \newcommand*{\program}[1]{\textsf{#1}} \newcommand*{\Ltag}[1]{\texttt{\bslash#1}} \newcommand*{\Lopt}[1]{\textsf {#1}} \newcommand*{\Lenv}[1]{\texttt {#1}} \newcommand*{\cls}[1]{\texttt {#1}} \newcommand*{\pck}[1]{\texttt {#1}} \newcommand*{\file}[1]{\texttt {#1}} \CodelineIndex % \end{macrocode} % And the document itself: % \begin{macrocode} \begin{document} \DocInput{index.dtx} \PrintIndex % ^^A\PrintChanges \end{document} % % \end{macrocode} % % \fi % % \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 at % \file{ftp://theory.lcs.mit.edu/pub/tex/index/}.}} % % \author{David M. Jones} % % \date{\filedate} % % \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:\footnote{Earlier versions of % this package provided a ``shortindexing'' feature (see below for % description). This feature is now deprecated and will be removed % in a future release of this package.} % \begin{enumerate} % % \item % Support for multiple indexes. % % \item % Indexing of items by counters other than the page number. % % \item % A $*$-variant of the \cs{index} command that, in addition to % putting it's argument in the index, also typesets it in the % running text. % % \item % The \bundle{showidx} style option has been merged into this file. % The command \cs{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 \cs{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 \cs{includeonly} % command, the index entries from the rest of the document are not % lost. % % \item % A more robust \cs{index} command. In particular, it no longer % depends on \cs{catcode} changes to work properly, so the new % \cs{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 % \cs{makeindex}, \cs{index}, \cs{printindex}, and (typically) with % the auxiliary program \program{MakeIndex}. For example, assuming % that your main file is called \file{foo.tex}, \cs{makeindex} % opens the file \file{foo.idx} and initializes it for holding the % raw index entries, and \cs{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 \cs{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 \cs{makeindex}, % \cs{index}, and \cs{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 \cs{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, \texttt{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 \cs{index} tags its argument with the page number % (i.e., the value of \cs{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 \cs{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 \texttt{aux} file should be deferred until the % page containing the entry is shipped out to the \texttt{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 % \texttt{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 \cs{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 % \texttt{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 \texttt{dvi} % file, you can acomplish this by beginning your index declaration % with % \begin{verbatim} % \newindex[thepage]*\end{verbatim} % % % \DescribeMacro{\renewindex} % The \cs{renewindex} command takes the same arguments as the % \cs{newindex} command and can be used to redefine indexes that % have been previously declared. % % % \DescribeMacro{\makeindex} % For backwards compatibility, the \cs{makeindex} command is % redefined to use \cs{newindex}. It is essentially equivalent to % \begin{verbatim} % \newindex{default}{idx}{ind}{Index}\end{verbatim} % The index labeled \texttt{default} is special: it is the one that % will be used by \cs{index} and \cs{printindex} unless another % index is specified (see below). % % % \DescribeMacro{\printindex} % The \cs{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 \cs{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, % \cs{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 \texttt{default} index % (such as that opened by \cs{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 \cs{index*} and \cs{index} outside of math % mode. These abbreviations are enabled by the % \cs{shortindexingon} command and disabled by the % \cs{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}\Lenv{shortindexingon} can be used % as an environment if that seems appropriate. \textbf{Warning: % This feature is deprecated and will disappear in a future release % of this package.} % % % \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 \cs{proofmodetrue} and turned off with \cs{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 % \cs{footnotesize}, but the user can override this with the % \cs{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 % \cs{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 \cs{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 \cs{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 \texttt{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 \texttt{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, \cs{@starttoc}, \cs{raggedbottom}, % \cs{flushbottom}, \cs{addcontents}, \cs{markboth}, and % \cs{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. % % The redefinition of \cs{@starttoc} is particularly bad, since it % introduces an incompatibility with the AMS document classes. % This will be addressed soon. % % Unfortunately, it's also been necessary to modify the % \Lenv{theindex} environment, so if you don't like the default % \LaTeX\ definition, you'll need copy the definition of % \Lenv{theindex} from this file and modify it appropriately. % % 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 % \cs{disableindex} for a fuller discussion of this problem and one % way around it. % % % \section{To do's} % % It might be nice if the \cs{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. % % It would be reasonable to add support for \cs{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, % especially since it's still based on the 2.09 version, even % though a few substantial changes have been made for the \LaTeXe\ % version. % % For some truly outlandish ideas, see the file \file{TODO} in the % distribution. % % \StopEventually{} % % \section{The code} % \label{sec:thecode} % % As is customary, identify this as a \LaTeXe\ package. % \begin{macrocode} %<*style> \NeedsTeXFormat{LaTeX2e}[1995/06/01] \ProvidesPackage{index}[2004/01/20 v4.2beta Improved index support (dmj)] % \end{macrocode} % % \begin{macro}{\disableindex} % The \cs{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}{}{% \PackageWarningNoLine{index}{It's too late to disable the `\@tempa' index;\MessageBreak \jobname.\@tempa\space has already been opened for output. You \MessageBreak should put the \string\disableindex\space command before\MessageBreak the declaration of the `\@tempa' index}% }% }% } % \end{macrocode} % \end{macro} % % \begin{macro}{\if@newindex} % \begin{macro}{\newindex} % \begin{macro}{\renewindex} % The \cs{newindex} and \cs{renewindex} commands are defined on % analogy with the \cs{[re]newcommand} macros. Each index is % identified by a unique tag, which is specified in the first % required argument of \cs{newindex}. Much of the information % about the index labeled \meta{tag} is kept in the macro % \cs{idx@}\meta{tag}, so we can check to see if a particular index % has already been defined by checking whether \cs{idx@}\meta{tag} % is defined. \cs{newindex} and \cs{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 % \cs{def@index}. % % The \cs{if@newindex} flag will be used to keep \cs{renewindex} % from re-allocating \cs{write} and \cs{toks} registers later. The % \cs{if@tempswa} switch will be used to determine whether the % \cs{write}s for this index should be done \cs{immediate}ly or % not. % \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 \cs{newindex}, \cs{renewindex}, nor \cs{disableindex} % should be used anywhere except inside style files or in the % preamble of a document, so we add them to the \cs{@preamblecmds} % list. % \begin{macrocode} \@onlypreamble\newindex \@onlypreamble\renewindex \@onlypreamble\disableindex % \end{macrocode} % \end{macro} % % \begin{macro}{\def@index} % \cs{def@index} does most of the work. First, it picks up the % first three arguments of the \cs{[re]newindex} command and stores % the second two in an appropriate \cs{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, \cs{def@index} % also opens an appropriate output file if we are writing auxiliary % files (i.e., unless \cs{nofiles} is in effect). % % \begin{macrocode} \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\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 % \PackageInfo{index}{Writing index file \jobname.#3}% } {\PackageInfo{index}{Index `#2' disabled -- not opening \jobname.#3}}% \fi \expandafter\csname idxtitle@#2\endcsname } % \end{macrocode} % \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} % |\@nearverbatim\foo| is much like |\meaning\foo|, % except that it suppresses the ``\texttt{macro ->}'' string % produced when \cs{meaning} expands a macro. It is used by % \cs{@wrindex} to produce an ``almost verbatim'' copy of their % arguments. This method replaces the use of \cs{@sanitize} from % latex.tex and allows indexing macros to be used in places (such % as inside macro arguments) where the original \cs{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\strip@prefix\meaning} % \end{macrocode} % \end{macro} % % Now we define the \cs{index} macro itself. The following % definitions are adapted from \bundle{latex.tex} v2.09 \vdate{25 % March 1992}. % % \begin{macro}{\makeindex} % First we redefine \cs{makeindex} to define the default index % using \cs{newindex}. We use \cs{edef} to make sure that % \cs{indexname} gets expanded here. Otherwise we'll get into an % infinite loop later on when we try to redefine \cs{indexname} % inside the \cs{theindex} environment. % % Unfortunately, this means that if the user changes \cs{indexname} % in the preamble, the index will come out with the wrong heading. % \begin{macrocode} \edef\makeindex{% \noexpand\newindex{default}{idx}{ind}{\indexname}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\if@silentindex} % \begin{macro}{\if@addtoindex} % \begin{macro}{\if@proofmode} % We need three new flags. The first, \cs{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 % \cs{index*} command. The second, \cs{if@addtoindex}, indicates % whether entries should be written to the index; this is used to % disable the \cs{index} command inside of page headings and tables % of contents. The third, \cs{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} % \cs{index} will be made self-protecting (a la \cs{em}, etc.) so % it can be used inside, for example, sectioning commands. % Unfortunately, to really make \cs{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 \cs{index} is equal to % \cs{@gobble}. This is so I don't have to redefine % \cs{@outputpage}, which temporarily disables \cs{label}, % \cs{index}, and \cs{glossary} by \cs{let}'ing them equal to % \cs{@gobble}. (For this reason, we have to be very careful to % make sure that \cs{index} has expanded to \cs{p@index} before it % gets to \cs{@outputpage}.) Second, note that if % \cs{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 \cs{index[AUT]{...}} instead of % \cs{index[aut]{...}}. % \begin{macrocode} \def\@index[#1]{% \ifx\index\@gobble \@addtoindexfalse \fi \def\@tempf{% \begingroup \@sanitize \@@index{#1}% }% \if@addtoindex \@ifundefined{idx@#1}% {% \def\@tempf{% \@latexerr{Index type `\string#1' undefined}% \@ehc \@silentindextrue \@gobble }% }% {}% \fi \@tempf } \def\@@index#1#2{% \endgroup \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\@writefile{#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}. \cs{index@prologue} adapted from % \bundle{doc.dtx}. \Lenv{theindex} based on version from % \bundle{classes.dtx}, v1.3g, 26 June 1995. % \begin{macrocode} \providecommand{\seename}{see} \providecommand*{\see}[2]{\emph{\seename} #1} \@ifclassloaded{article}{% \renewenvironment{theindex}{% \edef\indexname{\the\@nameuse{idxtitle@\@indextype}}% \if@twocolumn \@restonecolfalse \else \@restonecoltrue \fi \columnseprule \z@ \columnsep 35\p@ \twocolumn[% \section*{\indexname}% \ifx\index@prologue\@empty\else \index@prologue \bigskip \fi ]% \@mkboth{\MakeUppercase\indexname}% {\MakeUppercase\indexname}% \thispagestyle{plain}% \parindent\z@ \parskip\z@ \@plus .3\p@\relax \let\item\@idxitem }{% \if@restonecol \onecolumn \else \clearpage \fi } }{% \renewenvironment{theindex}{% \edef\indexname{\the\@nameuse{idxtitle@\@indextype}}% \if@twocolumn \@restonecolfalse \else \@restonecoltrue \fi \columnseprule \z@ \columnsep 35\p@ \twocolumn[% \@makeschapterhead{\indexname}% \ifx\index@prologue\@empty\else \index@prologue \bigskip \fi ]% \@mkboth{\MakeUppercase\indexname}% {\MakeUppercase\indexname}% \thispagestyle{plain}% \parindent\z@ \parskip\z@ \@plus .3\p@\relax \let\item\@idxitem }{% \if@restonecol \onecolumn \else \clearpage \fi } } \def\printindex{\@ifnextchar[{\@printindex}{\@printindex[default]}} \def\@printindex[#1]{% \@ifnextchar[{\@print@index[#1]}{\@print@index[#1][]}% } \long\def\@print@index[#1][#2]{% \def\@indextype{#1}% \long\def\index@prologue{#2}% \@ifundefined{idx@#1}% {\@latexerr{Index type `\string#1' undefined}\@ehc}% {% \edef\@tempa{\@nameuse{idx@#1}}% \edef\@tempa{% \noexpand\@input@{\jobname.\expandafter\@second\@tempa\@nil}% }% \@tempa }% } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\@indexstar@} % Now we set things up for % \cs{shortindexing}.\footnote{\textbf{Warning:} This feature is % deprecated and will be removed entirely in a future release of % this package.} First, we define a one-token shorthand for % \cs{index*}. This will be needed in the definition of % \cs{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 \cs{shortindexingon} and \cs{shortindexinoff} % commands to turn shortindexing on and off (surprise!). % \cs{shortindexingon} saves the old definitions and \cs{catcode}'s % of |^| and |_| so they can later be restored by % \cs{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, % \Lenv{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 \cs{shortindexingon} in the preamble of one's % document, and never want to turn it off. \cs{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 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 \cs{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 \cs{@showidx} % anyway. In particular, (a) I need to add the \cs{@sanitizeat} % command so this works correctly with AMS-\LaTeX\ and (b) I want % to add the \cs{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 \cs{@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} % \begin{macrocode} \newtoks\indexproofstyle \indexproofstyle{\footnotesize\reset@font\ttfamily} \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 \cs{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. % % These are based on \bundle{latex.tex} 2.09 \vdate{25 March 1992}. % % \begin{macro}{\addcontentsline} % We need to redefine \cs{addcontentsline} to keep it from % expanding \cs{index} commands too far. In particular, we have % removed \cs{index} from the list of macros that are set equal to % \cs{@gobble} and we substitute \cs{@vwritefile} for % \cs{@writefile}. This latter change also means that we can % simplify the definition of \cs{protect} somewhat. % \begin{macrocode} \CheckCommand\addtocontents[2]{% \protected@write\@auxout {\let\label\@gobble \let\index\@gobble \let\glossary\@gobble}% {\string\@writefile{#1}{#2}}% } \renewcommand{\addtocontents}[2]{% \protected@write\@auxout {\let\label\@gobble \let\glossary\@gobble}% {\string\@writefile{#1}{#2}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@starttoc} % We need to redefine \cs{@starttoc} to \cs{@addtoindexfalse} so % that items don't get written to the index from within tables of % contents. The only change here is the addition of % \cs{@addtoindexfalse}. % % Unfortunately, this will break pretty badly with the AMS document % classes, since they redefine \cs{@starttoc} to take two arguments % rather than one. This must be addressed. % % \begin{macrocode} \let\old@starttoc\@starttoc \renewcommand{\@starttoc}[1]{% \begingroup \@addtoindexfalse \old@starttoc{#1}% \endgroup } % \end{macrocode} % \end{macro} % % \begin{macro}{\markboth} % \begin{macro}{\markright} % Finally, we have to redefine \cs{markboth} and \cs{markright} to % keep them from disabling the expansion of \cs{index} while % putting section heads into the \cs{mark}. Otherwise, we'd end up % with ``\cs{index}'' in the mark, which would cause problems when % \cs{@outputpage} redefines \cs{index} to be equal to % \cs{@gobble}. Instead, we want \cs{index} to expand to % \cs{p@index} in the \cs{mark}, so we retain control over what % happens in \cs{@outputpage}. % % This time, the only change is to remove \cs{index} from the list % of macros that are \cs{let} equal to \cs{relax}. % \begin{macrocode} \CheckCommand*{\markboth}[2]{% \begingroup \let\label\relax \let\index\relax \let\glossary\relax \unrestored@protected@xdef\@themark {{#1}{#2}}% \@temptokena \expandafter{\@themark}% \mark{\the\@temptokena}% \endgroup \if@nobreak\ifvmode\nobreak\fi\fi} \CheckCommand*{\markright}[1]{% \begingroup \let\label\relax \let\index\relax \let\glossary\relax \expandafter\@markright\@themark {#1}% \@temptokena \expandafter{\@themark}% \mark{\the\@temptokena}% \endgroup \if@nobreak\ifvmode\nobreak\fi\fi} \renewcommand{\markboth}[2]{% \begingroup \let\label\relax \let\glossary\relax \unrestored@protected@xdef\@themark {{#1}{#2}}% \@temptokena \expandafter{\@themark}% \mark{\the\@temptokena}% \endgroup \if@nobreak\ifvmode\nobreak\fi\fi} \renewcommand{\markright}[1]{% \begingroup \let\label\relax \let\glossary\relax \expandafter\@markright\@themark {#1}% \@temptokena \expandafter{\@themark}% \mark{\the\@temptokena}% \endgroup \if@nobreak\ifvmode\nobreak\fi\fi} % % \end{macrocode} % \end{macro} % \end{macro} % % \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 \cs{renewindex} command and checking to make sure index is % (or is not) defined in \cs{newindex}, \cs{index} and % \cs{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 \cs{index*}, proofmode, \cs{shortindexingon} % and \cs{shortindexingoff}. % % \item[v2.01 (24 Jun 1993)] % Fixed 3 bugs. (1) If proofmode was turned on, then something % like ``\cs{index{WORD}WORD}'' would suppress the hyphenation of % WORD. This was fixed by adding ``|\penalty\@M\hskip\z@skip|'' to % the end of \cs{@showidx}. (This is just the definition of % \cs{allowhyphens} borrowed from \bundle{german.sty}, v2 \vdate{4 % Nov 1988}). (2) The \cs{hbox} in \cs{@mkidx} was being set at % its natural width, which had a tendency to interfere with the % width of the page. The \cs{hbox} is now replaced by \cs{rlap}. % (3) If the title of an index (i.e., the fourth argument of % \cs{newindex}) contained a particularly fragile command % like~\cs{d}, havoc would ensue when \cs{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 % \cs{shortindexingon} and \cs{shortindxingoff} commands to save % and restore the \cs{catcode}'s and meanings of |^| and |^| in the % safest possible (I hope) order. Also added the % \cs{if@shortindexing} flag to keep \cs{shortindexingoff} from % doing anything if it is called outside of the scope of a % \cs{shortindexingon} command. (Question: Should % \cs{shortindexingon} check that flag before doing anything?) % % \item[v2.04 (beta) (14 Jul 1993)] % Added \cs{disableindex} command. Added \cs{newindex} and % \cs{renewindex} to \cs{@preamblecmds}. Added \cs{if@newindex} % flag to \cs{@newindex} to prevent \cs{renewindex} from % re-allocating new \cs{write} and \cs{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 \cs{@shortindexingfalse} in definition of % \cs{shortindexingoff}. Thanks to Hendrik G. Seliger % \email{hank@Blimp.automat.uni-essen.de} for this bug report. % Also added redefinitions of \cs{@leftmark} and \cs{@rightmark} to % fix a bug reported by Dominik Wujastyk % \email{D.Wujastyk@ucl.ac.uk}. % % \item[v3.03 (beta) (20 Feb 1994)] % Added \cs{long} to the definition of \cs{@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 \cs{newindex} to specify which counter to % use in place of \cs{thepage}. The first change was suggested by % Martin Schr\"oder \email{l15d@zfn.uni-bremen.de}; the second was % suggested independently by Schr\"oder and Stefan Heinrich % H\"oning \email{hoening@pool.informatik.rwth-aachen.de}. The % \cs{@newindex} command was renamed \cs{def@index}. Also fixed % the \cs{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. % % \item[v4.00beta, (20 Feb 1995)] % Preliminary conversion to a native \LaTeXe\ package. Fixed % \cs{@printindex} to work under \LaTeXe\ (bug reported by Carsten % Folkertsma \email{cai@butler.fee.uva.nl}). Removed much code % that had been put in to work around various ancient versions of % \LaTeX~2.09. Added \cs{index@prologue} support (modelled on % \bundle{doc.sty}) at suggestion of Nick Higham % \email{higham@ma.man.ac.uk}. % % \item[v4.01beta (28 Sep 1995)] % Rewrote as a \LaTeXe\ package (finally!). Changes too numerous % to list, but in general deleted some now-superfluous code, % replaced some tricks by tricks from the \LaTeXe\ kernel, and % added some bullet-proofing. Much still remains to be done, but % this should be good enough for testing. % % Changed definition of \cs{protect} in \cs{markright} and % \cs{markboth} to fix bug reported by Dominik Wujastyk. % % \item[??? (5 Jan 2004)] % % % \end{description} % % \DisableCrossrefs % % \section{The sample file} % % \begin{macrocode} %<*sample> %% latex sample.tex %% makeindex sample %% makeindex -o sample.and sample.adx %% makeindex -o sample.nnd sample.ndx %% makeindex -o sample.lnd sample.ldx %% latex sample.tex \documentclass{book} \usepackage{index} \listfiles \makeindex \newindex{aut}{adx}{and}{Name Index} \newindex{not}{ndx}{nnd}{List of Notation} \newindex[theenumi]{list}{ldx}{lnd}{Items} \shortindexingon \proofmodetrue \def\aindex{\index*[aut]} \begin{document} \tableofcontents \newpage \chapter{Here is a ^[aut]{chapter} title} \section{Section header\index[aut]{section}} Here is some text.\index{subject} Here is \index[not]{notation}some more \index[not]{sin@$\sin$} text. \newpage Here is some ^{more} _[not]{notation} text. Here is yet more \aindex{text}. \section{Another Section header _[aut]{section2}} And here is some math: $x^1_b$. Here is an ^[aut]{index} entry \fbox{inside an \index[not]{min@$\min$}fbox} \fbox{Here is an ^[aut]{entry} in a box.} \section{An indexed list environment} \begin{enumerate} \item First item \item Second item\index[list]{second item} \item Third item \newpage \item Fourth item \item Fifth item\index[list]{fifth item} \item Sixth item \end{enumerate} \printindex[not] \printindex[aut][Here is a prologue for the author index. Note that it is set in a single column at the top of the first page of the index.] \printindex[list] \printindex \end{document} % % \end{macrocode} % % \Finale % \endinput