TeX macros for index making
[TeXnicard.git] / doc / tex / index_making.tex
blob8746b8b62678d2a44cd63befea8f8cc161bc13d9
1 % Set of macros for making index of a book
3 % This file is public domain.
5 \newwrite\indexfile%
6 \immediate\openout\indexfile=\jobname.idx %
8 \def\gobble#1{}%
10 \edef\allindex{}%
12 \def\indexa#1{\indexat{#1}{#1}}%
14 \long\def\indexat#1#2{{%
15 \expandafter\ifx\csname index:#1\endcsname\relax%
16 \let\indexnum\relax%
17 \edef\thisindexnum{}%
18 \def\next##1{%
19 \if*##1%
20 \let\next\relax%
21 \loop\ifnum\count9<14348906 %
22 \multiply\count9 by 27 %
23 \repeat%
24 \edef\thisindexnum{\thisindexnum\indexnum{\the\count9}}%
25 \else%
26 \ifnum\uccode`##1>0 %
27 \ifnum\count9>14348906 %
28 \edef\thisindexnum{\thisindexnum\indexnum{\the\count9}}%
29 \count9=0 %
30 \fi %
31 \multiply\count9 by 27 %
32 \advance\count9 by \uccode`##1%
33 \advance\count9 by -64 %
34 \fi%
35 \fi%
36 \next%
38 \count9=0 \next#1*%
39 \global\expandafter\let\csname index:#1\endcsname\thisindexnum%
40 \edef\preindex{}%
41 \let\postindex\allindex%
42 \def\indexnum##1{%
43 \count\count9=##1 %
44 \advance\count9 by 1 %
45 \if\count9=9 \let\indexnum\gobble\fi%
47 \count9=0 \thisindexnum%
48 \def\temporary##1{%
49 \ifnum##1>\count\count9 %
50 \def\next####1{%
51 \expandafter\ifx\csname index:####1\endcsname\relax%
52 \let\next\relax%
53 \fi%
54 \next%
56 \xdef\allindex{\preindex{#1}\postindex}%
57 \let\indexnum\gobble%
58 \else%
59 \ifnum##1<\count\count9 \let\indexnum\gobble\fi%
60 \fi%
61 \advance\count9 by 1 %
62 \if\count9=9 \let\indexnum\gobble\fi%
64 \def\next##1{%
65 \expandafter\ifx\csname index:##1\endcsname\relax%
66 \let\next\relax%
67 \xdef\allindex{\preindex{#1}}%
68 \else%
69 \count9=0 \let\indexnum\temporary \csname index:##1\endcsname%
70 \fi%
71 \edef\preindex{\preindex{##1}}%
72 \edef\postindex{\expandafter\gobble\postindex\empty}%
73 \next%
75 \expandafter\next\allindex{}%
76 \fi%
77 \let\indexentry\relax%
78 \expandafter\gdef\csname Index:#1\endcsname{#2}%
79 \write\indexfile{\noexpand\indexentry{#1}{\the\pageno}}%
80 }}%
82 \long\def\eindexat#1#2{\edef\next{\noexpand\indexat{#1}{#2}}\next}%
84 \def\indexmo#1#2{{%
85 \let\indexnum\relax%
86 \def~##1/{\indexnum{##1}}%
87 \expandafter\xdef\csname index:#1\endcsname{#2}%
88 }}%
90 \def\indexshow#1{\expandafter\show\csname index:#1\endcsname}%
92 \def\indexentry#1#2{%
93 \expandafter\xdef\csname index:#1\endcsname{%
94 \csname index:#1\endcsname%
95 \indexpage{#2}%
97 \ignorespaces%
100 \def\makeindex{%
101 \par%
102 \immediate\closeout\indexfile%
103 \let\indexnum\gobble%
104 \let\indexpage\relax%
105 \input \jobname.idx %
106 \def\indexpage##1{%
107 \ifnum\count9=##1 \else%
108 \ifnum\count9>0 ,\fi%
109 \space##1%
110 \count9=##1 %
111 \fi%
113 \setbox0=\vbox{%
114 \parindent=-0.25in %
115 \leftskip=0.25in %
116 \rightskip=0.15in %
117 \parskip=0pt %
118 \divide\hsize by 2 %
119 \long\def\next##1{%
120 \expandafter\ifx\csname index:##1\endcsname\relax%
121 \let\next\relax%
122 \else%
123 \indent \csname Index:##1\endcsname :%
124 \count9=0 \csname index:##1\endcsname.\par%
125 \fi%
126 \next%
128 \expandafter\next\allindex{}%
129 \vfil%
131 \dimen0=\dp0 %
132 \advance\dimen0 by \dp0 %
133 \ht0=\dimen0 %
134 \dp0=0pt %
135 \splitmaxdepth=0pt %
136 \loop%
137 \hbox{}\hrule height 0pt depth 0pt %
138 \dimen0=\pagegoal%
139 \advance\dimen0 by -\pagetotal %
140 \setbox1=\vsplit0 to \dimen0 %
141 \setbox2=\vsplit0 to \dimen0 %
142 \hbox{\box1\box2}%
143 \vfil\eject%
144 \ifdim\ht0>0pt \repeat%