%\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
%<ltxindex>\NeedsTeXFormat{LaTeX2e}[1995/06/01]
%<ltxindex>\ProvidesPackage{ltxindex}
%<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}
%</driver>
%\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 |<filename>.??| 
% 
% 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 (|<filename>.??|) you created
%    for your document (|<filename>.cp|, by default). \texindex\ will
%    create a sorted index file for your index file (|<filename>.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
