blob: c832c74f1cc5d3c2e9884ab218660c8921173af3 (
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
|
\chardef\escape=0
\chardef\letter=11
\chardef\other=12
%\chardef\active=13 % is defined in Plain already
\chardef\atcode=\catcode`\@
\chardef\uscode=\catcode`\_
\catcode`\@=\letter
\catcode`\_=\letter
\font\tentex=cmtex10 % typewriter extended ASCII 10pt
\let\ttex=\tentex % only for PLAIN with base size 10pt
\def\setup_verbatim{%
\def\do##1{\catcode`##1\other}\dospecials
\parskip\z@skip \parindent\z@
\obeylines \obeyspaces \obeytabs \frenchspacing
\ttex
}
\let\tab=\space
\begingroup
\catcode`\^^I=\active% % Attention: no tabs!
\gdef\obeytabs{\catcode`\^^I=\active\def^^I{\tab}}
\global\let^^I=\tab% % if an active tab appears in a \write
\endgroup
\let\origvert=|
\chardef\vbar=`\|
\catcode`\|=\active
\def|{%
\leavevmode
\hbox\bgroup
\let\par\space \setup_verbatim
\let|\egroup
}
\newif\if@print
\def\beginprog{%
\endgraf
\bigbreak
\begingroup
\setup_verbatim \catcode`\|\other
\@printtrue
\ignore_rest_line
}
\let\end_verbatim=\endgroup % internal command !
\begingroup
\obeylines% % ^^M is active! ==> every line must end with %
\gdef\ignore_rest_line#1^^M{\set_next_line}%
\gdef\set_next_line#1^^M{\do_set{#1}}%
\endgroup
\def\do_set#1{%
\endgraf
\check_print{#1}%
\if@print \indent \print_char#1\end_line\end_line
\else \let\set_next_line\end_verbatim
\fi
\set_next_line
}
\let\end_line=\relax
\begingroup
\obeyspaces\obeytabs
\gdef\check_print#1{\cut_at_tab#1^^I\end_line}
\gdef\cut_at_tab#1^^I#2\end_line{\check_first_part#1 \end_line}% blank !
\gdef\check_first_part#1 #2\end_line{\do_check{#1}}
\endgroup
\def\do_check#1{%
\def\@line{#1}%
\ifx \@line\@endverbatim \@printfalse
\fi
}
{\catcode`\|=\escape \catcode`\\=\other % | is temporary escape char
|gdef|@endverbatim{\endprog} % sample line
} % here \endgroup can't be used
\newcount\char_count \char_count\@ne
\def\print_char#1#2\end_line{%
\print_first_char{#1}%
\print_rest_of_line{#2}%
}
{\obeytabs\gdef\@tab{^^I}}
\def\print_first_char#1{%
\def\@char{#1}%
\advance \char_count\@ne
\ifx \@char\@tab \print_tab
\else \@char
\fi
}
\newcount\count_mod_viii
\def\mod_viii#1{%
\count@ #1\relax \count_mod_viii\count@
\divide \count@ 8\relax
\multiply \count@ 8\relax
\advance \count_mod_viii -\count@
}
\def\print_tab{%
\loop \space \mod_viii\char_count
\ifnum \count_mod_viii>\z@
\advance \char_count\@ne
\repeat
}
\def\print_rest_of_line#1{%
\def\@line{#1}%
\ifx \@line\empty \char_count\@ne
\def\next##1\end_line{\relax}%
\else \let\next\print_char
\fi
\next#1\end_line
}
\newcount\sectno \sectno=\@ne
\def\chap#1.{%
\mark{\number\sectno}
\endgraf
\vfill\eject
\def\rhead{\uppercase{\ignorespaces#1}} % define running headline
\message{*\number\sectno} % progress report
\let\Z=\let % now you can \send the control sequence \Z
\edef\next{\write\cont{\Z{#1}{\number\sectno}{\the\pageno}}}\next % to contents file
\noindent {\bf \number\sectno.\quad #1.}%
\advance \sectno\@ne
\endgraf
\medskip \nobreak
\everypar{%
\setbox0\lastbox
\global\everypar{}%
}%
}
\def\sect{%
\mark{\number\sectno}
\endgraf
\vskip 2pc plus 1pc minus 6dd \goodbreak
\noindent {\bf \number\sectno.}\advance \sectno\@ne
\quad \ignorespaces
}
\parskip 0pt % no stretch between paragraphs
\parindent 1em % for paragraphs and for the first line of Pascal text
\font\eightrm=cmr8
\font\sc=cmcsc10 % this IS a caps-and-small-caps font!
\let\mainfont=\tenrm
\font\titlefont=cmr7 scaled\magstep4 % title on the contents page
\font\ttitlefont=cmtt10 scaled\magstep2 % typewriter type in title
%\font\tentex=cmtex10 % TeX extended character set (used in strings)
% already defined above
\fontdimen7\tentex=0pt % no extra space after punctuation
\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers
\def\|#1{\hbox{$#1$}} % one-letter identifiers look a bit better this way
\def\{\hbox{\bf#1\/}} % boldface type for reserved words
\def\.#1{\hbox{\tentex % typewriter type for strings
\let\\=\BS % backslash in a string
\let\'=\RQ % right quote in a string
\let\`=\LQ % left quote in a string
\let\{=\LB % left brace in a string
\let\}=\RB % right brace in a string
\let\~=\TL % tilde in a string
\let\ =\SP % space in a string
\let\_=\UL % underline in a string
\let\&=\AM % ampersand in a string
#1}}
\def\#{\hbox{\tt\char`\#}} % parameter sign
\def\${\hbox{\tt\char`\$}} % dollar sign
\def\%{\hbox{\tt\char`\%}} % percent sign
\def\^{\ifmmode\mathchar"222 \else\char`^ \fi} % pointer or hat
% circumflex accents can be obtained from \^^D instead of \^
\def\AT!{@} % at sign for control text
\chardef\AM=`\& % ampersand character in a string
\chardef\BS=`\\ % backslash in a string
\chardef\LB=`\{ % left brace in a string
\def\LQ{{\tt\char'22}} % left quote in a string
\chardef\RB=`\} % right brace in a string
\def\RQ{{\tt\char'23}} % right quote in a string
\def\SP{{\tt\char`\ }} % (visible) space in a string
\chardef\TL=`\~ % tilde in a string
\chardef\UL=`\_ % underline character in a string
\newdimen\pagewidth \pagewidth=6.5in % the width of each page
\newdimen\pageheight \pageheight=8.7in % the height of each page
\newdimen\fullpageheight \fullpageheight=9in % page height including headlines
\newdimen\pageshift \pageshift=0in % shift righthand pages wrt lefthand ones
\def\magnify#1{\mag=#1\pagewidth=6.5truein\pageheight=8.7truein
\fullpageheight=9truein\setpage}
\def\setpage{\hsize\pagewidth\vsize\pageheight} % use after changing page size
\def\lheader{\mainfont\the\pageno\eightrm\qquad\rhead\hfill\title\qquad
\tensy x\mainfont\topmark} % top line on left-hand pages
\def\rheader{\tensy x\mainfont\topmark\eightrm\qquad\title\hfill\rhead
\qquad\mainfont\the\pageno} % top line on right-hand pages
\def\page{\box255 }
\def\normaloutput#1#2#3{\ifodd\pageno\hoffset=\pageshift\fi
\shipout\vbox{
\vbox to\fullpageheight{
\iftitle\global\titlefalse
\else\hbox to\pagewidth{\vbox to10pt{}\ifodd\pageno #3\else#2\fi}\fi
\vfill#1}} % parameter #1 is the page itself
\global\advance\pageno by1}
\def\rhead{\.{DOCMAC} OUTPUT} % this running head is reset by starred sections
\def\title{} % an optional title can be set by the user
\def\contentspagenumber{0} % default page number for table of contents
\newif\iftitle
\def\topofcontents{\centerline{\titlefont\title}
\vfill} % this material will start the table of contents page
\def\botofcontents{\vfill} % this material will end the table of contents page
\def\contentsfile{\jobname.toc} % file that gets table of contents info
\def\readcontents{\expandafter\input \contentsfile}
\newwrite\cont
\output{\setbox0=\page % the first page is garbage
\openout\cont=\contentsfile
\global\output{\normaloutput\page\lheader\rheader}}
\setpage
\vbox to \vsize{} % the first \topmark won't be null
\def\con{%
\write\cont{} % ensure that the contents file isn't empty
\closeout\cont % the contents information has been fully gathered
\par\vfill\eject % finish the preceding page
\rightskip 0pt \hyphenpenalty 50 \tolerance 200
\setpage
\output{\normaloutput\page\lheader\rheader}
\titletrue % prepare to output the table of contents
\pageno=\contentspagenumber \def\rhead{TABLE OF CONTENTS}
\message{Table of contents:}
\topofcontents
\line{\hfil Section\hbox to3em{\hss Page}}
\def\Z##1##2##3{\line{\ignorespaces##1
\leaders\hbox to .5em{.\hfil}\hfil\ ##2\hbox to3em{\hss##3}}}
\readcontents\relax % read the contents info
\botofcontents \end} % print the contents page(s) and terminate
\let\contentspage=\con
\catcode`\@=\atcode
\catcode`\_=\uscode
\endinput
|