%\iffalse meta-comment % ltxindex.dtx generated using /usr/local/bin/makedtx version 0.9b (c) Nicola Talbot % Command line args: % -src "ltxindex\.sty=>ltxindex.sty" % -doc "README" % ltxindex % Created on 2006/11/26 15:10 % % ltxindex.sty, a LaTeX package to typeset indices with GNU's Texindex % Copyright (C) 2004 by Richard Stallman, Robert J. Chassell, % Michael Clarkson, \& 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. % %\fi % %\iffalse %\NeedsTeXFormat{LaTeX2e}[1995/06/01] %\ProvidesPackage{ltxindex} % [2004/06/30 v0.1b ltxindex: LaTeX indexing, texindex style] %\fi % %\iffalse %<*driver> \documentclass{ltxdoc} \usepackage{ltxindex} \newcommand{\texindex}{\texttt{texindex}} \newcommand{\ltxindex}{\textsf{ltxindex}} \OnlyDescription \begin{document} \DocInput{ltxindex.dtx} \end{document} % %\fi % % \CheckSum{541} % % \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 \~} % % \changes{0.1}{2004/06/30}{First Release} % \changes{0.1b}{2007/12/14}{Made a first dtx file} % % \GetFileInfo{ltxindex.sty} % % \title{\ltxindex: Making \LaTeX\ indexes with GNU's \texindex% % \thanks{This file documents version~\fileversion, as of~\filedate. % Please send comments and bug reports to jlrn77 at gmail dot com.}} % \author{Luis Rivera} % \date{December 14, 2006} % \maketitle % % \ltxindex\ is a simple package to make indices for \LaTeX\ % documents with \texindex\ instead of |makeindex|. % Though missing some important functionality, \texindex\ seems much % simpler to use; % and if you don't need anything fancy, such an index may be useful. % % This package only implements the standard indices used by % texinfo, and only defines the concept index (cp) by default. % You can't define custom indices (yet), and you must set up the fn, ky, pg, % tp, and vr indices on your own. % % \section{Usage} % % Call this package in the preamble: |\usepackage{ltxindex}| % % The package implements the following commands, % % |\cpindex|\marg{concept} indexes \emph{concept}, without typesetting it in the % main text. % % |\cpsubindex|\marg{concept}\marg{subconcept} indexes \emph{subconcept} under % \emph{concept}, without typesetting it in the main text. % % |\indexcp|\marg{concept} typesets \emph{concept} and puts it in the |cp| index. % % |\subindex|\marg{subconcept}\marg{concept} typesets \emph{subconcept} in the main % document and puts it under \emph{concept} in the |cp| index. % % You may set up fnindex, kyindex, pgindex, tpindex, and vrindex with the % command |\newindex|\marg{??}, where |??| is either fn, ky, pg, tp, or vr. % This way, you enable commands |\??index|\marg{word}, which allows you to % index \emph{word} in the appropriate index. % Texinfo's shortcuts |\cindex|, |\findex|, |\kindex|, |\pindex|, |\tindex|, and % |\vindex|, are also available. % % |\synindex|\marg{foo}\marg{bar} subsumes index \emph{foo} under index \emph{bar}. % % |\syncodeindex|\marg{foo}\marg{bar} is similar, but typesets all entries for % index \emph{foo} in boldface. % % As in Texinfo, all these commands produce auxiliary files |.??| % % Once you're done with the main body of your document, you ask % \LaTeX\ to typeset the index with the command |\printindex|\marg{??}, wherever % you like. Make sure you precede it with some informative heading, % like |\section*{Concept Index}|. In short: % % \begin{description} % \item{Run} \LaTeX\ on filename to produce the |.aux| and |.??| files % \item{Run} \texindex\ on every unsorted index file (|.??|) you created % for your document (|.cp|, by default). \texindex\ will % create a sorted index file for your index file (|.cps|, by % default). % \item{ReRun} \LaTeX\ to incorporate the indices. % \item{ReRun} \texindex\ on every index file (to ensure right cross-references). % \item{ReRun} \LaTeX\ to put everything in order. % \end{description} % % You may avoid all this work in drafting and proofreading: % the package prints ``(Index is empty)'' or ``(Index is nonexistent)'' % in the appropriate places if the indices are unsorted or % undefined. % % \section{Acknowledgements} % % As you may see by simple inspection of the code, I just ``borrowed'' % the code from the old |latexinfo.sty|, available on CTAN, and patched % it up to run as a \LaTeX\ package. % Thus, all credits should go to Richard Stallman, Robert J. Chassell, % \& Michael Clarkson. % % \section{To Do's and Warnings} % % \begin{itemize} % \item Two column output is somewhat clumsy; you may have to edit the % |.??s| file manually to add |\columnbreak|'s in the appropriate places. % \item Devise a more general mechanism to create arbitrary indices. % \item Write some macros to modify the appearance of the index (by means % of some commands or package options). % \item PDF is not supported at all. % \item Documentation is wanting; I may improve it when I implement % user-defined indexes. % \item There is something odd about the license of this package. % % This package is distributed along the lines of the GNU General Public % License version 2.0, in compliance with the original license for % |latexinfo.sty|. % % There are additional conditions imposed on the use ---not the % distribution--- of the package, due to the usage of the \textsf{multicol} % package, by Frank Mittelbach. % Even though \textsf{multicol} is a required file for any \LaTeX\ % installation, you are \emph{morally} required to pay a license fee if you % use it as a part of a proprietary or commercially distributed product % based on or using \textsf{multicol}. The \ltxindex\ package is distributed % `gratis', so as long as you distribute or use this package for a % non-commercial or non-proprietary end product (document or software), % you don't acquire this moral obligation. % Otherwise, you are morally required to pay that fee, because of the usage % of \textsf{multicol}. % See the file |multicol.dtx| for details. % % Confused? Well, just comment out the lines containing the strings % \begin{verbatim} % \RequirePackage{multicol} % \begin{multicols}{2} % \end{multicols} % \end{verbatim} % The output will be ugly, but free from moral trouble. % % I may get around this odd situation when I implement another way of setting % multiple columns independently of Mittelbach's package. % \end{itemize} % %\StopEventually{} % %\section{The Code} % % This package may require the package \textsf{multicol} to typeset the index % in a two column environment. This should be the default behavior, save % the case documented above. % \begin{macrocode} \RequirePackage{multicol} % \end{macrocode} % Index generation facilities % % Define the texinfo user-accessible indexing commands for backwards % compatability. % % \begin{macrocode} \def\cindex{\cpindex} \def\pindex{\pgindex} \def\vindex{\vrindex} \def\tindex{\tpindex} \def\kindex{\kyindex} \def\findex{\fnindex} % \end{macrocode} % % |\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. % \begin{macrocode} \def\newindex#1{\csname newindex#1\endcsname} % \end{macrocode} % % Yes I know this could be done shorter, but safer?? % % \begin{macrocode} \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} % \end{macrocode} % % |\synindex{foo}{bar}| makes index foo feed into index bar. % % \begin{macrocode} \def\synindex#1#2{\expandafter\xdef \csname @#1index\endcsname{% \noexpand\csname @#2index\endcsname}% \expandafter \chardef \csname @#1indexfile\endcsname=\csname @#2indexfile\endcsname} % \end{macrocode} % % |\syncodeindex{foo}{bar}| similar, but put all entries made for index foo % inside bold. % % \begin{macrocode} \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}}% } % \end{macrocode} % % 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}| to |\printindex{fn}| % % \begin{macrocode} \newskip\secondaryindent \secondaryindent=0.5cm % \end{macrocode} % % In case index foo is undefined, or sorted index |foo.??s| is empty... % % \begin{macrocode} \ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)} \fi \ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)} \fi % \end{macrocode} % % The command |\printindex| typesets the index in the appropriate place. % This is the piece of code where the \textsf{multicol} package is used, % and some replacement is needed. % % \begin{macrocode} \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 } % \end{macrocode} % % These macros are used by the sorted index file itself. % Change them to control the appearance of the index. % % \begin{macrocode} \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 }} % \end{macrocode} % % Args are the skip and penalty (usually negative) % % \begin{macrocode} \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} % \end{macrocode} % % Now we set up the default concept index... % % \begin{macrocode} \newindex{cp} % \end{macrocode} % % ...and two useful macros to save typing time % % \begin{macrocode} \newcommand{\indexcp}[1]{#1\cpindex{#1}} \newcommand{\subindexcp}[2]{#1\cpsubindex{#2}{#1}} % \end{macrocode} % % et voil\`a! % %\Finale