%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % ltxindex.sty, a LaTeX package to typeset indices with GNU's Texindex % Copyright (C) 2004 by Jose-Luis Rivera % % This program is free software; you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by % the Free Software Foundation; either version 2, or (at your option) % any later version. % % This program is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the % GNU General Public License for more details. % % You should have received a copy of the GNU General Public License % along with this program; if not, write to the Free Software % Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % WARNING!!! This code is fairly experimental. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \NeedsTeXFormat{LaTeX2e}[1995/06/01] \ProvidesPackage{ltxindex} [2004/06/30 v0.1] \message{indexing, texindex style} \RequirePackage{multicol} % Index generation facilities % Define the texinfo user-accessible indexing commands for backwards % compatability. \def\cindex{\cpindex} \def\pindex{\pgindex} \def\vindex{\vrindex} \def\tindex{\tpindex} \def\kindex{\kyindex} \def\findex{\fnindex} % \newindex {foo} defines an index named foo. % It automatically defines \fooindex such that % \fooindex ...rest of line... puts an entry in the index foo. % It also defines \fooindfile to be the number of the output channel for % the file that accumulates this index. The file's extension is foo. % The name of an index should be no more than 2 characters long % for the sake of vms. \def\newindex#1{\csname newindex#1\endcsname} % Yes I know this could be done shorter, but safer?? \def\newindexcp{\if@filesw \newwrite\@cpindexfile \immediate\openout\@cpindexfile=\jobname.cp \def\cpindex{\@bsphack\begingroup \def\protect####1{\string####1\space}\@sanitize \@wrindex\@cpindexfile}% \def\cpsubindex{\@bsphack\begingroup \def\protect####1{\string####1\space}\@sanitize \@wrsubindex\@cpindexfile}% \def\cpindexbold{\@bsphack\begingroup \def\protect####1{\string####1\space}\@sanitize \@wrindexbold\@cpindexfile} \typeout{Writing concepts index file \jobname.cp }% \fi} \def\cpindex{\@bsphack\begingroup \@sanitize\@index} \def\cpsubindex{\@bsphack\begingroup \@sanitize\@index} \def\cpindexbold{\@bsphack\begingroup \@sanitize\@index} \def\@wrindex#1#2{\let\thepage\relax \xdef\@gtempa{\write#1{\string \entry{#2}{\thepage}{#2}}}\endgroup \def\@tempa{}\def\thing{#2}\ifx\thing\@tempa\relax\else\@gtempa\fi \if@nobreak \ifvmode\nobreak\fi\fi\@esphack} \def\@wrindexbold#1#2{\let\thepage\relax \let\bf\relax \xdef\@gtempa{\write#1{\string \entry{#2}{\b{\thepage}}{#2}}}\endgroup \def\@tempa{}\def\thing{#2}\ifx\thing\@tempa\relax\else\@gtempa\fi \if@nobreak \ifvmode\nobreak\fi\fi\@esphack} \def\@wrsubindex#1#2#3{\let\thepage\relax \xdef\@gtempa{\write#1{\string \entry{#2 #3}{\thepage}{#2}{#3}}}\endgroup% \@gtempa \if@nobreak \ifvmode\nobreak\fi\fi\@esphack} \def\@index#1{\endgroup\@esphack} \def\pgindex{\@bsphack\begingroup \@sanitize\@index} \def\newindexpg{\if@filesw \newwrite\@pgindexfile \immediate\openout\@pgindexfile=\jobname.pg \def\pgindex{\@bsphack\begingroup \def\protect####1{\string####1\space}\@sanitize \@wrindex\@pgindexfile} \def\pgindexbold{\@bsphack\begingroup \def\protect####1{\string####1\space}\@sanitize \@wrindexbold\@pgindexfile} \typeout{Writing index file \jobname.pg }\fi} \def\pgindex{\@bsphack\begingroup \@sanitize\@index} \def\pgindexbold{\@bsphack\begingroup \@sanitize\@index} \def\newindexvr{\if@filesw \newwrite\@vrindexfile \immediate\openout\@vrindexfile=\jobname.vr \def\vrindex{\@bsphack\begingroup \def\protect####1{\string####1\space}\@sanitize \@wrindex\@vrindexfile} \def\vrindexbold{\@bsphack\begingroup \def\protect####1{\string####1\space}\@sanitize \@wrindexbold\@vrindexfile} \typeout{Writing variable index file \jobname.vr }\fi} \def\vrindex{\@bsphack\begingroup \@sanitize\@index} \def\vrindexbold{\@bsphack\begingroup \@sanitize\@index} \def\newindextp{\if@filesw \newwrite\@tpindexfile \immediate\openout\@tpindexfile=\jobname.tp \def\tpindex{\@bsphack\begingroup \def\protect####1{\string####1\space}\@sanitize \@wrindex\@tpindexfile} \def\tpindexbold{\@bsphack\begingroup \def\protect####1{\string####1\space}\@sanitize \@wrindexbold\@tpindexfile} \typeout{Writing datatype index file \jobname.tp }\fi} \def\tpindex{\@bsphack\begingroup \@sanitize\@index} \def\tpindexbold{\@bsphack\begingroup \@sanitize\@index} \def\newindexky{\if@filesw \newwrite\@kyindexfile \immediate\openout\@kyindexfile=\jobname.ky \def\kyindex{\@bsphack\begingroup \def\protect####1{\string####1\space}\@sanitize \@wrindex\@kyindexfile}\typeout{Writing key index file \jobname.ky }\fi} \def\kyindex{\@bsphack\begingroup \@sanitize\@index} \def\kyindexbold{\@bsphack\begingroup \@sanitize\@index} \def\newindexfn{\if@filesw \newwrite\@fnindexfile \immediate\openout\@fnindexfile=\jobname.fn \def\fnindex{\@bsphack\begingroup \def\protect####1{\string####1\space}\@sanitize \@wrindex\@fnindexfile} \def\fnindexbold{\@bsphack\begingroup \def\protect####1{\string####1\space}\@sanitize \@wrindexbold\@fnindexfile} \typeout{Writing function index file \jobname.fn }\fi} \def\fnindex{\@bsphack\begingroup \@sanitize\@index} \def\fnindexbold{\@bsphack\begingroup \@sanitize\@index} % \synindex{foo}{bar} makes index foo feed into index bar. \def\synindex#1#2{\expandafter\xdef \csname @#1index\endcsname{% \noexpand\csname @#2index\endcsname}% \expandafter \chardef \csname @#1indexfile\endcsname=\csname @#2indexfile\endcsname} % \syncodeindex{foo}{bar} similar, but put all entries made for index foo % inside bold. \def\syncodeindex#1#2{% \expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname \expandafter\let\csname#1indfile\endcsname=\synindexfoo \expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex \csname#1boldindex\endcsname{#2}}% } % Define the macros used in formatting output of the sorted index material. % This is what you call to cause a particular index to get printed. % Write % \section*{Function Index} % \printindex{fn} \newskip\secondaryindent \secondaryindent=0.5cm % In case index foo is undefined, or sorted index foo.??s is empty... \ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi \ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi \def\printindex#1{ \def\indexbackslash{\rawbackslashxx} \tolerance=9500 \advance\baselineskip -1pt \openin 1 \jobname.#1s \ifeof 1 \putwordIndexNonexistent \else \read 1 to \temp \ifeof 1 \putwordIndexIsEmpty \else \begin{multicols}{2} \input \jobname.#1s \end{multicols} \fi \fi \closein 1 } % These macros are used by the sorted index file itself. % Change them to control the appearance of the index. \def\Dotsbox{\hbox to 1em{\hss.\hss}} % Used by index macros \def\pline{\hbox to\hsize} \def\initial#1{% {\bigbreak\pline{\large\bf#1\hfill}\kern 2pt\penalty3000}} \def\entry #1#2{ {\parfillskip=0in \parskip=0in \parindent=0in \small \hangindent=1in \hangafter=1% \noindent\hbox{#1}\leaders\Dotsbox\hskip 0pt plus 1filll\relax #2\par }} \def\primary #1{\pline{\small#1\hfil}} \def\secondary #1#2{ {\parfillskip=0in \parskip=0in \small \hangindent =1in \hangafter=1 \noindent\hskip\secondaryindent\hbox{#1}\leaders\Dotsbox\hskip 0pt plus 1filll#2\par }} %%% Args are the skip and penalty (usually negative) \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} % Now we set up the default concept index... \newindex{cp} % ...and two useful macros to save typing time \newcommand{\indexcp}[1]{#1\cpindex{#1}} \newcommand{\subindexcp}[2]{#1\cpsubindex{#2}{#1}} % et voil\`a! \endinput