summaryrefslogtreecommitdiff
path: root/macros/plain/contrib/misc/autotoc.tex
blob: 3b2f8ce6e863c4fdf83ce04d8e7636ef90b25e25 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
%
% Automatically generate a Table Of Contents (TOC) while the
% document is being processed by PLAIN TeX
%
% Use \tocref{ texta }{ textb } to insert TOC entries. `texta'
%         will be typeset in the TOC and at the current location,
%         for example `\centerline{\tocref{Chapter 1}{}}' inserts
%         `Chapter 1' at the current location in your document
%         centered, and enters it in the TOC (not centered).
%         `textb' is a prefix text/TeX commands to precede `texta'
%         in the TOC only (it will not appear in the current loc-
%         ation of your document -- {{`textb'`texta'}.....\folio}).
% Use \tocline to add info only intended for the TOC (no page number or
%         dotfill is used for tocline entries).
% Use \tocgen to force the last TOC page to be printed (last command
%         before \end?)
% To specialize, look at the below comments in the right
%
% Uses variable names
%         tocnew, tocopage, tocbox, tocsize, tocstrut, tocref,
%         tocbanner, tocsuffix, tocline, tocstart, tocont, tocgen
%
\newcount\tocnew\tocnew=1\newcount\tocopage
\newbox\tocbox\newdimen\tocsize
\def\tocstrut{{\vrule height8.5pt depth3.5pt width0pt}} % TOC baselineskip -1pt
\def\tocref#1#2{\tocbanner#1               % Where `texta' is duplicated
    \global\setbox\tocbox=\vbox{
    \box\tocbox\vbox{
    \line{\tocstrut{#2#1}~\dotfill~\folio} % Where the TOC line is made
    }}\tocsuffix}
\def\tocline#1{\tocbanner
    \global\setbox\tocbox=\vbox{
    \box\tocbox\vbox{
    \line{\tocstrut{#1}}
    }}\tocsuffix}
\def\tocbanner{\ifnum\tocnew=1\tocstart\fi
    \ifnum\tocnew=3\tocont\fi}
\def\tocsuffix{\ifdim\tocsize<\ht\tocbox\tocgen
    \global\tocnew=3\fi}
% Do not change tocsize = 1.0 (TeX may go into an infinite loop)
\def\tocstart{\global\tocsize=.95\vsize   % TOC page >95% full, print it
    \global\setbox\tocbox=\vbox{
    \centerline{\tocstrut\bf Table Of Contents} % TOC page 1 banner line 1
    \line{\tocstrut\hfil}                 % TOC page 1 banner line 2 blank line
    }\global\tocnew=2}
\def\tocont{\global\setbox\tocbox=\vbox{
    \centerline{\tocstrut Table Of Contents (Continued)} % TOC page <> 1 banner
    }\global\tocnew=2}
\def\tocgen{\ifnum\tocnew=1
    \message{No TOC entries found.}\else
    \tocopage=\pageno\pageno=0\message{(TOC}
    \shipout\box\tocbox\message{)}
    \pageno=\tocopage\global\tocnew=1\fi}