1%% 2%% INDEX (Macros) 3%% 4\ifsecondpass\else 5 \condwrite\index{The End} 6 \immediate\condwrite\toc{Index\string\dotfill\the\pageno} 7 \ifPDF \writesecnumbers \fi 8 \expandafter\end % stop here the first time (don't process index) 9\fi 10 11\ifPDF 12% Add a bookmark entry for the index. CHB 13 \putchapdest 14 \pdfoutline goto name {pdfchap@\the\pdfchapcntr} {Index} 15\fi 16 17\newdimen\fullhsize 18\fullhsize=\hsize 19\advance\hsize by -20pt 20\divide\hsize by 2 21 22\def\fullline{\hbox to\fullhsize} 23\let\lr=L\newbox\leftcolumn 24 25\headline={\hfil\bf Index\hfil\global\headline={\hfil}} 26 27\def\makeheadline{\vbox to 0pt{\vskip-22.5pt 28 \fullline{\vbox to8.5pt{}\the\headline}\vss} 29 \nointerlineskip} 30 31\def\makefootline{\baselineskip=24pt\fullline{\the\footline}} 32 33\output={\if L\lr %cf. The TeXbook, p257 34 \global\setbox\leftcolumn=\columnbox\global\let\lr=R 35 \else\doubleformat\global\let\lr=L\fi 36 \ifnum\outputpenalty>-20000\else\dosupereject\fi} 37\def\doubleformat{\shipout\vbox 38 {\makeheadline 39 \fullline{\box\leftcolumn\hfil\columnbox} 40 \makefootline} 41 \advancepageno} 42\def\columnbox{\leftline{\pagebody}} 43 44\def\parse!#1#2!#3!#4!#5 {% 45 \uppercase{\def\theletter{#1}}% 46 \def\theword{#1#2}% 47 \def\thefont{#3}% 48 \def\thepage{#4}% 49 \def\thedest{#5}} 50 51\ifPDF 52%% This puts the hyperlink command in the index, linked to the page 53%% number. #1 is the usual page number, #2 the pdfcounter. CHB 54 \def\indxjump#1#2{\pdfstartlink attr {/Border [ 0 0 0 ] /H /O} 55 goto name {pdf@#2}\pushcolor{\linkcolor}#1\popcolor\pdfendlink} 56\else 57 \def\indxjump#1#2{#1} 58\fi 59 60\def\theoldword{} 61\def\theoldletter{} 62\def\theoldpage{} 63\def\theend{The End } 64 65% more efficient to parse the glue specs once and keep them in registers 66% for later use. These govern index lines with too many page numbers to 67% fit in one line 68% b: indentation for 2nd and further lines / a: compensation for same, 69% and shrinkability for the normal word space 70\newbox\dbox \setbox\dbox=\hbox to 3truemm{\hss.\hss} 71\newskip\dfillskip \dfillskip=.5em plus .98\hsize 72\def\dotfill{\leaders\copy\dbox\hskip\dfillskip\relax} 73\newskip\interskipa \interskipa=-.4\hsize plus -1.5\hsize minus .11em 74\newskip\interskipb \interskipb= .4\hsize plus 1.5\hsize 75 76% cf. The TeXbook, p393: 77\def\interpage{,\penalty100\kern0.33em%normal space 78 \hskip\interskipa\vadjust{}\penalty10000 \hskip\interskipb\relax} 79 80\def\newword{\relax\endgraf% 81 {\csname\thefont\endcsname\theword}\dotfill\indxjump{\thepage}{\thedest}% 82 \let\theoldfont\thefont% 83 \let\theoldword\theword} 84 85%% 86%% INDEX 87%% 88\parskip=0pt plus 1pt 89\parindent=0pt 90\parfillskip=0pt 91 92\catcode`\_=11 % make _ an ordinary char (frequent in function names) 93 94\def\li#1{\hbox to\hsize{#1\hfil}} 95\li{\var{SomeWord} refers to PARI-GP concepts.} 96\li{\kbd{SomeWord} is a PARI-GP keyword.} 97\li{SomeWord is a generic index entry.} 98 99\checkfile{\jobname.std} 100\newif\ifmore 101\loop 102 \read\std to\theline 103 \ifx\theline\theend\morefalse\else\moretrue\fi 104\ifmore 105 \expandafter\parse\theline 106 \ifx \theletter \theoldletter \else \endgraf 107 \vskip 10pt plus 10pt\centerline{\bf\theletter} 108 \vskip 6pt plus 7pt 109 \fi 110 \ifx \theword \theoldword 111 \ifx \thefont \theoldfont 112 \ifx \thepage \theoldpage 113 \else \interpage \indxjump{\thepage}{\thedest}\fi 114 \else \newword \fi 115 \else \newword \fi 116 \let\theoldletter\theletter 117 \let\theoldpage\thepage 118\repeat% 119