% macros for the appendix to "Errors of TeX" paper
\input manmac
\voffset=-.3in
\catcode`\^=7 % disable the indexing stuff
\font\sltt=cmsltt9
\font\logosl=logosl9
\ninepoint
\vsize=48pc \pageheight=\vsize
\hsize=33.5pc

\def\\{\bgroup\catcode`_=\active\identifier}
{\catcode`_=\active \global\let_=\_}
\def\identifier#1{\hbox{\it#1\/\kern.05em}\egroup} % italic type for identifiers

\newdimen\codesize \setbox0=\hbox{\enspace M} \codesize=\wd0
\setbox0=\hbox{\thinspace\S1111\kern\codesize} \rightskip=\wd0
\newdimen\itemnosize \setbox0=\hbox{\bf999} \itemnosize=\wd0
\setbox0=\hbox{$999\mapsto{}$\kern\itemnosize\enspace} \parindent=\wd0
\newdimen\datemar \setbox0=\hbox{\bf 15 Mar 1977}
\datemar=\hsize \advance\datemar-\wd0 \divide\datemar2
\newdimen\hangamount \hangamount=\parindent \advance\hangamount 1em
\everypar{\global\hangindent=\hangamount}
\parfillskip=-\rightskip
\finalhyphendemerits=0
\interlinepenalty=100
\smallskipamount=3pt plus 2pt
\def\smallbreak{\fin\penalty-50\smallskip}

\newbox\predec % for predecessor "mapsto" info
\newbox\code   % for the code letter
\newbox\texsec % for TeX section numbers
\newbox\cbox   % the symbol used on commentlines
\newbox\dbox   % empty box used after datelines
\setbox\dbox=\hbox to\datemar{}
\setbox\cbox=\hbox to\itemnosize{\hfil$\bullet$}

\newif\ifnothing \newif\ifnobreak
\def\fin{\ifnothing\nothingfalse\else\endgroup
 \unskip\nobreak\hfil\penalty500\enspace\null\nobreak\hfil\box\texsec
 \box\code\endgraf\ifnobreak\nobreakfalse\nobreak\fi\fi}

\catcode`\	=12 % tabs are ordinary characters
\catcode`@=\active  % @ signs denote a TeX section reference
{\obeylines \gdef@#1
 {\global\setbox\texsec=\hbox{\S$#1$}\lookahead}}
\chardef\@=`\@
{\catcode`X=\active \gdef X{\X}}
\def\X{{\eightbf X}}
\def\lightX{\hbox{\eightrm X}}
\def\>#1\relax{\global\setbox\predec=\hbox{\let\X=\lightX
  $#1\mapsto{}$}} % previous bug ref

\def\checkvalid#1{\expandafter\ifx\csname#1!\endcsname\okay\else\invalidcode\fi}
\def\okay{\okay}
\def\makevalid#1{\expandafter\let\csname#1!\endcsname=\okay}
\makevalid A % algorithm
\makevalid B % blunder
\makevalid C % cleanup
\makevalid D % data structure
\makevalid E % efficiency
\makevalid F % forgotten case
\makevalid G % generalization
\makevalid I % interaction
\makevalid L % language
\makevalid M % mismatch
\makevalid P % program organization
\makevalid Q % quality
\makevalid R % robustness
\makevalid S % surprise
\makevalid T % typo

\def\lookahead{\futurelet\next\looky} % we'll do this at end of every line
\def\looky{\if\next	\let\cont\continuationline % tab mark
  \else\if\next*\let\cont\dateline % asterisk
  \else\if\next##\let\cont\commentline % sharp sign
  \else\if\next\relax\let\cont\endit % \relax (gets us out)
  \else\let\cont\dataline\fi\fi\fi\fi\cont} % otherwise should be a code letter
\def\continuationline	{ } % insert space if a tab mark starts the next line
\def\dateline* {\smallbreak\begingroup\bf\hfill\nobreaktrue
  \global\setbox\code=\copy\dbox}
\def\dataline#1{\fin\checkvalid#1%
  \global\setbox\code=\hbox to\codesize{\enspace
   \hskip0pt plus 3fil\rm#1\hskip0pt plus1fil}%
  \begingroup\rm\catcode`X=\active\itemnumber}
\def\itemnumber#1.{\catcode`X=11\setbox0=\hbox to\itemnosize{\bf\hss#1\relax}%
  \setbox2=\hbox{\bf#1\relax}\ifdim\wd2>\wd0 \setbox0=\box2 \fi
  \textindent{\hfil\box\predec\box0}}
\def\commentline{\fin\afterassignment\begincomment\let\next}
\def\begincomment{\begingroup\let\tt=\sltt
  \let\MF=\slMF\sl\textindent{\hfil\copy\cbox}}

\def\leftheadline{\hbox to \hsize{%
    \vbox to 10pt{}% strut to position the baseline
    {\tenrm\folio\kern1pc}% folio to left of text
    \hfil\eightrm D. \ E. \ KNUTH\hfil% running head 
    }}
\def\rightheadline{\hbox to \hsize{%
    \vbox to 10pt{}% strut to position the baseline
    \hfil\eightrm THE \ ERRORS \ OF \ \TeX\hfil% running head 
    {\kern1pc\tenrm\folio}% folio to right of text
    }}

\def\O#1{\hbox{\rm\char'23\kern-.2em\it#1\/\kern.05em}} % octal constant
\def\slMF{{\logosl META}\-{\logosl FONT}}

\def\endit{\fin\catcode`\^^M=5\let\par=\endgraf}
\let\par=\lookahead \obeylines \nothingtrue
