\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