% % idxmac.tex % % Most of the code in this file are excerpts from latex.tex and manmac.tex. % The actual style of the index environment \beginindex ... \endindex % at the end of this file is left empty. % % \def\makeatletter{\catcode`\@=11\relax} \def\makeatother{\catcode`\@=12\relax} \makeatletter \newif\if@filesw \@fileswtrue \newif\if@nobreak \@nobreakfalse \def\@makeother#1{\catcode`#112\relax} \def\newwrite{\alloc@7\write\chardef\sixt@@n} \newwrite\@unused \def\typeout#1{{\let\protect\string\immediate\write\@unused{#1}}} % **************************************** % * PAGE NUMBERING * % **************************************** % % Page numbers are produced by a page counter, used just like any other % counter. The only difference is that \c@page contains the number of % the next page to be output (the one currently being produced), rather % than one minus it. Thus, it is normally initialized to 1 rather than % 0. \c@page is defined to be \count0, rather than a count assigned by % \newcount. % % The user sets the pagenumber style with the \pagenumbering{FOO} % command, which sets the page counter to 1 and defines \thepage to be % \FOO. For example, \pagenumbering{roman} causes pages to be numbered % i, ii, etc. % Numbering commands for definitions of \theCOUNTER and \list arguments. % \fnsymbol produces the standard footnoting symbols: asterisk, dagger, etc. % They can be used only in math mode. \def\arabic#1{\@arabic{\@nameuse{c@#1}}} \def\roman#1{\@roman{\@nameuse{c@#1}}} \def\Roman#1{\@Roman{\@nameuse{c@#1}}} \def\alph#1{\@alph{\@nameuse{c@#1}}} \def\Alph#1{\@Alph{\@nameuse{c@#1}}} \def\fnsymbol#1{\@fnsymbol{\@nameuse{c@#1}}} \def\@arabic#1{\ifnum #1>0 \number #1\fi} \def\@roman#1{\romannumeral #1} \def\@Roman#1{\expandafter\uppercase\expandafter{\romannumeral #1}} \def\@alph#1{\ifcase#1\or a\or b\or c\or d\else\@ialph{#1}\fi} \def\@ialph#1{\ifcase#1\or \or \or \or \or e\or f\or g\or h\or i\or j\or k\or l\or m\or n\or o\or p\or q\or r\or s\or t\or u\or v\or w\or x\or y\or z\else\@ctrerr\fi} \def\@Alph#1{\ifcase#1\or A\or B\or C\or D\else\@Ialph{#1}\fi} \def\@Ialph#1{\ifcase#1\or \or \or \or \or E\or F\or G\or H\or I\or J\or K\or L\or M\or N\or O\or P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else\@ctrerr\fi} \def\@fnsymbol#1{\ifcase#1\or *\or \dagger\or \ddagger\or \mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger \or \ddagger\ddagger \else\@ctrerr\fi\relax} \countdef\c@page=0 \c@page=1 \def\cl@page{} \def\pagenumbering#1{\global\c@page \@ne \gdef\thepage{\csname @#1\endcsname \c@page}} \pagenumbering{arabic} % \@bsphack ... \@esphack % used by macros such as \index and \begin{@float} ... \end{@float} % that want to be invisible -- i.e., % not leave any extra space when used in the middle of text. Such % a macro should begin with \@bsphack and end with \@esphack % The macro in question should not create any text, nor change the % mode. % % \@bsphack == % BEGIN % \dimen\@savsk := \lastskip % if hmode then \@savsf := \spacefactor fi % END % % \@esphack == % BEGIN % if hmode % then \spacefactor := \@savsf % if \dimen\@savsk > 0pt then \ignorespaces % \global\ignoretrue fi % fi % END % \newdimen\@savsk \newcount\@savsf \def\@bsphack{\@savsk\lastskip \ifhmode\@savsf\spacefactor\fi} \def\@esphack{\relax\ifhmode\spacefactor\@savsf {}\ifdim \@savsk >\z@ \global\ignoretrue \ignorespaces \fi \fi} % The command \@sanitize changes the catcode of all special characters % except for braces to 'other'. It can be used for commands like % \index that want to write their arguments verbatim. Needless to % say, this command should only be executed within a group, or chaos % will ensue. \def\@sanitize{\@makeother\ \@makeother\\\@makeother\$\@makeother\&% \@makeother\#\@makeother\^\@makeother\^^K\@makeother\_\@makeother\^^A% \@makeother\%\@makeother\~} % **************************************** % * INDEX COMMANDS * % **************************************** % % \makeindex == % BEGIN % if \@filesw = T % then open file \jobname.IDX as \indexfile % \index == BEGIN \@bsphack % \begingroup % re-\catcode special characters to 'other' % \wrindex % fi % END % % \wrindex{ITEM} == % BEGIN % write of {\indexentry{ITEM}{page number}} % \endgroup % \@esphack % END % INITIALIZATION: % % \index == BEGIN \@bsphack % \begingroup % re-\catcode special characters (in case '%' there) % \index % END % % \index{ITEM} == BEGIN \endgroup \@esphack END % \def\makeindex{\if@filesw \newwrite\@indexfile \immediate\openout\@indexfile=\jobname.idx \def\index{\@bsphack\begingroup\@sanitize\@wrindex\@indexfile} \typeout{Writing index file \jobname.idx }\fi} \def\@wrindex#1#2{\let\thepage\relax \xdef\gtempa{\write#1{\string \indexentry{#2}{\thepage}}}\endgroup\gtempa \if@nobreak \ifvmode\@nobreak\fi\fi\@esphack} \def\index{\@bsphack\begingroup\@sanitize\@index} \def\@index#1{\endgroup\@esphack} \def\makeglossary{\if@@filesw \newwrite\@glossaryfile \immediate\openout\@glossaryfile=\jobname.glo \def\glossary{\@bsphack\begingroup\@sanitize\@wrindex\@glossaryfile}\typeout {Writing glossary file \jobname.glo }\fi} \def\glossary{\@bsphack\begingroup\@sanitize\index} \newdimen\pagewidth \pagewidth=\hsize \newbox\partialpage \def\begindoublecolumns{\begingroup \output={\global\setbox\partialpage=\vbox{\unvbox255\bigskip}}\eject \output={\doublecolumnout} \hsize=14pc \vsize=89pc \let\item\@idxitem} \def\enddoublecolumns{\output={\balancecolumns}\eject \endgroup \pagegoal=\vsize} \def\doublecolumnout{\splittopskip=\topskip \splitmaxdepth=\maxdepth \dimen@=44pc \advance\dimen@ by-\ht\partialpage \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ \onepageout\pagesofar \unvbox255 \penalty\outputpenalty} \def\pagesofar{\unvbox\partialpage \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}} \def\balancecolumns{\setbox0=\vbox{\unvbox255} \dimen@=\ht0 \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip \divide\dimen@ by2 \splittopskip=\topskip {\vbadness=10000 \loop \global\setbox3=\copy0 \global\setbox1=\vsplit3 to\dimen@ \ifdim\ht3>\dimen@ \global\advance\dimen@ by1pt \repeat} \setbox0=\vbox to\dimen@{\unvbox1} \setbox2=\vbox to\dimen@{\unvbox3} \pagesofar} \def\@idxitem{\par\hangindent 40pt} \def\subitem{\par\hangindent 40pt \hskip 20pt} \def\subsubitem{\par\hangindent 40pt \hskip 30pt} \def\indexspace{\par \vskip 10pt plus 5pt minus 3pt\relax} \def\beginindex{\begingroup\let\item\@idxitem % Output opening routines go here } \def\endindex{ % Output closing routines go here. \endgroup} \makeatother