% Macros for The TeXbook
\catcode`@=11 % borrow the private macros of PLAIN (with care)
\font\tentex=cmtex10
\font\inchhigh=cminch
\font\titlefont=cmssdc10 at 40pt
\font\ninerm=cmr9
\font\eightrm=cmr8
\font\sixrm=cmr6
\font\ninei=cmmi9
\font\eighti=cmmi8
\font\sixi=cmmi6
\skewchar\ninei='177 \skewchar\eighti='177 \skewchar\sixi='177
\font\ninesy=cmsy9
\font\eightsy=cmsy8
\font\sixsy=cmsy6
\skewchar\ninesy='60 \skewchar\eightsy='60 \skewchar\sixsy='60
\font\eightss=cmssq8
\font\eightssi=cmssqi8
\font\ninebf=cmbx9
\font\eightbf=cmbx8
\font\sixbf=cmbx6
\font\ninett=cmtt9
\font\eighttt=cmtt8
\hyphenchar\tentt=-1 % inhibit hyphenation in typewriter type
\hyphenchar\ninett=-1
\hyphenchar\eighttt=-1
\font\ninesl=cmsl9
\font\eightsl=cmsl8
\font\nineit=cmti9
\font\eightit=cmti8
\font\tenu=cmu10 % unslanted text italic
\font\magnifiedfiverm=cmr5 at 10pt
\font\manual=manfnt % font used for the METAFONT logo, etc.
\font\cmman=cmman % font used for miscellaneous Computer Modern variations
\newskip\ttglue
\def\tenpoint{\def\rm{\fam0\tenrm}%
\textfont0=\tenrm \scriptfont0=\sevenrm \scriptscriptfont0=\fiverm
\textfont1=\teni \scriptfont1=\seveni \scriptscriptfont1=\fivei
\textfont2=\tensy \scriptfont2=\sevensy \scriptscriptfont2=\fivesy
\textfont3=\tenex \scriptfont3=\tenex \scriptscriptfont3=\tenex
\def\it{\fam\itfam\tenit}%
\textfont\itfam=\tenit
\def\sl{\fam\slfam\tensl}%
\textfont\slfam=\tensl
\def\bf{\fam\bffam\tenbf}%
\textfont\bffam=\tenbf \scriptfont\bffam=\sevenbf
\scriptscriptfont\bffam=\fivebf
\def\tt{\fam\ttfam\tentt}%
\textfont\ttfam=\tentt
\tt \ttglue=.5em plus.25em minus.15em
\normalbaselineskip=12pt
\def\MF{{\manual META}\-{\manual FONT}}%
\let\sc=\eightrm
\let\big=\tenbig
\setbox\strutbox=\hbox{\vrule height8.5pt depth3.5pt width\z@}%
\normalbaselines\rm}
\def\ninepoint{\def\rm{\fam0\ninerm}%
\textfont0=\ninerm \scriptfont0=\sixrm \scriptscriptfont0=\fiverm
\textfont1=\ninei \scriptfont1=\sixi \scriptscriptfont1=\fivei
\textfont2=\ninesy \scriptfont2=\sixsy \scriptscriptfont2=\fivesy
\textfont3=\tenex \scriptfont3=\tenex \scriptscriptfont3=\tenex
\def\it{\fam\itfam\nineit}%
\textfont\itfam=\nineit
\def\sl{\fam\slfam\ninesl}%
\textfont\slfam=\ninesl
\def\bf{\fam\bffam\ninebf}%
\textfont\bffam=\ninebf \scriptfont\bffam=\sixbf
\scriptscriptfont\bffam=\fivebf
\def\tt{\fam\ttfam\ninett}%
\textfont\ttfam=\ninett
\tt \ttglue=.5em plus.25em minus.15em
\normalbaselineskip=11pt
\def\MF{{\manual hijk}\-{\manual lmnj}}%
\let\sc=\sevenrm
\let\big=\ninebig
\setbox\strutbox=\hbox{\vrule height8pt depth3pt width\z@}%
\normalbaselines\rm}
\def\eightpoint{\def\rm{\fam0\eightrm}%
\textfont0=\eightrm \scriptfont0=\sixrm \scriptscriptfont0=\fiverm
\textfont1=\eighti \scriptfont1=\sixi \scriptscriptfont1=\fivei
\textfont2=\eightsy \scriptfont2=\sixsy \scriptscriptfont2=\fivesy
\textfont3=\tenex \scriptfont3=\tenex \scriptscriptfont3=\tenex
\def\it{\fam\itfam\eightit}%
\textfont\itfam=\eightit
\def\sl{\fam\slfam\eightsl}%
\textfont\slfam=\eightsl
\def\bf{\fam\bffam\eightbf}%
\textfont\bffam=\eightbf \scriptfont\bffam=\sixbf
\scriptscriptfont\bffam=\fivebf
\def\tt{\fam\ttfam\eighttt}%
\textfont\ttfam=\eighttt
\tt \ttglue=.5em plus.25em minus.15em
\normalbaselineskip=9pt
\def\MF{{\manual opqr}\-{\manual stuq}}%
\let\sc=\sixrm
\let\big=\eightbig
\setbox\strutbox=\hbox{\vrule height7pt depth2pt width\z@}%
\normalbaselines\rm}
\def\tenmath{\tenpoint\fam-1 } % use after $ in ninepoint sections
\def\tenbig#1{{\hbox{$\left#1\vbox to8.5pt{}\right.\n@space$}}}
\def\ninebig#1{{\hbox{$\textfont0=\tenrm\textfont2=\tensy
\left#1\vbox to7.25pt{}\right.\n@space$}}}
\def\eightbig#1{{\hbox{$\textfont0=\ninerm\textfont2=\ninesy
\left#1\vbox to6.5pt{}\right.\n@space$}}}
% Page layout
\newdimen\pagewidth \newdimen\pageheight \newdimen\ruleht
\hsize=29pc \vsize=44pc \maxdepth=2.2pt \parindent=3pc
\pagewidth=\hsize \pageheight=\vsize \ruleht=.5pt
\abovedisplayskip=6pt plus 3pt minus 1pt
\belowdisplayskip=6pt plus 3pt minus 1pt
\abovedisplayshortskip=0pt plus 3pt
\belowdisplayshortskip=4pt plus 3pt
%\newinsert\footins
\def\footnote#1{\edef\@sf{\spacefactor\the\spacefactor}#1\@sf
\insert\footins\bgroup\eightpoint
\interlinepenalty100 \let\par=\endgraf
\leftskip=\z@skip \rightskip=\z@skip
\splittopskip=10pt plus 1pt minus 1pt \floatingpenalty=20000
\smallskip\item{#1}\bgroup\strut\aftergroup\@foot\let\next}
\skip\footins=12pt plus 2pt minus 4pt % space added when footnote is present
%\count\footins=1000 % footnote magnification factor (1 to 1)
\dimen\footins=30pc % maximum footnotes per page
\newinsert\margin
\dimen\margin=\maxdimen
%\count\margin=0 \skip\margin=0pt % marginal inserts take up no space
\newif\iftitle
\def\titlepage{\global\titletrue} % for pages without headlines
\def\rhead{} % \rhead contains the running headline
\def\leftheadline{\hbox to \pagewidth{%
\vbox to 10pt{}% strut to position the baseline
\llap{\tenbf\folio\kern1pc}% folio to left of text
\tenit\rhead\hfil% running head flush left
}}
\def\rightheadline{\hbox to \pagewidth{%
\vbox to 10pt{}% strut to position the baseline
\hfil\tenit\rhead\/% running head flush right
\rlap{\kern1pc\tenbf\folio}% folio to right of text
}}
\def\onepageout#1{\shipout\vbox{ % here we define one page of output
\offinterlineskip % butt the boxes together
\vbox to 3pc{ % this part goes on top of the 44pc pages
\iftitle % the next is used for title pages
\global\titlefalse % reset the titlepage switch
\setcornerrules % for camera alignment
\else\ifodd\pageno \rightheadline\else\leftheadline\fi\fi
\vfill} % this completes the \vbox to 3pc
\vbox to \pageheight{
\ifvoid\margin\else % marginal info is present
\rlap{\kern31pc\vbox to\z@{\kern4pt\box\margin \vss}}\fi
#1 % now insert the main information
\ifvoid\footins\else % footnote info is present
\vskip\skip\footins \kern-3pt
\hrule height\ruleht width\pagewidth \kern-\ruleht \kern3pt
\unvbox\footins\fi
\boxmaxdepth=\maxdepth
} % this completes the \vbox to \pageheight
}
\advancepageno}
\def\setcornerrules{\hbox to \pagewidth{\vrule width 1pc height\ruleht
\hfil \vrule width 1pc}
\hbox to \pagewidth{\llap{\sevenrm(page \folio)\kern1pc}%
\vrule height1pc width\ruleht depth\z@
\hfil \vrule width\ruleht depth\z@}}
\output{\onepageout{\unvbox255}}
\newbox\partialpage
\def\begindoublecolumns{\begingroup
\output={\global\setbox\partialpage=\vbox{\unvbox255\bigskip}}\eject
\output={\doublecolumnout} \hsize=14pc \vsize=89pc}
\def\enddoublecolumns{\output={\balancecolumns}\eject
\endgroup \pagegoal=\vsize}
\def\doublecolumnout{\splittopskip=\topskip \splitmaxdepth=\maxdepth
\dimen@=44pc \advance\dimen@ by-\ht\partialpage
\setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
\onepageout\pagesofar
\unvbox255 \penalty\outputpenalty}
\def\pagesofar{\unvbox\partialpage
\wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}}
\def\balancecolumns{\setbox0=\vbox{\unvbox255} \dimen@=\ht0
\advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip
\divide\dimen@ by2 \splittopskip=\topskip
{\vbadness=10000 \loop \global\setbox3=\copy0
\global\setbox1=\vsplit3 to\dimen@
\ifdim\ht3>\dimen@ \global\advance\dimen@ by1pt \repeat}
\setbox0=\vbox to\dimen@{\unvbox1}
\setbox2=\vbox to\dimen@{\unvbox3}
\pagesofar}
% To produce only a subset of pages, put the page numbers on separate
% lines in a file called pages.tex
\let\Shipout=\shipout
\newread\pages \newcount\nextpage \openin\pages=pages
\def\getnextpage{\ifeof\pages\else
{\endlinechar=-1\read\pages to\next
\ifx\next\empty % in this case we should have eof now
\else\global\nextpage=\next\fi}\fi}
\ifeof\pages\else\message{OK, I'll ship only the requested pages!}
\getnextpage\fi
\def\shipout{\ifeof\pages\let\next=\Shipout
\else\ifnum\pageno=\nextpage\getnextpage\let\next=\Shipout
\else\let\next=\Tosspage\fi\fi \next}
\newbox\garbage \def\Tosspage{\deadcycles=0\setbox\garbage=}
% Chapter formatting
% The preface and table of contents are formatted in place, not here
\newcount\exno % for the number of exercises in the current chapter
\newcount\subsecno % for the number of subsections in the current chapter
\def\beginchapter#1 #2#3. #4\par{\global\exno=0
\subsecno=0
\def\chapno{#2#3}
\ifodd\pageno
\errmessage{You had too much text on that last page; I'm backing up}
\advance\pageno by-1 \fi
\titlepage
\def\\{ } % \\'s in the title will be treated as spaces
\message{#1 #2#3:} % show the chapter title on the terminal
\def\MF{{\manual 89:;<=>:}} % slant the logo
\xdef\rhead{#1 #2#3: #4\unskip}
{\def\TeX{T\kern-.2em\lower.5ex\hbox{E}\kern-.06em X}
\def\MF{{\vbox to30pt{}\manual ()*+,-.*}}
\def\\{#3}
\ifx\empty\\ \rightline{\inchhigh #2\kern-.04em}
\else\rightline{\inchhigh #2\kern-.06em#3\kern-.04em}\fi
\vskip 1.75pc
\baselineskip 36pt \lineskiplimit \titlelsl \lineskip 12pt
\let\\=\cr % now the \\'s are line dividers
\halign{\line{\titlefont\hfil##}\\#4\unskip\\}
\vfill\eject} % output the chapter title page
\tenpoint
\noindent\ignorespaces} % the first paragraph of a chapter is not indented
\newdimen\titlelsl \titlelsl=1pt
\outer\def\endchapter{\ifodd\pageno \else\vfill\eject\null\fi
\begingroup\bigskip\vfill % beginning of the quotes
\def\eject{\endgroup\eject}
\def\par{\ifhmode\/\endgraf\fi}\obeylines
\def\TeX{T\kern-.2em\lower.5ex\hbox{E}\kern-.000em X}
\def\MF{{\manual opqr}\-{\manual stuq}}
\eightpoint \let\tt=\ninett
\baselineskip 10pt
\parfillskip \z@
\interlinepenalty 10000
\leftskip \z@ plus 40pc minus \parindent
\let\rm=\eightss \let\sl=\eightssi
\everypar{\sl}}
\def\author#1(#2){\smallskip\noindent\rm--- #1\unskip\enspace(#2)}
\def\dbend{{\manual\char127}} % dangerous bend sign
\def\d@nger{\medbreak\begingroup\clubpenalty=10000
\def\par{\endgraf\endgroup\medbreak} \noindent\hang\hangafter=-2
\hbox to0pt{\hskip-\hangindent\dbend\hfill}\ninepoint}
\outer\def\danger{\d@nger}
\def\dd@nger{\medbreak\begingroup\clubpenalty=10000
\def\par{\endgraf\endgroup\medbreak} \noindent\hang\hangafter=-2
\hbox to0pt{\hskip-\hangindent\dbend\kern1pt\dbend\hfill}\ninepoint}
\outer\def\ddanger{\dd@nger}
\def\enddanger{\endgraf\endgroup} % omits the \medbreak
\outer\def\subsection#1. {\medbreak\advance\subsecno by 1
\noindent{\it \the\subsecno.\enspace#1.\enspace}}
\def\ansno#1.#2:{\medbreak\noindent
\hbox to\parindent{\bf\hss#1.#2.\enspace}\ignorespaces}
% Composition macros
\hyphenation{man-u-script man-u-scripts ap-pen-dix xscaled}
\def\AmSTeX{$\cal A\kern-.1667em\lower.5ex\hbox{$\cal M$}\kern-.075em
S$-\TeX}
\def\bull{\vrule height .9ex width .8ex depth -.1ex } % square bullet
\def\SS{{\it SS}} % scriptscript style
\def\|{\leavevmode\hbox{\tt\char`\|}} % vertical line
\def\dn{\leavevmode\hbox{\tt\char'14}} % downward arrow
\def\up{\leavevmode\hbox{\tt\char'13}} % upward arrow
\def\]{\leavevmode\hbox{\tt\char`\ }} % visible space
\def\pt{\,{\rm pt}} % units of points, in math formulas
\def\em{\,{\rm em}} % units of ems, in math formulas
\def\<#1>{\leavevmode\hbox{$\langle$#1\/$\rangle$}} % syntactic quantity
\def\oct#1{\hbox{\rm\'{}\kern-.2em\it#1\/\kern.05em}} % octal constant
\def\hex#1{\hbox{\rm\H{}\tt#1}} % hexadecimal constant
\def\cstok#1{\leavevmode\thinspace\hbox{\vrule\vtop{\vbox{\hrule\kern1pt
\hbox{\vphantom{\tt/}\thinspace{\tt#1}\thinspace}}
\kern1pt\hrule}\vrule}\thinspace} % control sequence token
{\obeyspaces\gdef {\ }}
\def\parbreak{\hfil\break\indent\strut}
\def\stretch{\nobreak\hskip0pt plus2pt\relax}
% macros for non-centered displays
\outer\def\begindisplay{\obeylines\startdisplay}
{\obeylines\gdef\startdisplay#1
{\catcode`\^^M=5$$#1\halign\bgroup\indent##\hfil&&\qquad##\hfil\cr}}
\outer\def\enddisplay{\crcr\egroup$$}
% (the following \begin...\end-type macros do not appear in Appendix E)
% macros for demonstrating math constructions
\outer\def\beginmathdemo{$$\advance\baselineskip by2pt
\halign\bgroup\indent\hbox to 160pt{##\hfil}&$##$\hfil\cr\noalign{\vskip-2pt}}
\outer\def\begindisplaymathdemo {$$\advance\baselineskip by15pt
\halign\bgroup\indent\hbox to 160pt{##\hfil}&$\displaystyle{##}$\hfil\cr
\noalign{\vskip-15pt}}
\outer\def\beginlongmathdemo{$$\advance\baselineskip by2pt
\halign\bgroup\indent\hbox to 210pt{##\hfil}&$##$\hfil\cr\noalign{\vskip-2pt}}
\outer\def\beginlongdisplaymathdemo {$$\advance\baselineskip by15pt
\halign\bgroup\indent\hbox to 210pt{##\hfil}&$\displaystyle{##}$\hfil\cr
\noalign{\vskip-15pt}}
\outer\def\endmathdemo{\egroup$$}
% macros for font tables
\def\oddline#1{\cr
\noalign{\nointerlineskip}
\multispan{19}\hrulefill&
\setbox0=\hbox{\lower 2.3pt\hbox{\hex{#1x}}}\smash{\box0}\cr
\noalign{\nointerlineskip}}
\def\evenline{\cr\noalign{\hrule}}
\def\chartstrut{\lower4.5pt\vbox to14pt{}}
\def\beginchart#1{$$\postdisplaypenalty=-10000 \global\count@=0 #1
\halign to\hsize\bgroup
\chartstrut##\tabskip0pt plus10pt&
&\hfil##\hfil&\vrule##\cr
\lower6.5pt\null
&&&\oct0&&\oct1&&\oct2&&\oct3&&\oct4&&\oct5&&\oct6&&\oct7&\evenline}
\def\endchart{\raise11.5pt\null&&&\hex 8&&\hex 9&&\hex A&&\hex B&
&\hex C&&\hex D&&\hex E&&\hex F&\cr\egroup$$}
\def\:{\setbox0=\hbox{\char\count@}%
\ifdim\ht0>7.5pt\reposition
\else\ifdim\dp0>2.5pt\reposition\fi\fi
\box0\global\advance\count@ by1 }
\def\reposition{\setbox0=\hbox{$\vcenter{\kern2pt\box0\kern2pt}$}}
\def\normalchart{%
&\oct{00x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline0
&\oct{01x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
&\oct{02x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline1
&\oct{03x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
&\oct{04x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline2
&\oct{05x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
&\oct{06x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline3
&\oct{07x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
&\oct{10x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline4
&\oct{11x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
&\oct{12x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline5
&\oct{13x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
&\oct{14x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline6
&\oct{15x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
&\oct{16x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline7
&\oct{17x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline}
% (now Appendix E resumes again)
% macros for verbatim scanning
\chardef\other=12
\def\ttverbatim{\begingroup
\catcode`\\=\other
\catcode`\{=\other
\catcode`\}=\other
\catcode`\$=\other
\catcode`\&=\other
\catcode`\#=\other
\catcode`\%=\other
\catcode`\~=\other
\catcode`\_=\other
\catcode`\^=\other
\obeyspaces \obeylines \tt}
\outer\def\begintt{$$\let\par=\endgraf \ttverbatim \parskip=\z@
\catcode`\|=0 \rightskip-5pc \ttfinish}
{\catcode`\|=0 |catcode`|\=\other % | is temporary escape character
|obeylines % end of line is active
|gdef|ttfinish#1^^M#2\endtt{#1|vbox{#2}|endgroup$$}}
\catcode`\|=\active
{\obeylines \gdef|{\ttverbatim \spaceskip\ttglue \let^^M=\ \let|=\endgroup}}
% macros for syntax rules (again, not in Appendix E)
\def\[#1]{\silenttrue\xref|#1|\thinspace{\tt#1}\thinspace} % keyword in syntax
\def\beginsyntax{\endgraf\nobreak\medskip
\begingroup \catcode`<=13 \catcode`[=13
\let\par=\endsyntaxline \obeylines}
\def\endsyntaxline{\futurelet\next\syntaxswitch}
\def\syntaxswitch{\ifx\next\<\let\next=\syntaxrule
\else\ifx\next\endsyntax\let\next=\endgroup
\else\let\next=\continuerule\fi\fi \next}
\def\continuerule{\hfil\break\indent\qquad}
\def\endsyntax{\medbreak\noindent}
{\catcode`<=13 \catcode`[=13
\global\let<=\< \global\let[=\[
\gdef\syntaxrule<#1>{\endgraf\indent\silentfalse\xref\<#1>}}
\def\is{\ $\longrightarrow$ }
\def\alt{\ $\vert$ }
% macros to demarcate lines quoted from TeX source files
\def\beginlines{\par\begingroup\nobreak\medskip\parindent\z@ \obeylines
\hrule\kern1pt\nobreak \everypar{\strut}}
\def\endlines{\kern1pt\hrule\endgroup\medbreak\noindent}
\def\weakendlines{\kern1pt\hrule\endgroup\medskip\noindent}
\def\finalendlines{\kern1pt\hrule\endgroup\medbreak}
\outer\def\exercise{\medbreak
\global\advance\exno by 1
\noindent\llap{\manual\char'170\rm\kern.15em}% triangle in margin
{\ninebf EXERCISE \bf\chapno.\the\exno}\par\nobreak\noindent}
\def\dexercise{\global\advance\exno by 1
\llap{\manual\char'170\rm\kern.15em}% triangle in indented space
{\eightbf EXERCISE \bf\chapno.\the\exno}\hfil\break}
\outer\def\dangerexercise{\d@nger \dexercise}
\outer\def\ddangerexercise{\dd@nger \dexercise}
\newwrite\ans
\immediate\openout\ans=answers % file for answers to exercises
\outer\def\answer{\par\medbreak
\immediate\write\ans{}
\immediate\write\ans{\string\ansno\chapno.\the\exno:}
\copytoblankline}
\def\copytoblankline{\begingroup\setupcopy\copyans}
\def\setupcopy{\def\do##1{\catcode`##1=\other}\dospecials
\catcode`\|=\other \obeylines}
{\obeylines \gdef\copyans#1
{\def\next{#1}%
\ifx\next\empty\let\next=\endgroup %
\else\immediate\write\ans{\next} \let\next=\copyans\fi\next}}
% Editorial notes: some things to watch for.
% f |\ and f ^|\ => insert \/ [e.g., if\/ |\hbox|...]
% appendi => check for \null [e.g., Appendix~B\null.]
% ly- => the hyphen is probably omittable
% ''. and '', => transpose to .'' and ,''
% dgement => dgment
% in MFbook: f@' and \MF, and \MF.
% Macros for drawing figures (not in Appendix E)
\def\hidehrule#1#2{\kern-#1\hrule height#1 depth#2 \kern-#2 }
\def\hidevrule#1#2{\kern-#1{\dimen0=#1
\advance\dimen0 by#2\vrule width\dimen0}\kern-#2 }
% \makeblankbox puts rules at the edges of a blank box
% whose dimensions are those of \box0 (assuming nonnegative wd,ht,dp)
% #1 is rule thickness outside, #2 is rule thickness inside
\def\makeblankbox#1#2{\hbox{\lower\dp0\vbox{\hidehrule{#1}{#2}%
\kern-#1% overlap the rules at the corners
\hbox to\wd0{\hidevrule{#1}{#2}%
\raise\ht0\vbox to #1{}% set the vrule height
\lower\dp0\vtop to #1{}% set the vrule depth
\hfil\hidevrule{#2}{#1}}%
\kern-#1\hidehrule{#2}{#1}}}}
\def\maketypebox{\makeblankbox{0pt}{1pt}}
\def\makelightbox{\makeblankbox{.2pt}{.2pt}}
% \box\bigdot is a null box with a bullet at its reference point
\newbox\bigdot \newbox\smalldot
\setbox0=\hbox{$\vcenter{}$} % \ht0 is the axis height
\setbox1=\hbox to\z@{$\hss\bullet\hss$} % bullet is centered on the axis
\setbox\bigdot=\vbox to\z@{\kern-\ht1 \kern\ht0 \box1 \vss}
\setbox1=\hbox to\z@{$\hss\cdot\hss$} % cdot is centered on the axis
\setbox\smalldot=\vbox to\z@{\kern-\ht1 \kern\ht0 \box1 \vss}
% \arrows makes things like <--- text --->
\def\arrows#1#2{% #1=width, #2=text
{\setbox0=\hbox{$\mkern-2mu\mathord-\mkern-2mu$}
\hbox to #1{\kern-.055556em$\leftarrow\mkern-6mu$%
\cleaders\copy0\hfil
\kern.4em #2\kern.4em
\cleaders\copy0\hfil
$\mkern-6mu\rightarrow$\kern-.055556em}}}
% \samplebox makes the outline of a box, with big dot at reference point
\def\samplebox#1#2#3#4{% #1=ht, #2=dp, #3=wd, #4=text
{\setbox0=\vtop{\vbox to #1{\hbox to #3{}\vss}
\nointerlineskip
\vbox to #2{}}% now \box0 has the desired ht, dp, and wd
\hbox{\copy\bigdot
\vrule height.2pt depth.2pt width#3%
\kern-#3%
\makelightbox
\kern-#3%
\raise#1\vbox{\hbox to #3{\hss#4\hss}
\kern 3pt}}}}
% \sampleglue makes glue between sample boxes
\newdimen\varunit
\varunit=\hsize \advance\varunit by-2\parindent
\divide\varunit by 58 % illustrations in Chapter 12
\def\sampleglue#1#2{% #1=width, #2=text
\vtop{\hbox to #1{\xleaders\hbox to .5\varunit{\hss\copy\smalldot\hss}\hfil}
\kern3pt
\tabskip \z@ plus 1fil
\halign to #1{\hfil##\cr#2\cr}}}
% Indexing macros
\newif\ifproofmode
\proofmodetrue % this should be false when making camera-ready copy
\newwrite\inx
\immediate\openout\inx=index % file for index reminders
\newif\ifsilent
\def\specialhat{\ifmmode\def\next{^}\else\let\next=\beginxref\fi\next}
\def\beginxref{\futurelet\next\beginxrefswitch}
\def\beginxrefswitch{\ifx\next\specialhat\let\next=\silentxref
\else\silentfalse\let\next=\xref\fi \next}
\catcode`\^=\active \let ^=\specialhat
\def\silentxref^{\silenttrue\xref}
\def\marginstyle{\vrule height6pt depth2pt width\z@ \sevenrm}
\chardef\bslash=`\\
\def\xref{\futurelet\next\xrefswitch}
\def\xrefswitch{\begingroup
\ifx\next|\aftergroup\vxref % case 1 or 2, |arg| or |\arg|
\else\ifx\next\<\aftergroup\anglexref % case 3, "\<arg>" means angle brackets
\else\aftergroup\normalxref \fi\fi\endgroup} % case 0, "{arg}"
\def\vxref|{\catcode`\\=\active \futurelet\next\vxrefswitch}
\def\vxrefswitch#1|{\catcode`\\=0
\ifx\next\empty\def\xreftype{2}%
\def\next{{\tt\bslash\text}}% type 2, |\arg|
\else\def\xreftype{1}\def\next{{\tt\text}}\fi % type 1, |arg|
\edef\text{#1}\makexref}
{\catcode`\|=0 \catcode`\\=\active |gdef\{}}
\def\anglexref\<#1>{\def\xreftype{3}\def\text{#1}%
\def\next{\<\text>}\makexref}
\def\normalxref#1{\def\xreftype{0}\def\text{#1}\let\next=\text\makexref}
\def\makexref{\ifproofmode\insert\margin{\hbox{\marginstyle\text}}%
\xdef\writeit{\write\inx{\text\space!\xreftype\space
\noexpand\number\pageno.}}\writeit
\else\ifhmode\kern\z@\fi\fi
\ifsilent\ignorespaces\else\next\fi}
% the \insert (which is done in proofmode only) suppresses hyphenation,
% so the \kern\z@ is put in to give the same effect in non-proofmode.
% Internal cross references that may change
\def\sesame{61} % page number for Sesame Street quote
\def\bmiexno{20} % exercise number for bold math italic
\def\punishexno{1} % exercise number for `punishment'
\def\fracexno{6} % exercise number for `\frac'
\def\vshippage{31} % error message from `\vship'
\def\storypage{24} % listing of story.tex
\def\metaT{4} % exercise number for T of METAFONT
\def\xwhat{2} % exercise number for x3:=whatever
\def\Xwhat{2} % exercise number for whatever itself
\def\checkequals#1#2{\ifnum#1=#2\else
\errmessage{Redefine \string#1 to be \the#2}\fi}
% Things for The METAFONTbook only
\ifx\MFmanual\!\else\endinput\fi
\def\!{\kern-.03em\relax}
\def\frac#1/#2{\leavevmode\kern.1em
\raise.5ex\hbox{\the\scriptfont0 #1}\kern-.1em
/\kern-.15em\lower.25ex\hbox{\the\scriptfont0 #2}}
\outer\def\displayfig #1 (#2){$$\advance\abovedisplayskip by 3pt
\leftline{\indent\figbox{#1}{3in}{#2}\vbox}$$}
\def\rightfig #1 (#2 x #3) ^#4 {% #2 wide and #3 deep, raised #4
\strut\vadjust{\setbox0=\vbox to 0pt{\vss
\hbox to\pagewidth{\hfil
\raise #4\figbox{#1}{#2}{#3}\vtop \quad}}
\dp0=0pt \box0}}
\def\figbox#1#2#3#4{#4to#3{ % makes a box #2 wide and #3 deep
\ifproofmode\kern0pt\hrule\vfill
\hsize=#2 \baselineskip 6pt \fiverm\noindent\raggedright
(Figure #1 will be inserted here; too bad you can't see it now.)
\endgraf\vfill\hrule
\else\vfill\hbox to#2{}\fi}}
\def\endsyntax{\begingroup\let\par=\endgraf\medbreak\endgroup\noindent}
\let\BEGINCHAPTER=\beginchapter
\def\beginchapter{\titlelsl=1pt \BEGINCHAPTER}
\def\beginChapter{\titlelsl=2pt \BEGINCHAPTER}
\def\decreasehsize #1 {\advance\hsize-#1}
\def\restorehsize{\hsize=\pagewidth}
\catcode`\@=\active
\catcode`\"=\active
\def\ttverbatim{\begingroup \catcode`\@=\other \catcode`\"=\other
\catcode`\\=\other
\catcode`\{=\other
\catcode`\}=\other
\catcode`\$=\other
\catcode`\&=\other
\catcode`\#=\other
\catcode`\%=\other
\catcode`\~=\other
\catcode`\_=\other
\catcode`\^=\other
\obeyspaces \obeylines \tt}
\def\setupcopy{\def\do##1{\catcode`##1=\other}\dospecials
\catcode`\|=\other \catcode`\@=\other \catcode`\"=\other \obeylines}
\def\_{\leavevmode \kern.06em \vbox{\hrule width.3em}}
\def@#1@{\begingroup\def\_{\kern.04em
\vbox{\hrule width.3em height .6pt}\kern.08em}%
\ifmmode\mathop{\bf#1}\else\hbox{\bf#1\/}\fi\endgroup}
\def"#1"{\hbox{\it#1\/\kern.05em}} % italic type for identifiers
\def\xrefswitch{\begingroup
\ifx\next|\aftergroup\vxref % case 1, |arg| or |\arg|
\else\ifx\next@\aftergroup\boldxref % case 2, "@arg@" means boldface
\else\ifx\next"\aftergroup\italxref % case 4, ""arg"" means boldface
\else\ifx\next\<\aftergroup\anglexref % case 3, "\<arg>" means angle brackets
\else\aftergroup\normalxref \fi\fi\fi\fi\endgroup} % case 0, "{arg}"
\def\boldxref@#1@{\def\xreftype{2}\def\text{#1}%
\def\next{@\text@}\makexref}
\def\italxref"#1"{\def\xreftype{4}\def\text{#1}%
\def\next{"\text"}\makexref}
\def\pyth+{\mathbin{++}}
\def\0{\raise.7ex\hbox{$\scriptstyle\#$}}
\def\to{\mathrel{\ldotp\ldotp}}
\def\dashto{\mathrel{\hbox{-\thinspace-\kern-.05em}}}
\def\ddashto{\mathrel{\hbox{-\thinspace-\thinspace-\kern-.05em}}}
\def\round{\mathop{\rm round}}
\def\angle{\mathop{\rm angle}}
\def\rmsqrt{\mathop{\rm sqrt}}
\def\reverse{\mathop{\rm reverse}}
\def\curl{\mathop{\rm curl}}
\def\tension{\mathop{\rm tension}}
\def\atleast{\mathop{\rm atleast}}
\def\controls{\mathop{\rm controls}}
\def\and{\,{\rm and}\,}
\def\cycle{{\rm cycle}}
\def\pickup{@pickup@ \thinspace}
\def\penpos#1{\hbox{\it penpos}_{#1}}
\def\pentaper#1{\hbox{\it pentaper}_{#1}}
\chardef\hexa=1 % first hex
\chardef\hexb=2 % top and bot adjusted
\chardef\hexc=3 % same, bold
\chardef\hexd=4 % same, confined to box
\chardef\hexe=5 % penstroked hex
\chardef\Aa=6 % stick-figure A, golden ratio
\def\sevenAs{\char7\char8\char9\char10\char11\char12\char13} % same, variants
\chardef\Az=14 % same, with crooked bar
\chardef\Ab=15 % \Aa with rectilinear elliptical pen
\chardef\Ac=16 % same, with the ellipse tilted
\chardef\beana=17 % kidney bean, default pen
\chardef\beanb=18 % same, twice as bold
\chardef\beanc=19 % same, rectilinear elliptical pen
\chardef\beand=20 % same, with the ellipse tilted
\chardef\niba=21 % 10x rectilinear ellipse
\chardef\nibb=22 % same, with the ellipse tilted
\chardef\nibc=23 % same, 90 degrees titled
\chardef\IOT=24 % Ionian T
\chardef\IOS=25 % Ionian S
\chardef\IOO=26 % Ionian O
\chardef\IOI=27 % Ionian I
\chardef\cubea=28 % possible cube
\chardef\cubeb=29 % impossible cube
\chardef\bicentennial=30 % star with overlapping strokes
\chardef\oneu=31 % 1/4 of uuuu ornament
\chardef\circa=32 % quartercircle
\chardef\circb=33 % filled quartercircle
\chardef\circc=34 % rotated quartercircle
\chardef\circd=35 % cone
\chardef\circe=36 % concentric circles
\chardef\circf=37 % concentric diamonds
\chardef\fouru=38 % uuuu ornament
\chardef\fourc=39 % same, rotated
\chardef\seventh='140 % 1/7, to go with cmssqi8
\newdimen\apspix
\apspix=31448sp % 8 APS pixels = 52413.64sp, and I'm taking 60% of this
% to crude approximation, there are about 2\apspix per pt
\newdimen\blankpix \newdimen\Blankpix
\setbox0=\hbox{\manual P} \blankpix=\wd0 % approximately 1pt blank pixel
\setbox0=\hbox{\manual R} \Blankpix=\wd0 % approximately 3pt blank pixel
\def\leftheadline{\hbox to \pagewidth{%
\vbox to 10pt{}% strut to position the baseline
\llap{\tenbf\folio\kern1pc}% folio to left of text
\def\MF{{\manual 89:;<=>:}}% slanted 10pt
\tenit\rhead\hfil% running head flush left
}}
\def\rightheadline{\hbox to \pagewidth{%
\vbox to 10pt{}% strut to position the baseline
\def\MF{{\manual 89:;<=>:}}% slanted 10pt
\hfil\tenit\rhead\/% running head flush right
\rlap{\kern1pc\tenbf\folio}% folio to right of text
}}
\def\ttok#1{\leavevmode\thinspace\hbox{\vrule\vtop{\vbox{\hrule\kern1pt
\hbox{\vphantom{\tt(j}\thinspace{\tt#1}\thinspace}}
\kern1pt\hrule}\vrule}\thinspace} % token
\newdimen\tinypix \setbox0=\hbox{\sixrm0} \tinypix=5pt
\newdimen\pixcorr \pixcorr=\tinypix \advance\pixcorr by-\wd0
\def\pixpat#1#2#3#4{\vcenter{\sixrm\baselineskip=\tinypix
\hbox{#1\kern\pixcorr#2}\hbox{#3\kern\pixcorr#4}}}
\font\rand=random
|