summaryrefslogtreecommitdiff
path: root/macros/texsis/index
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/texsis/index
Initial commit
Diffstat (limited to 'macros/texsis/index')
-rw-r--r--macros/texsis/index/README22
-rw-r--r--macros/texsis/index/index.tex303
2 files changed, 325 insertions, 0 deletions
diff --git a/macros/texsis/index/README b/macros/texsis/index/README
new file mode 100644
index 0000000000..82f8481a2e
--- /dev/null
+++ b/macros/texsis/index/README
@@ -0,0 +1,22 @@
+index.tex -- Macros for creating an index using MakeIndex
+
+ The file index.tex contains a set of Plain TeX macros for making an
+index for a document. The raw index output file produced by the macros
+is in a form which can be fed to the makeindex program. The output from
+makeindex can then be fed back through TeX with the formatting macros
+(which are also in index.tex) to produce the final formatted index. For
+further information see the file itself.
+
+ The file makeindex.tar.gz is a compressed tar file containing the
+standard distribution of the makeindex program. You can also get
+makeindex from CTAN:indexing/makeindex.
+
+ The file MakeIndex.ps contains a PostScript copy of the paper "Index
+Preparation and Processing" by Pehong Chen and Michael A. Harrison which
+describes the general workings of their makeindex program.
+
+ It is possible to make the index from just the raw index file
+and a sorting program (and a lot of "by-hand" work), but makeindex
+really is the proper way to make a good index.
+
+Eric Myers <texsis@lifshitz.ph.utexas.edu> - 29 August 1997
diff --git a/macros/texsis/index/index.tex b/macros/texsis/index/index.tex
new file mode 100644
index 0000000000..d9985e2952
--- /dev/null
+++ b/macros/texsis/index/index.tex
@@ -0,0 +1,303 @@
+%% file: index.tex - creating an index - TeXsis 2.19
+% @(#) $Id: index.tex,v 18.1 2003/01/20 17:08:21 myers Exp $
+%======================================================================*
+% index.tex -- Macros for creating an index using MakeIndex
+%
+% Use \index{key} or \idx{word} to make an entry in the index file
+% [\idx{word} is more or less the same as ``word\index{word}''].
+% At the end of the job the file \jobname.idx is the raw index file,
+% ready to be fed into the MakeIndex program to create the index.
+% The MakeIndex output file \jobname.ind is then fed back through TeX with
+% the output formatting macros below to print the final formatted index.
+%
+% To process the index file with MakeIndex the command is simply
+%
+% makeindex jobname.idx
+%
+% You can leave off the .idx extension for the raw file and makeindex
+% will assume it. This will produce the processed index file, called
+% \jobname.ind. To print the index you can either include it in
+% another pass of the full document with ``\input \jobname.ind'' or
+% print it separately by adding ``\input index'' to the begining of the
+% \jobname.ind file and running it through TeX.
+%
+% If you set \markindextrue then indexed words selected with \idx
+% will appear in the printed output inside a ruled box. This is
+% useful for draft copies when you are putting together the index,
+% but obviously you do not want to use it in a final copy.
+% The box does not interfere with or change the line spacing.
+%
+% These macros are completely compatible with Plain TeX, although
+% they can also be used with TeXsis (some of the macros used below
+% are a part of TeXsis). Note however that these macros support output
+% from MakeIndex in it's default LaTeX mode. You don't need a separate
+% style file for MakeIndex!
+%
+% For more information about how to make full use of MakeIndex read
+% the man page for makeindex(1) and/or the paper ``Index Preparation
+% and Processing'' by Pehong Chen and Michale A. Harrison,
+% Software: Practice and Experience, Vol 19, No. 9, Sep. 1988, pp. 897-915
+% (a copy is available at ftp://ftp.texsis.org/texsis/index/index.tex )
+%
+% It is possible to make more than one index by creating a few extra
+% macros based on the ones below. See the documentation at the end
+% of this file for details.
+%
+%======================================================================*
+% (C) Copyright 1992, 1999, 2000 by Eric Myers and Frank Paige.
+% This file is a part of TeXsis. Distribution and/or modifications
+% are allowed under the terms of the LaTeX Project Public License (LPPL).
+% See the file COPYING or ftp://ftp.texsis.org/texsis/LPPL
+%======================================================================*
+\message{- indexing macros}
+\catcode`@=11 % @ is a letter here to hide workings
+
+\newif\ifmarkindex \markindexfalse % put proof marks in text?
+\newif\ifmakeindex \makeindextrue % set false to suppress .idx output
+
+%---------------------------*
+% Index Entries:
+%
+% \idx{word} is the quickest way to make an index entry.
+% The word is put in the text and an index entry is made at the
+% same time. It is the same as typing ``word\index{word}''.
+% If \markintdextrue is selected the word appears in the text with a
+% box around it so you know it has been included in the index.
+
+
+\def\idx#1{% include a word in the index output file
+ #1\index{#1}% % put word in text and \index it
+ \ifmarkindex % proof marks?
+ \llap{\lower\jot\vbox to 0pt{\vss % box it
+ \tightboxit{\loosebox{\phantom{#1}}}}\hskip-\jot}%
+ \fi} % put a ruled box around word
+
+
+% \index{key} makes an index entry for the given key.
+% Since MakeIndex can use special characters like @ | ! and " in the key
+% we must make sure that they are printed correctly to the raw index file.
+
+\def\index{% make an index entry for a given key
+ \begingroup % turn MakeIndex special characters to letters
+ \catcode`@=11 \catcode`"=11 \catcode`!=11 \catcode`|=11 \catcode`-=11
+ \@index}
+
+\def\Index{% alternate entry for \index (in case of tex2xindy)
+ \begingroup % turn MakeIndex special characters to letters
+ \catcode`@=11 \catcode`"=11 \catcode`!=11 \catcode`|=11 \catcode`-=11
+ \@index}
+
+
+
+\def\@index#1{% get the index entry and write it to the file
+ \endgroup % special characters back to before
+ \ifmakeindex % .idx file output enabled?
+ \indexwrite\indexout{\indexentry{#1}}% write entry to file
+ \fi}
+
+
+% \loosebox put a loose box around a box.
+% \tightboxit draws a rule box around the box #1 without any added space
+
+\def\loosebox#1{%
+ \vbox{\vskip\jot
+ \hbox{\hskip\jot #1\hskip\jot}%
+ \vskip\jot}}
+
+\def\tightboxit#1{\vbox{\hrule\hbox{\vrule\vbox{#1}\vrule}\hrule}}
+
+%---------------------------*
+% Index Formatting (printing the processed index file)
+
+
+% The index is begun by \theindex or \begin{theindex} and ended
+% with \endtheindex or \end{theindex}
+
+
+\def\theindex{% begin a formatted index
+ \begingroup
+ \parskip = 0pt % no extra space between items
+ \def\item{\indexitem{0pt}}% % level 0 item separator
+ \def\subitem{\indexitem{20pt}}% % level 1 item separator
+ \def\subsubitem{\indexitem{30pt}}% % level 2 item separator
+ \def\indexspace{\medskip}% % intergroup vertical space
+ \def\setcounter##1##2{\global\csname ##1no\endcsname=##2}% to set page counter
+ \def\bold##1{{\bf ##1}}% % boldface for |bold
+ \def\italic##1{{\it ##1}}% % italics for |italic
+ \def\slanted##1{{\sl ##1}}% % slanted for |slanted
+ \def\see##1##2{{\it see} ##1}% % italics for |see
+ \def\seealso##1{{\it see also} ##1}%% italics for |seealso
+ \def\also##1{{\it see also} ##1}% % italics for |also
+ }
+
+\def\indexitem#1{% how to make an entry for an item in the index
+ \vskip 0pt % force vertical mode
+ \hangindent=30pt\hangafter=1 % hanging indent for extra lines
+ \noindent\hskip #1} % level N item separator
+
+\def\endtheindex{% end a formatted index
+ \endgroup}
+
+
+% If you don't have MakeIndex you can still make a sorted index.
+% (Even though it may not look as good. If you are really going to
+% do it right, do get MakeIndex). The Unix sort(1) command or a similar
+% program can be used to sort the \jobname.idx file. You can then
+% edit the file to collect all the page numbers for a key into
+% one \indexentry, like ``\indexentry{foo}{29,47-48}'' , and \indexentry
+% will format the items as best it can.
+
+
+\def\indexentry#1#2{% prints an index entry (from the raw file)
+ \indexitem{0pt}#1, #2} % keyword, page number
+
+
+%-------------------------*
+% Simple \begin .. \end support (like in LaTeX): There is a conspiracy
+% to preserve job security for typists by making sure one has to
+% type \begin{thing} and \end{thing} everywhere. In TeXsis it's just
+% \thing and \endthing, so here we just make \begin{thing} become \thing
+% and \end{thing} become \endthing. Then we can use MakeIndex in it's
+% default mode, even though that is for LaTeX.
+% Note: we don't check that you begin and end the same thing. After all,
+% you might want to say \begin{midfigure} followed by \end{figure}.
+
+
+\def\begin#1{% \begin{foo} just becomes \foo
+ \begingroup % changes to \end are temporary
+ \let\end=\endbegin % now \end will end the \begin
+ \expandafter\ifx\csname #1\endcsname\relax\relax % is \thing defined?
+ \def\next{\beginerror{#1}}% NO: flag an error
+ \else %
+ \def\next{\csname #1\endcsname}% YES: just invoke it
+ \fi\next}
+
+\def\endbegin#1{% \end{foo} just becomes \endfoo
+ \endgroup % now \end goes back to normal
+ \expandafter\ifx\csname end#1\endcsname\relax\relax % is \endthing defined?
+ \def\next{\begingroup\beginerror{end#1}}% % NO: flag an error
+ \else %
+ \def\next{\csname end#1\endcsname}% YES: just invoke it
+ \fi\next}
+
+
+\newhelp\beginhelp{begin:
+ The \string\begin\space or \string\end\space marked above is for a^^M%
+ non-existant environment. Check for spelling errors and such.}
+
+
+\def\beginerror#1{% \begin{foo} or \end{foo} fail if no \foo or \endfoo
+ \endgroup % make sure \end is back to normal
+ \errhelp=\beginhelp % longer help message
+ \newlinechar=`\^^M % ^^M is line break
+ \errmessage{Undefined environment for \string\begin\space or \string\end}}
+
+
+%---------------------------*
+% Index file output:
+%
+
+\newwrite\indexout % raw index output file
+
+
+% \indexinit will only get called once. It opens the output file,
+% write an identifying comment to it, and then undefines itself.
+
+\def\indexinit{% open and initialize raw index file
+ \immediate\openout\indexout=\jobname.idx % open file as \jobname.idx
+ \immediate\write\indexout{\@comment Raw index file ``\jobname.idx''}%
+ \immediate\write\indexout{\@comment ====================================}%
+ \gdef\indexinit{\relax}} % so we initialize only once
+
+% \@comment is for writing % to a file. It expands to '% '.
+
+{\catcode`\%=11 \gdef\@comment{% }}
+
+
+% \indexwrite writes an entry to the raw index file named by #1. Argument
+% #2 is the \indexentry{foo}, so it is not expanded (which is why this is so
+% complicated), while \@indexpage is the page number, which *is* expanded.
+
+\def\indexwrite#1#2{% % write entry to raw index file
+ \indexinit % open output file if not already
+ \def\@finwrite{\write#1}% % to write to index output file (#1)
+ \begingroup % begin collecting tokens on stack
+ \aftergroup\@finwrite % put \write\indexout on stack
+ \aftergroup{\relax % put { on stack
+ \@stackNX#2\@endstack % puts \noexpand\token... on stack
+ \aftergroup\@indexpage % expanded {enclosed} page number
+ \aftergroup}\relax % put } on stack
+ \endgroup} % now dump from stack to \write
+
+\def\@indexpage{{\folio}} % to get the {enclosed} page number
+
+% Saying \@stackNX <stuff>\@endstack will take all the tokens
+% in <stuff> and put them on the stack, with every control sequence
+% prefaced by \noexpand. \indexwrite uses this for unexpanded write.
+
+\def\@stackNX{\futurelet\next\@stackswitch}
+
+\def\@stackswitch{% decides what to do with various types of tokens
+ \ifx\next\@endstack\relax % if \@endstack then we'll quit
+ \else\ifcat\noexpand\next\@stoken % if token is a space,
+ \aftergroup\space\let\next=\@eatnext% write \space and eat token
+ \else\ifcat\noexpand\next\bgroup % if token is \bgroup
+ \aftergroup{\let\next=\@eatnext % write { and eat it
+ \else\ifcat\noexpand\next\egroup % if token is \egroup
+ \aftergroup}\let\next=\@eatnext % write a } and eat it
+ \else % otherwize
+ \let\next=\@stacktoken % just copy to the stack with \NX
+ \fi\fi\fi\fi % end all \if's
+ \next} % do it to the token
+
+\def\\{\global\let\@stoken= }\\
+
+% \@eatnext ignores the \next token and goes on to the
+% one following in the argument list
+
+\def\@eatnext{\afterassignment\@stackNX\let\next= }
+
+% \@stacktoken copies one token to the stack with \aftergroup,
+% then calls \@stackNX to get the one following.
+
+\long\def\@stacktoken#1{% write token to stack, unexpanded
+ \ifcat\noexpand#1\relax % if token is a control sequence
+ \aftergroup\noexpand % preface with \noexpand
+ \else\ifcat\noexpand#1\noexpand~\relax % if token is an active character
+ \aftergroup\noexpand % preface with \noexpand
+ \fi\fi %
+ \aftergroup#1\relax % put the next token on the list
+ \@stackNX} % do next token from argument...
+
+\def\@endstack\@endstack{} % just marks the end of token list
+
+\catcode`@=12 % @ goes back to \other, not a letter
+
+%---------------------------*
+% MULTIPLE INDICES:
+%
+% If you want more than one index I can't guess how you will want to
+% use them, so all I can do is tell you how to use the macros above to
+% create another (or several other) additional indices:
+%
+% 1) Create another output file and open it, with something like:
+%
+% \newwrite\otherindexout
+% \immediate\openout\otherindexout=other.idx
+%
+% 2) Define a macro to make the entry to the second index, following
+% the pattern of \index and \@index above, but using the other index
+% file (but don't use @ in a macro name). For example:
+%
+% \def\OtherIndex{\begingroup % special characters letters
+% \catcode`@=11 \catcode`"=11 \catcode`!=11 \catcode`|=11
+% \catcode`-=11
+% \Oindex}
+%
+% \def\Oindex#1{\endgroup % special characters return
+% \indexwrite\otherindexout{\indexentry{#1}}}
+%
+% Then saying \OtherIndex{word} will make an entry into the alternate
+% index for ``word''.
+%
+%>>> EOF index.tex <<<