home *** CD-ROM | disk | FTP | other *** search
/ Atari FTP / ATARI_FTP_0693.zip / ATARI_FTP_0693 / Tex / Tex29 / StTeXmac.zoo / macros / manmac.tex < prev    next >
Text File  |  1988-10-16  |  26KB  |  671 lines

  1. % Macros for The TeXbook
  2.  
  3. \catcode`@=11 % borrow the private macros of PLAIN (with care)
  4.  
  5. \font\tentex=amtex10
  6.  
  7. \font\inchhigh=aminch
  8. \font\titlefont=amssmc40
  9.  
  10. \font\ninerm=amr9
  11. \font\eightrm=amr8
  12. \font\sixrm=amr6
  13.  
  14. \font\ninei=ammi9
  15. \font\eighti=ammi8
  16. \font\sixi=ammi6
  17. \skewchar\ninei='177 \skewchar\eighti='177 \skewchar\sixi='177
  18.  
  19. \font\ninesy=amsy9
  20. \font\eightsy=amsy8
  21. \font\sixsy=amsy6
  22. \skewchar\ninesy='60 \skewchar\eightsy='60 \skewchar\sixsy='60
  23.  
  24. \font\eightss=amssq8
  25.  
  26. \font\eightssi=amssqi8
  27.  
  28. \font\ninebf=ambx9
  29. \font\eightbf=ambx8
  30. \font\sixbf=ambx6
  31.  
  32. \font\ninett=amtt9
  33. \font\eighttt=amtt8
  34.  
  35. \hyphenchar\tentt=-1 % inhibit hyphenation in typewriter type
  36. \hyphenchar\ninett=-1
  37. \hyphenchar\eighttt=-1
  38.  
  39. \font\ninesl=amsl9
  40. \font\eightsl=amsl8
  41.  
  42. \font\nineit=amti9
  43. \font\eightit=amti8
  44.  
  45. \font\tenu=amu10 % unslanted text italic
  46. \font\magnifiedfiverm=amr5 at 10pt
  47. \font\man=manfnt % font used for special symbols (old version)
  48. \font\manual=manual % font used for the METAFONT logo, etc. (new version)
  49.  % manual [which isn't complete yet] is supposed to replace manfnt some day
  50.  
  51. \newskip\ttglue
  52. \def\tenpoint{\def\rm{\fam0\tenrm}%
  53.   \textfont0=\tenrm \scriptfont0=\sevenrm \scriptscriptfont0=\fiverm
  54.   \textfont1=\teni \scriptfont1=\seveni \scriptscriptfont1=\fivei
  55.   \textfont2=\tensy \scriptfont2=\sevensy \scriptscriptfont2=\fivesy
  56.   \textfont3=\tenex \scriptfont3=\tenex \scriptscriptfont3=\tenex
  57.   \def\it{\fam\itfam\tenit}%
  58.   \textfont\itfam=\tenit
  59.   \def\sl{\fam\slfam\tensl}%
  60.   \textfont\slfam=\tensl
  61.   \def\bf{\fam\bffam\tenbf}%
  62.   \textfont\bffam=\tenbf \scriptfont\bffam=\sevenbf
  63.    \scriptscriptfont\bffam=\fivebf
  64.   \def\tt{\fam\ttfam\tentt}%
  65.   \textfont\ttfam=\tentt
  66.   \tt \ttglue=.5em plus.25em minus.15em
  67.   \normalbaselineskip=12pt
  68.   \def\MF{{\manual META}\-{\manual FONT}}%
  69.   \let\sc=\eightrm
  70.   \let\big=\tenbig
  71.   \setbox\strutbox=\hbox{\vrule height8.5pt depth3.5pt width\z@}%
  72.   \normalbaselines\rm}
  73.  
  74. \def\ninepoint{\def\rm{\fam0\ninerm}%
  75.   \textfont0=\ninerm \scriptfont0=\sixrm \scriptscriptfont0=\fiverm
  76.   \textfont1=\ninei \scriptfont1=\sixi \scriptscriptfont1=\fivei
  77.   \textfont2=\ninesy \scriptfont2=\sixsy \scriptscriptfont2=\fivesy
  78.   \textfont3=\tenex \scriptfont3=\tenex \scriptscriptfont3=\tenex
  79.   \def\it{\fam\itfam\nineit}%
  80.   \textfont\itfam=\nineit
  81.   \def\sl{\fam\slfam\ninesl}%
  82.   \textfont\slfam=\ninesl
  83.   \def\bf{\fam\bffam\ninebf}%
  84.   \textfont\bffam=\ninebf \scriptfont\bffam=\sixbf
  85.    \scriptscriptfont\bffam=\fivebf
  86.   \def\tt{\fam\ttfam\ninett}%
  87.   \textfont\ttfam=\ninett
  88.   \tt \ttglue=.5em plus.25em minus.15em
  89.   \normalbaselineskip=11pt
  90.   \def\MF{{\manual hijk}\-{\manual lmnj}}%
  91.   \let\sc=\sevenrm
  92.   \let\big=\ninebig
  93.   \setbox\strutbox=\hbox{\vrule height8pt depth3pt width\z@}%
  94.   \normalbaselines\rm}
  95.  
  96. \def\eightpoint{\def\rm{\fam0\eightrm}%
  97.   \textfont0=\eightrm \scriptfont0=\sixrm \scriptscriptfont0=\fiverm
  98.   \textfont1=\eighti \scriptfont1=\sixi \scriptscriptfont1=\fivei
  99.   \textfont2=\eightsy \scriptfont2=\sixsy \scriptscriptfont2=\fivesy
  100.   \textfont3=\tenex \scriptfont3=\tenex \scriptscriptfont3=\tenex
  101.   \def\it{\fam\itfam\eightit}%
  102.   \textfont\itfam=\eightit
  103.   \def\sl{\fam\slfam\eightsl}%
  104.   \textfont\slfam=\eightsl
  105.   \def\bf{\fam\bffam\eightbf}%
  106.   \textfont\bffam=\eightbf \scriptfont\bffam=\sixbf
  107.    \scriptscriptfont\bffam=\fivebf
  108.   \def\tt{\fam\ttfam\eighttt}%
  109.   \textfont\ttfam=\eighttt
  110.   \tt \ttglue=.5em plus.25em minus.15em
  111.   \normalbaselineskip=9pt
  112.   \def\MF{{\manual opqr}\-{\manual stuq}}%
  113.   \let\sc=\sixrm
  114.   \let\big=\eightbig
  115.   \setbox\strutbox=\hbox{\vrule height7pt depth2pt width\z@}%
  116.   \normalbaselines\rm}
  117.  
  118. \def\tenmath{\tenpoint\fam-1 } % use after $ in ninepoint sections
  119. \def\tenbig#1{{\hbox{$\left#1\vbox to8.5pt{}\right.\n@space$}}}
  120. \def\ninebig#1{{\hbox{$\textfont0=\tenrm\textfont2=\tensy
  121.   \left#1\vbox to7.25pt{}\right.\n@space$}}}
  122. \def\eightbig#1{{\hbox{$\textfont0=\ninerm\textfont2=\ninesy
  123.   \left#1\vbox to6.5pt{}\right.\n@space$}}}
  124.  
  125. % Page layout
  126. \newdimen\pagewidth \newdimen\pageheight \newdimen\ruleht
  127. \hsize=29pc  \vsize=44pc  \maxdepth=2.2pt  \parindent=3pc
  128. \pagewidth=\hsize \pageheight=\vsize \ruleht=.5pt
  129. \abovedisplayskip=6pt plus 3pt minus 1pt
  130. \belowdisplayskip=6pt plus 3pt minus 1pt
  131. \abovedisplayshortskip=0pt plus 3pt
  132. \belowdisplayshortskip=4pt plus 3pt
  133.  
  134. %\newinsert\footins
  135. \def\footnote#1{\edef\@sf{\spacefactor\the\spacefactor}#1\@sf
  136.       \insert\footins\bgroup\eightpoint
  137.       \interlinepenalty100 \let\par=\endgraf
  138.         \leftskip=\z@skip \rightskip=\z@skip
  139.         \splittopskip=10pt plus 1pt minus 1pt \floatingpenalty=20000
  140.         \smallskip\item{#1}\bgroup\strut\aftergroup\@foot\let\next}
  141. \skip\footins=12pt plus 2pt minus 4pt % space added when footnote is present
  142. %\count\footins=1000 % footnote magnification factor (1 to 1)
  143. \dimen\footins=30pc % maximum footnotes per page
  144.  
  145. \newinsert\margin
  146. \dimen\margin=\maxdimen
  147. %\count\margin=0 \skip\margin=0pt % marginal inserts take up no space
  148.  
  149. \newif\iftitle
  150. \def\titlepage{\global\titletrue} % for pages without headlines
  151. \def\rhead{} % \rhead contains the running headline
  152.  
  153. \def\leftheadline{\hbox to \pagewidth{%
  154.     \vbox to 10pt{}% strut to position the baseline
  155.     \llap{\tenbf\folio\kern1pc}% folio to left of text
  156.     \tenit\rhead\hfil% running head flush left
  157.     }}
  158. \def\rightheadline{\hbox to \pagewidth{%
  159.     \vbox to 10pt{}% strut to position the baseline
  160.     \hfil\tenit\rhead\/% running head flush right
  161.     \rlap{\kern1pc\tenbf\folio}% folio to right of text
  162.     }}
  163.  
  164. \def\onepageout#1{\shipout\vbox{ % here we define one page of output
  165.     \offinterlineskip % butt the boxes together
  166.     \vbox to 3pc{ % this part goes on top of the 44pc pages
  167.       \iftitle % the next is used for title pages
  168.         \global\titlefalse % reset the titlepage switch
  169.         \setcornerrules % for camera alignment
  170.       \else\ifodd\pageno \rightheadline\else\leftheadline\fi\fi
  171.       \vfill} % this completes the \vbox to 3pc
  172.     \vbox to \pageheight{
  173.       \ifvoid\margin\else % marginal info is present
  174.         \rlap{\kern31pc\vbox to\z@{\kern4pt\box\margin \vss}}\fi
  175.       #1 % now insert the main information
  176.       \ifvoid\footins\else % footnote info is present
  177.         \vskip\skip\footins \kern-3pt
  178.         \hrule height\ruleht width\pagewidth \kern-\ruleht \kern3pt
  179.         \unvbox\footins\fi
  180.       \boxmaxdepth=\maxdepth
  181.       } % this completes the \vbox to \pageheight
  182.     }
  183.   \advancepageno}
  184.  
  185. \def\setcornerrules{\hbox to \pagewidth{\vrule width 1pc height\ruleht
  186.     \hfil \vrule width 1pc}
  187.   \hbox to \pagewidth{\llap{\sevenrm(page \folio)\kern1pc}%
  188.     \vrule height1pc width\ruleht depth\z@
  189.     \hfil \vrule width\ruleht depth\z@}}
  190.  
  191. \output{\onepageout{\unvbox255}}
  192.  
  193. \newbox\partialpage
  194. \def\begindoublecolumns{\begingroup
  195.   \output={\global\setbox\partialpage=\vbox{\unvbox255\bigskip}}\eject
  196.   \output={\doublecolumnout} \hsize=14pc \vsize=89pc}
  197. \def\enddoublecolumns{\output={\balancecolumns}\eject
  198.   \endgroup \pagegoal=\vsize}
  199.  
  200. \def\doublecolumnout{\splittopskip=\topskip \splitmaxdepth=\maxdepth
  201.   \dimen@=44pc \advance\dimen@ by-\ht\partialpage
  202.   \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
  203.   \onepageout\pagesofar
  204.   \unvbox255 \penalty\outputpenalty}
  205. \def\pagesofar{\unvbox\partialpage
  206.   \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}}
  207. \def\balancecolumns{\setbox0=\vbox{\unvbox255} \dimen@=\ht0
  208.   \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip
  209.   \divide\dimen@ by2 \splittopskip=\topskip
  210.   {\vbadness=10000 \loop \global\setbox3=\copy0
  211.     \global\setbox1=\vsplit3 to\dimen@
  212.     \ifdim\ht3>\dimen@ \global\advance\dimen@ by1pt \repeat}
  213.   \setbox0=\vbox to\dimen@{\unvbox1}
  214.   \setbox2=\vbox to\dimen@{\unvbox3}
  215.   \pagesofar}
  216.  
  217. % Chapter formatting
  218. % The preface and table of contents are formatted in place, not here
  219.  
  220. \newcount\exno % for the number of exercises in the current chapter
  221. \newcount\subsecno % for the number of subsections in the current chapter
  222.  
  223. \outer\def\beginchapter#1 #2#3. #4\par{\global\exno=0
  224.   \subsecno=0
  225.   \def\chapno{#2#3}
  226.   \ifodd\pageno
  227.     \errmessage{You had too much text on that last page; I'm backing up}
  228.     \advance\pageno by-1 \fi
  229.   \titlepage
  230.   \def\\{ } % \\'s in the title will be treated as spaces
  231.   \message{#1 #2#3:} % show the chapter title on the terminal
  232.   \xdef\rhead{#1 #2#3: #4\unskip}
  233.   {\def\TeX{T\kern-.2em\lower.5ex\hbox{E}\kern-.06em X}
  234.     \def\MF{{\vbox to30pt{}\manual ()*+,-.*}}
  235.     \def\\{#3}
  236.     \ifx\empty\\ \rightline{\inchhigh #2\kern-.04em}
  237.     \else\rightline{\inchhigh #2\kern-.06em#3\kern-.04em}\fi
  238.     \vskip 1.75pc
  239.     \baselineskip 36pt \lineskiplimit 1pt \lineskip 12pt
  240.     \let\\=\cr % now the \\'s are line dividers
  241.     \halign{\line{\titlefont\hfil##}\\#4\unskip\\}
  242.     \vfill\eject} % output the chapter title page
  243.   \tenpoint
  244.   \noindent\ignorespaces} % the first paragraph of a chapter is not indented
  245.  
  246. \outer\def\endchapter{\ifodd\pageno \else\vfill\eject\null\fi
  247.   \begingroup\bigskip\vfill % beginning of the quotes
  248.   \def\eject{\endgroup\eject}
  249.   \def\par{\ifhmode\/\endgraf\fi}\obeylines
  250.   \def\TeX{T\kern-.2em\lower.5ex\hbox{E}\kern-.000em X}
  251.   \def\MF{{\manual opqr}\-{\manual stuq}}
  252.   \eightpoint \let\tt=\ninett
  253.   \baselineskip 10pt
  254.   \parfillskip \z@
  255.   \interlinepenalty 10000
  256.   \leftskip \z@ plus 40pc minus \parindent
  257.   \let\rm=\eightss \let\sl=\eightssi
  258.   \everypar{\sl}}
  259. \def\author#1(#2){\smallskip\noindent\rm--- #1\unskip\enspace(#2)}
  260.  
  261. \def\dbend{{\manual\char127}} % dangerous bend sign
  262. \def\d@nger{\medbreak\begingroup\clubpenalty=10000
  263.   \def\par{\endgraf\endgroup\medbreak} \noindent\hang\hangafter=-2
  264.   \hbox to0pt{\hskip-\hangindent\dbend\hfill}\ninepoint}
  265. \outer\def\danger{\d@nger}
  266. \def\dd@nger{\medbreak\begingroup\clubpenalty=10000
  267.   \def\par{\endgraf\endgroup\medbreak} \noindent\hang\hangafter=-2
  268.   \hbox to0pt{\hskip-\hangindent\dbend\kern1pt\dbend\hfill}\ninepoint}
  269. \outer\def\ddanger{\dd@nger}
  270. \def\enddanger{\endgraf\endgroup} % omits the \medbreak
  271.  
  272. \outer\def\subsection#1. {\medbreak\advance\subsecno by 1
  273.   \noindent{\it \the\subsecno.\enspace#1.\enspace}}
  274. \def\ansno#1.#2:{\medbreak\noindent
  275.   \hbox to\parindent{\bf\hss#1.#2.\enspace}\ignorespaces}
  276.  
  277. % Composition macros
  278. \hyphenation{man-u-script man-u-scripts ap-pen-dix}
  279.  
  280. \def\AmSTeX{$\cal A\kern-.1667em\lower.5ex\hbox{$\cal M$}\kern-.125em
  281.   S$-\TeX}
  282. \def\bull{\vrule height .9ex width .8ex depth -.1ex } % square bullet
  283. \def\SS{{\it SS}} % scriptscript style
  284. \def\|{\leavevmode\hbox{\tt\char`\|}} % vertical line
  285. \def\dn{\leavevmode\hbox{\tt\char'14}} % downward arrow
  286. \def\up{\leavevmode\hbox{\tt\char'13}} % upward arrow
  287. \def\]{\leavevmode\hbox{\tt\char`\ }} % visible space
  288.  
  289. \def\pt{\,{\rm pt}} % units of points, in math formulas
  290. \def\em{\,{\rm em}} % units of ems, in math formulas
  291. \def\<#1>{\leavevmode\hbox{$\langle$#1\/$\rangle$}} % syntactic quantity
  292. \def\oct#1{\hbox{\rm\'{}\kern-.2em\it#1\/\kern.05em}} % octal constant
  293. \def\hex#1{\hbox{\rm\H{}\tt#1}} % hexadecimal constant
  294. \def\cstok#1{\leavevmode\thinspace\hbox{\vrule\vtop{\vbox{\hrule\kern1pt
  295.         \hbox{\vphantom{\tt/}\thinspace{\tt#1}\thinspace}}
  296.       \kern1pt\hrule}\vrule}\thinspace} % control sequence token
  297.  
  298. {\obeyspaces\gdef {\ }}
  299. \def\parbreak{\hfil\break\indent\strut}
  300. \def\stretch{\nobreak\hskip0pt plus2pt\relax}
  301.  
  302. % macros for non-centered displays
  303. \outer\def\begindisplay{\obeylines\startdisplay}
  304. {\obeylines\gdef\startdisplay#1
  305.   {\catcode`\^^M=5$$#1\halign\bgroup\indent##\hfil&&\qquad##\hfil\cr}}
  306. \outer\def\enddisplay{\crcr\egroup$$}
  307.  
  308. % (the following \begin...\end-type macros do not appear in Appendix E)
  309. % macros for demonstrating math constructions
  310. \outer\def\beginmathdemo{$$\advance\baselineskip by2pt
  311.   \halign\bgroup\indent\hbox to 160pt{##\hfil}&$##$\hfil\cr\noalign{\vskip-2pt}}
  312. \outer\def\begindisplaymathdemo {$$\advance\baselineskip by15pt
  313.   \halign\bgroup\indent\hbox to 160pt{##\hfil}&$\displaystyle{##}$\hfil\cr
  314.   \noalign{\vskip-15pt}}
  315. \outer\def\beginlongmathdemo{$$\advance\baselineskip by2pt
  316.   \halign\bgroup\indent\hbox to 210pt{##\hfil}&$##$\hfil\cr\noalign{\vskip-2pt}}
  317. \outer\def\beginlongdisplaymathdemo {$$\advance\baselineskip by15pt
  318.   \halign\bgroup\indent\hbox to 210pt{##\hfil}&$\displaystyle{##}$\hfil\cr
  319.   \noalign{\vskip-15pt}}
  320. \outer\def\endmathdemo{\egroup$$}
  321.  
  322. % macros for font tables
  323. \def\oddline#1{\cr
  324.   \noalign{\nointerlineskip}
  325.   \multispan{19}\hrulefill&
  326.   \setbox0=\hbox{\lower 2.3pt\hbox{\hex{#1x}}}\smash{\box0}\cr
  327.   \noalign{\nointerlineskip}}
  328. \def\evenline{\cr\noalign{\hrule}}
  329. \def\chartstrut{\lower4.5pt\vbox to14pt{}}
  330. \def\beginchart#1{$$\postdisplaypenalty=-10000 \global\count@=0 #1
  331.   \halign to\hsize\bgroup
  332.     \chartstrut##\tabskip0pt plus10pt&
  333.     &\hfil##\hfil&\vrule##\cr
  334.     \lower6.5pt\null
  335.     &&&\oct0&&\oct1&&\oct2&&\oct3&&\oct4&&\oct5&&\oct6&&\oct7&\evenline}
  336. \def\endchart{\raise11.5pt\null&&&\hex 8&&\hex 9&&\hex A&&\hex B&
  337.   &\hex C&&\hex D&&\hex E&&\hex F&\cr\egroup$$}
  338. \def\:{\setbox0=\hbox{\char\count@}%
  339.   \ifdim\ht0>7.5pt\reposition
  340.   \else\ifdim\dp0>2.5pt\reposition\fi\fi
  341.   \box0\global\advance\count@ by1 }
  342. \def\reposition{\setbox0=\hbox{$\vcenter{\kern2pt\box0\kern2pt}$}}
  343. \def\normalchart{%
  344.   &\oct{00x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline0
  345.   &\oct{01x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
  346.   &\oct{02x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline1
  347.   &\oct{03x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
  348.   &\oct{04x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline2
  349.   &\oct{05x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
  350.   &\oct{06x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline3
  351.   &\oct{07x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
  352.   &\oct{10x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline4
  353.   &\oct{11x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
  354.   &\oct{12x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline5
  355.   &\oct{13x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
  356.   &\oct{14x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline6
  357.   &\oct{15x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
  358.   &\oct{16x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline7
  359.   &\oct{17x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline}
  360.  
  361. % (now Appendix E resumes again)
  362. % macros for verbatim scanning
  363. \chardef\other=12
  364. \def\ttverbatim{\begingroup
  365.   \catcode`\\=\other
  366.   \catcode`\{=\other
  367.   \catcode`\}=\other
  368.   \catcode`\$=\other
  369.   \catcode`\&=\other
  370.   \catcode`\#=\other
  371.   \catcode`\%=\other
  372.   \catcode`\~=\other
  373.   \catcode`\_=\other
  374.   \catcode`\^=\other
  375.   \obeyspaces \obeylines \tt}
  376.  
  377. \outer\def\begintt{$$\let\par=\endgraf \ttverbatim \parskip=\z@
  378.   \catcode`\|=0 \rightskip-5pc \ttfinish}
  379. {\catcode`\|=0 |catcode`|\=\other % | is temporary escape character
  380.   |obeylines % end of line is active
  381.   |gdef|ttfinish#1^^M#2\endtt{#1|vbox{#2}|endgroup$$}}
  382.  
  383. \catcode`\|=\active
  384. {\obeylines \gdef|{\ttverbatim \spaceskip\ttglue \let^^M=\  \let|=\endgroup}}
  385.  
  386. % macros for syntax rules (again, not in Appendix E)
  387. \def\[#1]{\silenttrue\xref|#1|\thinspace{\tt#1}\thinspace} % keyword in syntax
  388. \def\beginsyntax{\endgraf\nobreak\medskip
  389.   \begingroup \catcode`<=13 \catcode`[=13
  390.   \let\par=\endsyntaxline \obeylines}
  391. \def\endsyntaxline{\futurelet\next\syntaxswitch}
  392. \def\syntaxswitch{\ifx\next\<\let\next=\syntaxrule
  393.   \else\ifx\next\endsyntax\let\next=\endgroup
  394.   \else\let\next=\continuerule\fi\fi \next}
  395. \def\continuerule{\hfil\break\indent\qquad}
  396. \def\endsyntax{\medbreak\noindent}
  397. {\catcode`<=13 \catcode`[=13
  398.   \global\let<=\< \global\let[=\[
  399.   \gdef\syntaxrule<#1>{\endgraf\indent\silentfalse\xref\<#1>}}
  400. \def\is{\ $\longrightarrow$ }
  401. \def\alt{\ $\vert$ }
  402.  
  403. % macros to demarcate lines quoted from TeX source files
  404. \def\beginlines{\par\begingroup\nobreak\medskip\parindent\z@ \obeylines
  405.   \hrule\kern1pt\nobreak \everypar{\strut}}
  406. \def\endlines{\kern1pt\hrule\endgroup\medbreak\noindent}
  407. \def\weakendlines{\kern1pt\hrule\endgroup\medskip\noindent}
  408.  
  409. \outer\def\exercise{\medbreak
  410.   \global\advance\exno by 1
  411.   \noindent\llap{\manual\char'170\rm\kern.15em}% triangle in margin
  412.   {\ninebf EXERCISE \bf\chapno.\the\exno}\par\nobreak\noindent}
  413. \def\dexercise{\global\advance\exno by 1
  414.   \llap{\manual\char'170\rm\kern.15em}% triangle in indented space
  415.   {\eightbf EXERCISE \bf\chapno.\the\exno}\hfil\break}
  416. \outer\def\dangerexercise{\d@nger \dexercise}
  417. \outer\def\ddangerexercise{\dd@nger \dexercise}
  418.  
  419. \newwrite\ans
  420. \immediate\openout\ans=answers % file for answers to exercises
  421. \outer\def\answer{\par\medbreak
  422.   \immediate\write\ans{}
  423.   \immediate\write\ans{\string\ansno\chapno.\the\exno:}
  424.   \copytoblankline}
  425. \def\copytoblankline{\begingroup\setupcopy\copyans}
  426. \def\setupcopy{\def\do##1{\catcode`##1=\other}\dospecials
  427.   \catcode`\|=\other \obeylines}
  428. {\obeylines \gdef\copyans#1
  429.   {\def\next{#1}%
  430.   \ifx\next\empty\let\next=\endgroup %
  431.   \else\immediate\write\ans{\next} \let\next=\copyans\fi\next}}
  432.  
  433. % Editorial notes: some things to watch for.
  434.  
  435. % f |\ and f ^|\ => insert \/  [e.g., if\/ |\hbox|...]
  436. % appendi => check for \null  [e.g., Appendix~B\null.]
  437. % ly- => the hyphen is probably omittable
  438. % ''. and '', => transpose to .'' and ,''
  439. % dgement => dgment
  440.  
  441. % Macros for drawing figures (not in Appendix E)
  442. \def\hidehrule#1#2{\kern-#1\hrule height#1 depth#2 \kern-#2 }
  443. \def\hidevrule#1#2{\kern-#1{\dimen0=#1
  444.     \advance\dimen0 by#2\vrule width\dimen0}\kern-#2 }
  445. % \makeblankbox puts rules at the edges of a blank box
  446. % whose dimensions are those of \box0 (assuming nonnegative wd,ht,dp)
  447. % #1 is rule thickness outside, #2 is rule thickness inside
  448. \def\makeblankbox#1#2{\hbox{\lower\dp0\vbox{\hidehrule{#1}{#2}%
  449.     \kern-#1% overlap the rules at the corners
  450.     \hbox to\wd0{\hidevrule{#1}{#2}%
  451.       \raise\ht0\vbox to #1{}% set the vrule height
  452.       \lower\dp0\vtop to #1{}% set the vrule depth
  453.       \hfil\hidevrule{#2}{#1}}%
  454.     \kern-#1\hidehrule{#2}{#1}}}}
  455. \def\maketypebox{\makeblankbox{0pt}{1pt}}
  456. \def\makelightbox{\makeblankbox{.2pt}{.2pt}}
  457.  
  458. % \box\bigdot is a null box with a bullet at its reference point
  459. \newbox\bigdot \newbox\smalldot
  460. \setbox0=\hbox{$\vcenter{}$} % \ht0 is the axis height
  461. \setbox1=\hbox to\z@{$\hss\bullet\hss$} % bullet is centered on the axis
  462. \setbox\bigdot=\vbox to\z@{\kern-\ht1 \kern\ht0 \box1 \vss}
  463. \setbox1=\hbox to\z@{$\hss\cdot\hss$} % cdot is centered on the axis
  464. \setbox\smalldot=\vbox to\z@{\kern-\ht1 \kern\ht0 \box1 \vss}
  465.  
  466. % \arrows makes things like <--- text --->
  467. \def\arrows#1#2{% #1=width, #2=text
  468.   {\setbox0=\hbox{$\mkern-2mu\mathord-\mkern-2mu$}
  469.     \hbox to #1{\kern-.055556em$\leftarrow\mkern-6mu$%
  470.       \cleaders\copy0\hfil
  471.       \kern.4em #2\kern.4em
  472.       \cleaders\copy0\hfil
  473.       $\mkern-6mu\rightarrow$\kern-.055556em}}}
  474.  
  475. % \samplebox makes the outline of a box, with big dot at reference point
  476. \def\samplebox#1#2#3#4{% #1=ht, #2=dp, #3=wd, #4=text
  477.   {\setbox0=\vtop{\vbox to #1{\hbox to #3{}\vss}
  478.       \nointerlineskip
  479.       \vbox to #2{}}% now \box0 has the desired ht, dp, and wd
  480.     \hbox{\copy\bigdot
  481.       \vrule height.2pt depth.2pt width#3%
  482.       \kern-#3%
  483.       \makelightbox
  484.       \kern-#3%
  485.       \raise#1\vbox{\hbox to #3{\hss#4\hss}
  486.         \kern 3pt}}}}
  487.  
  488. % \sampleglue makes glue between sample boxes
  489. \newdimen\varunit
  490. \varunit=\hsize \advance\varunit by-2\parindent
  491. \divide\varunit by 58 % illustrations in Chapter 12
  492. \def\sampleglue#1#2{% #1=width, #2=text
  493.   \vtop{\hbox to #1{\xleaders\hbox to .5\varunit{\hss\copy\smalldot\hss}\hfil}
  494.     \kern3pt
  495.     \tabskip \z@ plus 1fil
  496.     \halign to #1{\hfil##\cr#2\cr}}}
  497.  
  498. % Indexing macros
  499. \newif\ifproofmode
  500. \proofmodetrue % this should be false when making camera-ready copy
  501. \newwrite\inx
  502. \immediate\openout\inx=index % file for index reminders
  503. \newif\ifsilent
  504. \def\specialhat{\ifmmode\def\next{^}\else\let\next=\beginxref\fi\next}
  505. \def\beginxref{\futurelet\next\beginxrefswitch}
  506. \def\beginxrefswitch{\ifx\next\specialhat\let\next=\silentxref
  507.   \else\silentfalse\let\next=\xref\fi \next}
  508. \catcode`\^=\active \let ^=\specialhat
  509. \def\silentxref^{\silenttrue\xref}
  510.  
  511. \def\marginstyle{\vrule height6pt depth2pt width\z@ \sevenrm}
  512.  
  513. \chardef\bslash=`\\
  514. \def\xref{\futurelet\next\xrefswitch}
  515. \def\xrefswitch{\begingroup
  516.   \ifx\next|\aftergroup\vxref % case 1 or 2, |arg| or |\arg|
  517.   \else\ifx\next\<\aftergroup\anglexref % case 3, "\<arg>" means angle brackets
  518.     \else\aftergroup\normalxref \fi\fi\endgroup} % case 0, "{arg}"
  519. \def\vxref|{\catcode`\\=\active \futurelet\next\vxrefswitch}
  520. \def\vxrefswitch#1|{\catcode`\\=0
  521.   \ifx\next\empty\def\xreftype{2}%
  522.     \def\next{{\tt\bslash\text}}% type 2, |\arg|
  523.   \else\def\xreftype{1}\def\next{{\tt\text}}\fi % type 1, |arg|
  524.   \edef\text{#1}\makexref}
  525. {\catcode`\|=0 \catcode`\\=\active |gdef\{}}
  526. \def\anglexref\<#1>{\def\xreftype{3}\def\text{#1}%
  527.   \def\next{\<\text>}\makexref}
  528. \def\normalxref#1{\def\xreftype{0}\def\text{#1}\let\next=\text\makexref}
  529. \def\makexref{\ifproofmode\insert\margin{\hbox{\marginstyle\text}}%
  530.    \xdef\writeit{\write\inx{\text\space!\xreftype\space
  531.      \noexpand\number\pageno.}}\writeit
  532.    \else\ifhmode\kern\z@\fi\fi
  533.   \ifsilent\ignorespaces\else\next\fi}
  534. % the \insert (which is done in proofmode only) suppresses hyphenation,
  535. % so the \kern\z@ is put in to give the same effect in non-proofmode.
  536.  
  537. % Internal cross references that may change
  538. \def\sesame{61} % page number for Sesame Street quote
  539. \def\bmiexno{20} % exercise number for bold math italic
  540. \def\punishexno{1} % exercise number for `punishment'
  541. \def\fracexno{6} % exercise number for `\frac'
  542. \def\vshippage{31} % error message from `\vship'
  543. \def\storypage{24} % listing of story.tex
  544.  
  545. \def\checkequals#1#2{\ifnum#1=#2\else
  546.   \errmessage{Redefine \string#1 to be \the#2}\fi}
  547.  
  548. % Things for The METAFONTbook only
  549. \ifx\MFmanual\!\else\endinput\fi
  550.  
  551. \def\!{\kern-.05em\relax}
  552.  
  553. \outer\def\displayfig #1 (#2){$$\advance\abovedisplayskip by 3pt
  554.   \leftline{\indent\figbox{#1}{3in}{#2}\vbox}$$}
  555. \def\rightfig #1 (#2 x #3) ^#4 {% #2 wide and #3 deep, raised #4
  556.   \strut\vadjust{\setbox0=\vbox to 0pt{\vss
  557.       \hbox to\pagewidth{\hfil
  558.         \raise #4\figbox{#1}{#2}{#3}\vtop \quad}}
  559.     \dp0=0pt \box0}}
  560. \def\figbox#1#2#3#4{#4to#3{ % makes a box #2 wide and #3 deep
  561.     \ifproofmode\kern0pt\hrule\vfill
  562.     \hsize=#2 \baselineskip 6pt \fiverm\noindent\raggedright
  563.     (Figure #1 will be inserted here; too bad you can't see it now.)
  564.     \endgraf\vfill\hrule
  565.     \else\vfill\hbox to#2{}\fi}}
  566.  
  567. \def\endsyntax{\begingroup\let\par=\endgraf\medbreak\endgroup\noindent}
  568.  
  569. \def\decreasehsize #1 {\advance\hsize-#1}
  570. \def\restorehsize{\hsize=\pagewidth}
  571.  
  572. \catcode`\@=\active
  573. \catcode`\"=\active
  574. \def\ttverbatim{\begingroup \catcode`\@=\other \catcode`\"=\other
  575.   \catcode`\\=\other
  576.   \catcode`\{=\other
  577.   \catcode`\}=\other
  578.   \catcode`\$=\other
  579.   \catcode`\&=\other
  580.   \catcode`\#=\other
  581.   \catcode`\%=\other
  582.   \catcode`\~=\other
  583.   \catcode`\_=\other
  584.   \catcode`\^=\other
  585.   \obeyspaces \obeylines \tt}
  586. \def\setupcopy{\def\do##1{\catcode`##1=\other}\dospecials
  587.   \catcode`\|=\other \catcode`\@=\other \catcode`\"=\other \obeylines}
  588. \def\_{\leavevmode \kern.06em \vbox{\hrule width.3em}}
  589. \def@#1@{\begingroup\def\_{\kern.04em
  590.     \vbox{\hrule width.3em height .6pt}\kern.08em}%
  591.   \ifmmode\mathop{\bf#1}\else\hbox{\bf#1\/}\fi\endgroup}
  592. \def"#1"{\hbox{\it#1\/\kern.05em}} % italic type for identifiers
  593. \def\xrefswitch{\begingroup
  594.   \ifx\next|\aftergroup\vxref % case 1, |arg| or |\arg|
  595.   \else\ifx\next@\aftergroup\boldxref % case 2, "@arg@" means boldface
  596.   \else\ifx\next"\aftergroup\italxref % case 4, ""arg"" means boldface
  597.   \else\ifx\next\<\aftergroup\anglexref % case 3, "\<arg>" means angle brackets
  598.     \else\aftergroup\normalxref \fi\fi\fi\fi\endgroup} % case 0, "{arg}"
  599. \def\boldxref@#1@{\def\xreftype{2}\def\text{#1}%
  600.   \def\next{@\text@}\makexref}
  601. \def\italxref"#1"{\def\xreftype{4}\def\text{#1}%
  602.   \def\next{"\text"}\makexref}
  603.  
  604. \def\pyth+{\mathbin{++}}
  605. \def\0{\raise.7ex\hbox{$\scriptstyle\#$}}
  606. \def\to{\mathrel{\ldotp\ldotp}}
  607. \def\dashto{\mathrel{\hbox{-\thinspace-\kern-.05em}}}
  608. \def\ddashto{\mathrel{\hbox{-\thinspace-\thinspace-\kern-.05em}}}
  609. \def\round{\mathop{\rm round}}
  610. \def\angle{\mathop{\rm angle}}
  611. \def\reverse{\mathop{\rm reverse}}
  612. \def\curl{\mathop{\rm curl}}
  613. \def\tension{\mathop{\rm tension}}
  614. \def\controls{\mathop{\rm controls}}
  615. \def\and{\,{\rm and}\,}
  616. \def\cycle{{\rm cycle}}
  617. \def\pickup{@pickup@ \thinspace}
  618. \def\penpos#1{\hbox{\it penpos}_{#1}}
  619. \def\pentaper#1{\hbox{\it pentaper}_{#1}}
  620.  
  621. \chardef\hexa=1  % first hex
  622. \chardef\hexb=2 % top and bot adjusted
  623. \chardef\hexc=3 % same, bold
  624. \chardef\hexd=4 % same, confined to box
  625. \chardef\hexe=5 % penstroked hex
  626. \chardef\Aa=6 % stick-figure A, golden ratio
  627. \def\sevenAs{\char7\char8\char9\char10\char11\char12\char13} % same, variants
  628. \chardef\Az=14 % same, with crooked bar
  629. \chardef\Ab=15 % \Aa with rectilinear elliptical pen
  630. \chardef\Ac=16 % same, with the ellipse tilted
  631. \chardef\beana=17 % kidney bean, default pen
  632. \chardef\beanb=18 % same, twice as bold
  633. \chardef\beanc=19 % same, rectilinear elliptical pen
  634. \chardef\beand=20 % same, with the ellipse tilted
  635. \chardef\niba=21 % 10x rectilinear ellipse
  636. \chardef\nibb=22 % same, with the ellipse tilted
  637. \chardef\nibc=23 % same, 90 degrees titled
  638. \chardef\IOT=24 % Ionian T
  639. \chardef\IOS=25 % Ionian S
  640. \chardef\IOO=26 % Ionian O
  641. \chardef\IOI=27 % Ionian I
  642. \chardef\cubea=28 % possible cube
  643. \chardef\cubeb=29 % impossible cube
  644. \chardef\bicentennial=30 % star with overlapping strokes
  645. \chardef\seventh='140 % 1/7, to go with cmssqi8
  646.  
  647. \newdimen\apspix
  648. \apspix=31448sp % 8 APS pixels = 52413.64sp, and I'm taking 60% of this
  649. % to crude approximation, there are about 2\apspix per pt
  650.  
  651. \def\leftheadline{\hbox to \pagewidth{%
  652.     \vbox to 10pt{}% strut to position the baseline
  653.     \llap{\tenbf\folio\kern1pc}% folio to left of text
  654.     \def\MF{{\manual 89:;<=>:}}% slanted 10pt
  655.     \tenit\rhead\hfil% running head flush left
  656.     }}
  657. \def\rightheadline{\hbox to \pagewidth{%
  658.     \vbox to 10pt{}% strut to position the baseline
  659.     \def\MF{{\manual 89:;<=>:}}% slanted 10pt
  660.     \hfil\tenit\rhead\/% running head flush right
  661.     \rlap{\kern1pc\tenbf\folio}% folio to right of text
  662.     }}
  663. \def\ttok#1{\leavevmode\thinspace\hbox{\vrule\vtop{\vbox{\hrule\kern1pt
  664.         \hbox{\vphantom{\tt(j}\thinspace{\tt#1}\thinspace}}
  665.       \kern1pt\hrule}\vrule}\thinspace} % token
  666.  
  667. \newdimen\tinypix \setbox0=\hbox{\sixrm0} \tinypix=5pt
  668. \newdimen\pixcorr \pixcorr=\tinypix \advance\pixcorr by-\wd0
  669. \def\pixpat#1#2#3#4{\vcenter{\sixrm\baselineskip=\tinypix
  670.   \hbox{#1\kern\pixcorr#2}\hbox{#3\kern\pixcorr#4}}}
  671.