diff options
Diffstat (limited to 'Master/texmf-dist/source')
16 files changed, 15769 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/generic/knuth/errata/errata.eight b/Master/texmf-dist/source/generic/knuth/errata/errata.eight new file mode 100644 index 00000000000..f7ceafd9f69 --- /dev/null +++ b/Master/texmf-dist/source/generic/knuth/errata/errata.eight @@ -0,0 +1,610 @@ +% Bugs (sigh) in Computers \& Typesetting + +\input manmac +\font\sltt=cmsltt10 +\font\niness=cmss9 +\font\ninessi=cmssi9 +\proofmodefalse +\raggedbottom +\output{\hsize=29pc \onepageout{\unvbox255\kern-\dimen@ \vfil}} + +\def\today{\number\day\ + \ifcase\month\or + Jan\or Feb\or Mar\or Apr\or May\or Jun\or + Jul\or Aug\or Sep\or Oct\or Nov\or Dec\fi + \ \number\year} + +\def\cutpar{{\parfillskip=0pt\par}} + +\def\rhead{Bugs in {\tensl Computers \& Typesetting, 1992}} +\def\bugonpage#1(#2) \par{\bigbreak\tenpoint + \hrule width\hsize + \line{\lower3.5pt\vbox to13pt{}Page #1\hfil(#2)}\hrule width\hsize + \nobreak\medskip} +\def\buginvol#1(#2) \par{\bigbreak\penalty-1000\tenpoint + \hrule width\hsize + \line{\lower3.5pt\vbox to13pt{}Volume #1\hfil(#2)}\hrule width\hsize + \nobreak\medskip} +\def\slMF{{\manual 89:;}\-{\manual <=>:}} % slant the logo +\def\0{\raise.7ex\hbox{$\scriptstyle\#$}} +\newcount\nn +\newdimen\nsize \newdimen\msize \newdimen\ninept \ninept=9pt +\newbox\eqbox \setbox\eqbox=\hbox{\kern2pt\eightrm=\kern2pt} + +\tenpoint +\noindent This is a list of all corrections made to {\sl Computers \& +Typesetting\/} between 15 March 1992 and the publication of the final +printed versions of those books. +Corrections made to the softcover version of {\sl The \TeX book\/} are +the same as corrections to Volume~A\null. Corrections to the softcover +version of {\sl The \slMF\kern1ptbook\/} are the same as corrections +to Volume~C\null. Changes to Volume~B refer to the fourth printing +(1991), which differs markedly from earlier printings because it includes +all the revisions for \TeX3.0. Changes to Volume~D refer to the third +printing (1991), which differs markedly from earlier printings because +it includes all the revisions for \MF\kern1pt2.0. Changes to the mini-indexes +and master indexes of Volumes B and~D are not shown here unless they are +not obviously derivable from what has been shown. +\looseness=-1 + +% volume A + +\bugonpage A23, line 14 (9/1/92) + +\tenpoint\noindent +a command and you type `|tex|' or `|run| |tex|' or something like that.) + +\bugonpage A53, line 23 (7/7/92) + +\tenpoint\noindent +{\sl scientiarum imperialis petropolitan\ae\/} +became {\sl Akademi\t\i a Nauk SSSR, Doklady}. + +\bugonpage A146, line 2 from the bottom (2/25/93) + +|$\bigl|\|| |\||x|\||-|\||y|\|| \bigr|\||$|\hskip1.25in + $\bigl\vert\vert x\vert-\vert y\vert\bigr\vert$ + +\bugonpage A149, lines 3--5 (2/25/93) + +\noindent +example, we used |\bigl| and |\bigr| to produce $\bigl\vert\vert x\vert- +\vert y\vert\bigr\vert$ in one of the previous illustrations; |\left| and +|\right| don't make things any bigger than necessary, so +`|$\left|\||\left|\||x\right|\||-\left|\||y\right|\||\right|\||$|' +yields only `$\left\vert + \left\vert x\right\vert -\left\vert y\right\vert \right\vert$'.\cutpar + +\bugonpage A158, line 18 from the bottom (2/25/93) + +\ninepoint +are four possibilities for each of these fields. +A field can be + +\bugonpage A282, line 9 from the bottom (7/8/92) + +\ninepoint\noindent +category~4) are intercepted by the alignment +process, en route to \TeX's stomach, so\cutpar + +\bugonpage A293, new paragraph after line 15 (4/9/92) + +\ninepoint +\textindent{$\bull$}|\unhbox|\<8-bit number>, |\unhcopy|\<8-bit number>.\enskip +The specified box register must be void. Nothing happens. + +\bugonpage A309, line 23 (7/7/92) + +\ninepoint\noindent +|petropolitan\ae\/} became {\sl Akademi\t\i a Nauk SSSR, Doklady}.| + +\bugonpage A320, line 11 (1/26/93) + +\ninepoint +\ansno17.12: +|$\bigl(x+f(x)\bigr) \big/ \bigl(x-f(x)\bigr)$|. \ Notice especially the\cutpar + +\bugonpage A349, second line from the bottom (7/8/92) + +\ninepoint\noindent +expand to a ^\<number> en route to \TeX's +``stomach''; |\multiply| wouldn't work, because\cutpar + +\bugonpage A358, bottom line (2/3/93) + +\ninepoint\noindent +it is easy to define ^|\ldots| and ^|\cdots| macros that +give the proper spacing in most\cutpar + +\bugonpage A370, lines 28 and 29 (9/1/92) + +\def\Russiantt#1{{\tt\hbox to.5em{\hss\eighttt\char#1\hss}}} +\ninepoint\noindent +example, if \TeX\ is implemented for +a purely ^{Cyrillic} ^^{Russian} keyboard, the letter `\Russiantt5' should be +assigned to code \oct{160} and `\Russiantt{`T}' to code \oct{164}, so that +`\Russiantt5\Russiantt{`T}' still means `|pt|'; or else control\cutpar + +\bugonpage A377, lines 17--24 (5/4/92) + +\ninepoint +\begintt +\def\sanswitch{\let\n@xt\endsanity \ifx\next\endsanity + \else\ifcat\noexpand\next\stoken\aftergroup\space\let\n@xt=\eat + \else\ifcat\noexpand\next\bgroup\aftergroup{\let\n@xt=\eat + \else\ifcat\noexpand\next\egroup\aftergroup}\let\n@xt=\eat + \else\let\n@xt=\copytok\fi\fi\fi\fi \n@xt} +\def\eat{\afterassignment\sanitize \let\next= } +\long\def\copytok#1{\ifcat\noexpand#1\relax\aftergroup\noexpand\fi + \ifcat\noexpand#1\noexpand~\aftergroup\noexpand\fi +\endtt + +\bugonpage A455, line 25 (2/26/93) + +\ninepoint\noindent +rent language'' is set equal to |\language|. Whenever a +character is added to the cur-\cutpar + +\bugonpage A459, second line of entry for ampersand (3/22/92) + +\eightpoint\indent\qquad +{\it231--248}, $\underline{282}$, {\it339}, 344, 385--386, 428. + +\bugonpage A461, right column (2/19/93) + +\eightpoint +\newbox\astbox \setbox\astbox=\hbox to0pt{\hss\lower1pt\hbox{*}} +\def\prim#1{\par\indent\copy\astbox{\tt\char`\\#1}} +\prim{chardef}, 44, 121, 155, 210, 214, 215, 271,\par +\indent\qquad $\underline{277}$, 336, {\it343}, {\it345}, {\it356}, 452.\par +\indent\<chardef token>, $\underline{271}$, 283, 286, 289. + +\bugonpage A467, left column (2/25/93) + +\eightpoint +Greek, 127--128, 137, 156, 164, 319,\par +\indent\qquad 358, 430, 434. + +\bugonpage A470, left column (2/25/93) + +\eightpoint +margins, {\sl see\/} |\hoffset|, |\hsize|, |\narrower|. + +\bugonpage A471, left column (2/19/93) + +\eightpoint +\prim{mathchardef}, 155, 199, 214, 215, 271,\par +\indent\qquad 277, 289, 336, {\it358}, {\it394}.\par +\indent\<mathchardef token>, $\underline{271}$, 289. + +\bugonpage A474, right column (3/22/92) + +\eightpoint +pound sterling, 54, {\it339}, 428. + +\bugonpage A477, right column (3/22/92) + +\eightpoint +sterling, 54, {\it339}, 428. + +\bugonpage A480, left column (4/9/92) + +\eightpoint +\prim{unhbox}, 120, 283, $\underline{285}$, 293, {\it354}, {\it356}, + {\it399}.\par +\prim{unhcopy}, 120, 283, $\underline{285}$, 293, {\it353}. + +\bugonpage A481, left column (2/25/93) + +\eightpoint +whatsits, 95, 110, 157, 226--229, 455. + +\bugonpage A483, lines 15--21 (2/25/93) + +{\tt P.O. Box 869\par +Santa Barbara, CA 93102-0869 USA.\par +|}|} +\smallskip\noindent +Don't delay, write today! That number again is + +\smallskip +{\obeylines +\TeX\ Users Group +P.O. Box 869 +Santa Barbara, CA 93102-0869 USA. +} + +% volume B +\hsize=35pc +\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers +\def\to{\mathrel{.\,.}} % double dot, used only in math mode + +\bugonpage B2, line 10 from the bottom (2/27/93) + +\ninepoint\noindent\hskip10pt +{\bf define} $\\{banner}\equiv\hbox{\tt\char'23}$% +{\tt This\]is\]TeX,\]Version\]3.1415\char'23}\quad +$\{\,$printed when \TeX\ starts$\,\}$ + +\bugonpage B89, line 12 (2/27/93) + +\tenpoint +\noindent\hskip10pt +In horizontal mode, the \\{prev\_graf} field is used for initial language data. + +\bugonpage B89, line 20 (2/27/93) + +\ninepoint +\noindent\hskip20pt +\\{pg\_field}, \\{ml\_field}: \\{integer}; \ \\{aux\_field}: \\{memory\_word}; +\par +\noindent [Also delete the definitions of \\{lhmin} and \\{rhmin}, lines +32 and 33.] + +\bugonpage B90, line 13 (2/27/93) + +\ninepoint +\noindent\hskip10pt +$\\{prev\_depth}\gets\\{ignore\_depth}$; \ $\\{mode\_line}\gets0$; \ +$\\{prev\_graf}\gets0$; + +\bugonpage B91, top three lines (2/27/93) + +\ninepoint +\noindent\hskip20pt +{\bf if\/} $m=\\{hmode}$ {\bf then if\/} $\\{nest}[p].\\{pg\_field}\ne + \oct{40600000}$ {\bf then}\par\noindent\hskip40pt +{\bf begin} \\{print}({\tt\char`\"\](language\char`\"}); \ + \\{print\_int}(\\{nest}[$p$].\\{pg\_field} {\bf mod} \oct{200000});\par +\noindent\hskip40pt + \\{print}({\tt\char`\":hyphenmin\char`\"}); \ + \\{print\_int}(\\{nest}[$p$].\\{pg\_field} {\bf div} \oct{20000000}); \ + \\{print\_char}({\tt\char`\",\char`\"});\par\noindent\hskip40pt +\\{print\_int}((\\{nest}[$p$].\\{pg\_field} {\bf div} \oct{200000}) + {\bf mod} \oct{100}); \ \\{print\_char}({\tt\char`\")\char`\"}); + +\bugonpage B344, lines 21 and 22 (2/27/93) + +\tenpoint\noindent\hskip10pt +This code assumes that a \\{glue\_node} and a \\{penalty\_node} occupy the +same number of \\{mem}~words. + +\bugonpage B344, line 30 (2/27/93) + +\ninepoint\noindent\hskip10pt +$\\{link}(\\{tail})\gets\\{new\_param\_glue}(\\{par\_fill\_skip\_code})$; \ + $\\{init\_cur\_lang}\gets\\{prev\_graf}$ {\bf mod} \oct{200000};\par +\noindent\hskip10pt +$\\{init\_l\_hyf}\gets\\{prev\_graf}$ {\bf div} \oct{20000000}; \ +$\\{init\_r\_hyf}\gets(\\{prev\_graf}$ {\bf div} \oct{200000}) {\bf mod} + \oct{100}; \ +\\{pop\_nest}; + +\bugonpage B353, line 4 (2/27/93) + +\tenpoint\noindent\hskip10pt +Kern nodes do not disappear at a line break unless they are \\{explicit}. + +\bugonpage B353, lines 15 and 16 (2/27/93) + +\ninepoint\noindent\hskip20pt +\\{math\_node}: $\\{break\_width}[1]\gets\\{break\_width}[1]-\\{width}(s)$;\par +\noindent\hskip20pt +\\{kern\_node}: {\bf if\/} $\\{subtype}(s)\ne\\{explicit}$ + {\bf then goto} \\{done}\par\noindent\hskip30pt +{\bf else} $\\{break\_width}[1]\gets\\{break\_width}[1]-\\{width}(s)$; + +\bugonpage B354, lines 6 and 7 (2/27/93) + +\tenpoint\noindent +will be the background +plus $l_1$, so the length from \\{cur\_p} to \\{cur\_p} should be +$\gamma+l_0+l_1-l$. +If the post-break text of the discretionary is empty, a break may also +discard~$q$; in that unusual case we subtract the length of~$q$ and any +other nodes that will be discarded after the discretionary break. + +\bugonpage B354, line 18 (2/27/93) + +\ninepoint\noindent\hskip20pt +{\bf begin} $\langle\,$Add the width of node $s$ to \\{break\_width}{\sevenrm + \kern.5em842}$\,\rangle$; + +\bugonpage B354, line 22 (2/27/93) + +\ninepoint\noindent\hskip10pt +{\bf if\/} $\\{post\_break}(\\{cur\_p})=\\{null}$ {\bf then} + $s\gets\\{link}(v)$;\quad$\{\,$nodes may be discardable after the break$\,\}$ + +\bugonpage B355, top line (2/27/93) + +\ninepoint\noindent +{\tenbf842.\quad}$\langle\,$Add the width of node $s$ to + \\{break\_width}{\sevenrm\kern.5em842}$\,\rangle\equiv$ + +\bugonpage B355, lines 9--14 (2/27/93) + +\ninepoint\noindent\hskip20pt +$\\{hlist\_node},\\{vlist\_node},\\{rule\_node},\\{kern\_node}$: + $\\{break\_width}[1]\gets\\{break\_width}[1]+\\{width}(s)$;\par +\noindent\hskip20pt +{\bf othercases} \\{confusion}({\tt\char`\"disc2\char`\"})\par +\noindent\hskip20pt +{\bf endcases} + +\bugonpage B364, line 10 (2/27/93) + +\tenpoint\noindent +a glue node, penalty node, explicit kern node, or math node. + +\bugonpage B366, line 11 from the bottom (2/27/93) + +\ninepoint\noindent +\\{kern\_node}: {\bf if\/} $\\{subtype}(\\{cur\_p})=\\{explicit}$ + {\bf then} \\{kern\_break}\par\noindent\hskip10pt +{\bf else} $\\{act\_width}\gets\\{act\_width}+\\{width}(\\{cur\_p})$; + +\bugonpage B367, line 21 (2/27/93) + +\ninepoint\noindent\hskip20pt +{\bf else if\/} \\{precedes\_break}(\\{prev\_p}) {\bf then} + $\\{try\_break}(0,\\{unhyphenated})$\par\noindent\hskip20pt +{\bf else if\/} $(\\{type}(\\{prev\_p})=\\{kern\_node})\land + (\\{subtype}(\\{prev\_p})\ne\\{explicit})$ {\bf then} + $\\{try\_break}(0,\\{unhyphenated})$; + +\bugonpage B372, lines 12 and 13 (2/27/93) + +\ninepoint\noindent\hskip20pt +{\bf if\/} $\\{type}(q)=\\{kern\_node}$ {\bf then}\par\noindent\hskip30pt +{\bf if\/} $\\{subtype}(q)\ne\\{explicit}$ {\bf then goto} \\{done1}; + +\bugonpage B376, line 3 from the bottom (2/27/93) + +\ninepoint\noindent\hskip10pt +$\\{cur\_lang}\gets\\{init\_cur\_lang}$; \ +$\\{l\_hyf}\gets\\{init\_l\_hyf}$; \ +$\\{r\_hyf}\gets\\{init\_r\_hyf}$; + +\bugonpage B377, lines 11 and 12 (2/27/93) + +\ninepoint\noindent +$\\{cur\_lang},\\{init\_cur\_lang}$: \\{ASCII\_code};\quad + $\{\,$current hyphenation table of interest$\,\}$\par\noindent +$\\{l\_hyf},\\{r\_hyf},\\{init\_l\_hyf},\\{init\_r\_hyf}$: \\{integer};\quad + $\{\,$limits on fragment sizes$\,\}$ + +\bugonpage B378, line 5 from the bottom, overriding earlier change (2/27/93) + +\ninepoint\noindent\hskip30pt +{\bf else if} $(\\{type}(s)=\\{kern\_node})\land(\\{subtype}(s)=\\{normal})$ + {\bf then}\par\noindent\hskip50pt +{\bf begin} $\\{hb}\gets s$; \ $\\{hyf\_bchar}\gets\\{font\_bchar}[\\{hf}]$; \ + {\bf end}\par\noindent\hskip40pt +{\bf else goto} \\{done3}; + + +\bugonpage B394, lines 12 and 13 (2/27/93) + +\ninepoint\noindent\hskip10pt +{\bf var} $n$: $0\to64$;\quad$\{\,$length of current word; not always + a \\{small\_number}$\,\}$\par\noindent\hskip20pt +$j$: $0\to64$;\quad$\{\,$an index into \\{hc}$\,\}$ + +\bugonpage B404, line 21 (2/27/93) + +\ninepoint\noindent\hskip10pt +{\bf var} $k,l$: $0\to64$;\quad$\{\,$indices into \\{hc} and \\{hyf}; + not always in \\{small\_number} range$\,\}$ + +\bugonpage B460, lines 21 and 22 (2/27/93) + +\ninepoint\noindent\hskip10pt +\\{push\_nest}; \ $\\{mode}\gets\\{hmode}$; \ $\\{space\_factor}\gets1000$; \ + \\{set\_cur\_lang}; \ $\\{clang}\gets\\{cur\_lang}$;\par\noindent\hskip10pt +$\\{prev\_graf}\gets(\\{norm\_min}(\\{left\_hyphen\_min})\ast\oct{100}+ + \\{norm\_min}(\\{right\_hyphen\_min}))\ast\oct{200000}+\\{cur\_lang}$; + +\bugonpage B492, line 6 from the bottom (2/27/93) + +\ninepoint\noindent\hskip10pt +\\{unsave}; \ $\\{prev\_graf}\gets\\{prev\_graf}+3$;\par\noindent\hskip10pt +\\{push\_nest}; \ $\\{mode}\gets\\{hmode}$; \ $\\{space\_factor}\gets1000$; \ + \\{set\_cur\_lang}; \ $\\{clang}\gets\\{cur\_lang}$;\par\noindent\hskip10pt +$\\{prev\_graf}\gets(\\{norm\_min}(\\{left\_hyphen\_min})\ast\oct{100}+ + \\{norm\_min}(\\{right\_hyphen\_min}))\ast\oct{200000}+\\{cur\_lang}$; + +% volume C +\hsize=29pc +\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers + +\bugonpage C151, line 11 from the bottom (6/26/93) + +\ninepoint\indent +\qquad scaled $1.42(1+\max(-\\{pen\_lft},\\{pen\_rt},\\{pen\_top}, + -\\{pen\_bot}))$ + +\bugonpage C262, line 15 (6/26/93) + +\ninepoint\noindent +|string base_name, base_version; base_name="plain"; base_version="2.71";| + +\bugonpage C262, line 29 (6/26/93) + +\ninepoint\noindent +|def |^|gobble|| primary g = enddef; def |^|killtext|| text t = enddef;| + +\bugonpage C271, bottom line (6/26/93) + +\ninepoint\noindent +| culldraw p enddef;| + +\bugonpage C272, three new lines for top of page (6/26/93) + +{\ninepoint\parindent=0pt +|def |^|culldraw|| expr p = addto pic_ doublepath p.t_ withpen currentpen;|\par +| cull pic_ dropping(-infinity,0) withweight default_wt_;|\par +| addto_currentpicture also pic_; pic_:=nullpicture; killtext enddef;|\par +} + +\bugonpage C272, replacement for former line 5 (6/26/93) + +\ninepoint\noindent +| (cut_ scaled (1+max(-pen_lft,pen_rt,pen_top,-pen_bot))| + +\bugonpage C296, line 24 (2/3/93) + +\ninepoint\noindent +the definition of |rp| is changed to `|]..tension 4..|', +and if `|scaled|~|5pt|' is inserted\cutpar + +\bugonpage C299, line 3 (5/15/92) + +\ninepoint\noindent +a Bernshte{\u\i}n polynomial of order $n-1$.) + +\bugonpage C347, left column (5/15/92) + +\eightpoint +Bernshte{\u\i}n, Serge{\u\i} \thinspace Natanovich, 14. + +\bugonpage C348, left column (6/26/93) + +\eightpoint +|culldraw|, {\it271}, $\underline{272}$. + +\bugonpage C350, left column (6/26/93) + +\eightpoint +exponential, {\sl see\/} |mexp|. + +\bugonpage C352, left column (6/26/93) + +\eightpoint +|killtext|, $\underline{262}$, {\it 272}. + +\bugonpage C352, right column (6/26/93) + +\eightpoint +logarithm, {\sl see\/} |mlog|. + +\bugonpage C361, lines 14 and 15 (2/25/93) + +P.O. Box 869\par +Santa Barbara, CA 93102-0869 USA. + + +% Volume D +\hsize=29pc +\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers +\def\to{\mathrel{.\,.}} % double dot, used only in math mode + +\bugonpage Dxiv, line 13 (4/19/96) + +\noindent preprocessor converts these into numeric constants that are +256 or more. This\cutpar + +\bugonpage Dxiv, line $-1$ (4/19/96) + +\ninepoint\noindent This file contains one line per string, starting with +string number 256, then number 257,\cutpar + +\bugonpage Dxv, lines 10 and 11 (4/19/96) + +\ninepoint\noindent +In this case, occurrences of |""| in the |WEB| program will be replaced by +256; occurrences of |"This longer string"| will be replaced by 257. +The symbol |@$| stands for the numeric\cutpar + +\hsize=35pc +\bugonpage D2, line $-17$ (8/7/98) + +\def\RQ/{{\char'23}} % right quote in a string +\ninepoint\noindent +{\bf define} $\\{banner}\equiv\hbox{\tt\RQ/This\]is\]METAFONT,\]% + Version\]2.7182\RQ/}$\quad$\{\,$printed when \MF\ starts$\,\}$ + +\bugonpage D50, line 26 (8/7/98) + +\ninepoint\noindent +\quad{\bf if\/} $b>0$ {\bf then} + +\bugonpage D138, line 14 from the bottom (3/6/95) + +\tenpoint +\textindent{$2'$)} Let $Z_k^{(j+1)}={1\over2}(Z_k^{(j)}+Z_{k+1}^{(j)})$, for +$1\le k\le n-j$, for $1\le j<n$. + +\bugonpage D190, D191, D194, D195 (6/26/93) + +\noindent[Several changes to the code in sections 415, 416, 424, and 425 +were made to \MF\ version 2.71 in July~1991, too numerous to mention here. +They are documented in file {\tt mf84.bug} as bug number 560. We also +delete lines 4 and~5 of page D194.] + +\bugonpage D216, line 10 from the bottom (7/15/92) + +\tenpoint\noindent +will be offset by $w_1$ or $w_2$, unless its slope drops to zero +en route to the eighth octant; in the latter\cutpar + +\bugonpage D289, lines 9 and 10 (6/26/93) + +\ninepoint\noindent\hskip20pt +$p\gets\\{dep\_list}(p)$; \ $r\gets\\{inf\_val}$;\par\noindent\hskip20pt +{\bf repeat if\/} $\\{value}(\\{info}(p))\ge\\{value}(r)$ {\bf then} + +\bugonpage D296, lines 8 and 9 from the bottom (9/13/98) + +\ninepoint\noindent[Delete these spurious lines.] + +\bugonpage D297, mini-index (6/6/98) + +\eightpoint the meaning of {\it loc\/} should be `macro' + +\bugonpage D310, line 7 (8/7/98) + +\ninepoint\noindent +\quad{\bf if\/} $(\\{loc}=k+1)\land(\\{length}(\\{buffer}[k])=1)$ + {\bf then} $\\{cur\_mod}:=\\{buffer}[k]$ + +\bugonpage D363, lines 10 and 11 (3/1/95) + +\ninepoint\noindent +\quad {\bf begin if\/} $(\\{max\_c}[\\{dependent}]$ {\bf div} + $\oct{10000}\ge\\{max\_c}[\\{proto\_dependent}])$ {\bf then} + $t\gets\\{dependent}$ + +\bugonpage D512, line 13 (11/23/98) + +\ninepoint\noindent +\quad \\{print\_int}(\\{round\_unscaled}(\\{internal}[\\{year}])); \ + \\{print\_char}(|"."|); + +\bugonpage D518, insert new material between lines 7 and 8 (3/20/95) + +\ninepoint\noindent +\quad {\bf while} $\\{input\_ptr}>0$ {\bf do}\par\noindent +\qquad {\bf if\/} \\{token\_state} {\bf then} \\{end\_token\_list} + {\bf else} \\{end\_file\_reading};\par\noindent +\quad {\bf while} $\\{loop\_ptr}\ne\\{null}$ {\bf do} \\{stop\_iteration}; + +\bugonpage D518, line 18 (3/20/95) + +\ninepoint\noindent +\qquad $\\{loop\_ptr}\gets\\{cond\_ptr}$; \ + $\\{cond\_ptr}\gets\\{link}(\\{cond\_ptr})$; \ + $\\{free\_node}(\\{loop\_ptr},\\{if\_node\_size})$; + +\bugonpage D546, left column (4/11/96) + +\eightpoint +Stern, Moritz Abraham: \ 526. + +% volume E +\hsize=29pc +\def\dashto{\mathrel{\hbox{-\kern-.05em}\mkern3.9mu\hbox{-\kern-.05em}}} + + +\bye + diff --git a/Master/texmf-dist/source/generic/knuth/errata/errata.eleven b/Master/texmf-dist/source/generic/knuth/errata/errata.eleven new file mode 100644 index 00000000000..64d9f8ab457 --- /dev/null +++ b/Master/texmf-dist/source/generic/knuth/errata/errata.eleven @@ -0,0 +1,317 @@ +% Bugs (sigh) in Computers \& Typesetting + +\input manmac +\def\curl{\mathop{\rm curl}} +\def\cycle{{\rm cycle}}\indent +\def\dashto{\mathrel{\hbox{-\thinspace-\kern-.05em}}} +\font\sltt=cmsltt10 +\font\niness=cmss9 +\font\ninessi=cmssi9 +\proofmodefalse +\raggedbottom +\output{\hsize=29pc \onepageout{\unvbox255\kern-\dimen@ \vfil}} + +\def\today{\number\day\ + \ifcase\month\or + Jan\or Feb\or Mar\or Apr\or May\or Jun\or + Jul\or Aug\or Sep\or Oct\or Nov\or Dec\fi + \ \number\year} + +\def\cutpar{{\parfillskip=0pt\par}} + +\def\rhead{Bugs in {\tensl Computers \& Typesetting, 2001}} +\def\bugonpage#1(#2) \par{\bigbreak\tenpoint + \hrule width\hsize + \line{\lower3.5pt\vbox to13pt{}Page #1\hfil(#2)}\hrule width\hsize + \nobreak\medskip} +\def\buginvol#1(#2) \par{\bigbreak\penalty-1000\tenpoint + \hrule width\hsize + \line{\lower3.5pt\vbox to13pt{}Volume #1\hfil(#2)}\hrule width\hsize + \nobreak\medskip} +\def\slMF{{\manual 89:;}\-{\manual <=>:}} % slant the logo +\def\0{\raise.7ex\hbox{$\scriptstyle\#$}} +\newcount\nn +\newdimen\nsize \newdimen\msize \newdimen\ninept \ninept=9pt +\newbox\eqbox \setbox\eqbox=\hbox{\kern2pt\eightrm=\kern2pt} + +\tenpoint +\noindent This is a list of all substantial corrections made to {\sl Computers +\& Typesetting\/} between the first ``Millennium edition'' of 2000 and the +second such edition, which appeared late in 2001. +(More precisely, it lists errors to the 16th, 7th, 6th, 4th, and 5th +printings of Volumes A, B, C, D, and E, respectively, that were corrected +in the 17th, 8th, 7th, 5th, and 6th printings.) +Changes to the mini-indexes +and master indexes of Volumes B, D, and~E are not shown here unless they are +not obviously derivable from what has been shown. +\looseness=-1 + +% volume A + +\bugonpage A16, line 7 from the bottom (06/30/01) + +\font\magnifiedfiverm=cmr5 at 10pt +\tenpoint\indent +Ten-point type is different from% + \magnifiedfiverm\ magnif{}ied f{}ive-point type. + +\bugonpage A17, line 7 (06/30/01) + +\ninepoint\indent +fications that grow in geometric ratios---something like equal-tempered +tuning\cutpar + +\bugonpage A51, lines 18--20 (06/30/01) + +\tenpoint\kern-6pt\noindent +$$\openup1pt\halign{\indent#\hfil\cr +|ff| yields ff\thinspace;$\!$\quad |fi| yields fi\thinspace;$\!$\quad +|fl| yields fl\thinspace;$\!$\quad +|ffi| yields ffi\thinspace;$\!$\quad |ffl| yields ffl\thinspace;\cr +|``| yields``\thinspace;\qquad |''| yields ''\thinspace;\qquad +|!||`| yields !`\thinspace;\qquad |?||`| yields ?`\thinspace;\cr +|--| yields --\thinspace;\qquad |---| yields ---\thinspace.\cr}$$ + +\bugonpage A52, line 7 from the bottom (06/30/01) + +\tenpoint\kern-6pt\noindent +$$\halign{\indent\hbox to 50pt{#\hfil}&\hbox to 35pt{#\hfil}&#\hfil\cr +|\ae,\AE|&\ae,\thinspace\AE&(Latin ligature and Scandinavian letter AE)\cr}$$ + +\bugonpage A71, line 15 (06/30/01) + +\tenpoint\indent +One of the interesting things that can happen when glue stretches and\cutpar + +\bugonpage A180, line 20 (06/30/01) + +\ninepoint\indent +Challenge number 5:\enspace +$\qquad\tenmath k=1.38065\times10^{-16}\rm\,erg\,K^{-1}$. + +\bugonpage A254, line 12 from the bottom becomes two lines (04/09/01) + +\ninepoint\noindent +\begintt +\output={\unvbox255 + \ifnum\outputpenalty<10000 \penalty\outputpenalty\fi} +\endtt + +\bugonpage A292, lines 13--16 (06/30/01) + +\def\s{\hskip0pt plus1pt} +\ninepoint\textindent{$\bull$}|\mathchoice|\s +$\langle$filler$\rangle$\s|{|\s$\langle$math mode material$\rangle$\s|}|\s +$\langle$filler$\rangle$\s|{|\s$\langle$math mode material$\rangle$\s|}|\break +$\langle$filler$\rangle$|{|$\langle$math mode material$\rangle$|}| +$\langle$filler$\rangle$|{|$\langle$math mode material$\rangle$|}|. +Four math lists, which are defined as in the +second alternative of a \<math field>, are +recorded in a ``choice item'' that is appended to the current list. + +\bugonpage A306, line 7 (06/30/01) + +\ninepoint\noindent +instead of a shelf{\kern0pt}ful. +In fact, the latter idea---to +insert an italic correction---is prefer-\cutpar + +\bugonpage A323, line 12 from the bottom (06/30/01) + +\ninepoint\noindent +\hbox to\parindent{\bf\hss18.31.\enspace}% +|$k=1.38065\times10^{-16}\rm\,erg\,K^{-1}$|. + +\bugonpage A451, line 15 (01/30/01) + +\tenpoint\noindent +{\sl Connecticut Yankee\/} come out with only nine or +ten bad hyphens: + +\bugonpage A451, line 23 (01/30/01) + +\tenpoint\noindent\begintt + mo-er-der-mohren-mut-ter-mar-mor-mon-u-menten-macher. +\endtt + +\bugonpage A454, lines 23--30 (06/30/01) + +\begingroup +\hyphenpenalty=-1000 \pretolerance=-1 \tolerance=1000 +\doublehyphendemerits=-100000 \finalhyphendemerits=-100000 +\ddanger If a suitable starting letter is found, let it be in font~$f$. +Hyphenation is abandoned unless the |\hyphenchar| of~$f$ is a number +between 0 and~255, inclusive. +If this test is passed, \TeX\ continues to scan forward +until coming to something that's not one of the following three +``admissible items'': (1)~a character in font~$f$ whose |\lccode| +is nonzero; (2)~a ligature formed entirely from characters of type~(1); +(3)~an implicit kern. The first inadmissible item terminates this part of +the process; the trial word consists of all the letters found in admissible +items. Notice that all of these letters are in font~$f$. +\par\endgroup + +\bugonpage A461, right column (07/08/01) + +\eightpoint\noindent +\llap{*}|\char|, {\it 43--45}, 76, 86, 155, 283, $\underline{286}$, + +\bugonpage A466, left column (07/09/01) + +\eightpoint\noindent +\llap{*}|\floatingpenalty|, $\underline{123}$--$\underline{124}$, + 272, 281, {\it 363}. + +\bugonpage A473, left column (06/30/01) + +\eightpoint\noindent +orphans, {\sl see\/} widow words. + +% volume B +\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers +\def\to{\mathrel{.\,.}} % double dot, used only in math mode + +\hsize=35pc + +\bugonpage B8, line 2 (05/04/01) + +\tenpoint\noindent +statements will be meaningful. We insert the label +`\\{exit}' just before the `{\bf end}' of a procedure in\cutpar + +\bugonpage B30, line $-4$ (05/04/01) + +\ninepoint\noindent +\quad{\bf begin} \\{update\_terminal};\quad$\{\,$now the user sees + the prompt for sure$\,\}$ + +\bugonpage B84, lines 22 and 27 (05/04/01) + +\ninepoint\noindent +\quad$\\{ignore}=9$\quad$\{\,$characters to ignore ( |^^@| )$\,\}$\par +\noindent +\quad$\\{active\_char}=13$\quad$\{\,$characters that invoke + macros ( |~| )$\,\}$ + +\bugonpage B280, lines 23 and 24 (04/08/01) + +\tenpoint\noindent +or unset nodes; in particular, each mlist item appears in the +variable-size part of \\{mem}, so the \\{type} field is always present. + +\bugonpage B382, line 6 (01/01/01) + +\tenpoint\noindent +between `fl' and `y', then $m=2$, $t=2$, and $y_1$ will +be a ligature node for `fl' followed by an\cutpar + +\bugonpage B386, line 11 (04/08/01) + +\ninepoint\noindent +\quad$\\{qi}(2),\\{qi}(6)$: {\bf begin} $\\{cur\_r}\gets\\{rem\_byte}(q)$;% + \quad$\{\,$\||=:|, \||=:>|$\,\}$ + +\bugonpage B475, line 12 (07/01/01) + +\ninepoint\noindent +\qquad{\bf end};\quad$\{\,$now we are in vertical mode, + working on the list that will contain the display$\,\}$ + +% volume C +\hsize=29pc +\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers +\def\ddashto{\mathrel{\hbox{-\thinspace-\thinspace-\kern-.05em}}} +\def\tension{\mathop{\rm tension}} +\def\controls{\mathop{\rm controls}} +\def\and{\,{\rm and}\,} + +\bugonpage C204, line 3 from the bottom (07/08/01) + +\ninepoint\noindent +slightly. If $\\{autorounding}>1$, +you get even more changes: Paths are perturbed slightly\cutpar + +\bugonpage C238, lines 9 and 8 from the bottom (07/08/01) + +\ninepoint\noindent +tance is ${\rm length}(z_4-z_1)$. But there's a slicker solution: +Just calculate +$$\hbox{abs ypart$((z_1-z_2)\mathbin{\rm rotated}-{\rm angle}(z_3-z_2))$.}$$ + +\bugonpage C313, bottom line (06/30/01) + +\rightline{\eightss--- LA ROCHEFOUCAULD, {\eightssi Maximes\/}\enspace(1665)} + +\bugonpage C352, left column (06/30/01) + +\eightpoint\noindent +La Rochefoucauld, Fran\c cois VI, 313. + +\bugonpage C357, right column (07/08/01) + +\eightpoint\noindent +\llap{*}|true|, 55, {\it64\/}--{\it65}, 170, 210. + +% Volume D +\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers +\def\to{\mathrel{.\,.}} % double dot, used only in math mode + +\hsize=35pc + +\bugonpage D8, line 2 (05/04/01) + +\tenpoint\noindent +statements will be meaningful. We insert the label +`\\{exit}' just before the `{\bf end}' of a procedure in\cutpar + +\bugonpage D28, line $-8$ (05/04/01) + +\ninepoint\noindent +\quad{\bf begin} \\{update\_terminal};\quad$\{\,$now the user sees + the prompt for sure$\,\}$ + +\bugonpage D101, line 21 (07/08/01) + +\ninepoint\noindent +\quad{\bf define} $\\{subscr\_head\_loc}(\hbox{\tt\#})\equiv\hbox{\tt\#}+1$ +\quad$\{\,$where \\{value}, \\{subscr\_head}, and \\{attr\_head} are$\,\}$ + +\bugonpage D180, lines 22 and 23 (01/26/01) + +\tenpoint\noindent +$(y,-x)$ will appear in node~$p$. Similarly, a fourth-octant +transformation will have been applied after the transition, so +we will have $\\{x\_coord}(q)=\hbox{$-x$}$ and $\\{y\_coord}(q)=y$. + +\bugonpage D196, lines 7 and 8 (01/26/01) + +\tenpoint\noindent +where $x'(t)\ge0$ we have $\\{right\_type}=% +\\{first\_octant}$ or $\\{right\_type}=\\{eighth\_octant}$; in regions where +$x'(t)\le0$, +we have $\\{right\_type}=\\{fifth\_octant}$ or $\\{right\_type}=\\{fourth% +\_octant}$. + +\bugonpage D511, line 17 (07/03/01) + +\tenpoint\noindent +from appearing again. + +% volume E +\hsize=29pc + +\newbox\shorthyf \setbox\shorthyf=\hbox{-\kern-.05em} +\mathchardef\period=`\. +{\catcode`\-=\active \global\def-{\copy\shorthyf\mkern3.9mu} + \catcode`\.=\active \global\def.{\period\mkern3mu}} +\def\8#1{\mathrel{\mathcode`\.="8000 \mathcode`\-="8000 + #1\unkern}} % `..' and `--' + +\bugonpage E9, line 9 (07/03/01) + +\tenpoint\indent +|[92] [123] [124]) ) )| + +\bye + + diff --git a/Master/texmf-dist/source/generic/knuth/errata/errata.five b/Master/texmf-dist/source/generic/knuth/errata/errata.five new file mode 100644 index 00000000000..4e2982f109a --- /dev/null +++ b/Master/texmf-dist/source/generic/knuth/errata/errata.five @@ -0,0 +1,1108 @@ +% Bugs (sigh) in Computers \& Typesetting + +\input manmac +\font\sltt=cmsltt10 +\font\niness=cmss9 +\font\ninessi=cmssi9 +\proofmodefalse +\raggedbottom +\output{\hsize=29pc \onepageout{\unvbox255\kern-\dimen@ \vfil}} + +\def\today{\number\day\ + \ifcase\month\or + Jan\or Feb\or Mar\or Apr\or May\or Jun\or + Jul\or Aug\or Sep\or Oct\or Nov\or Dec\fi + \ \number\year} + +\def\cutpar{{\parfillskip=0pt\par}} + +\def\rhead{Bugs in {\tensl Computers \& Typesetting, 1989}} +\def\bugonpage#1(#2) \par{\bigbreak\tenpoint + \hrule width\hsize + \line{\lower3.5pt\vbox to13pt{}Page #1\hfil(#2)}\hrule width\hsize + \nobreak\medskip} +\def\buginvol#1(#2) \par{\bigbreak\penalty-1000\tenpoint + \hrule width\hsize + \line{\lower3.5pt\vbox to13pt{}Volume #1\hfil(#2)}\hrule width\hsize + \nobreak\medskip} +\def\slMF{{\manual 89:;}\-{\manual <=>:}} % slant the logo +\def\0{\raise.7ex\hbox{$\scriptstyle\#$}} +\newcount\nn +\newdimen\nsize \newdimen\msize \newdimen\ninept \ninept=9pt +\newbox\eqbox \setbox\eqbox=\hbox{\kern2pt\eightrm=\kern2pt} + +\tenpoint +\noindent This is a list of all corrections made to {\sl Computers \& +Typesetting}, Volumes \hbox{A--E}, between 20 February 1989 and +30 September 1989 (when \TeX\ Version 3.0 and \MF\ Version 2.0 were +fully defined). Corrections made to +the softcover version of {\sl The \TeX book\/} are the same as corrections to +Volume~A\null. Corrections to the softcover version of {\sl The +\slMF\kern1ptbook\/} are the same as corrections to Volume~C\null. +Some of these corrections have already been made in reprintings +of the books. Several minor changes +to Volumes A~and~C are not shown here because they simply +make room for the more substantive changes needed to describe the new +features of \TeX\ Version 3.0 and \MF\ Version 2.0. Hundreds of +changes will soon be made to Volumes B~and~D because of the upgrades +to \TeX\ and \MF\/; it will unfortunately be impossible to document all of those +changes. Therefore, readers who need up-to-date information on the \TeX\ and +\MF\ programs should refer to the |WEB| source files until new +printings of Volumes B~and~D are issued. + +% volume A + +\buginvol A, in general (9/23/89) + +\ninepoint\noindent +[Change `127' to `255' and `128' to `256' in contexts referring to character +codes. This happens on pages 37(twice), 39, 41, 43, 44(twice), 48, 93, 154, +277, 305(twice), 308(twice), 313, and 343. Also change `7-bit' to `8-bit' on +pages 214 and 277.] + +\bugonpage A23, line 16 (9/23/89) + +|This is TeX, Version 3.0 (preloaded format=plain 89.7.15)| + +\bugonpage A34, new copy for bottom of page (9/23/89) + +\ddanger If you use \TeX\ format packages designed by others, your +error messages may involve many inscrutable two-line levels of macro +context. By setting ^|\errorcontextlines||=0| at the beginning of your file, +you can reduce the amount of information that is reported; +\TeX\ will show only the top and bottom pairs of context lines +together with up to |\errorcontextlines| additional two-line items. \ (If +anything has thereby been omitted, you'll also see `|...|'.) \ Chances +are good that you can spot the source of an error even when most of a +large context has been suppressed; if not, you can say +`|I\errorcontextlines=100\oops|' and try again. \ (That will usually +give you an undefined control sequence error and plenty of context.) \ +Plain \TeX\ sets |\errorcontextlines=5|. + +\bugonpage A45, lines 9--15 (9/23/89) + +\ninepoint\noindent +|^^| has an internal code between 64 and 127, \TeX\ +subtracts 64 from the code; if the code is between 0 and 63, \TeX\ +adds~64. Hence code 127 can be typed |^^?|, and +the dangerous bend sign can be obtained by saying +|{\manual^^?}|. However, you must change the category code of character +127 before using it, since this character ordinarily has category~15 +(^{invalid}); say, e.g., |\catcode`\^^?=12|. +^^{double hat} ^^{hat hat} +The |^^| notation is different from |\char|, because |^^| combinations are +like single characters; for example, it would not be permissible to say +|\catcode`\char127|, but |^^| symbols can even be used as letters within +control words. + +\bugonpage A45, new copy before line 20 (9/23/89) + +\danger There's also a special convention in which |^^| is +followed by {\sl two\/} ``lowercase hexadecimal digits,'' |0|--|9| or |a|--|f|. +With this convention, all 256 characters are obtainable in a uniform +way, from |^^00| to |^^ff|. Character 127 is |^^7f|. + +\noindent +[Also remove one of the two dangerous bend signs on line 20.] + +\bugonpage A45, bottom paragraph and footnote (9/23/89) + +\ddanger People who install \TeX\ systems for use with non-American alphabets +can make \TeX\ conform to any desired standard. For example, suppose +you have a ^{Norwegian keyboard} containing the letter {\tt\ae}, which +^^{Scandinavian letters} ^^{foreign languages} +comes in as code~241 (say). Your local format package should define +|\catcode`|{\tt\ae}|=11|; then you could have control sequences like +|\s|{\tt\ae}|rtrykk|. Your \TeX\ input files could be made readable by +American installations of \TeX\ that don't have your keyboard, by +substituting |^^f1| for character~241. \ (For example, the stated control +sequence would appear as |\s^^f1rtrykk| in the file; your American +friends should also be provided with the format that you used, with its +|\catcode`^^f1=11|.) \ Of course you should also arrange your fonts +so that \TeX's character 241 will print as {\ae}; and you should +change \TeX's hyphenation algorithm so that it will do correct +Norwegian hyphenation. The main point is that such changes are not +extremely difficult; nothing in the design of \TeX\ limits it to the +American alphabet. Fine printing is obtained by fine tuning to the +language or languages being used. +^^{keyboards, non-ASCII} + +\ddanger European languages can also be accommodated effectively with +only a limited character set. +For example, let's consider Norwegian again, but suppose that\parfillskip=0pt + +\noindent [Now continue with the text on line 11 of page 46.] + +\bugonpage A47, lines 9--21 (9/23/89) + +\ddanger If \TeX\ sees a superscript character (category 7) in any state, +and if that character is followed by another identical character, and if +those two equal characters are followed by a character of code +$c<128$, then they +are deleted and 64 is added~to or subtracted from the code~$c$. +\ (Thus, |^^A| is +replaced by a single character whose code is~1, etc., as explained earlier.) \ +However, if the two superscript characters are immediately followed by two +of the lowercase hexadecimal digits |0123456789abcdef|, the +four-character sequence is replaced by a single character having the +specified hexadecimal code. +The replacement is carried out also if such a trio or quartet of +characters is encountered during steps (b) or~(c) of the control-sequence-name +scanning procedure described above. After the replacement is made, \TeX\ +begins again as if the new character had been present all the time. +If a superscript character is not the first of such a trio or quartet, it is +handled by the following rule. + +\ddanger If \TeX\ sees a character of categories 1, 2, 3, 4, 6, 8, 11, 12, +or~13, +or a character of category~7 that is not the first of a special +sequence as just +described, it converts the character to a token by attaching the category +code, and goes into state~$M$. This is the normal case; almost every +nonblank character is handled by this rule. + +\bugonpage A48, line 15 (9/23/89) + +\ninepoint\noindent +the input line +`| $x^2$~ \TeX ^^62^^6|'\thinspace? + +\bugonpage A54, third line from the bottom (9/23/89) + +\ninepoint\noindent +For example, a well-designed \TeX\ font for ^{French} +might well treat accents as lig-\cutpar + +\bugonpage A76, lines 3--5 from the bottom (9/23/89) + +\ninepoint\noindent +\TeX\ does not assign any value to +|\sfcode'042|. + +\bugonpage A107, new copy for top of page (9/23/89) + +\ddanger If you want to avoid overfull boxes at all costs without +trying to fix them manually, you might be tempted to set +|tolerance=10000|; this allows arbitrarily bad lines to be acceptable +in tough situations. But infinite tolerance is a bad idea, because +\TeX\ doesn't distinguish between terribly bad and preposterously +horrible lines. Indeed, a tolerance of 10000 encourages \TeX\ to +concentrate all the badness in one place, making one truly unsightly +line instead of two moderately bad ones, because a single +``write-off'' produces fewest total demerits according to the rules. +There's a much better way to get the desired effect: \TeX\ has a +parameter called ^|\emergencystretch| that is added to the assumed +stretchability of every line when badness and demerits are computed, +in cases where overfull boxes are otherwise unavoidable. If +|\emergencystretch| is positive, \TeX\ will make a third pass over a +paragraph before choosing the line breaks, when the first passes did +not find a way to satisfy the ^|\pretolerance| and ^|\tolerance|. +The effect of\/ |\emergencystretch| is to scale down the badnesses so +that large infinities are distinguishable from smaller ones. By +setting |\emergencystretch| high enough (based on |\hsize|) you can be +sure that the |\tolerance| is never exceeded; hence overfull boxes +will never occur unless the line-breaking task is truly impossible. + +\bugonpage A116, lines 11--15 (6/7/89) + +\danger If you have two or more |\topinsert| or |\pageinsert| commands in +quick succession, \TeX\ may need to carry them over to several subsequent +pages; but they will retain their relative order when they are +carried over. For example, suppose you have pages that are nine inches +tall, and suppose you have already specified 4~inches of text for some +page, say page~25. Then suppose you make seven topinserts in a row, of% +{\parfillskip=0pt\endgraf}\endgroup + +\bugonpage A125, lines 13--29 (9/23/89) + +\ddanger \looseness=-1 +When the best page break is finally chosen, \TeX\ removes everything after +the chosen breakpoint from the bottom of the ``current page,'' and puts it +all back at the top of the ``recent contributions.'' The +chosen breakpoint itself is placed at the very top of the recent contributions. +If it is a penalty item, the value of the penalty is recorded in +^|\outputpenalty| and the penalty in the contribution list is changed +to $10000$; otherwise |\outputpenalty| is set to 10000. +The insertions that remain on the current page are of three kinds: For +each class~$n$ there are unsplit insertions, followed possibly by +a single split insertion, followed possibly by others. If +^|\holdinginserts|$\null>0$, all insertions remain in place (so that +they might be contributed again); otherwise they are all removed from +the current page list as follows: The unsplit insertions +are appended to |\box|$\,n$, with no interline glue between them. \ +(^{Struts} should be used, as in the |\vfootnote| macro of +Appendix~B\null.) \ +If a split insertion is present, it is effectively |\vsplit| to the size +that was computed previously in Step~4; the top part is treated as an +unsplit insertion, and the remainder (if any) is converted to an insertion +as if it had not been split. This remainder, followed by any other floating +insertions of the same class, is held +over in a separate place. \ (They will show up on the ``current page'' if +^|\showlists| is used while an ^|\output| routine is active; the total +number of such insertions appears in ^|\insertpenalties| during an +|\output| routine.) %\ +Finally, the remaining items before the best break on the current page are put +together in a |\vbox|\parfillskip=0pt + +\bugonpage A131, line 12 (9/22/89) + +\ninepoint\noindent +work fine; but sometimes you want to have uniformity +between different members of a\cutpar + +\bugonpage A155, lines 3--5 (9/23/89) + +\ninepoint\noindent +when it encounters a character that +is given explicitly as ^|\char|\<number>. + +\bugonpage A214, lines 19--24 (9/23/89) + +\ninepoint +\textindent\bull |\the|\<special register>, where \<special register> is +one of the integer quantities ^|\prevgraf|, ^|\deadcycles|, ^|\insertpenalties|, +^|\inputlineno|, ^|\badness|, +or ^|\parshape| (denoting only the number of lines of\/ |\parshape|); or +one of the dimensions ^|\pagetotal|, ^|\pagegoal|, ^|\pagestretch|, +^|\pagefilstretch|, ^|\pagefillstretch|, ^|\pagefilllstretch|, ^|\pageshrink|, +^|\pagedepth|. In horizontal modes you can also refer to a special integer, +|\the\spacefactor|; in vertical modes there's a special dimension, +|\the\prevdepth|. + +\bugonpage A229, new copy after line 11 (9/23/89) + +\ddanger \TeX\ will report the badness of glue setting in a box if +you ask for the numeric quantity +^|\badness| after making a box. For example, you might say +\begintt +\setbox0=\line{\trialtexta} +\ifnum\badness>250 \setbox0=\line{\trialtextb}\fi +\endtt +The badness is between 0 and 10000 +unless the box is overfull, when |\badness=1000000|. + +\bugonpage A271, lines 17--20 (9/23/89) + +\ninepoint +\beginsyntax + \alt<countdef token>\alt^|\count|<8-bit number>\alt<codename><8-bit number> + \alt<chardef token>\alt<mathchardef token>\alt^|\parshape|\alt^|\inputlineno| + \alt^|\hyphenchar|<font>\alt^|\skewchar|<font>\alt^|\badness| +\endsyntax + +\bugonpage A272, lines 3--4 (9/23/89) + +\ninepoint\noindent +value is between 0~and $2^8-1=255$; a ^\<4-bit number> is similar. + +\bugonpage A273, insert after lines 11, 20, 21, 21, 38 (9/23/89) + +\ninepoint +\begindisplay +|\holdinginserts|\quad(positive if insertions remain dormant in output box)\cr +|\language|\quad(the current set of hyphenation rules)\cr +|\lefthyphenmin|\quad(smallest fragment at beginning of hyphenated word)\cr +|\righthyphenmin|\quad(smallest fragment at end of hyphenated word)\cr +|\errorcontextlines|\quad(maximum extra context shown when errors occur)\cr +\enddisplay + +\bugonpage A274, insert after line 4 (9/23/89) + +\ninepoint\indent +|\emergencystretch|\quad(reduces badnesses on final pass of line-breaking) + +\bugonpage A275, line 13 (9/23/89) + +\ninepoint\noindent +That makes a total of 103 parameters of all five kinds. + +\bugonpage A283, line 14 (9/23/89) + +\ninepoint +\beginsyntax + \alt^|\noboundary|\alt^|\unhbox|\alt^|\unhcopy|\alt^|\valign|\alt^|\vrule| +\endsyntax + +\bugonpage A286, lines 3--12 from the bottom (9/23/89) + +\ninepoint +\textindent{$\bull$}% +\<letter>, \<otherchar>, \kern-1pt^|\char|\<8-bit number>, \<chardef token>, +\kern-1pt^|\noboundary|.\enskip +The most common commands of all are the character commands that tell +\TeX\ to append a character to the current horizontal +list, using the current font. +If two or more commands of this type occur in succession, \TeX\ processes +them all as a unit, converting to ligatures and/or +inserting kerns as directed by the font information. \ (Ligatures and +kerns may be influenced by invisible ``boundary'' characters at the left +and right, unless |\noboundary| appears.) \ Each character +command adjusts ^|\spacefactor|, using +the ^|\sfcode| table as described in Chapter~12. +In unrestricted horizontal mode, a +`|\discretionary{}{}{}|' item is appended after a character whose code is +the ^|\hyphenchar| of its font, or after a ligature formed from a sequence +that ends with such a character. + +\bugonpage A287, insert after line 19 (9/23/89) + +\ninepoint +\textindent{$\bull$}% +|\setlanguage|\<number>.\enskip See the conclusion of Appendix H. + +\bugonpage A289, lines 9--14 from the bottom (9/23/89) + +\ninepoint\noindent +$2^{15}-1$. This is done by replacing the character number by its +^|\mathcode| value. If the +|\mathcode| value turns out to be $32768=\null$\hex{8000}, however, + the \<character> +is replaced by an ^{active character} token having the original character +code (0 to~255); \TeX\ forgets the original \<character> and expands this +active character according to the rules of Chapter~20. + +\bugonpage A290, insert before 13th line from bottom (9/23/89) + +\ninepoint +\textindent{$\bull$}% +|\noboundary|. This command is redundant and therefore has no +effect; boundary ligatures are automatically disabled in math modes. + +\bugonpage A296, line 16 from the bottom (9/22/89) + +\noindent[There should be a `|^|' just above the `|3|' in the line below. +This was mistakenly dropped by the printer some time during 1985; it was +correct in the first two printings and it has always been correct inside the +computer!] + +\bugonpage A309, lines 3--5 (9/23/89) + +\ninepoint\noindent +\hbox to\parindent{\bf\hss8.4.\enspace}\ignorespaces +|$|$_{3}$ |x|$_{11}$ |^|$_7$ |2|$_{12}$ |$|$_{3}$ |~|$_{13}$ \]$_{10}$ +\cstok{TeX} |b|$_{12}$ |v|$_{12}$ \]$_{10}$. The final space comes from the +\<return> placed at the end of the line. Code |^^6| yields |v| only +when not followed by |0|--|9| or |a|--|f|. +The initial space is ignored, because state~$N$ +governs the beginning of the line. + +\bugonpage A314, line 27 (9/23/89) + +\ninepoint\noindent +The English word `eighteen' might deserve similar treatment. +\TeX's hyphenation algorithm will not make such spelling changes automatically. + +\bugonpage A318, line 19 (3/3/89) + +\ninepoint +|\def\clearnotenumber{\notenumber=0\relax}| + +\bugonpage A330, line 3 (8/25/89) + +\ninepoint\noindent +\hbox to\parindent{\bf\hss20.10.\enspace}\ignorespaces +|\def\overpaid{{\count0=\balance| + +\bugonpage A336, lines 4--8 from the bottom (9/23/89) + +\ninepoint\noindent +badness rating of a +box is at most 10000, except that the |\badness| of +an overfull box is 1000000. |INITEX| initializes |\tolerance| to +10000, thereby making all line breaks feasible. Penalties of 10000 or more +prohibit breaks; penalties of $-10000$ or less make breaks mandatory. The +cost of a page break is 100000, if the badness is 10000 and if the +associated penalties are less than 10000 in magnitude (see Chapter~15). + +\bugonpage A337, lines 2--16 (9/23/89) + +\ninepoint\noindent +ifies characters whose codes differ by~64 +from the codes of |?|, |@|, |A|; this convention applies only to +characters with ASCII codes less than~128. There are 256 possible characters, +hence 256 entries in each of the |\catcode|, |\mathcode|, +|\lccode|, |\uccode|, |\sfcode|, and |\delcode| tables. All +|\lccode|, |\uccode|, and |\char| values +must be less than~256. A font has at most 256 characters. There are +256~|\box| registers, 256~|\count| registers, 256~|\dimen| registers, +256~|\skip| registers, 256~|\muskip| registers, 256~|\toks| registers, +256~hyphenation tables. +The ``at size'' of a font must be less than~$2048\pt$, i.e.,~$2^{11}\pt$. +Math delimiters are encoded by multiplying the math~code of the ``small +character'' by~$2^{12}$. The magnitude of +a~\<dimen> value must be less than~$16384\pt$, i.e.,~$2^{14}\pt$; +similarly, the \<factor> in a~\<fil dimen> must be less than~$2^{14}$. +A~|\mathchar| or |\spacefactor| or |\sfcode| value must be less than~$2^{15}$; +a~|\mathcode| or |\mag| value must be less than or equal to~$2^{15}$, +and $2^{15}$ denotes an ``active'' math character. There +are $2^{16}\rm\,sp$ per~pt. A~|\delcode| value +must be less than~$2^{24}$; a~|\delimiter|, less than $2^{27}$. +The |\end| command sometimes contributes +a penalty of $-2^{30}$ to the current page. A~\<dimen> must be less than +$2^{30}\rm\,sp$ in absolute value; a~\<number> must be +less than $2^{31}$ in absolute value. + +\bugonpage A348, line 12 from the bottom (9/23/89) + +\ninepoint\noindent +^|\showboxbreadth||=5 |^|\showboxdepth||=3 |^|\errorcontextlines||=5| + +\bugonpage A364, insert before line 18 from the bottom (9/23/89) + +\ninepoint\noindent +^|\lefthyphenmin||=2 |^|\righthyphenmin||=3 % disallow x- or -xx breaks| + +\bugonpage A364, line 5 from the bottom (9/23/89) + +\ninepoint\noindent +|\def|^|\fmtname||{plain}\def\fmtversion{3.0} % identifies the current format| + +\bugonpage A369, insert before line 5 from the bottom (9/23/89) + +\ninepoint +Modern keyboards allow 256 codes to be input, not just 128; so \TeX\ +represents characters internally as numbers in the range 0--255 (i.e., +\oct{000}--\oct{377}, or \hex{00}--\hex{FF}). Implementations of \TeX\ +differ in which characters they will accept in input files and which +they will transmit to output files; these subsets can be specified +independently. A completely permissive version of \TeX\ allows full +256-character input and output; other versions might ignore all +but the visible characters of ASCII; still other versions might +distinguish the tab character (code \oct{011}) from a space on input, +but might output each tab as a sequence of three characters |^^I|. + +\bugonpage A370, lines 3--7 (9/23/89) + +\ninepoint\noindent +close as possible to the ASCII conventions. +\ (b)~Make sure that codes \oct{041}--\oct{046}, \oct{060}--\oct{071}, +\oct{141}--\oct{146}, and \oct{160}--\oct{171} are present and that +each unrepresentable +internal code $<\null$\oct{200} leads to a representable code when \oct{100} is +added or subtracted; then all 256 codes can be input and output. +\ (c)~Cooperate with everyone else who shares +the same constraints, so that you all adopt the same policy. +\ (See Appendix~J for information about the \TeX\ Users Group.) + +\bugonpage A370, bottom line (9/23/89) + +\ninepoint\noindent +doesn't matter if these symbols have their plain +\TeX\ meanings or not. \ (6)~There is a special convention for +representing characters 0--255 in the hexadecimal forms +|^^00|--|^^ff|, explained in Chapter~8. This convention is always +acceptable as input, when |^| is any character of catcode~7. Text +output is produced with this convention only when representing +characters of code $\ge128$ that a \TeX\ installer has chosen not to +output directly. + +\bugonpage A385, line 8 (5/14/89) + +\ninepoint +|\def\beginbox{\setbox0=\hbox\bgroup}| + +\bugonpage A400, line 18 from the bottom (9/23/89) + +\ninepoint\noindent +page prematurely if you want to pass a signal. \ (Set +^|\holdinginserts| positive to pass a signal when the contents of\/ +|\box255| will be sent back through the page builder again, if any +insertions are present.) + +\bugonpage A419, lines 4--6 (9/23/89) + +\ninepoint\noindent +shortened or lengthened anyway; +book preparation with \TeX, as with type, encourages interaction between +humans and machines.) \ +The lines of the quotations are set ^{flush right} by using +^|\obeylines| together with a stretchable ^|\leftskip|: + +\bugonpage A444, lines 21--26 (9/23/89) + +\ninepoint\noindent +following one, using the specified family and the current size, then +insert the ligature character and continue as specified by the font; +two characters may collapse into one, or a new character may appear. +Otherwise if the font information +shows a kern between the current symbol and the next, insert a kern item +after the current Ord atom and move to the next item after that. +Otherwise (i.e., if no ligature or kern is specified between the present +text symbol and the following character), go to Rule~17. + +\bugonpage A453, lines 12--14 from the bottom (9/23/89) + +\begingroup +\hyphenpenalty=-1000 \pretolerance=-1 \tolerance=1000 +\doublehyphendemerits=-100000 \finalhyphendemerits=-100000 +\ninepoint\noindent +Exception: The character +`|.|'~is treated as if it were a \<letter> of code~0 +when it appears in a pattern. Code~0 (which obviously cannot match a nonzero +|\lccode|) is used by \TeX\ to represent the +left or right edge of a word when it is being hyphenated. + +\endgroup + +\bugonpage A454, lines 7--15 from the bottom (9/23/89) + +\begingroup +\hyphenpenalty=-1000 \pretolerance=-1 \tolerance=1000 +\doublehyphendemerits=-100000 \finalhyphendemerits=-100000 +\ddanger If a trial word $l_1\ldots l_n$ has been found by this process, +hyphenation will still be abandoned unless $n\ge\lambda+\rho$, where +$\lambda=\max(1,\hbox{|\lefthyphenmin|})$ and +$\rho=\max(1,\hbox{|\righthyphenmin|})$. +\ (Plain \TeX\ takes $\lambda=2$ and $\rho=3$.) \ Furthermore, the items +immediately following the trial word must consist of zero or more +characters, ligatures, and implicit kerns, followed immediately by +either glue or an explicit kern or a penalty item or a whatsit or an +item of vertical mode material from ^|\mark|, ^|\insert|, or ^|\vadjust|. +Thus, a box or rule or math formula or discretionary following too closely +upon the trial word will inhibit hyphenation. (Since \TeX\ inserts +empty discretionaries after ^{explicit hyphens}, these rules imply that +already-hyphenated compound words will not be further hyphenated by +the algorithm.) + +\endgroup + +\bugonpage A455, new copy after line 13 (9/23/89) + +\begingroup +\hyphenpenalty=-1000 \pretolerance=-1 \tolerance=1000 +\doublehyphendemerits=-100000 \finalhyphendemerits=-100000 +\ddanger \looseness=-1 +So far we have assumed that \TeX\ knows only one style of +hyphenation at a time; but in fact \TeX\ can remember up to 256 +distinct sets of rules, if you have enough memory in your computer. An +integer parameter called ^|\language| selects the rules actually used; +every ^|\hyphenation| and ^|\patterns| specification appends new rules +to those previously given for the current value of\/ |\language|. +\ (If\/ |\language| is negative or greater than 255, \TeX\ acts as if +|\language|$\null=0$.) \ All |\patterns| for all languages must be +given before a paragraph is typeset, if |INITEX| is used for +typesetting. + +\ddanger \TeX\ is able to work with several languages in the same +paragraph, because it operates as follows. At the beginning of a +paragraph the ``current language'' is defined to be~0. Whenever a +character is added to the current paragraph (i.e., in unrestricted +horizontal mode), the current language is compared to |\language|; if +they differ, the current language is reset and a whatsit node +specifying the new current language is inserted before the character. +Thus, if you say `|\def\french{\language1...}|' and `|mix| |{\french +franc/ais}| |with| |English|', \TeX\ will put whatsits before the |f| +and the~|w|; hence it will use language~1 rules when hyphenating +|franc/ais|, after which it will revert to language~0. You can insert +the whatsit yourself (even in restricted horizontal mode) by saying +^|\setlanguage|\<number>; this changes the current language but it +does not change |\language|. + +\endgroup + +\bugonpage A459, right column (9/23/89) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +|\badness|, 214, {\it229}, 271. + +\bugonpage A461, right column (9/23/89) + +\eightpoint +caron, {\sl see\/} h\'a\v cek. + +\bugonpage A464, line 10 (5/15/89) + +\eightpoint +displays, 87, 103, {\it139--145}, {\it166--167}, + +\bugonpage A464, right column (9/23/89) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +|\emergencystretch|, $\underline{107}$, 274. + +\bugonpage A465, left column (9/23/89) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +|\errorcontextlines|, $\underline{34}$, 273, {\it348}. + +\bugonpage A466, entry for `fractions' (9/23/89) + +\eightpoint[Add page 332 to this entry.] + +\bugonpage A466, entry for `French'' (9/23/89) + +\eightpoint[Add page 455 to this entry.] + +\bugonpage A467, entry for `hexadecimal' (9/23/89) + +\eightpoint[Add pages 45, 47--48 to this entry.] + +\bugonpage A467, right column (9/23/89) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +|\holdinginserts|, $\underline{125}$, 273, 400. + +\bugonpage A467, bottom line (9/23/89) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +|\hyphenation|, 277, {\it419}, $\underline{452}$--$\underline{453}$, 455. + +\bugonpage A468, right column (9/23/89) + +\eightpoint +infinite badness, 97, 107, 111, 229, 317. + +\bugonpage A468, right column (9/23/89) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +|\inputlineno|, 214, 271. + +\bugonpage A469, entry for kerns (9/23/89) + +\eightpoint[Add pages 286 and 444 to this entry.] + +\bugonpage A469, left column (9/23/89) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +|\language| (hyphenation method), 273, $\underline{455}$. + +\bugonpage A469, right column (9/23/89) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +|\lefthyphenmin|, 273, {\it364}, $\underline{454}$. + +\bugonpage A470, entry for ligatures (9/23/89) + +\eightpoint[Add pages 286 and 444 to this entry.] + +\bugonpage A472, left column (9/23/89) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +|\noboundary|, 283, $\underline{286}$, 290. + +\bugonpage A473, right column (9/23/89) + +\eightpoint +overfull boxes, 27--30, 94, 229, 238,\par +\indent\qquad 302--303, 307, 400.\par +\indent\quad avoiding, 107. + +\bugonpage A474, left column (9/23/89) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +|\patterns|, 277, $\underline{453}$, 455. + +\bugonpage A476, left column (9/23/89) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +|\righthyphenmin|, 273, {\it364}, $\underline{454}$. + +\bugonpage A476, right column (9/23/89) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +|\setlanguage|, 287, $\underline{455}$. + +\bugonpage A476, right column (9/23/89) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +|\showboxbreadth|, 273, $\underline{302}$, 303, {\it348}.\par +\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +|\showboxdepth|, 79, 273, $\underline{302}$, 303, {\it348}. + +\bugonpage A479, left column (9/23/89) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +|\tolerance|, {\it29--30}, 91, 94, $\underline{96}$, 107, 272,\par +\indent\qquad{\it317}, {\it333}, {\it342}, {\it348}, {\it364}, {\it451}. + +\bugonpage A481, right column, last six entries (9/23/89) + +\def\frac#1/#2{\leavevmode\kern.1em + \raise.5ex\hbox{\the\scriptfont0 #1}\kern-.1em + /\kern-.15em\lower.25ex\hbox{\the\scriptfont0 #2}}% +\eightpoint +\frac1/2, 67, 332.\par +1/2, in unslashed form, 141, 186.\par +\<4-bit number>, $\underline{271}$.\par +\<8-bit number>, $\underline{271}$, 276--278.\par +\<15-bit number>, $\underline{271}$, 277, 289, 291.\par +\<27-bit number>, $\underline{271}$, 289, 291.\par + +\bugonpage A483, lines 15 and 21 (9/23/89) + +\noindent[Delete these two lines, as TUG's address is no longer c/o AMS.] + +% volume B +\hsize=35pc +\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers +\def\to{\mathrel{.\,.}} % double dot, used only in math mode + +\bugonpage Bvii, top two lines (4/21/89) + +{\hsize=29pc +\tenpoint\noindent +{\it {\sltt WEB} documentation for four utility programs that are +often used in conjunction with \TeX: {\sltt POOLtype}, {\sltt TFtoPL}, +{\sltt PLtoTF}, and {\sltt DVItype}.} +\par} + +\bugonpage B2, line 32 (6/20/89) + +\ninepoint\noindent\hskip10pt +{\bf define} $\\{banner}\equiv\hbox{\tt\char'23}$% +{\tt This\]is\]TeX,\]Version\]2.991\char'23}\quad +$\{\,$printed when \TeX\ starts$\,\}$ + +\bugonpage B118, lines 2--4 (3/2/89) + +\ninepoint\noindent\hskip10pt +{\bf begin if\/} $\\{cur\_level}>\\{level\_one}$ {\bf then}\par +\noindent\hskip20pt{\bf begin} \\{check\_full\_save\_stack}; \ + $\\{save\_type}(\\{save\_ptr})\gets\\{insert\_token}$;\par +\noindent\hskip20pt$\\{save\_level}(\\{save\_ptr})\gets\\{level\_zero}$; \ + $\\{save\_index}(\\{save\_ptr})\gets t$; \ \\{incr}(\\{save\_ptr});\par +\noindent\hskip20pt{\bf end}; + +\bugonpage B182, line 13 becomes two lines (6/20/89) + +\ninepoint\noindent +$k,\\{kk}$: \\{small\_number};\quad + $\{\,$number of digits in a decimal fraction$\,\}$\par\noindent +$p,q$: \\{pointer};\quad + $\{\,$top of decimal digit stack$\,\}$ + +\bugonpage B182, line 15 from the bottom (6/20/89) + +\ninepoint\noindent\hskip10pt +{\bf begin} $k\gets0$; $p\gets\\{null}$; \\{get\_token};\quad + $\{\,$\\{point\_token} is being re-scanned$\,\}$ + +\bugonpage B182, line 11 from the bottom (6/20/89) + +\ninepoint\noindent\hskip30pt +{\bf begin} $q\gets\\{get\_avail}$; $\\{link}(q)\gets p$; + $\\{info}(q)\gets\\{cur\_tok}-\\{zero\_token}$; + $p\gets q$; $\\{incr}(k)$; + +\bugonpage B182, line 8 from the bottom (6/20/89) + +\ninepoint\noindent +\\{done1}: {\bf for} $\\{kk}\gets k$ {\bf downto} 1 {\bf do}\par +\noindent\hskip20pt +{\bf begin} $\\{dig}[kk-1]\gets\\{info}(p)$; $q\gets p$; $p\gets\\{link}(p)$; + $\\{free\_avail}(q)$;\par +\noindent\hskip20pt{\bf end};\par +\noindent\hskip10pt$f\gets\\{round\_decimals}(k)$; + +\bugonpage B332, lines 11 and 12 from the bottom (4/8/89) + +\ninepoint +\noindent\hskip10pt +{\bf begin if\/} $\\{cur\_align}=\\{null}$ {\bf then} + \\{confusion}({\tt\char'23endv\char'23});\par\noindent\hskip10pt +$q\gets\\{link}(\\{cur\_align})$; \ {\bf if\/} $q=\\{null}$ {\bf then} + \\{confusion}({\tt\char'23endv\char'23}); + +\bugonpage B466, line 5 becomes three lines (6/7/89) + +\ninepoint +\noindent +$\\{mmode}+\\{halign}$: {\bf if\/} \\{privileged} {\bf then}\par\noindent +\hskip20pt{\bf if\/} $\\{cur\_group}=\\{math\_shift\_group}$ + {\bf then} \\{init\_align}\par\noindent\hskip20pt +{\bf else} \\{off\_save}; + +\bugonpage B518, line 25 (8/31/89) + +\ninepoint\noindent\hskip10pt +$\\{undump}(\\{lo\_mem\_stat\_max}+1)(\\{lo\_mem\_max})(\\{rover})$; \ +$p\gets\\{mem\_bot}$; \ $q\gets\\{rover}$; + +% volume C +\hsize=29pc +\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers + +\buginvol C, in general (9/23/89) + +\ninepoint\noindent +[Change `127' to `255' and `128' to `256' in contexts referring to character +codes. This happens on pages 188(thrice) and 251.] + +\bugonpage C91, lines 12 and 13 (8/31/89) + +\begintt +\mode=cheapo; input newface +\endtt +and the same file should also produce a high-resolution font if we start with + +\bugonpage C204, line 4 (8/18/89) + +\ninepoint\noindent +so that +\\{currenttransform} multiplies all $y$~coordinates by +\\{aspect\_ratio}, when paths are\cutpar + +\bugonpage C212, lines 24--27 (9/30/89) + +\ninepoint +\begindisplay +{\it boundarychar}\quad&the right boundary character for ligatures and kerns\cr +\enddisplay +All of these quantities are numeric. They are initially zero at the +start of a job, except for {\it year\/}, {\it month\/}, + {\it day\/}, and {\it time\/}, which +are initialized to the time the run began; furthermore, {\it boundarychar\/} is +initially~$-1$. A {\it granularity\/} of zero is equivalent to + $\hbox{\it granularity\/}=1$. +A preloaded base file like plain \MF\ will usually give nonzero values to +several other internal quantities on this list. + +\bugonpage C259, lines 16 and 17 from the bottom (5/14/89) + +\tenpoint +\noindent +|screenchars|; \ |screenstrokes|; \ |imagerules|; \ |gfcorners|; \ +|nodisplays|;\hfil\break +|notransforms|; \ |input| \<filename>. + +\bugonpage C282, the three lines following the chart (9/30/89) + +\tenpoint\noindent +\MF\ can also be configured to accept any or all of the character codes +128--255. +However, \MF\ programs that make use of anything in addition to the 95 +standard ASCII characters cannot be expected to run on other systems, so +the use of extended character sets is discouraged. + +\bugonpage C316, bottom 14 lines and top 30 of page C317 (9/30/89) + +\ninepoint +Ligature information and kerning information is specified in short +``^{ligtable programs}'' of a particularly simple form. Here's an example +that illustrates most of the features (although it is not a serious +example of typographic practice): +\beginlines +^|ligtable|| "f": "f" =: oct"013", "i" |\||=: oct"020", skipto 1;| +|ligtable "o": "b": "p": "e" kern .5u#, "o" kern .5u#, "x" kern-.5u#,| +| 1:: "!" kern u#;| +\endlines +This sequence of instructions can be paraphrased as follows: +\smallskip +\hangindent 3pc +Dear \TeX, when you're typesetting an~`f' with this font, and when the +following character also belongs to this font, look at it closely because +you might need to do something special: If that following character is +another~`f', replace the two f's by character code |oct"013"| +[namely `\char'13'\kern.5pt]; +if it's an `i', retain the `f' but replace the `i' by character code +|oct"020"| [a dotless `\char'20'\kern.5pt]; +otherwise skip down to label `|1::|' for further instructions. +When you're typesetting an `o' or~`b' or~`p', if the next input to \TeX\ is +`e' or~`o', add a half unit +of space between the letters; if it's an `x', subtract a half unit; if it's an +exclamation point, add a full unit. The last instruction applies also +to exclamation points following~`f' (because of the label `|1::|'). +\smallskip\noindent +When a character code appears in front of a colon, the colon ``labels'' +the starting place for that character's ligature and kerning program, +which continues to the end of the ligtable statement. A double colon denotes +a ``local label''; a |skipto| instruction advances to the next matching local +label, which must appear before 128 ligtable steps intervene. The special +label \|\||:| can be used to initiate ligtable instructions for an invisible +``left boundary character'' that is implicitly present just before every +word; an invisible ``right boundary character'' equal to {\it boundarychar\/} is +also implicitly present just after every word, if {\it boundarychar\/} + lies between +0 and~255. + +The general syntax for ligtable programs is pretty easy to guess from +these examples, but we ought to exhibit it for completeness: +\beginsyntax \chardef\\=`\| +<ligtable command>\is[ligtable]<ligtable program><optional skip> +<ligtable program>\is<ligtable step>\alt<ligtable program>[,]<ligtable step> +<optional skip>\is[,] [skipto]<code>\alt<empty> +<ligtable step>\is<code><ligature op><code> + \alt<code>[kern]<numeric expression> + \alt<label><ligtable step> +<ligature op>\is[=:]\alt[\\=:]\alt[\\=:>]\alt[=:\\]\alt[=:\\>]% + \alt[\\=:\\]\alt[\\=:\\>]\alt[\\=:\\>>] +<label>\is<code>[:]\alt<code>[::]\alt[\\\\:] +<code>\is<numeric expression>\alt<string expression> +\endsyntax +A \<code> should have a numeric value between 0 and 255, inclusive, +after having been rounded to the nearest integer; or it should be a +string of length~1, in which case it denotes the corresponding +^{ASCII} code (Appendix~C\null). For example, |"A"| and |64.61| both +specify the code value 65. Vertical bars to the left or right of `|=:|' +tell \TeX\ to retain the original left and/or right character that invoked a +ligature. Additional `|>|' signs tell \TeX\ to advance its focus of attention +instead of doing any further ligtable operations at the current +character position. + +\bugonpage C338, lines 21 and 22 (9/30/89) + +\ninepoint\noindent +and 127--255 have to be specified with the `|#|' option, +on non-fancy installations of \TeX, +and so does code 35 (which is the ASCII code of `|#|' itself). + +\bugonpage C346, left column, after line 14 (9/30/89) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +\||=:|, {\it316}, $\underline{317}$.\par +\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +\||=:>|, $\underline{317}$.\par +\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +|=:|\|, $\underline{317}$.\par +\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +|=:|\||>|, $\underline{317}$.\par +\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +\||=:|\|, $\underline{317}$.\par +\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +\||=:|\||>|, $\underline{317}$.\par +\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +\||=:|\||>>|, $\underline{317}$.\par + +\bugonpage C346, left column, after line 31 (9/30/89) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +|::| (local label), $\underline{317}$.\par +\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +\|\||:| (left boundary label), $\underline{317}$.\par + +\bugonpage C347, left column (9/30/89) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +|boundarychar|, 212, 317. + +\bugonpage C352, left column (9/30/89) + +\eightpoint[Change `\<ligature replacement>' to `\<ligature op>'.] + +\bugonpage C354, left column (9/30/89) + +\eightpoint +\<optional skip>, 217. + +\bugonpage C356, left column (9/30/89) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +|skipto|, {\it316}, $\underline{317}$. + +% Volume D +\hsize=35pc +\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers +\def\to{\mathrel{.\,.}} % double dot, used only in math mode + +\bugonpage Dvi, bottom two lines, and top lines of page vii (4/21/89) + +{\hsize=29pc \tenpoint +\textindent\bull ``\MF\/ware'' by Donald~E. Knuth, Tomas~G. Rokicki, and +Ar\-thur~L. Samuel, Stanford Computer Science Report 1255 (Stanford, +California, April 1989), 207~pp. \ {\it The {\sltt WEB} programs for +four utility programs that are often used in conjunction with +\slMF\kern1pt: {\sltt GFtype}, {\sltt GFtoPK}, {\sltt GFtoDVI}, +and {\sltt MFT}.} +\par} + +\bugonpage D63, line 9 (8/31/89) + +\tenpoint\noindent +\\{mem}, so we +allow pointers to assume any \\{halfword} value. The minimum memory +index represents\cutpar + +\bugonpage D63, line 28 (8/31/89) + +\tenpoint\centerline{$\\{null}=\\{mem\_min}<\\{lo\_mem\_max}< +\\{hi\_mem\_min}<\\{mem\_top}\le\\{mem\_end}\le\\{mem\_max}$.} + +\bugonpage D67, in the July 1987 printing (4/7/89) + +\ninepoint\noindent +[Delete line 7, which has a redundant `{\bf if\/} $r=p$ {\bf then}'; + move line 8 to the left 10 points for alignment; and restore the following + line (which was deleted by mistake after line 8): + + \noindent\hskip10pt + $\\{node\_size}(p)\gets q-p$\quad$\{\,$reset the size in case it grew$\,\}$ + + \noindent + These corrections are needed only in the reprinting made July, 1987.] + +\bugonpage D228, in the July 1987 printing (4/7/89) + +\ninepoint\noindent +[Delete lines 14--15, which were inserted erroneously from a previous errata +list; and restore the following lines (which were deleted by mistake): + +\noindent\hskip20pt +{\bf begin} \\{double}(\\{max\_coef}); \ +\\{double}(\\{x0}); \ +\\{double}(\\{x1}); \ +\\{double}(\\{x2});\par\noindent\hskip20pt +\\{double}(\\{y0}); \ +\\{double}(\\{y1}); \ +\\{double}(\\{y2});\par\noindent\hskip20pt +{\bf end} + +\noindent +These corrections are needed only in the reprinting made July, 1987.] + +\bugonpage D248, in the July 1987 printing (4/7/89) + +\ninepoint\noindent +[Delete line 16, which begins with `$d\gets\\{take\_fraction}$'; +and restore the following line (which was deleted by mistake after line 22): + +\noindent\hskip10pt +{\bf if\/} $d<\\{alpha}$ {\bf then} $d\gets\\{alpha}$ + +\noindent +These corrections are needed only in the reprinting made July, 1987.] + +\bugonpage D389, line 10 (6/20/89) + +\ninepoint\noindent\hskip20pt +\\{help1}({\tt\char'23 +The\]expression\]above\]should\]have\]been\]a\]number\]>=3/4.\char'23}); + +\bugonpage D504, line 25 (8/31/89) + +\ninepoint\noindent\hskip10pt +$\\{undump}(\\{lo\_mem\_stat\_max}+1)(\\{lo\_mem\_max})(\\{rover})$; \ +$p\gets\\{mem\_min}$; \ $q\gets\\{rover}$; + +\bugonpage D510, in the July 1987 printing (4/7/89) + +\ninepoint\noindent +[Move the 7th-to-last line, which begins with `\\{internal}[\\{fontmaking}]', +one line down, and indent it to the right by 10 more points. +This correction is needed only in the reprinting made July, 1987.] + +% volume E +\hsize=29pc +\def\dashto{\mathrel{\hbox{-\kern-.05em}\mkern3.9mu\hbox{-\kern-.05em}}} + +\bugonpage Exiii, bottom four lines (5/5/89) + +{\hsize=29pc \tenpoint +\textindent\bull ``Metamarks: Preliminary studies for a Pandora's Box of +shapes'' by Neenie Billawala, +Stanford Computer Science Report 1256 (Stanford, +California, May 1989), 132~pp. \ {\it Lavishly illustrated studies in +parameter variation, leading to the design of a new family of +typefaces called Pandora.} +\par} + +\bugonpage E401, bottom line (5/16/89) + +\ninepoint\noindent +{\bf \def\_{\kern.04em\vbox{\hrule width.3em height .6pt}\kern.08em}% +math\_fit}$(-.3\\{cap\_height}\0*\\{slant}-.5u\0,\\{ic}\0)$;\par\noindent +{\bf penlabels}$(1,2,3,4,5,6,7,8)$; {\bf endchar\/}; +\smallskip\noindent +[some points and labels are missing at the tip of the tail on page 400] +\bye +Now here are some that I will make soon! + diff --git a/Master/texmf-dist/source/generic/knuth/errata/errata.four b/Master/texmf-dist/source/generic/knuth/errata/errata.four new file mode 100644 index 00000000000..11d0435e749 --- /dev/null +++ b/Master/texmf-dist/source/generic/knuth/errata/errata.four @@ -0,0 +1,1052 @@ +% Bugs (sigh) in Computers \& Typesetting + +\input manmac +\font\sltt=cmsltt10 +\font\niness=cmss9 +\font\ninessi=cmssi9 +\proofmodefalse +\raggedbottom +\output{\hsize=29pc \onepageout{\unvbox255\kern-\dimen@ \vfil}} + +\def\today{\number\day\ + \ifcase\month\or + Jan\or Feb\or Mar\or Apr\or May\or Jun\or + Jul\or Aug\or Sep\or Oct\or Nov\or Dec\fi + \ \number\year} + +\def\cutpar{{\parfillskip=0pt\par}} + +\def\rhead{Bugs in {\tensl Computers \& Typesetting, 1987--1988}} +\def\bugonpage#1(#2) \par{\bigbreak\tenpoint + \hrule width\hsize + \line{\lower3.5pt\vbox to13pt{}Page #1\hfil(#2)}\hrule width\hsize + \nobreak\medskip} +\def\buginvol#1(#2) \par{\bigbreak\penalty-1000\tenpoint + \hrule width\hsize + \line{\lower3.5pt\vbox to13pt{}Volume #1\hfil(#2)}\hrule width\hsize + \nobreak\medskip} +\def\slMF{{\manual 89:;}\-{\manual <=>:}} % slant the logo +\def\0{\raise.7ex\hbox{$\scriptstyle\#$}} +\newcount\nn +\newdimen\nsize \newdimen\msize \newdimen\ninept \ninept=9pt +\newbox\eqbox \setbox\eqbox=\hbox{\kern2pt\eightrm=\kern2pt} + +\noindent This is a list of all corrections made to {\sl Computers \& +Typesetting}, Volumes A--E\null, between +16 June 1987 and 20 February 1989. Corrections made to +the softcover version of {\sl The \TeX book} are the same as corrections to +Volume~A\null. Corrections to the softcover version of {\sl The +\slMF\kern1ptbook\/} are the same as corrections to Volume~C\null. +Some of these corrections have already been made in reprintings +of the books. Some of these corrections affect the indexes and +mini-indexes of Volumes B~and~D in ways not shown here. Corrections +made up to 15 June 1987 appear in other files. +% volume A + +\bugonpage A159, line 22 (2/15/88) + +\ninepoint\noindent +`|\nolimits|' if the normal |\displaylimits| +convention has been overridden; a Rad\cutpar + +\bugonpage A213, lines 34--35 (12/23/87) + +\ninepoint\noindent +text will be a single control sequence token, defined to be like |\relax| if +its meaning is currently undefined. + +\bugonpage A299, line 30 (7/6/88) + +\ninepoint\indent\tt +Fatal format file error; I'm stymied. + +\bugonpage A326, line 12 (12/12/87) + +\ninepoint\noindent +its natural width. The |\hbox| version also invokes |\everymath|. + +\bugonpage A359, line 2 (11/6/88) + +\ninepoint\noindent +|\mathchardef\ldotp="613A\mathchardef\cdotp="6201\mathchardef\colon="603A| + +\bugonpage A359, lines 35--38 (5/24/88) + +\ninepoint\noindent +|\def\updownarrow{\delimiter"326C33F } \def\arrowvert{\delimiter"033C000 }|% + \par\noindent +|\def\Updownarrow{\delimiter"326D377 } \def\Arrowvert{\delimiter"033D000 } |% + \par\noindent +|\def\vert{\delimiter"026A30C } \def\Vert{\delimiter"026B30D } |% + \par\noindent +|\def\backslash{\delimiter"026E30F } \def\bracevert{\delimiter"033E000 }| + +\bugonpage A364, line 35 (11/6/88) + +\ninepoint\noindent +|\def\fmtname{plain}\def\fmtversion{2.94} % identifies the current format| + +\bugonpage A379, line 15 (10/12/87) + +\ninepoint +|\def\deleterightmost#1{\edef#1{\expandafter\xyzzy#1\xyzzy}}| + +\bugonpage A383, lines 7--15 from the bottom (1/4/89) + +\begintt + 209 strings out of 1685 + 1659 string characters out of 17636 + 27618 words of memory out of 52821 + 1172 multiletter control sequences out of 2500 +\endtt +Consequently there was plenty of room for more macros: $52821-27618= +25203$ unused cells of main memory, $2500-1172=1328$ of name memory, +$1685-209=1476$ of string memory, and $17636-1659=15977$ of character memory. +But a fairly large \TeX\ was being used, and only the macros of +Appendices B and~E were loaded; in other circumstances it might have +been necessary to conserve space. + +\bugonpage A454, lines 23--29 (8/13/87) + +\begingroup +\hyphenpenalty=-1000 \pretolerance=-1 \tolerance=1000 +\doublehyphendemerits=-100000 \finalhyphendemerits=-100000 +\ddanger If a suitable starting letter is found, let it be in font~$f$. +Hyphenation is abandoned unless the |\hyphenchar| of~$f$ is between +0 and~255, and unless a character of that number exists in the font. +If this test is passed, \TeX\ continues to scan forward +until coming to something that's not one of the following three +``admissible items'': (1)~a character in font~$f$ whose |\lccode| +is nonzero; (2)~a ligature formed entirely from characters of type~(1); +(3)~an implicit kern. The first inadmissible item terminates this part of +the process; the trial word consists of all the letters found in admissible +items. Notice that all of these letters are in font~$f$. + +\endgroup % end the special hyphenation conventions + +\bugonpage A458, left column, line 19 (2/15/88) + +\eightpoint\indent +|\|\| ( $\Vert$ ), {\it146--147}, {\it171}, $\underline{361}$, 435, 438. + +\bugonpage A462, left column, line 7 (10/9/87) + +\eightpoint\indent\qquad 152, 178, $\underline{360}$. + +\bugonpage A463, left column (4/17/88) + +\eightpoint\indent +\hbox to0pt{\hss\lower1pt\hbox{*}}|\day|, 273, 349, {\it406}. + +\bugonpage A464, left column, under Displays (12/8/88) + +\eightpoint\indent\quad +non-centered, 186, 326, 375--376, 420--421. + +\bugonpage A465, entry for {\tt\char`\\everymath} (12/12/87) + +\eightpoint\indent[Include also a reference to page 326.] + +\bugonpage A465, right column (7/6/88) + +\eightpoint\indent{\tt Fatal format file error}, 299. + +\bugonpage A473, entry for `page builder' (8/13/87) + +\eightpoint\indent\quad when exercised, 122, 280--283, 286--287. + +\bugonpage A474, left column (12/27/88) + +\eightpoint\indent +\hbox to0pt{\hss\lower1pt\hbox{*}}|\parshape|, 101--102, 214, 271, 277, 283, + +\bugonpage A480, right column (2/15/88) + +\eightpoint\indent|\vdots| ( $\vdots$ ), {\it177}, $\underline{359}$. + +\bugonpage A481, right column (7/3/87) + +\eightpoint|\z@|, $\underline{347}$, 348.\par +|\z@skip|, $\underline{347}$, 348. +% volume B +\hsize=35pc +\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers +\def\to{\mathrel{.\,.}} % double dot, used only in math mode + +\bugonpage B2, line 32 (2/20/89) + +\ninepoint\noindent\hskip10pt +{\bf define} $\\{banner}\equiv\hbox{\tt\char'23}$% +{\tt This\]is\]TeX,\]Version\]2.97\char'23}\quad +$\{\,$printed when \TeX\ starts$\,\}$ + +\bugonpage B38, lines 7--9 from the bottom (11/6/88) + +\tenpoint\noindent[Delete this paragraph; it is being moved to page B214.] + +\bugonpage B38, line 5 from the bottom (12/14/88) + +\ninepoint\noindent\kern10pt +{\bf begin if\/} \\{log\_opened} {\bf then} $\\{selector}\gets\\{term\_and\_log}$ + +\bugonpage B39, line 5 (12/14/88) + +\ninepoint\noindent\kern50pt +{\bf if\/} \\{log\_opened} {\bf then} \\{error}; + +\bugonpage B52, line 5 (8/13/87) + +\tenpoint\noindent +cannot be done, i.e., if $\\{hi\_mem\_min}=\\{lo\_mem\_max}+1$, +we have to quit. + +\bugonpage B54, lines 34--35 (7/9/88) + +\ninepoint\noindent\kern10pt +{\bf begin if\/} $\\{hi\_mem\_min}-\\{lo\_mem\_max}\ge1998$ + {\bf then} $t\gets\\{lo\_mem\_max}+1000$\par\noindent\kern10pt +{\bf else} $t\gets\\{lo\_mem\_max}+1+(\\{hi\_mem\_min}-\\{lo\_mem\_max}) +\,\mathbin{\bf div}\,2$;\quad\kern-4pt +$\{\,\\{lo\_mem\_max}+2\le t<\\{hi\_mem\_min}\,\}$ + +\bugonpage B108, new line after line 8 (5/24/88) + +\ninepoint\noindent\kern20pt +$d$: \\{integer};\quad +$\{\,$number of characters in incomplete current string$\,\}$ + +\bugonpage B108, lines 31--33 (5/24/88) + +\ninepoint\noindent\kern10pt +$\\{str\_room}(l)$; $d\gets\\{cur\_length}$;\par\noindent\kern10pt +{\bf while} $\\{pool\_ptr}>\\{str\_start}[\\{str\_ptr}]$ {\bf do} + \par\noindent\kern20pt +{\bf begin} \\{decr}(\\{pool\_ptr}); + $\\{str\_pool}[\\{pool\_ptr}+l]\gets\\{str\_pool}[\\{pool\_ptr}]$; + \par\noindent\kern20pt +{\bf end};\quad$\{\,$move current string up to make room for another$\,\}$ +\par\noindent\kern10pt +{\bf for} $k\gets j$ {\bf to} $j+l-1$ {\bf do} $\\{append\_char}(\\{buffer}[k])$; +\par\noindent\kern10pt +$\\{text}(p)\gets\\{make\_string}$; $\\{pool\_ptr}\gets\\{pool\_ptr}+d$; + +\bugonpage B115, line 12 (4/28/88) + +\ninepoint\noindent\hskip10pt +$\\{group\_code}=0\to\\{max\_group\_code}$;\quad + $\{\,$\\{save\_level} for a level boundary$\,\}$ + +\bugonpage B141, line 19 (4/28/88) + +\ninepoint\noindent +\\{par\_token}: \\{halfword};\quad + $\{\,$token representing `|\par|'$\,\}$ + +\bugonpage B150, line 24 (4/28/88) + +\tenpoint\noindent{\bf 358.\quad}% +The present point in the program is reached only when the \\{expand} +routine has inserted\cutpar + +\bugonpage B151, mini-index (4/28/88) + +\eightpoint\noindent +Delete the entry for `\\{no\_expand}'; replace it by: + +\indent\\{expand}: {\bf procedure}, \S366. + +\bugonpage B154, lines 25, 29, 34 respectively (9/20/87) + +\ninepoint\noindent\hskip20pt +$\\{cvl\_backup},\\{radix\_backup},\\{co\_backup}$: \\{small\_number};\quad + $\{\,$to save \\{cur\_val\_level}, etc.$\,\}$\par\noindent\hskip10pt +$\\{co\_backup}\gets\\{cur\_order}$; + $\\{backup\_backup}\gets\\{link}(\\{backup\_head})$;\par\noindent\hskip10pt +$\\{cur\_order}\gets\\{co\_backup}$; + $\\{link}(\\{backup\_head})\gets\\{backup\_backup}$; + +\bugonpage B155, new entry for mini-index (9/20/87) + +\eightpoint\indent +\\{cur\_order}: \\{glue\_ord}, \S447. + +\bugonpage B156, line 28 (12/23/87) + +\ninepoint\noindent\hskip20pt +{\bf begin }$\\{eq\_define}(\\{cur\_cs},\\{relax},256)$; + +\bugonpage B157, mini-index (12/23/87) + +\eightpoint\noindent +Delete the entries for `\\{eqtb}' and `\\{frozen\_relax}'; replace them +by the following: + +\indent\\{eq\_define}: {\bf procedure}, \S227.\par +$\\{relax}=0$, \S207.\par + +\bugonpage B162, lines 12--14 (4/30/88) + +\ninepoint\noindent\hskip10pt +{\bf repeat} $\\{link}(\\{temp\_head})\gets\\{null}$;\par\noindent\hskip20pt +{\bf if\/} $(\\{info}(r)>\\{match\_token}+127)\lor + (\\{info}(r)<\\{match\_token})$ {\bf then} + $s\gets\\{null}$\par\noindent\hskip20pt +{\bf else begin} $\\{match\_chr}\gets\\{info}(r)-\\{match\_token}$; \ + $s\gets\\{link}(r)$; \ $r\gets s$; \ $p\gets\\{temp\_head}$; \ + $m\gets 0$; + +\bugonpage B177, bottom line before mini-index (7/13/88) + +\ninepoint\noindent\hskip10pt +$\\{cur\_val}\gets0$; \ + $\\{cur\_val\_level}\gets\\{int\_val}$; \ + $\\{radix}\gets0$; \ + $\\{cur\_order}\gets0$; + +\bugonpage B181, line 31 (4/28/88) + +\ninepoint\noindent +[Change `$x$ units per sp' to `$x$ sp per unit'! This change also +should be made on line~1 of page B183 and line $-8$ of page B590.] + +\bugonpage B188, line 8 (5/25/88) + +\ninepoint\noindent +{\bf function} $\\{str\_toks}(b:\\{pool\_pointer})$: \\{pointer};\quad + $\{\,$changes the string \\{str\_pool}$[b\to\\{pool\_ptr}]$ to a token list$\,\}$ + +\bugonpage B188, line 13 (5/25/88) + +\ninepoint\noindent\kern10pt +{\bf begin} \\{str\_room}(1); $p\gets\\{temp\_head}$; + $\\{link}(p)\gets\\{null}$; $k\gets b$; + +\bugonpage B188, line 20 (5/25/88) + +\ninepoint\noindent\kern10pt +$\\{pool\_ptr}\gets b$; $\\{str\_toks}\gets p$; + +\bugonpage B188, new line after line 28 (5/25/88) + +\ninepoint\noindent\kern20pt +$b$: \\{pool\_pointer};\quad$\{\,$base of temporary string$\,\}$ + +\bugonpage B188, line 31 (5/25/88) + +\ninepoint\noindent\kern10pt +{\bf else begin} $\\{old\_setting}\gets\\{selector}$; + $\\{selector}\gets\\{new\_string}$; $b\gets\\{pool\_ptr}$; + +\bugonpage B188, line 41 (5/25/88) + +\ninepoint\noindent\kern20pt +$\\{selector}\gets\\{old\_setting}$; $\\{the\_toks}\gets\\{str\_toks}(b)$; + +\bugonpage B190, lines 16--18 (5/25/88) + +\ninepoint\noindent\kern20pt +$b$: \\{pool\_pointer};\quad$\{\,$base of temporary string$\,\}$\par +\noindent\kern10pt +{\bf begin} $c\gets\\{cur\_chr}$; + $\langle\,$Scan the argument for command $c${\eightrm\kern.5em471}$\,\rangle$; +\par\noindent\kern10pt +$\\{old\_setting}\gets\\{selector}$; +$\\{selector}\gets\\{new\_string}$; $b\gets\\{pool\_ptr}$; +$\langle\,$Print the result of command~$c${\eightrm\kern.5em472}$\,\rangle$; +\par\noindent\kern10pt +$\\{selector}\gets\\{old\_setting}$; +$\\{link}(\\{garbage})\gets\\{str\_toks}(b)$; +$\\{ins\_list}(\\{link}(\\{temp\_head}))$; + +\bugonpage B210, line 36 (5/25/88) + +\ninepoint\noindent\kern10pt +{\bf begin if} $(\\{pool\_ptr}+\\{name\_length}>\\{pool\_size}) + \lor(\\{str\_ptr}=\\{max\_strings})\lor(\\{cur\_length}>0)$ {\bf then} + +\bugonpage B211, new line of code before the mini-index (12/14/88) + +\ninepoint\noindent +\\{log\_opened}: \\{boolean};\quad$\{\,$has the transcript file been opened?$\,\}$ + +\bugonpage B212, line 5 (12/14/88) + +\ninepoint\noindent\kern10pt +$\\{job\_name}\gets0$; \ $\\{name\_in\_progress}\gets\\{false}$; \ +$\\{log\_opened}\gets\\{false}$; + +\bugonpage B213, line 24 (12/14/88) + +\ninepoint\noindent\kern10pt +$\\{log\_name}\gets\\{a\_make\_name\_string}(\\{log\_file})$; \ +$\\{selector}\gets\\{log\_only}$; \ +$\\{log\_opened}\gets\\{true}$; + +\bugonpage B214, lines 2 and 3 (12/14/88) + +\tenpoint\noindent +messages or even to \\{show\_context}. +The \\{prompt\_file\_name} routine can result in a \\{fatal\_error}, +but the \\{error} +routine will not be invoked because \\{log\_opened} will be false. +\par\noindent\hskip10pt +The normal idea of \\{batch\_mode} is that nothing at all should be written +on the terminal. However, in the unusual case that +no log file could be opened, we make an exception and allow +an explanatory message to be seen. + +\bugonpage B214, lines 7--11 reduce to a single line (12/14/88) + +\ninepoint\noindent\hskip10pt +{\bf begin} $\\{selector}\gets\\{term\_only}$; + +\bugonpage B224, second-last line (4/28/87) + +\ninepoint\noindent +\\{done}: {\bf if} \\{file\_opened} {\bf then} \\{b\_close}(\\{tfm\_file});\par +\noindent\hskip10pt $\\{read\_font\_info}\gets g$; + +\bugonpage B229, lines 6--8 (11/17/87) + +\tenpoint\noindent +than $2^{27}$. +If $z<2^{23}$, the individual multiplications $b\cdot z$, +$c\cdot z$, $d\cdot z$ cannot overflow; otherwise we will divide $z$ by 2, +4, 8, or 16, to obtain a multiplier less than $2^{23}$, and we can +compensate for this later. If $z$ has thereby been replaced by +$z^\prime=z/2^e$, let $\beta=2^{4-e}$; we shall compute + +\bugonpage B229, lines 11--12 (11/17/87) + +\tenpoint\noindent +if $a=0$, or the same quantity minus $\alpha=2^{4+e}z^\prime$ if $a=255$. +This calculation must be done exactly, in order to guarantee portability +of \TeX\ between computers. + +\bugonpage B230, lines 2--5 (11/17/87) + +\ninepoint +\noindent\hskip10pt{\bf begin} $\\{alpha}\gets16$;\par +\noindent\hskip10pt{\bf while} $z\ge\oct{40000000}$ {\bf do}\par +\noindent\hskip20pt{\bf begin} $z\gets z\ {\bf div}\ 2$; \ + $\\{alpha}\gets\\{alpha}+\\{alpha}$; \ {\bf end};\par +\noindent\hskip10pt$\\{beta}\gets256\ {\bf div}\ \\{alpha}$; \ + $\\{alpha}\gets\\{alpha}\ast z$;\par + +\bugonpage B245, new entry for mini-index (8/7/87) + +\eightpoint\indent +\\{cur\_s}: \\{integer}, \S616. + +\bugonpage B254, line 29 (8/7/87) + +\ninepoint\noindent +\\{cur\_s}: \\{integer};\quad +$\{\,$current depth of output box nesting, initially $-1\,\}$ + +\bugonpage B254, line 31 (8/7/87) + +\ninepoint\noindent +[Remove the statement `$\\{cur\_s}\gets-1$;' and put it on page B244 at the +end of line 31.] + +\bugonpage B259, line 13 (11/9/87) + +\ninepoint\noindent\hskip20pt +{\bf begin }$\\{rule\_wd}\gets\\{rule\_wd}+10$;\quad +$\{\,$compensate for floating-point rounding$\,\}$\par\noindent\hskip20pt +$\\{edge}\gets\\{cur\_h}+\\{rule\_wd}$; $\\{lx}\gets0$; +$\langle\,$Let \\{cur\_h} be the position of the first box, and set + +\bugonpage B259, line 17 (11/9/87) + +\ninepoint\noindent\hskip20pt +$\\{cur\_h}\gets\\{edge}-10$; {\bf goto} \\{next\_p}; + +\bugonpage B263, line 21 (11/9/87) + +\ninepoint\noindent\hskip20pt +{\bf begin }$\\{rule\_ht}\gets\\{rule\_ht}+10$;\quad +$\{\,$compensate for floating-point rounding$\,\}$\par\noindent\hskip20pt +$\\{edge}\gets\\{cur\_v}+\\{rule\_ht}$; $\\{lx}\gets0$; +$\langle\,$Let \\{cur\_v} be the position of the first box, and set + +\bugonpage B263, line 25 (11/9/87) + +\ninepoint\noindent\hskip20pt +$\\{cur\_v}\gets\\{edge}-10$; {\bf goto} \\{next\_p}; + +\bugonpage B266, line 8 (8/7/87) + +\ninepoint\noindent\hskip10pt +\\{dvi\_out}(\\{eop}); \\{incr}(\\{total\_pages}); $\\{cur\_s}\gets-1$; + +\bugonpage B266, new code between lines 31 and 32 (8/7/87) + +\ninepoint +\noindent\hskip10pt{\bf while} $\\{cur\_s}>-1$ {\bf do}\par +\noindent\hskip20pt{\bf begin if} $\\{cur\_s}>0$ {\bf then} + \\{dvi\_out}(\\{pop})\par +\noindent\hskip20pt{\bf else begin} \\{dvi\_out}(\\{eop}); + \\{incr}(\\{total\_pages})\par +\noindent\hskip30pt{\bf end};\par +\noindent\hskip20pt\\{decr}(\\{cur\_s});\par +\noindent\hskip20pt{\bf end};\par + +\bugonpage B285, line 21 (4/28/88) + +\noindent\tenpoint +is subsidiary to the \\{nucleus} field of some noad; the dot is replaced by +`|_|' or `|^|' or `|/|' or `|\|' if $p$ is\cutpar + +\bugonpage B338, second-last line (8/19/87) + +\ninepoint\noindent\kern10pt +$q\gets\\{link}(\\{head})$; $s\gets\\{head}$; + +\bugonpage B339, line 4 (8/19/87) + +\ninepoint\noindent\kern20pt +$s\gets q$; $q\gets\\{link}(q)$; + +\bugonpage B339, new code to insert after line 10 (8/19/87) + +\ninepoint +\noindent\kern10pt{\bf if} $o\ne0$ {\bf then}\par +\noindent\kern20pt{\bf begin} $r\gets\\{link}(q)$; $\\{link}(q)\gets\\{null}$; + $q\gets\\{hpack}(q,\\{natural})$;\par +\noindent\kern20pt$\\{shift\_amount}(q)\gets o$; $\\{link}(q)\gets r$; + $\\{link}(s)\gets q$;\par +\noindent\kern20pt{\bf end};\par +\noindent[These new lines also imply changes to the index that aren't + shown in this errata list.] + +\bugonpage B387, line 2 (5/24/88) + +\tenpoint\noindent +is quite short. In the following code we set \\{hc}$[\\{hn}+2]$ to the +impossible value 128, in order to\cutpar + +\bugonpage B387, line 8 (5/24/88) + +\ninepoint\noindent\kern10pt +$\\{hc}[0]\gets127$; $\\{hc}[\\{hn}+1]\gets127$; + $\\{hc}[\\{hn}+2]\gets128$;\quad$\{\,$insert delimiters$\,\}$ + +\bugonpage B390, lines 17--18 (5/24/88) + +\ninepoint\noindent\kern10pt +$\langle\,$Enter as many hyphenation exceptions as are listed, until coming + to a right brace; then {\bf return\eightrm\kern.5em961}$\,\rangle$; + +\smallskip[The same change applies to lines 20--21, and +to page~582.] + +\bugonpage B396, new line after line 34 (5/24/88) + +\ninepoint\noindent\kern10pt +$\\{trie\_link}(\\{trie\_size})\gets0$; +$\\{trie\_back}(0)\gets\\{trie\_size}$;\quad +$\{\,$wrap around$\,\}$ + +\bugonpage B396, bottom line (12/12/87) + +\ninepoint\noindent\hskip10pt +$\\{trie\_link}(0)\gets0$; $\\{trie\_char}(0)\gets0$; + $\\{trie\_op}(0)\gets\\{min\_quarterword}$; + +\bugonpage B397, lines 15--17 (5/24/88) + +\ninepoint\noindent\kern10pt +{\bf begin} $c\gets\\{trie\_c}[p]$;\par\noindent\kern10pt +{\bf if} $c<\\{trie\_min}$ {\bf then} $\\{trie\_min}\gets c$;\par\noindent\kern10pt +{\bf if} $\\{trie\_min}=0$ {\bf then} $z\gets\\{trie\_link}(\\{trie\_size})$\par +\noindent\kern10pt +{\bf else} $z\gets\\{trie\_link}(\\{trie\_min}-1)$;\quad +$\{\,$get the first conceivably good hole$\,\}$ + +\bugonpage B400, lines 3--4 (5/24/88) + +\ninepoint\noindent +$\langle\,$Enter all of the patterns into a linked trie, until coming + to a right brace{\eightrm\kern.5em961}$\,\rangle\equiv$ + +\smallskip[The same change applies to page B399, lines 29--30, and +to page~582.] + +\bugonpage B402, line 10 (5/24/88) + +\ninepoint\noindent\kern10pt +$r\gets\\{trie\_size}$;\quad +$\{\,$finally, we will zero out the holes$\,\}$ + +\bugonpage B406, line 9 from the bottom (1/23/89) + +\ninepoint\noindent\kern30pt +$\\{shrink\_order}(r)\gets\\{normal}$; \ $\\{delete\_glue\_ref}(q)$; \ +$\\{glue\_ptr}(p)\gets r$; \ $q\gets r$; + +\bugonpage B417, line 10 (1/23/89) + +\ninepoint\noindent\kern10pt +$q\gets\\{new\_skip\_param}(\\{top\_skip\_code})$; \quad +$\{\,$now $\\{temp\_ptr}=\\{glue\_ptr}(q)\,\}$ + +\bugonpage B418, line 14 (1/23/89) + +\ninepoint\noindent\kern30pt +$\\{shrink\_order}(r)\gets\\{normal}$; \ $\\{delete\_glue\_ref}(q)$; \ +$\\{glue\_ptr}(p)\gets r$; \ $q\gets r$; + +\bugonpage B507, line 13 (12/14/88) + +\ninepoint\noindent\kern10pt +{\bf if\/} \\{log\_opened} {\bf then} $\\{selector}\gets\\{selector}+2$; + +\bugonpage B527, line 21 (12/14/88) + +\ninepoint\noindent\kern10pt +{\bf if\/} \\{log\_opened} {\bf then} + +\bugonpage B528, line 5 (12/14/88) + +\ninepoint\noindent\kern10pt +{\bf if\/} \\{log\_opened} {\bf then} + +\bugonpage B547, right column (9/20/87) + +\eightpoint +\leftline{\\{co\_backup}:\quad $\underline{366}$.} + +\bugonpage B548, right column (9/20/87) + +\eightpoint +\leftline{\\{cur\_order}:\quad 366, $\underline{447}$, 448, 454, 462.} + +\bugonpage B548, right column (8/7/87) + +\eightpoint +\leftline{\\{cur\_s}:\quad 593, $\underline{616}$, 619, 629, 640, 642.} + +\bugonpage B551, both columns (12/23/87) + +\eightpoint[Remove `372' from \\{eqtb} and put it into \\{eq\_define}.] + +\bugonpage B552, left column (4/28/88) + +\eightpoint[Insert `358' into \\{expand}.] + +\bugonpage B554, left column (12/23/87) + +\eightpoint[Remove `372' from \\{frozen\_relax}.] + +\bugonpage B559, new entry (12/14/88) + +\eightpoint\noindent +\\{log\_opened}, 92--93, $\underline{527}$, 528, 534--535, 1265, 1333--1334. + +\bugonpage B559, right column (8/13/87) + +\eightpoint[Delete the entry for \\{low\_mem\_max}.] + +\bugonpage B562, left column (4/28/88) + +\eightpoint[Remove `358' from \\{no\_expand}.] + +\bugonpage B565, left column (8/7/87) + +\eightpoint +\leftline{\\{pop}:\quad 584--585, $\underline{586}$, 590, 601, 608, 642.} + +\bugonpage B567, left column (12/23/87) + +\eightpoint[Insert `372' into \\{relax}.] + +\bugonpage B568, left column (4/28/88) + +\eightpoint[Move `269' from \\{save\_index} to \\{save\_level}.] +% volume C +\hsize=29pc +\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers + +\bugonpage C26, bottom line (7/18/87) + +\tenpoint\noindent +What angle corresponds to the direction North-Northwest? + +\bugonpage C107, line 13 (10/7/87) + +{\bf pickup penrazor} xscaled \\{heavyline} + rotated (angle$(z_{32}-z_{31})+90$); + +\bugonpage C164, line 10 (4/27/88) + +\ninepoint\indent +\quad $y_{\$c}=\\{top}\,y_{\$l}$; \ $y_{\$d}=y_{\$r}$; \ + $x_{\$c}=x_{\$l}-\\{left\_jut}$; \ $x_{\$d}=x_{\$r}+\\{right\_jut}$; + +\bugonpage C175, line 23 (1/11/88) + +\ninepoint\noindent +expand into a sequence of tokens. \ +(The language {\eightrm{SIMULA67}} demonstrated that it is\cutpar + +\bugonpage C241, line 11 (5/25/88) + +\ninepoint\indent +{\bf numeric} $\\{ht}\0,\\{dp}\0$; \ + $\\{ht}\0=\\{body\_height}\0$; \ + $.5[\\{ht}\0,-\\{dp}\0]=\\{axis}\0$; + +\bugonpage C248, line 21 becomes two lines (1/24/89) + +\ninepoint\noindent +which might not +be numerically stable in the presence of rounding errors.) +Another case, not really desirable, is $\\{left\_jut}=\\{right\_jut}=0$. + +\bugonpage C262, line 15 (12/23/88) + +\ninepoint\noindent +|string base_name, base_version; base_name="plain"; base_version="1.7";| + +\bugonpage C271, line 12 (1/4/89) + +\ninepoint\noindent +the user and \MF's primitive picture commands. +First, some important program\cutpar + +\bugonpage C271, line 4 from the bottom (12/23/88) + +\ninepoint\noindent +|def |^|cutdraw|| expr p = % caution: you may need autorounding=0| + +\bugonpage C272, lines 5 and 6 (12/23/88) + +\ninepoint\noindent +| (cut_ scaled (1+max(pen_lft,pen_rt,pen_top,pen_bot))|\par\noindent +| rotated theta shifted z)t_;| + +\bugonpage C273, lines 20 and 22 (9/26/88) + +\ninepoint\noindent +| (z_+(0,pen_top))t_=round((z+(0,pen_top))t_); z_ enddef;|\par\noindent +| (z_+(0,pen_bot))t_=round((z+(0,pen_bot))t_); z_ enddef;| + +\bugonpage C290, line 6 from the bottom (12/23/88) + +\ninepoint\noindent +(2)~A throwaway variable, +`\\{whatever}', nullifies an unwanted equation at the beginning\cutpar + +\bugonpage C331, just below the illustration (7/18/87) + +\ninepoint\noindent +Such a pattern is, of course, rather unlikely to occur in a |gf| file, +but |GFtoDVI| would\cutpar + +\bugonpage C337, line 11 (4/28/88) + +\ninepoint +An online ``menu'' of the available test routines will be typed at your +terminal\cutpar + +\bugonpage C346, entry for {\tt autorounding} (12/23/88) + +\eightpoint\indent\hskip20pt +212, {\it262}, {\it264}, 271--272. + +\bugonpage C350, left column (7/6/88) + +\eightpoint\indent +|Fatal| |base| |file| |error|, 226. + +\bugonpage C356, left column (1/11/88) + +\eightpoint +SIMULA67 language, 175. + +\bugonpage C358, right column (2/15/88) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +|yoffset|, 212, $\underline{220}$, 315, 324. +% Volume D +\hsize=35pc +\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers +\def\to{\mathrel{.\,.}} % double dot, used only in math mode + +\bugonpage D2, line 27 (12/14/88) + +\ninepoint\noindent\hskip10pt +{\bf define} $\\{banner}\equiv\hbox{\tt\char'23}$% +{\tt This\]is\]METAFONT,\]Version\]1.7\char'23}\quad +$\{\,$printed when \MF\ starts$\,\}$ + +\bugonpage D36, lines 3--5 (11/6/88) + +\tenpoint\noindent[Delete this paragraph; it is being moved to page D349.] + +\bugonpage D36, line 7 (12/14/88) + +\ninepoint\noindent\kern10pt +{\bf begin if\/} \\{log\_opened} {\bf then} $\\{selector}\gets\\{term\_and\_log}$ + +\bugonpage D36, line 16 (12/14/88) + +\ninepoint\noindent\kern50pt +{\bf if\/} \\{log\_opened} {\bf then} \\{error}; + +\bugonpage D66, lines 34--35 (7/9/88) + +\ninepoint\noindent\kern10pt +{\bf begin if\/} $\\{hi\_mem\_min}-\\{lo\_mem\_max}\ge1998$ + {\bf then} $t\gets\\{lo\_mem\_max}+1000$\par\noindent\kern10pt +{\bf else} $t\gets\\{lo\_mem\_max}+1+(\\{hi\_mem\_min}-\\{lo\_mem\_max}) +\,\mathbin{\bf div}\,2$;\quad\kern-4pt +$\{\,\\{lo\_mem\_max}+2\le t<\\{hi\_mem\_min}\,\}$ + +\bugonpage D347, new line of code after line 5 (12/14/88) + +\ninepoint\noindent +\\{log\_opened}: \\{boolean};\quad$\{\,$has the transcript file been opened?$\,\}$ + +\bugonpage D347, line 11 (12/14/88) + +\ninepoint\noindent\kern10pt +$\\{job\_name}\gets0$; \ +$\\{log\_opened}\gets\\{false}$; + +\bugonpage D348, line 4 from the bottom (12/14/88) + +\ninepoint\noindent\kern10pt +$\\{log\_name}\gets\\{a\_make\_name\_string}(\\{log\_file})$; \ +$\\{selector}\gets\\{log\_only}$; \ +$\\{log\_opened}\gets\\{true}$; + +\bugonpage D349, lines 6 and 7 (12/14/88) + +\tenpoint\noindent +print error messages or even to \\{show\_context}. +The \\{prompt\_file\_name} routine can result in a \\{fatal\_error}, +but the \\{error} +routine will not be invoked because \\{log\_opened} will be false. +\par\noindent\hskip10pt +The normal idea of \\{batch\_mode} is that nothing at all should be written +on the terminal. However, in the unusual case that +no log file could be opened, we make an exception and allow +an explanatory message to be seen. + +\bugonpage D349, lines 11--15 reduce to a single line (12/14/88) + +\ninepoint\noindent\hskip10pt +{\bf begin} $\\{selector}\gets\\{term\_only}$; + +\bugonpage D420, bottom line (5/25/88) + +\ninepoint\noindent\kern30pt +{\bf if\/} \\{txx} {\bf mod} $\\{unity}=0$ {\bf then} + +\bugonpage D441, delete line 2 and change line 12 as follows (5/25/88) + +\ninepoint\noindent +\\{done}: {\bf if} $\\{eq\_type}(x)\ne\\{tag\_token}$ {\bf then} + $\\{clear\_symbol}(x,\\{false})$;\par\noindent\kern10pt +{\bf if} $\\{equiv}(x)=\\{null}$ {\bf then} $\\{new\_root}(x)$; +\par\noindent\kern10pt +$\\{scan\_declared\_variable}\gets h$; + +\bugonpage D444, line 8 from the bottom (12/14/88) + +\ninepoint\noindent\kern10pt +{\bf if\/} \\{log\_opened} {\bf then} $\\{selector}\gets\\{selector}+2$; + +\bugonpage D510, line 14 (12/14/88) + +\ninepoint\noindent\kern10pt +{\bf if\/} \\{log\_opened} {\bf then} + +\bugonpage D511, line 11 (12/14/88) + +\ninepoint\noindent\kern10pt +{\bf if\/} \\{log\_opened} {\bf then} + +\bugonpage D530, new entry (12/14/88) + +\eightpoint\noindent +\\{log\_opened}, 87--88, $\underline{782}$, 783, 788--789, 1023, 1205, 1208. + +\bugonpage D545, left column (10/31/87) + +\eightpoint +\leftline{{\bf zscaled} primitive:\quad $\underline{893}$.} +\leftline{Zabala Salelles, Ignacio Andres:\quad 812.} + +% volume E +\hsize=29pc +\def\dashto{\mathrel{\hbox{-\kern-.05em}\mkern3.9mu\hbox{-\kern-.05em}}} + +\bugonpage E32, second-last line (9/20/87) + +\tenpoint\noindent +after which comes `\\{math\_axis}\0; {\bf generate} |mathsy|' (which we +won't bother to\cutpar + +\bugonpage E111, line 29 (10/16/88) + +\ninepoint\noindent +$\\{lft}\,x_{11}={\rm hround}\,u$; \ + $x_{1l}-x_{11}=x_{2l}-x_{12}=x_{22}-x_{2r}={\rm hround}\,1.6\\{cap\_jut}$; + +\bugonpage E285, bottom line (12/1/87) + +\rightline{\eightssi Due to Technical Developments\/\enspace\eightss(1968)} + +\bugonpage E333, lines 9--11 (1/9/89) + +\ninepoint\noindent +$\\{lft}\,x_{1l}={\rm hround}(2.5u-.5\\{mfudged.stem})$; \ + $x_{1l}=x_{1'l}=x_{2l}=x_{2'l}$;\par\noindent +$\\{lft}\,x_{3l}={\rm hround}(.5w-.5\\{mfudged.stem})$; \ + $x_5-x_3=x_3-x_1$;\par +\line{{\bf if\/} not \\{monospace}: + $r:={\rm hround}(x_5+x_1)+r-w$; {\bf fi}\hfill + \% change width for better fit} + +\bugonpage E353, lines 38--39 (8/12/87) + +\ninepoint +\leftline{\kern10pt{\bf else}: {\bf fill} \\{diag\_end}$(6r,5r,1,1,5l,6l) + \dashto.9[z_{5l},z_{6l}]$} +\line{\kern30pt$.\,.\,\{z_5-z_6\}\,.1[z_{5r},z_{6r}]\dashto\rm cycle$;\hfil + \% middle stem} + +\bugonpage E387, line 13 (8/12/87) + +\ninepoint +\line{\kern10pt{\bf pickup} \\{tiny}.\\{nib}; \ \\{bulb}$(3,4,5)$;\hfil\% bulb} + +\bugonpage E413, lines 37--38 (8/12/87) + +\ninepoint +\leftline{\kern10pt{\bf else}: {\bf fill} \\{diag\_end}$(6r,5r,1,1,5l,6l) + \dashto.9[z_{5l},z_{6l}]$} +\line{\kern30pt$.\,.\,\{z_5-z_6\}\,.1[z_{5r},z_{6r}]\dashto\rm cycle$;\hfil + \% middle stem} + +\bugonpage E459, line 24 (8/7/87) + +\ninepoint\noindent[Delete the `$=$' sign between `\\{lft}' and `$x_5$'.] + +\bugonpage E471, line 5 (12/11/88) + +\ninepoint\noindent +$x_2=\\{good}.x\,.5w$; \ $\\{center\_on}(x_2)$; + +\bugonpage E471, insert two lines below the rule at bottom of page (12/11/88) + +\ninepoint +\line{{\bf def\/} +\\{center\_on}({\bf expr} $x) =\null$ +{\bf if\/} not \\{monospace}:\hfill \% change width for symmetric fit} +\leftline{\kern10pt + $r:=r+2x-w$; \ $w:=2x$; \ {\bf fi} {\bf enddef};} + +\bugonpage E477, line 20 (12/11/87) + +\ninepoint\noindent +$x_4=x_8=\\{good}.x\,.5w$; \ $\\{center\_on}(x_4)$; \ +$x_2=w-x_6=\\{good}.x(x_4+a)$; + +\bugonpage E483, third line of elementary division operator (12/11/88) + +\ninepoint\noindent +$x_3-.5\\{dot\_size}={\rm hround}(.5w-.5\\{dot\_size})$; \ +$\\{center\_on}(x_3)$; + +\bugonpage E485, line 4 (8/7/87) + +\ninepoint\noindent[Delete the `$=$' sign between `\\{lft}' and `$x_5$'.] + +\bugonpage E487, line 17 (8/4/88) + +\ninepoint\line{% +{\bf fill} \\{fullcircle} scaled$\,(\\{bold}+3.8\\{dw}+\\{eps})\,$% + shifted$\,(.5[z_4,z_8])$;\hfill\% dot} +\smallskip\noindent[Also remove page 487 from the index entry for +\\{dot\_size}, and add it to the entries for \\{bold} and \\{dw}.] + +\bugonpage E515, lines 5 and 12 (12/11/88) + +\ninepoint\noindent +$.5[x_1,x_2]=x_3=\\{good}.x\,.5w$; \ +$\\{center\_on}(x_3)$; \ $\\{lft}\,x_1={\rm hround}(.5w-u*{\rm sqrt}48)$; + +\bugonpage E515, line 21 (1/23/89) + +\ninepoint\noindent +{\bf labels}$(5,6)$; \ \\{zero\_width}; \ {\bf endchar\/}; +\smallskip\noindent[Also put labels `{\tt5}' and `{\tt6}' on the +upper right figure, page E514.] + +\bugonpage E521, lines 4 and 14 (12/12/88) + +\ninepoint\noindent +$x_1=x_2=\\{good}.x\,.5w$; \ +$\\{center\_on}(x_1)$; \ $\\{lft}\,x_3={\rm hround}\,u$; \ $x_4=w-x_3$; + +\bugonpage E537, line 6 (12/11/88) + +\ninepoint\noindent +$x_1=x_2=x_3=x_4$; \ +$x_1-.5\\{stem}={\rm hround}(.5w-.5\\{stem})$; \ +$\\{center\_on}(x_1)$; + +\bugonpage E537, line 19 (12/11/88) + +\ninepoint\noindent +$x_1=x_2=x_3$; \ +$x_1-.5\\{stem}={\rm hround}(.5w-.5\\{stem})$; \ +$\\{center\_on}(x_1)$; + +\bugonpage E539, line 4 (12/11/88) + +\ninepoint\noindent +$x_1=x_4=x_{30}=x_{33}=\\{good}.x\,.5w$; \ $\\{center\_on}(x_1)$; + +\bugonpage E539, line 21 (12/11/88) + +\ninepoint\noindent +$x_1=x_4=\\{good}.x\,.5w$; \ $\\{center\_on}(x_1)$; + +\bugonpage E541, line 4 (12/11/88) + +\ninepoint\noindent +$x_1=x_5=\\{good}.x\,.5w$; \ $\\{center\_on}(x_1)$; + +\bugonpage E541, line 17 (12/11/88) + +\ninepoint\noindent +$x_1=x_{10}=\\{good}.x\,.5w$; \ $\\{center\_on}(x_1)$; + +\bugonpage E550, new line after line 23 (8/15/87) + +\ninepoint\noindent\kern10pt +{\bf forsuffixes} $\hbox{\$}=\\{notch\_cut},\\{cap\_notch\_cut}$: + {\bf if\/} $\hbox{\$}<3$: $\hbox{\$}:=3$; {\bf fi endfor} +\smallskip\noindent +[To make room for this, combine lines 38 and 39 into a single line.] + +\bugonpage E550, line 29 (7/9/88) + +\ninepoint\noindent\hskip10pt +{\bf \def\_{\kern.04em\vbox{\hrule width.3em height .6pt}\kern.08em}% +define\_whole\_vertical\_blacker\_pixels}$(\\{vair},\\{bar},\\{slab}, + \\{cap\_bar},\\{cap\_band})$; + +\bugonpage E572, new entry at bottom (12/11/88) + +\eightpoint\noindent +\\{center\_on}, $\underline{471}$, 477, 483, 515, 521, 537--541. +\bye +Now here are some that I will make soon! + diff --git a/Master/texmf-dist/source/generic/knuth/errata/errata.nine b/Master/texmf-dist/source/generic/knuth/errata/errata.nine new file mode 100644 index 00000000000..3715cd813fc --- /dev/null +++ b/Master/texmf-dist/source/generic/knuth/errata/errata.nine @@ -0,0 +1,226 @@ +% Bugs (sigh) in Computers \& Typesetting + +\input manmac +\font\sltt=cmsltt10 +\font\niness=cmss9 +\font\ninessi=cmssi9 +\proofmodefalse +\raggedbottom +\output{\hsize=29pc \onepageout{\unvbox255\kern-\dimen@ \vfil}} + +\def\today{\number\day\ + \ifcase\month\or + Jan\or Feb\or Mar\or Apr\or May\or Jun\or + Jul\or Aug\or Sep\or Oct\or Nov\or Dec\fi + \ \number\year} + +\def\cutpar{{\parfillskip=0pt\par}} + +\def\rhead{Bugs in {\tensl Computers \& Typesetting A, 1996}} +\def\bugonpage#1(#2) \par{\bigbreak\tenpoint + \hrule width\hsize + \line{\lower3.5pt\vbox to13pt{}Page #1\hfil(#2)}\hrule width\hsize + \nobreak\medskip} +\def\buginvol#1(#2) \par{\bigbreak\penalty-1000\tenpoint + \hrule width\hsize + \line{\lower3.5pt\vbox to13pt{}Volume #1\hfil(#2)}\hrule width\hsize + \nobreak\medskip} +\def\slMF{{\manual 89:;}\-{\manual <=>:}} % slant the logo +\def\0{\raise.7ex\hbox{$\scriptstyle\#$}} +\newcount\nn +\newdimen\nsize \newdimen\msize \newdimen\ninept \ninept=9pt +\newbox\eqbox \setbox\eqbox=\hbox{\kern2pt\eightrm=\kern2pt} + +\tenpoint +\noindent This is a list of all corrections made to {\sl Computers \& +Typesetting}, Volume~A (also known as {\sl The \TeX book}), +between 1992 and the publication of the final printed +version of that book in September 1996. +\looseness=-1 + +% volume A + +\bugonpage A31, line 8 (3/6/95) + +\tenpoint\noindent +\TeX\ begins its error messages with `|!|', and it shows what it was +reading at the\cutpar + +\bugonpage A46, line 8 (1/22/95) + +\ninepoint\noindent +out for +the occasional times when the adjacent characters |aa|, |ae|, and |o/| +should not be\cutpar + +\bugonpage A282, lines 11 and 12 (4/18/96) + +\ninepoint\noindent +unadorned \<box> command, except that the new box +being appended to the vertical list is also shifted left or right by the +specified amount. + +\bugonpage A285, lines 15--17 from the bottom (4/18/96) + +\ninepoint +\textindent{$\bull$}|\raise|\<dimen>\<box>, |\lower|\<dimen>\<box>.\enskip +This acts just like an unadorned \<box> command, except that the new box +being appended to the horizontal list is also shifted up or down by the +specified amount. + +\bugonpage A290, lines 4--6 from the bottom (4/18/96) + +\ninepoint +\textindent{$\bull$}|\raise|\<dimen>\<box>, |\lower|\<dimen>\<box>.\enskip +This acts just like an unadorned \<box> command, except that the new box +being put into the nucleus is also shifted up or down by the specified amount. + +\bugonpage A331, bottom two lines (6/25/93) + +\ninepoint\noindent +if you know that the +enclosing box is sufficiently small; and |\leaders\vrule\vfill| works fine in +vertical mode. + +\bugonpage A354, lines 19--22 (3/5/95) + +\ninepoint\noindent +|\def\sett@b{\ifx\next\+\def\nxt{\afterassignment\s@tt@b\let\nxt}%|\par +\noindent +| \else\let\nxt=\s@tcols\fi|\par\noindent +| \let\next=\relax \nxt} % turn off \outerness|\par\noindent +|\def\s@tt@b{\let\nxt=\relax \us@false\m@ketabbox}| + +\bugonpage A356, lines 13--20 from the bottom (3/5/95) + +\ninepoint +{\parindent=0pt +|\def\oalign#1{\leavevmode\vtop{\baselineskip0pt \lineskip.25ex|\par +| \ialign{##\crcr#1\crcr}}} \def\o@lign{\lineskiplimit=0pt \oalign}|\par +|\def\ooalign{\lineskiplimit=-\maxdimen \oalign} % chars over each other|\par +|\def\sh@ft#1{\dimen0=.00#1ex \multiply\dimen0 by\fontdimen1\font|\par +| \kern-.0156\dimen0} % compensate for slant in lowered accents|\par +|\def|^|\d||#1{{\o@lign{\relax#1\crcr\hidewidth\sh@ft{10}.\hidewidth}}}|\par +|\def|^|\b||#1{{\o@lign{\relax#1\crcr\hidewidth\sh@ft{29}%|\par +| \vbox to.2ex{\hbox{\char'26}\vss}\hidewidth}}}|\par +} + +\bugonpage A357, lines 7--12 (8/1/95) + +\ninepoint\noindent +|\def|^|\rightarrowfill||{$\m@th \smash- \mkern-7mu|\par\noindent +| \cleaders\hbox{$\mkern-2mu \smash- \mkern-2mu$}\hfill|\par\noindent +| \mkern-7mu \mathord\rightarrow$}|\par\noindent +|\def|^|\leftarrowfill|% + |{$\m@th \mathord\leftarrow \mkern-7mu|\par\noindent +| \cleaders\hbox{$\mkern-2mu \smash- \mkern-2mu$}\hfill|\par\noindent +| \mkern-7mu \smash-$}| + +\bugonpage A357, lines 16--20 (6/25/93) + +\ninepoint +{\parindent=0pt +| \setbox0=\hbox{$\braceld$}%|\par +| \bracelu\leaders\vrule height\ht0 depth0pt\hfill\bracerd|\par +| \braceld\leaders\vrule height\ht0 depth0pt\hfill\braceru$}|\par +|\def|^|\downbracefill||{$\m@th|\par +| \setbox0=\hbox{$\braceld$}%|\par +| \braceld\leaders\vrule height\ht0 depth0pt\hfill\braceru|\par +| \bracelu\leaders\vrule height\ht0 depth0pt\hfill\bracerd$}|\par +\smallskip[Also delete lines 21 and 22, as the usage is no longer restricted.] +} + +\bugonpage A359, line 25 (3/5/95) + +\ninepoint\noindent +|\def|^|\skew||#1#2#3{{\muskip0=#1mu \mkern.5\muskip0|\par\noindent +| #2{\mkern-.5\muskip0{#3}\mkern.5\muskip0}\mkern-.5\muskip0}{}}| + +\bugonpage A360, line 5 from the bottom (3/5/95) + +\ninepoint\noindent +|\def\@vereq#1#2{\lower.5pt\vbox{\lineskiplimit\maxdimen \lineskip-.5pt| + +\bugonpage A361, lines 19 and 20 (3/5/95) + +\ninepoint\noindent +|\def|^|\bmod||{\nonscript\mskip-\medmuskip \mkern5mu|\par\noindent +| |^|\mathbin||{\rm mod} \penalty900 \mkern5mu \nonscript\mskip-\medmuskip}| + +\bugonpage A362, lines 14--18 (3/5/95) + +\ninepoint\noindent +| |^|\everycr||{\noalign{\ifdt@p \global\dt@pfalse|% + | \ifdim\prevdepth>-1000pt|\par\noindent +| \vskip-\lineskiplimit \vskip\normallineskiplimit \fi|\par\noindent +| \else \penalty|^|\interdisplaylinepenalty|| \fi}}}|\par\noindent +|\def\@lign{\tabskip=0pt\everycr={}} % restore inside \displ@y|\par\noindent +|\def|^|\displaylines||#1{\displ@y \tabskip=0pt| + +\bugonpage A363, lines 8--9 from the bottom (12/8/89) + +{\ninepoint\parindent=0pt +| \if@mid \dimen@=\ht0 \advance\dimen@ by\dp\z@ |% + |\advance\dimen@ by12\p@|\parbreak% +| \advance\dimen@ by\pagetotal \advance\dimen@ by-\pageshrink| +\par} + +\bugonpage A364, line 5 from the bottom (4/11/96) + +\ninepoint\noindent +|\def\fmtname{plain}|\par\noindent +|\def\fmtversion{3.141592} % identifies the current format| + +\bugonpage A374, line 3 (3/7/95) + +\ninepoint\indent +|\begingroup\aftergroup\def\aftergroup\asts\aftergroup{| + +\bugonpage A410, line 23 (4/18/96) + +\ninepoint\noindent +| Tema con variazione \(su un tema differente)| +\smallskip\eightpoint\noindent +(This implies a corresponding correction to page 411.) + +\bugonpage A451, line $16$ (8/8/93) + +\ninepoint\noindent +But when plain \TeX\ is tried on the name of a famous ^{Welsh} village, + +\bugonpage A462, right column (3/5/95) + +\def\cong{\mathrel{\mathpalette\OvOreq\sim}} % congruence sign, index version +\def\OvOreq#1#2{\lower.5pt\vbox{\baselineskip0pt\lineskip-.0pt + \ialign{$#1\hfil##\hfil$\crcr#2\crcr=\crcr}}} +\eightpoint +|\cong| ( $\cong$ ), 151, $\underline{360}$, 436. + +\bugonpage A463, right column (6/25/93) + +\eightpoint +direct sum, {\sl see\/} |\oplus|. + +\bugonpage A464, left column (6/25/93) + +\eightpoint +|\downbracefill| (\hbox to 4em{\downbracefill}), 225--226, $\underline{357}$. + +\bugonpage A483, lines 15--21 (4/29/97) + +\tenpoint +\begintt +email: {\tt TUG@tug.org} +internet: {\tt http://www.tug.org/} +} +\endtt +Don't delay, subscribe today! That address again is + +\smallskip +{\obeylines +\TeX\ Users Group +email: {\tt TUG\char`\@ tug.org} +internet: {\tt http://www.tug.org/} +} + +\bye diff --git a/Master/texmf-dist/source/generic/knuth/errata/errata.one b/Master/texmf-dist/source/generic/knuth/errata/errata.one new file mode 100644 index 00000000000..471971958c3 --- /dev/null +++ b/Master/texmf-dist/source/generic/knuth/errata/errata.one @@ -0,0 +1,751 @@ +% Bugs (sigh) in The TeXbook + +\input manmac +\proofmodefalse +\raggedbottom +\output{\onepageout{\unvbox255\kern-\dimen@ \vfil}} + +\def\rhead{Bugs in {\sl The \TeX book}, first printing} +\def\bugonpage#1(#2) \par{\bigbreak\tenpoint + \hrule\line{\lower3.5pt\vbox to13pt{}Page #1\hfil(#2)}\hrule\nobreak\medskip} + +\noindent This is a list of all corrections made to {\sl The \TeX book\/} +between the first and second printings. If your copy says `{\sl\kern-1pt Second +printing (October 1984)\/}' on the copyright page, you've already got +all of these things corrected. Otherwise, you're a lucky owner of the +rare first edition; read on. + +\bugonpage 29, lines 31--32 (8/25/84) + +The underfull box that \TeX\ produces in the 1.5-inch case is really bad; +with such narrow limits, an occasional wide space is unavoidable. But try + +\bugonpage 54, lines 5--6 (4/20/84) + +{\parfillskip=0pt +\ddanger Appendix B shows that plain \TeX\ handles most of the accents +by using \TeX's ^|\accent| primitive. For example, |\'#1| is equivalent +to |{\accent19 #1}|, where\par} + +\bugonpage 63, seven lines below the first illustration (2/27/84) + +\line{points, a width of 5.5555 points, and a depth of zero; +the letter `g' has a height} + +\bugonpage 72, line 35 (2/28/84) + +\ninepoint\noindent +from |0pt|, but |0.00001filll| is infinitely greater than |16383.99999fill|. + +\bugonpage 79, line 12 (2/28/84) + +\ninepoint\indent +|\hbox(6.25+1.94444)x312.0, glue set 0.5783, shifted 36.0 []| + +\bugonpage 98, line 24 (4/13/84) + +\ninepoint +\line{and |\finalhyphendemerits=5000|. Demerits are in units of + ``badness squared,'' so the} + +\bugonpage 101, lines 29--30 (3/13/84) + +{\parfillskip=0pt +\danger It's possible to control the length of lines in a much more general +way, if simple changes to |\leftskip| and |\rightskip| aren't +flexible enough for your\par} + +\bugonpage 113, bottom two lines (3/13/84) + +{\parfillskip=0pt +\ddanger Notice that the first ``|%| line'' of our example says |t=10.0|; +this is a consequence of another parameter, called ^|\topskip|. Glue +disappears at a page break, but\par} + +\bugonpage 124, eighth-last line (8/25/84) + +\ninepoint +{\parfillskip=0pt\noindent +discarded, |\box100| will +be void after the |\vsplit|. And if\/ |\box100| was void before the\par} + +\bugonpage 131, display in exercise 16.8 (3/16/84) + +\indent +|If$ x = y$, then $x$ is equal to $y.$| + +\bugonpage 170, table in middle of the page (2/12/84) + +\ninepoint +$$\baselineskip0pt\lineskip0pt +\halign to\hsize + {\strut\hbox to\parindent{\it#\hfil}& % for the legend "Left atom" + #\hfil\quad& % for the row labels + #\hfil\tabskip 0pt plus 10pt& % for the rule at the left + \hbox to 25pt{\tt\hss#\hss}& % for column 1 + \hbox to 25pt{\tt\hss#\hss}& % for column 2 + \hbox to 25pt{\tt\hss#\hss}& % for column 3 + \hbox to 25pt{\tt\hss#\hss}& % for column 4 + \hbox to 25pt{\tt\hss#\hss}& % for column 5 + \hbox to 25pt{\tt\hss#\hss}& % for column 6 + \hbox to 25pt{\tt\hss#\hss}& % for column 7 + \hbox to 25pt{\tt\hss#\hss}& % for column 8 + #\hfil\tabskip0pt\cr % for the rule at the right +\noalign{\vskip-6pt} % it just happens that there's extra white space +&&&&\multispan7\hss\it Right atom\hss\cr +\noalign{\vskip3pt} +&&&\rm Ord&\rm Op&\rm Bin&\rm Rel&\rm Open&\rm Close&\rm Punct&\rm Inner\cr +\noalign{\vskip2pt} +\omit&&\multispan{10}\leaders\hrule\hfil\cr +\omit\vbox to 2pt{}&&\vrule&&&&&&&&&\vrule\cr +&Ord&\vrule&0&1&(2)&(3)&0&0&0&(1)&\vrule\cr +&Op&\vrule&1&1&*&(3)&0&0&0&(1)&\vrule\cr +&Bin&\vrule&(2)&(2)&*&*&(2)&*&*&(2)&\vrule\cr +Left&Rel&\vrule&(3)&(3)&*&0&(3)&0&0&(3)&\vrule\cr +atom&Open&\vrule&0&0&*&0&0&0&0&0&\vrule\cr +&Close&\vrule&0&1&(2)&(3)&0&0&0&(1)&\vrule\cr +&Punct&\vrule&(1)&(1)&*&(1)&(1)&(1)&(1)&(1)&\vrule\cr +&Inner&\vrule&(1)&1&(2)&(3)&(1)&0&(1)&(1)&\vrule\cr +\omit\vbox to 2pt{}&&\vrule&&&&&&&&&\vrule\cr +\omit&&\multispan{10}\leaders\hrule\hfil\cr}$$ + +\bugonpage 173, line 11 (1/2/84) + +\indent|Clearly $a_i<b_i$ for~$i=1, 2, \ldots, n$.| + +\bugonpage 176, bottom two lines (7/20/84) + +\def\chapno{ 18} \exno=23 % for exercise 18.24! +\dangerexercise Typeset the display \ \lower12pt\null +$\tenpoint\smash{\displaystyle +\left\lgroup\matrix{a&b&c\cr d&e&f\cr}\right\rgroup + \left\lgroup\matrix{u&x\cr v&y\cr w&z\cr}\right\rgroup +}$, \ +using ^|\lgroup| and ^|\rgroup|. + +\bugonpage 189, line 18 (2/13/84) + +\ninepoint\noindent +{\parfillskip=0pt +when there is an overlap.] \ If $e=0$ and if there is an |\leqno|, +the equation number is\par} + +\bugonpage 204, line 31 (2/13/84) + +\ninepoint\noindent +of\/ |\a| is delimited by a left brace. + +\bugonpage 212, line 23 (7/8/84) + +\ninepoint\noindent +it equals~2.) \ +Similarly, ^|\tracingmacros||=2| will trace |\output|, |\everypar|, etc. + +\bugonpage 216, first five lines (8/25/84) + +\ddanger Expanded definitions that are made with |\edef| or |\xdef| continue +to expand tokens until only unexpandable tokens remain, except that +token lists produced by `^|\the|' are not expanded further. Furthermore +a token following `^|\noexpand|' will not be expanded, since its ability +to expand has been nullified. These two operations can be used to control +^^{expansion, avoiding} what gets expanded and what doesn't. + +\bugonpage 219, simplification of line 18 (2/15/84) + +\ninepoint\indent +| \advance\count0 by\count2 \hexdigit}}| + +\bugonpage 223, lines 3--4 (3/13/84) + +{\parfillskip=0pt +\ddanger Chapters 24 to 26 present summaries of all \TeX's operations +in all modes, and when those summaries mention a `\<box>' they mean one +of the seven\par} + +\bugonpage 242, line 29 (1/2/84) + +\ninepoint\noindent +{\parfillskip=0pt +a relation, the solution is to insert `|{}|' ^^{lbrace rbrace} +at the beginning of the right-hand formula; \TeX +\par} + +\bugonpage 245, line 24 (2/15/84) + +\ninepoint\noindent +of a box that spans columns $i$ through~$j$, +hence the glue in such a box might shrink. + +\bugonpage 248, the fourth dangerous bend (2/15/84) + +{\parfillskip=0pt +\ddanger You have to be careful with the use of |&| and ^|\span| and ^|\cr|, +because these tokens are intercepted by \TeX's scanner even when it is +not expanding macros.\par} + +\bugonpage 249, lines 20--26 (2/15/84) + +\ninepoint\noindent +line (see Chapter~9). +If you don't want a~|\cr| at the end of a certain line, +just type `|%|' and the corresponding |\cr| +will be ``commented out.'' ^^{percent} \ (This special mode doesn't +work with ^|\+| lines, since |\+| is a macro whose argument is delimited +by the token `|\cr|', not simply by a token that has the same meaning +as~|\cr|. ^^{delimited arguments} But you can redefine |\+| to overcome +this hurdle, if you want to. For example, define a macro |\alternateplus| +that is just like |\+| except that its argument is delimited by the active +character |^^M|; then include the command `|\let\+=\alternateplus|' as +part of\/ |\obeylines|.) + +\bugonpage 253, lines 28--32 (4/25/84) + +\ninepoint\noindent +vertical list at what it thinks is the best place, and at such times +it enters internal vertical mode and begins to read the commands in the +current |\output| routine. When the output routine begins, ^|\box255| +contains the page that \TeX\ has completed; the output routine is supposed to +do something with this vbox. When the output routine ends, the list of +items that it has constructed in internal vertical mode is placed just% +{\parfillskip=0pt\par} + +\bugonpage 254, lines 1--13 (3/13/84) + +\ddanger \TeX's primitive command |\shipout|\<box> is what actually +causes output. It sends the contents of the box to the |dvi| file, +which is \TeX's main output file; after \TeX\ has finished, +the ^|dvi| file will contain a compact device-independent encoding of +instructions that specify exactly what should be printed. When a +box is shipped out, \TeX\ displays the values of\/ |\count0| through +|\count9| on your terminal, ^^|\count0| as explained in Chapter~15; these +ten counters are also recorded in the |dvi| file, where they can be used +to identify the page. All of the ^|\openout|, ^|\closeout|, and ^|\write| +commands that appear inside of the \<box> are performed in their natural +order as that box is being shipped out. Since a |\write| command +expands macros, as explained in Chapter~21, \TeX's scanning mechanism +might detect syntax errors while a |\shipout| is in progress. If +^|\tracingoutput| is nonzero at the time of a |\shipout|, the contents +of the \<box> being shipped are written into your log file in symbolic +form. You can say |\shipout| anywhere, not only in an output routine. + +\bugonpage 255, line 33 (4/25/84) + +\ninepoint\indent +|\nointerlineskip| + + +\bugonpage 256, starting with line $-17$ (11/1/83) + +\ninepoint +\textindent{6)} Finally, the ^|\dosupereject| macro is designed to clear +out any insertions that have been held over, whether they are illustrations +or footnotes or both: ^^|\insertpenalties| ^^|\supereject| +\begintt +\ifnum\insertpenalties>0 + \line{} \kern-\topskip \nobreak + \vfill\supereject\fi +\endtt +The mysterious negative ^|\kern| here cancels out the natural space of the +^|\topskip| glue that goes above the empty |\line|; that empty line box +prevents the ^|\vfill| from disappearing into a page break. The vertical +list that results from |\dosupereject| is placed on \TeX's list of things +to put out next, just after the straggling insertions have been +reconsidered as explained in Chapter~15. Hence another super-eject will +occur, and the process will continue until no insertions remain. + +\bugonpage 262, line 14 (2/12/84) + +\ninepoint\indent +|\def\endindex{\mark{}\break\endgroup}| + +\bugonpage 262, lines 34 and 35 (2/12/84) + +\ninepoint\noindent +if\/ |\next| is `|\endindex|', +the next commands executed will be `|\vfill|\allowbreak +|\mark{}|\allowbreak|\break|\allowbreak|\endgroup|'; +otherwise the line will be treated as a main entry. + +\bugonpage 269, line 23 becomes two lines (8/25/84) + +\ninepoint\noindent +tokens like |+|$_{12}$; +(3)~keywords like \[pt]; (4)~control sequence names like |\dimen|; +or (5)~the special symbols |{|, |}|, |$|. + +\bugonpage 274, line 24 (2/15/84) + +\ninepoint\indent +|\lineskip|\quad(interline glue if\/ |\baselineskip| isn't feasible) + +\bugonpage 289, slight clarification on lines 39--41 (3/10/84) + +\ninepoint +A \<math character> defines a 15-bit number either by specifying it +directly with ^|\mathchar| or in a previous ^|\mathchardef|, or by +specifying a 27-bit |\delimiter| value; in the latter case, the least +significant 12~bits are discarded. + + +\bugonpage 307, a slightly more explicit answer (11/3/83) + +\ninepoint\noindent +\hbox to\parindent{\bf\hss6.3.\enspace}% +It represents the heavy bar that shows up in +your output. \ (This bar wouldn't be present if\/ ^|\overfullrule| had been +set to |0pt|, nor is it present in an underfull box.) + +\bugonpage 313, first four lines (3/13/84) + +{\ninepoint\parfillskip=0pt +\ansno12.17: + You get `A' at the extreme left and `puzzle.\null' at the extreme right, +because the space between words has the only stretchability that is finite; +the infinite stretchability cancels out. \ (In this case, \TeX's rule +about ^{infinite glue} differs from what you would get in the limit if the +value of $1\,{\rm fil}$ were finite but getting larger and larger. +The true\par} + +\bugonpage 315, first three lines (3/13/84) + +\ninepoint +\ansno14.14: + Just say |\parfillskip|\stretch|=|\stretch|\parindent|. Of course, +\TeX\ will not be able to find appropriate line breaks unless each +paragraph is sufficiently long or sufficiently lucky; but with an +appropriate text, your output will be immaculately +symmetrical.{\parfillskip=\parindent\par} + +\bugonpage 324, line 16 (2/15/84) + +\ninepoint\noindent +\hbox to\parindent{\bf\hss18.41.\enspace}% +|$$\{\underbrace{\overbrace{\mathstrut a,\ldots,a}| + +\bugonpage 324, first line of answer 18.44 (4/11/84) + +\ninepoint +\ansno18.44: + |$$\mathop{{\sum}'}_{x\in A}f(x)\mathrel{\mathop=^{\rm def}}| + +\bugonpage 333, beginning of the final paragraph (12/19/83) + +\ninepoint +{\sl Note:\/} The stated preamble solves the problem and demonstrates +that \TeX's line-breaking capability can be used within tables. But this +particular table is not really a good example of the use of\/ |\halign|, +because \TeX\ could typeset it directly, using ^|\everypar| in an +appropriate manner to set up the hanging indentation, and using |\par| +instead of\/ |\cr|. For example, one could say + +\bugonpage 341, the bottom line was left out! (2/9/84) + +\line{Footline\quad\dotfill\quad Page 1009} + +\bugonpage 345, top three lines (1/26/84) + +\ninepoint{\noindent\parfillskip=0pt +A mathcode is relevant only when the corresponding category code is +11 or~12; therefore many of these codes will rarely be looked at. For +example, the math code for |^^M| specifies the character |\oplus|, +but it's hard to imagine a user who would want |^^M|\par} + +\bugonpage 345, line 31 (2/29/84) + +\ninepoint\noindent +|\delcode`\<="26830A \delcode`\\="26E30F \delcode`\>="26930B| + +\bugonpage 347, lines 1 and 2 (3/16/84) + +\ninepoint\noindent +|\count18=3 % this counter allocates math families 4, 5, 6, ...|\hfil\break +|\count19=255 % this counter allocates insertions 254, 253, 252, ...| + +\bugonpage 350, line 9 from the bottom (3/16/84) + +\ninepoint\noindent +font, whose information does not have to be loaded again. + +\bugonpage 354, line 5 (6/7/84) + +\ninepoint\noindent +|\def\ialign{\everycr={}\tabskip=0pt \halign} % initialized \halign| + +\bugonpage 355, lines 19--21 (7/3/84) + +\ninepoint\noindent +subdivision in a document; to use it, you say +`|\beginsection|\<section title>' followed by a blank line (or~|\par|). +The macro first emits glue and penalties, designed to start a new page +if the present page is nearly full; then it makes a ^|\bigskip| and +puts the section{\parfillskip=0pt\par} + +\bugonpage 355, lines 27--29 (7/3/84) + +\ninepoint\noindent +|\outer\def\beginsection#1\par{\vskip0pt plus.3\vsize\penalty-250| +\par\noindent +| \vskip0pt plus-.3\vsize\bigskip\vskip\parskip| +\par\noindent +| \message{#1}\leftline{\bf#1}\nobreak\smallskip\noindent}| + +\bugonpage 355, line 37 (4/24/84) + +\ninepoint\noindent +|\outer\def\proclaim #1. #2\par{\medbreak| + +\bugonpage 356, seven lines from the bottom (4/11/84) + +\ninepoint\noindent +|\def|^|\TeX||{T\kern-.1667em \lower.5ex\hbox{E}\kern-.125em X}| + +\bugonpage 359, starting with line 2 (11/16/83) + +\ninepoint +\beginlines +|\mathchardef\ldotp="602E\mathchardef\cdotp="6201\mathchardef\colon="603A| +|\def\ldots{\mathinner{\ldotp\ldotp\ldotp}}| +|\def\cdots{\mathinner{\cdotp\cdotp\cdotp}}| +|\def\vdots{\vbox{\baselineskip=4pt \lineskiplimit=0pt| +| \kern6pt \hbox{.}\hbox{.}\hbox{.}}}| +|\def\ddots{\mathinner{\mskip1mu\raise7pt\vbox{\kern7pt\hbox{.}}\mskip2mu| +| \raise4pt\hbox{.}\mskip2mu\raise1pt\hbox{.}\mskip1mu}}| +\endlines + +\bugonpage 359, starting with line 19 (11/3/83) + +{\ninepoint\parindent=0pt +|\def|^|\overbrace|% + |#1{\mathop{\vbox{\ialign{##\crcr\noalign{\kern3pt}|\parbreak% +| \downbracefill\crcr\noalign{\kern3pt\nointerlineskip}|\parbreak% +| $\hfil\displaystyle{#1}\hfil$\crcr}}}|^|\limits||}| + +|\def|^|\underbrace||#1{\mathop{\vtop{\ialign{##\crcr|\parbreak% +| $\hfil\displaystyle{#1}\hfil$\crcr|% + |\noalign{\kern3pt\nointerlineskip}|\parbreak% +| \upbracefill\crcr\noalign{\kern3pt}}}}\limits}| +} + +\bugonpage 359, seventh line from the bottom (2/29/84) + +\ninepoint\noindent +|\def\backslash{\delimiter"026E30F } \def\bracevert{\delimiter"000033E }| + +\bugonpage 361, line 3 (8/17/84) + +\ninepoint\noindent + +|\def\buildrel#1\over#2{\mathrel{\mathop{\null#2}\limits^{#1}}}| + +\bugonpage 363, line 10 (4/26/84) + +\ninepoint\noindent +| \ifhmode\edef\@sf{\spacefactor=\the\spacefactor}\/\fi| + +\bugonpage 364, starting with line 10 (11/1/83) + +{\ninepoint\parindent=0pt +|\def\dosupereject{\ifnum\insertpenalties>0 % something is being held over|% +\parbreak +| \line{}\kern-\topskip\nobreak\vfill\supereject\fi}| +} + +\bugonpage 364, line 28 (7/8/84) + +\ninepoint\noindent +| \tracingmacros=2 \tracingparagraphs=1 \tracingrestores=1 | + +\bugonpage 370, line 7 (3/16/84) + +\ninepoint\noindent +information about the \TeX\ Users Group.) + +\bugonpage 374, line 23 (7/8/84) + +\ninepoint +\line{log file when |\tracingmacros=2| and + |\tracingcommands=2|. One of the important ways} + +\bugonpage 379, line 1 (1/12/84) + +\ninepoint\noindent +A particular item can be selected by its position number from the left: + +\bugonpage 381, line 6 (2/12/84) + +\ninepoint\indent +|\newcount\lineno % the number of file lines listed| + +\bugonpage 381, lines 24 and 25 (12/15/83) + +\ninepoint +{\parfillskip=0pt +Instead of listing a file verbatim, you might want to define a |\verbatim| +macro such that `|\verbatim{$this$|{\tt\ is }|{\it!}}|' yields +`|$this$|{\tt\ is }|{\it!}|'. It's somewhat\par} + +\bugonpage 385, lines 22 and 23 (1/12/84) + +\ninepoint\noindent +macro, a parameter, or a token list +variable; (b)~when \TeX\ must determine whether the token +|&|~or ^|\span| ^^{ampersand} +or ^|\cr| or~^|\crcr| is the end of an entry within an ^{alignment}. + +\bugonpage 387, two paragraphs in right column (1/18/84) + +\setbox0=\vbox{ +\eightpoint +\tolerance=9999 +\hbadness=2300 +\finalhyphendemerits=3000000 +\doublehyphendemerits=1000000 +\parskip=1pt +\parindent=1.5em +\frenchspacing +\hsize=166.8125pt +\def\\#1{\raise.5pt\hbox{$\scriptscriptstyle + \ifx#1`\langle\!\langle\else\rangle\!\rangle\fi$}% Spanish quote marks + \ifx#1`\nobreak\hskip0pt \fi} % allow hyphenation +\item{A.} Exactamente. Pero los profesores son tan conservadores +que temer\'\i an espantar al tipo de estudiante \\`apisonadora\\' +que hace lo que le proponen para casa, obe\-dien\-te\-mente y de forma +mec\'anica. Adem\'as, no creo que les gustase el trabajo adicional +de calificar respuestas a preguntas abiertas. + +\item{}La forma tradicional es dejar la parte creativa para los cursos +altos. Durante diecisiete a\~nos o m\'as se ense\~na al es\-tu\-diante a +aprobar, luego de golpe, cerca de la graduaci\'on, se le pide que haga +algo original. + +}\rightline{\box0} + +\bugonpage 395, lines 21 and 22 (1/12/84) + +\ninepoint\noindent +{\parfillskip=0pt +Notice that the macros need to do their own checking for ligatures, and +they also take appropriate actions when a paragraph begins with an opening +quote. Since |\kern|\par} + +\bugonpage 399, line 1 (1/10/84) + +\ninepoint +{\parfillskip=0pt +Inside the output routine, |\box\footins| will now be a vbox of hboxes, and +\par} + +\bugonpage 399, line 9 (2/28/84) + +\ninepoint\indent +|.\hbox(7.6359+0.0)x269.62617 []| + +\bugonpage 407, line 4 (6/10/84) + +\ninepoint\noindent +|\beginlinemode| and |\beginparmode| are defined to initiate these +modes; and another% +{\parfillskip=0pt\par} + +\bugonpage 408, line 15 (12/14/83) + +\noindent +| P. O. Box 1009, Haga Alto, CA 94321 USA}| + +\smallskip\noindent\ninepoint +[Also change the ZIP code in the return address on the envelope +illustrated at the bottom of page 405.] + +\bugonpage 409, line 5 (2/18/84) + +\ninepoint\noindent +|\font\twelveit=cmti10 at 12pt % (a cheap substitute for cmti12)| + +\bugonpage 417, last six lines (8/25/84) + +\ninepoint\noindent +^|\parskip| +of |0pt| |plus|~|.8pt| between adjacent entries, and since there is room for +more than 50 lines per column; therefore the |manmac| balancing routine tries +to make both the top and bottom baselines agree at the end of the index. +In applications where the glue is not so flexible it would be more +appropriate to let the right-hand column be a little short; the best +way to do this is probably to replace the command `|\unvbox3|' by +`|\dimen2=|^|\dp||3| |\unvbox3| |\kern-\dimen2| ^|\vfil|'. + +\bugonpage 422, lines 24--26 (2/9/84) + +\ninepoint\noindent +(The last two lines use |\d@nger| and |\dd@nger|, which are non-|\outer| +equivalents of\/ |\danger| and |\ddanger|; such duplication is necessary +because control sequences of type ^|\outer| cannot appear within a |\def|.) + +\bugonpage 428, in the table of sixteen basic fonts (12/19/83) + +\ninepoint\noindent +[The special fonts called |cmi10| and |cmi7| and |cmi5| should really be +called |cmmi10| and |cmmi7| and |cmmi5|.] + +\bugonpage 433, last eight lines (8/17/84) + +\noindent +explained in Appendix~G\null. If you want to increase +the number of parameters past the number that actually appear in a font's +metric information file, you can assign new values immediately after that font +has been loaded. For example, if some font |\ff| with seven parameters +has just entered \TeX's memory, the command |\fontdimen13\ff=5pt| will set +parameter number~13 to $5\pt$; the intervening parameters, numbers 8--12, +will be set to zero. You can even give more than seven parameters to +^|\nullfont|, provided that you assign the values before any actual fonts +have been loaded. + +\bugonpage 445, line 6 (11/11/83) + +\ninepoint +\line{if $(a-{1\over2}\theta)- +\bigl(h(z)-v\bigr)<\varphi$, increase~$v$ by the difference. Finally +construct a vbox of} + +\bugonpage 449, line 12 (1/18/84) + +\line{immediately clear why the `n' should +be attached to the `e' in one case but not} + +\bugonpage 459, left column, line 2 (1/18/84) + +\eightpoint +al-Khw\^arizm\^\i, abu Ja`far Mu\d{h}ammad + +\bugonpage 460, index entry for Beethoven (8/16/84) + +\eightpoint +Change `von' to `van'. + +\bugonpage 461, third line in left column (8/25/84) + +\eightpoint The entry for |\box255| should not be indented. + +\bugonpage 461, index entry for boxed material (8/2/84) + +\eightpoint Add `{\it 420}'. + +\bugonpage 462, index entry for {\tt\char`\\colon} (11/16/83) + +\eightpoint Add page \underbar{359} to this list. + +\bugonpage 462, right column, third-last line (5/21/84) + +\eightpoint\indent +[Change `crochets' to `crotchets'; then move this entry down two lines.] + +\bugonpage 463, right column, line 16 (5/20/84) + +\eightpoint\indent +design size, 16--17, 213. + +\bugonpage 464, index entry for {\tt\char`\\dump} (1/10/84) + +\eightpoint Add page {\it 344\/} to this list. + +\bugonpage 464, right column, line 5 (1/5/84) + +\eightpoint +Dvo\v r\'ak, Anton\'\i n Leopold, 409. + +\bugonpage 464, index entry for {\tt\char`\\end} (8/25/84) + +\eightpoint Page number 264 should be underlined. + +\bugonpage 465, index entry for {\tt\char`\\everydisplay} (8/25/84) + +\eightpoint Add page {\it 326\/} to this list. + +\bugonpage 465, index entry for {\tt\char`\\filbreak} (7/3/84) + +\eightpoint Delete the reference to page number 355. + +\bugonpage 466, index entry for {\tt\char`\\footnote} (4/26/84) + +\eightpoint Page number 363 should be underlined. + +\bugonpage 467, index entry for {\tt\char`\\hidewidth} (7/3/84) + +\eightpoint Page number 354 should be underlined. + +\bugonpage 468, index entry for insertions (8/25/84) + +\eightpoint Add pages 115--117, 122--125 to this list. + +\bugonpage 469, index entry for {\tt\char`\\kern} (11/1/83) + +\eightpoint Add page {\it 256\/} to this list. + +\bugonpage 470, index entry for {\tt\char`\\limits} (11/3/83) + +\eightpoint Add page {\it 359\/} to this list. + +\bugonpage 472, right column, lines 10--11 (7/9/84) + +{\eightpoint +\indent +|\normalbaselines|\kern1pt, + {\it 325}, 349, $\underline{351}$, {\it 414--415}.\par +\baselineskip=9.9pt +\indent +|\normalbaselineskip|\kern1pt, + $\underline{349}$, {\it 414--415}.\par +} + +\bugonpage 472, index entry for {\tt\char`\\null} (7/3/84) + +\eightpoint Page number 351 should be underlined. + +\bugonpage 472, right column, line 28 (1/3/84) + +\eightpoint\indent +\hbox to0pt{\hss\lower1pt\hbox{*}}|\nullfont|, 14, 153, 271, 433. + +\bugonpage 476, a new index entry (8/25/84) + +\eightpoint\indent +shifted output, {\sl see\/} |\hoffset|, |\voffset|. + +\bugonpage 476, index entry for shriek (8/25/84) + +\eightpoint It should not be capitalized. + +\bugonpage 478, index entry for \'Swierczkowski (9/15/84) + +\eightpoint +The middle name should be `S\l awomir'. + +\bugonpage 479, last seven lines in the left column (8/23/84) + +\eightpoint +{\baselineskip=9.9pt +\par\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +|\tracingmacros|, $\underline{205}$, $\underline{212}$, 273, {\it329}. +\par\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +|\tracingonline|, 121, 212, 273, $\underline{303}$. +\par\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +|\tracingoutput|, $\underline{254}$, 273, {\it301--302}. +\par\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +|\tracingpages|, {\it112--114}, 124, 273, $\underline{303}$. +\par\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +|\tracingparagraphs|, {\it98--99}, 273, $\underline{303}$. +\par\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +|\tracingrestores|, 273, $\underline{301}$, $\underline{303}$. +\par\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +|\tracingstats|, 273, $\underline{300}$, $\underline{303}$, {\it383}. +} + +\bugonpage 479, index entry for underlined text (8/2/84) + +\eightpoint Add `{\sl see also\/} |\underbar|'. + +\bugonpage 480, index entry for {\tt\char`\\vbox} (11/1/83) + +\eightpoint Delete page 256 from this list. + +\bye + diff --git a/Master/texmf-dist/source/generic/knuth/errata/errata.seven b/Master/texmf-dist/source/generic/knuth/errata/errata.seven new file mode 100644 index 00000000000..0866189da51 --- /dev/null +++ b/Master/texmf-dist/source/generic/knuth/errata/errata.seven @@ -0,0 +1,821 @@ +% Bugs (sigh) in Computers \& Typesetting + +\input manmac +\font\sltt=cmsltt10 +\font\niness=cmss9 +\font\ninessi=cmssi9 +\proofmodefalse +\raggedbottom +\output{\hsize=29pc \onepageout{\unvbox255\kern-\dimen@ \vfil}} + +\def\today{\number\day\ + \ifcase\month\or + Jan\or Feb\or Mar\or Apr\or May\or Jun\or + Jul\or Aug\or Sep\or Oct\or Nov\or Dec\fi + \ \number\year} + +\def\cutpar{{\parfillskip=0pt\par}} + +\def\rhead{Bugs in {\tensl Computers \& Typesetting, 1991}} +\def\bugonpage#1(#2) \par{\bigbreak\tenpoint + \hrule width\hsize + \line{\lower3.5pt\vbox to13pt{}Page #1\hfil(#2)}\hrule width\hsize + \nobreak\medskip} +\def\buginvol#1(#2) \par{\bigbreak\penalty-1000\tenpoint + \hrule width\hsize + \line{\lower3.5pt\vbox to13pt{}Volume #1\hfil(#2)}\hrule width\hsize + \nobreak\medskip} +\def\slMF{{\manual 89:;}\-{\manual <=>:}} % slant the logo +\def\0{\raise.7ex\hbox{$\scriptstyle\#$}} +\newcount\nn +\newdimen\nsize \newdimen\msize \newdimen\ninept \ninept=9pt +\newbox\eqbox \setbox\eqbox=\hbox{\kern2pt\eightrm=\kern2pt} + +\tenpoint +\noindent This is a list of all corrections made to {\sl Computers \& +Typesetting}, Volumes A,~B, C, and D\null, between 1 January 1991 and +15 March 1992. +Corrections made to the softcover version of {\sl The \TeX book\/} are +the same as corrections to Volume~A\null. Corrections to the softcover +version of {\sl The \slMF\kern1ptbook\/} are the same as corrections +to Volume~C\null. Some of the corrections below have already been made in +reprintings of the books. Changes to Volume~B refer to the fourth printing +(1991), which differs markedly from earlier printings because it includes +all the revisions for \TeX3.0. Changes to Volume~D refer to the third +printing (1991), which differs markedly from earlier printings because +it includes all the revisions for \MF\kern1pt2.0. Changes to the mini-indexes +and master indexes of Volumes B and~D are not shown here unless they are +not obviously derivable from what has been shown. +Dozens of changes, too many to list +here, have been made to Volume~E because of recent upgrades to the +Computer Modern font source files. +Those changes, which affect only the digitization at +low resolution and the appearance of lowercase delta and +some characters in the math symbols +fonts (but not the {\tt TFM} files), are documented at +the end of file {\tt cm85.bug}. +\looseness=-1 + +% volume A + +\bugonpage A96, lines 9--11 (9/18/91) + +\ninepoint +Some ^{German} words traditionally change their spelling +when they are split between lines. For example, `backen' becomes `bak-ken' +and `Bettuch' becomes `Bett-tuch'. How can you instruct \TeX\ to produce +such effects? + +\bugonpage A178, line 17 (11/19/91) + +\ninepoint +If you say `|\phantom{|\<subformula>|}|' in any formula, plain +\TeX\ will do its\cutpar + +\bugonpage A286, bottom two lines and continuing into A287 (11/21/91) + +\ninepoint\noindent +stands for zero or more \<assignment> +commands other than |\setbox|. +If the assignments are not followed by a \<character>, where +\<character> stands for any of the commands just discussed in the previous +paragraph, \TeX\ treats |\accent| as if it were |\char|, except that +the space factor is set to 1000. Otherwise the character that follows +the assignment is accented by the character that corresponds to the +\<8-bit number>. \ (The purpose of the intervening assignments is to +allow the accenter and accentee to be in different fonts.) \ If the +accent must be moved up or down, it is put into an hbox that is +raised or lowered. Then the accent is effectively superposed on the +character by means of kerns, in such a way that the width of the accent +does not influence the width of the resulting horizontal list. +Finally, \TeX\ sets |\spacefactor=1000|. + +\bugonpage A291, lines 6--8 (11/21/91) + +\ninepoint\noindent +`|}|' may be followed by +optional \<assignment> commands other than |\setbox|, +after which `|$$|'~must conclude +the display. \TeX\ will insert the |\abovedisplayskip| and +|\belowdisplayskip| glue before and after the result of the alignment. + +\bugonpage A293, line 14 (9/18/91) + +\ninepoint\noindent +explained in Appendix~G\null. \TeX\ +scans \<one optional space> after completing a displayed formula; this is +usually the implicit space at the end of a line in the input file. + +\bugonpage A311, bottom four lines (9/18/91) + +\ninepoint +\ansno12.7: 1000, except: 999 after |O|, |B|, |S|, |D|, and |J|; 1250 after the +comma; 3000 after the exclamation point, the right-quote marks, and the +periods. If a period had come just after the |B| (i.e., if the text had +said `|B. Sally|'), the space factor after that period would have +been~1000, not~3000. + +\bugonpage A314, lines 16--18 from the bottom (1/10/92) + +\ninepoint +\ansno14.8: |ba\ck/en| and |Be\ttt/uch|, where the macros |\ck/| and |\ttt/| +are defined by +\begintt +\def\ck/{\discretionary{k-}{k}{ck}} +\def\ttt/{tt\discretionary{-}{t}{}} +\endtt + +\bugonpage A354, line 8 (9/18/91) + +\ninepoint\noindent +|\def\multispan#1{\omit\mscount=#1\relax\loop\ifnum\mscount>1 \sp@n\repeat}|% +\kern-10pt\null + +\bugonpage A356, line 11 from the bottom (9/23/91) + +\ninepoint\noindent +| \else{\ooalign{\unhbox0\crcr\hidewidth\char'30\hidewidth}}\fi}| + +\bugonpage A358, line 8 from the bottom (9/18/91) + +\ninepoint\noindent +|\mathchardef\mapstochar="3237 \def\mapsto{\mapstochar\rightarrow}| + +\bugonpage A359, line 13 (11/4/91) + +\ninepoint\noindent +|\def\overrightarrow#1{\vbox{\m@th\ialign{##\crcr| + +\bugonpage A359, line 16 (11/4/91) + +\ninepoint\noindent +|\def\overleftarrow#1{\vbox{\m@th\ialign{##\crcr| + +\bugonpage A359, line 19 (11/4/91) + +\ninepoint\noindent +|\def\overbrace#1{\mathop{\vbox{\m@th\ialign{##\crcr\noalign{\kern3pt}| + +\bugonpage A359, line 22 (11/4/91) + +\ninepoint\noindent +|\def\underbrace#1{\mathop{\vtop{\m@th\ialign{##\crcr| + +\bugonpage A359, lines 7--14 from the bottom (1/11/92) + +\ninepoint\noindent +|\def\lgroup{\delimiter"462833A } \def\rgroup{\delimiter"562933B }|% +\par\noindent +|\def\lmoustache{\delimiter"437A340 } \def\rmoustache{\delimiter"537B341 }|% + \kern-2pt\null\par\noindent +|\def\uparrow{\delimiter"3222378 } \def\Uparrow{\delimiter"322A37E }|% +\par\noindent +|\def\downarrow{\delimiter"3223379 } \def\Downarrow{\delimiter"322B37F }|% +\par\noindent +|\def\updownarrow{\delimiter"326C33F } \def\arrowvert{\delimiter"026A33C }|% +\par\noindent +|\def\Updownarrow{\delimiter"326D377 } \def\Arrowvert{\delimiter"026B33D } |% +\par\noindent +|\def\vert{\delimiter"026A30C } \def\Vert{\delimiter"026B30D } |% +\par\noindent +|\def\backslash{\delimiter"026E30F } \def\bracevert{\delimiter"077C33E }| + +\bugonpage A360, line 13 (11/19/91) + +\ninepoint\noindent +|\phantom|, |\smash|, |\root|, and other +operations. (Actually |\phantom| and |\smash| are not perfect: They +assume that the current style is uncramped.) + +\bugonpage A360, line 2 from the bottom (11/4/91) + +\ninepoint\noindent +|\def\c@ncel#1#2{\m@th\ooalign{$\hfil#1\mkern1mu/\hfil$\crcr$#1#2$}}| + +\bugonpage A361, top line (11/4/91) + +\ninepoint\noindent +|\def\rlh@#1{\vcenter{\m@th\hbox{\ooalign{\raise2pt| + +\bugonpage A364, line 5 from the bottom (11/4/91) + +\ninepoint\noindent +|\def|^|\fmtname||{plain}\def\fmtversion{3.141}| + +\bugonpage A377, the bottom 17 lines (9/18/91) + +\eightpoint\noindent\hangindent\parindent\hangafter-3 +story: Macro |\stest| decides whether or not +a given token list register begins with +a \<space token> as defined in Chapter~24. If so, the macro +decides whether the token is explicit and/or funny and/or active. +\begintt +\newif\ifspace \newif\iffunny \newif\ifexplicit \newif\ifactive +\def\stest#1{\funnyfalse \expandafter\s\the#1! \stest} +\def\s{\global\explicitfalse \global\activefalse \futurelet\next\ss} +\def\ss{\ifcat\noexpand\next\stoken\let\nxt\sx\else\let\nxt\ns\fi\nxt} +\def\sx{\spacetrue\ifx\next\stoken\let\nxt\sss\else\let\nxt=\ssss\fi\nxt} +\long\def\sss#1 #2\stest{\def\next{#1}% + \ifx\next\empty \global\explicittrue \else\testactive#1\s\fi} +\long\def\ssss#1#2\stest{\funnytrue{\escapechar=\if*#1`?\else`*\fi\relax + \if#1\string#1\uccode`#1=`~ % we assume that ~ is an active character + \uppercase{\ifcat\noexpand#1}\noexpand~\global\activetrue + \else\global\explicittrue\fi + \else\testactive#1\s\fi}} +\long\def\ns#1\stest{\spacefalse} +\long\def\testactive#1#2\s{\expandafter\tact\string#1\s\tact} +\long\def\tact#1#2\tact{\def\next{#2}\ifx\next\xs\global\activetrue + \else\ifx\next\empty \global\activetrue\fi\fi} \def\xs{\s} +\endtt + +\bugonpage A444, lines 15--26 (3/26/91) + +\ninepoint +\textindent{\bf14.}If the current item is an Ord atom, +go directly to Rule~17 unless +all of the following are true: The nucleus is a symbol; the subscript +and superscript are both empty; the very next item in the math list is an +atom of type Ord, Op, Bin, Rel, Open, Close, or Punct; and the nucleus of the +next item is a symbol whose family is the same as the family in the present +Ord atom. In such cases the present symbol is marked as a text symbol. +If the font information shows a ligature between this symbol and the +following one, using the specified family and the current size, then +insert the ligature character and continue as specified by the font; +in this process, two characters may collapse into a single Ord +text symbol, and/or new Ord text characters may appear. If the font information +shows a kern between the current symbol and the next, insert a kern item +following the current atom. +As soon as an Ord atom has been fully processed for ligatures and kerns, +go to Rule~17. + +\bugonpage A446, lines 5 and 6 from the bottom (1/13/92) + +\ninepoint\noindent +are used to change the current style just as +in the first pass, so that both passes have the same value of~$C$ when +they work on any particular atom. + +\bugonpage A447, in the parameter usage table (1/13/92) + +\ninepoint\noindent[Delete the entry for `$\sigma_2$'; the entry for +`$\sigma_{17}$' moves down to the bottom of the left column.] + +\bugonpage A447, line 2 after the parameter usage table (1/13/92) + +\ninepoint\noindent +to parameters in arbitrary families: +Rule~17 uses |\fontdimen| parameter~2 (space) to de-\cutpar + +\bugonpage A467, entry for {\tt\char`\\hss} (9/18/91) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +{\tt\char`\\hss}, 71--72, {\it82--83}, 233, 283, 285, 290, 442. + +\bugonpage A467, new subentry under hyphenation (9/18/91) + +\eightpoint\indent\quad +suppressing, 93, 414, 424, 454. + +\bugonpage A476, right column (11/21/91) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +{\tt\char`\\setbox}, 66--67, 77, 81, $\underline{120}$, 276, 279, 286,\par +\indent\qquad 291, {\it386--392}. + +% volume B +\hsize=35pc +\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers +\def\to{\mathrel{.\,.}} % double dot, used only in math mode + +\bugonpage B2, line 10 from the bottom (1/11/92) + +\ninepoint\noindent\hskip10pt +{\bf define} $\\{banner}\equiv\hbox{\tt\char'23}$% +{\tt This\]is\]TeX,\]Version\]3.141\char'23}\quad +$\{\,$printed when \TeX\ starts$\,\}$ + +\bugonpage B18, lines 21 and 22 (10/12/91) + +\tenpoint\noindent +must have an \\{xchr} equivalent in the local +character set. (This restriction applies only to preloaded strings, +not to those generated dynamically by the user.) + +\bugonpage B26, new line before fourth line from bottom (1/24/92) + +\ninepoint\noindent\hskip20pt +\\{nl}: \\{integer};\quad$\{\,$new-line character to restore$\,\}$ + +\bugonpage B26, bottom line and top 3 lines of B27 (1/24/92) + +\ninepoint\noindent\hskip30pt +{\bf else begin if\/} $\\{selector}>\\{pseudo}$ {\bf then}\par +\noindent\hskip50pt +{\bf begin} \\{print\_char}($s$); \ {\bf return};\quad + $\{\,$internal strings are not expanded$\,\}$\par\noindent\hskip50pt +{\bf end};\par\noindent\hskip40pt +{\bf if\/} ($\langle\,$Character $s$ is the current new-line + character{\sevenrm\kern.5em244}$\,\rangle$) {\bf then}\par\noindent\hskip50pt +{\bf if\/} $\\{selector}<\\{pseudo}$ {\bf then}\par\noindent\hskip60pt +{\bf begin} \\{print\_ln}; \ {\bf return}; \ +{\bf end};\par\noindent\hskip40pt +$\\{nl}\gets\\{new\_line\_char}$; \ $\\{new\_line\_char}\gets-1$;\quad + $\{\,$temporarily disable new-line character$\,\}$\par\noindent\hskip40pt +$j\gets\\{str\_start}[s]$;\par\noindent\hskip40pt +{\bf while} $j<\\{str\_start}[s+1]$ {\bf do}\par\noindent\hskip50pt +{\bf begin} $\\{print\_char}(\\{so}(\\{str\_pool}[j]))$; \ $\\{incr}(j)$; \ +{\bf end};\par\noindent\hskip40pt +$\\{new\_line\_char}\gets\\{nl}$; \ {\bf return};\par\noindent\hskip40pt +{\bf end}; + +\bugonpage B27, lines 9 and 10 (9/19/91) + +\tenpoint\noindent +{\bf 60.\quad}% +Control sequence names, file names, and strings constructed with +{\tt\char`\\string} might contain \\{ASCII\_code} values that can't +be printed using \\{print\_char}. Therefore we use +\\{slow\_print} for them: + +\bugonpage B27, lines 13--26 (1/24/92) + +\ninepoint\noindent\hskip10pt +{\bf var} $j$: \\{pool\_pointer};\quad$\{\,$current character code + position$\,\}$\par\noindent\hskip10pt +{\bf begin if\/} $(s\ge\\{str\_ptr})\lor(s<256)$ {\bf then} \\{print}(s) +\par\noindent\hskip10pt {\bf else begin} $j\gets\\{str\_start}[s]$;\par +\noindent\hskip20pt{\bf while} $j<\\{str\_start}[s+1]$ {\bf do}\par +\noindent\hskip30pt{\bf begin} $\\{print}(\\{so}(\\{str\_pool}[j]))$; \ + $\\{incr}(j)$;\par\noindent\hskip30pt +{\bf end};\par\noindent\hskip20pt +{\bf end};\par\noindent\hskip10pt +{\bf end}; + +\bugonpage B28, line 8 (9/19/91) + +\ninepoint\noindent\hskip10pt +{\bf else begin} \\{slow\_print}(\\{format\_ident}); \ \\{print\_ln}; + +\bugonpage B33, line 3 (1/11/92) + +\tenpoint\noindent +recursively. A similar interlock is provided by \\{set\_box\_allowed}. + +\bugonpage B33, new line to come after line 14 (1/11/92) + +\ninepoint\noindent +\\{set\_box\_allowed}: \\{boolean};\quad + $\{\,$is it safe to do a |\setbox| assignment?$\,\}$ + +\bugonpage B33, new line to come after line 20 (1/11/92) + +\ninepoint\noindent\hskip10pt +$\\{set\_box\_allowed}\gets\\{true}$; + +\bugonpage B36, line 12 (9/19/91) + +\ninepoint\noindent\hskip30pt +{\bf begin} \\{print\_nl}({\tt\char`\"You\]want\]to\]edit\]file\]\char`\"}); + \ \\{slow\_print}(\\{input\_stack}[\\{base\_ptr}].\\{name\_field}); + +\bugonpage B46, lines 9 and 10 (5/24/91) + +\tenpoint\noindent +arithmetic; see {\sl TUGboat \bf3},1 (March 1982), 10--27. (But the +routines cited there must be modified to allow negative glue ratios.) + +\bugonpage B47, lines 2 and 3 (5/24/91) + +\tenpoint\noindent +structures on a \\{memory\_word}, which contains either a (signed) integer, +possibly scaled, or a (signed) \\{glue\_ratio}, or a small number of +fields that are one half or one quarter of the size used\cutpar + +\bugonpage B177, lines 10 and 11 (9/19/91) + +\ninepoint\noindent\hskip20pt +{\bf begin} \\{print\_err}({\tt\char`\"Bad\]mathchar\char`\"});\par +\noindent\hskip20pt +\\{help2}({\tt\char`\"A\]mathchar\]number\]must\]be\]between\]0\]% + and\]32767.\char`\"}) + +\bugonpage B196, new lines after line 11 (1/13/92) + +\ninepoint\noindent\hskip20pt +{\bf if\/} $\\{align\_state}<1000000$ {\bf then}\quad + $\{\,$unmatched `|}|' aborts the line$\,\}$\par\noindent\hskip30pt +{\bf begin repeat} \\{get\_token}; \ {\bf until} $\\{cur\_tok}=0$;\par +\noindent\hskip30pt$\\{align\_state}\gets1000000$; \ {\bf goto} \\{done};\par +\noindent\hskip30pt{\bf end}; + +\bugonpage B208, line 21 (9/19/91) + +\ninepoint\noindent\hskip10pt +{\bf begin} \\{slow\_print}($a$); \ \\{slow\_print}($n$); \ + \\{slow\_print}($e$); + +\bugonpage B214, line 14 (9/19/91) + +\ninepoint\noindent\hskip10pt +{\bf begin} \\{wlog}(\\{banner}); \\{slow\_print}(\\{format\_ident}); \ + \\{print}({\tt\char`\"\]\]\char`\"}); \ + \\{print\_int}(\\{day}); \ + \\{print\_char}({\tt\char`\"\]\char`\"}); + +\bugonpage B214, line 2 from the bottom (9/19/91) + +\ninepoint\noindent\hskip10pt +\\{print\_char}({\tt\char`\"(\char`\"}); \ +\\{incr}(\\{open\_parens}); \ +\\{slow\_print}(\\{name}); \ +\\{update\_terminal}; \ +$\\{state}\gets\\{new\_line}$; + +\bugonpage B234, line 22 (9/19/91) + +\ninepoint\noindent\hskip20pt +\\{print}({\tt\char`\"\]in\]font\]\char`\"}); \ +\\{slow\_print}(\\{font\_name}[$f$]); \ +\\{print\_char}({\tt\char`\"!\char`\"}); \ +\\{end\_diagnostic}(\\{false}); + +\bugonpage B267, lines 7 and 8 (9/19/91) + +\ninepoint\noindent\hskip20pt +\\{print\_nl}({\tt\char`\"Output\]written\]on\]\char`\"}); \ +\\{slow\_print}(\\{output\_file\_name});\par\noindent\hskip20pt +\\{print}({\tt\char`\"\](\char`\"}); \ +\\{print\_int}(\\{total\_pages}); \ +\\{print}({\tt\char`\"\]page\char`\"}); + +\bugonpage B296, new lines after line 8 of section 716 (1/11/92) + +\ninepoint\noindent\hskip10pt +{\bf if\/} $f<0$ {\bf then}\par\noindent\hskip20pt +{\bf begin} \\{decr}($n$); \ $f\gets f+\oct{200000}$;\par\noindent\hskip20pt +{\bf end}; + +\bugonpage B297, new lines after line 7 of section 717 (1/11/92) + +\ninepoint\noindent\hskip20pt +{\bf if\/} $f<0$ {\bf then}\par\noindent\hskip30pt +{\bf begin} \\{decr}($n$); \ $f\gets f+\oct{200000}$;\par\noindent\hskip30pt +{\bf end}; + +\bugonpage B348, bottom two lines (1/3/92) + +\tenpoint\noindent\hskip10pt +Up to three passes might be made through the paragraph in an attempt to find at +least one set of feasible breakpoints. On the first pass, we have +$\\{threshold}=\\{pretolerance}$ and $\\{second\_pass}=$\cutpar + +\bugonpage B364, line 20 (1/3/92) + +\tenpoint\noindent +{\bf 863.\quad} +The `{\bf loop}' in the following code is performed at most +thrice per call of \\{line\_break}, since\cutpar + +\bugonpage B377, insert new line after line 12 (9/19/91) + +\ninepoint\noindent +\\{hyf\_bchar}:\enspace\\{halfword};\quad + $\{\,$boundary character after $c_n\,\}$ + +\bugonpage B378, line 12 from the bottom (9/19/91) + +\ninepoint\noindent\hskip30pt +$\\{hyf\_bchar}\gets\\{character}(s)$; \ +$c\gets\\{qo}(\\{hyf\_bchar})$; + +\bugonpage B378, line 9 from the bottom (1/10/92) + +\ninepoint\noindent\hskip30pt +$\\{hb}\gets s$; \ \\{incr}(\\{hn}); \ $\\{hu}[\\{hn}]\gets c$; \ +$\\{hc}[\\{hn}]\gets\\{lc\_code}(c)$; \ +$\\{hyf\_bchar}\gets\\{non\_char}$; + +\bugonpage B378, line 5 from the bottom (9/19/91) + +\ninepoint\noindent\hskip30pt +{\bf else if} $(\\{type}(s)=\\{kern\_node})\land(\\{subtype}(s)=\\{normal})$ + {\bf then} $\\{hb}\gets s$\par\noindent\hskip40pt + {\bf else goto} \\{done3}; + +\bugonpage B379, line 6 (9/19/91) + +\ninepoint\noindent\hskip10pt +$j\gets\\{hn}$; \ $q\gets\\{lig\_ptr}(s)$; \ +{\bf if\/} $q>\\{null}$ {\bf then} $\\{hyf\_bchar}\gets\\{character}(q)$; + +\bugonpage B379, new line between lines 14 and 15 (1/10/92) + +\ninepoint\noindent\hskip10pt +{\bf if\/} $\\{odd}(\\{subtype}(s))$ {\bf then} +$\\{hyf\_bchar}\gets\\{font\_bchar}[\\{hf}]$ {\bf else} +$\\{hyf\_bchar}\gets\\{non\_char}$; + +\bugonpage B379, line 19 (9/19/91) + +\ninepoint\noindent\hskip10pt +{\bf if\/} $\\{hn}<\\{l\_hyf}+\\{r\_hyf}$ {\bf then goto} \\{done1}; \ +\quad$\{\,$\\{l\_hyf} and \\{r\_hyf} are always $\ge1\,\}$ + +\bugonpage B380, lines 9--11 from the bottom reduce to a single line (1/10/92) + +\ninepoint\noindent\hskip10pt +$q\gets\\{link}(\\{hb})$; \ $\\{link}(\\{hb})\gets\\{null}$; \ +$r\gets\\{link}(\\{ha})$; \ $\\{link}(\\{ha})\gets\\{null}$; \ +$\\{bchar}\gets\\{hyf\_bchar}$; + +\bugonpage B436, lines 9 and 10 (3/15/92) + +\tenpoint +$$\\{cur\_r}=\cases{\\{character}(\\{lig\_stack}),&if $\\{lig\_stack}> + \\{null}$;\cr + \\{font\_bchar}[\\{cur\_font}],&otherwise;\cr}$$ +except when $\\{character}(\\{lig\_stack})=\\{font\_false\_bchar} + [\\{cur\_font}]$. Several additional global variables are needed. + +\bugonpage B438, line 13 from the bottom (3/15/92) + +\ninepoint\noindent\hskip10pt +$\\{cur\_q}\gets\\{tail}$; \ $\\{cur\_l}\gets\\{character}(\\{lig\_stack})$; + +\bugonpage B507, line 6 of section 1241 (1/11/92) + +\ninepoint\noindent\hskip10pt +\\{scan\_optional\_equals};\par\noindent\hskip10pt +{\bf if\/} \\{set\_box\_allowed} {\bf then} +$\\{scan\_box}(\\{box\_flag}+n)$\par\noindent\hskip10pt +{\bf else begin} \\{print\_err}({\tt\char`\"Improper\]\char`\"}); +\ \\{print\_esc}({\tt\char`\"setbox\char`\"});\par\noindent\hskip20pt +\\{help2}({\tt\char`\"Sorry,\]\char`\\setbox\]is\]not\]allowed\]after\]% +\char`\\halign\]in\]a\]display,\char`\"})\par\noindent\hskip20pt +({\tt\char`\"or\]between\]\char`\\accent\]% +and\]an\]accented\]character.\char`\"}); +\ \\{error};\par\noindent\hskip20pt +{\bf end}; + +\bugonpage B511, new line inserted after line 3 (1/24/92) + +\ninepoint\noindent\hskip20pt +\\{flushable\_string}: \\{str\_number};\quad + $\{\,$string not yet referenced$\,\}$ + +\bugonpage B512, new line inserted after line 3 of section 1260 (1/24/92) + +\ninepoint\noindent\hskip10pt +$\\{flushable\_string}\gets\\{str\_ptr}-1$; + +\bugonpage B512, the former line 6 of section 1260 (1/24/92) + +\ninepoint\noindent\hskip30pt +{\bf begin if\/} $\\{cur\_name}=\\{flushable\_string}$ {\bf then} +\par\noindent\hskip40pt{\bf begin} \\{flush\_string}; \ + $\\{cur\_name}\gets\\{font\_name}[f]$; \ {\bf end}; +\par\noindent\hskip30pt{\bf if\/} $s>0$ {\bf then} + +\bugonpage B512, line 10 from the bottom (9/19/91) + +\ninepoint\noindent +\\{set\_font}:\enspace{\bf begin} +\\{print}({\tt\char`\"select\]font\]\char`\"}); \ +\\{slow\_print}(\\{font\_name}[\\{chr\_code}]); + +\bugonpage B514, line 9 (1/11/92) + +\ninepoint\noindent\hskip20pt +$\\{set\_box\_allowed}\gets\\{false}$; \ +\\{prefixed\_command}; \ +$\\{set\_box\_allowed}\gets\\{true}$; + +\bugonpage B515, line 19 (9/19/91) + +\ninepoint\noindent\hskip10pt +\\{slow\_print}($s$); \ \\{update\_terminal}; + +\bugonpage B516, line 2 (9/19/91) + +\ninepoint\noindent\hskip10pt +{\bf begin} \\{print\_err}({\tt\char`\"\char`\"}); \ + \\{slow\_print}($s$); + +\bugonpage B531, lines 19 and 20 (9/19/91) + +\ninepoint\noindent\hskip10pt +\\{print\_nl}({\tt\char`\"Beginning\]to\]dump\]on\]file\]\char`\"}; \ +\\{slow\_print}(\\{w\_make\_name\_string}(\\{fmt\_file})); \ +\\{flush\_string};\par\noindent\hskip10pt +\\{print\_nl}({\tt\char`\"\char`\"}); \ +\\{slow\_print}(\\{format\_ident}) + +\bugonpage B533, line 29 (9/19/91) + +\ninepoint\noindent\hskip30pt +{\bf begin} \\{print\_nl}({\tt\char`\"Transcript\]written\]on\]\char`\"}); \ +\\{slow\_print}(\\{log\_name}); \ +\\{print\_char}({\tt\char`\".\char`\"}); + +\bugonpage B538, line 13 (9/19/91) + +\ninepoint\noindent +10:\enspace\\{slow\_print}($n$); + +\bugonpage B577, left column (12/23/91) + +\eightpoint\noindent[Add 798 to the index entries for `system dependencies'.] + +% volume C +\hsize=29pc +\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers + +\bugonpage C262, line 15 (3/26/91) + +\ninepoint\noindent +|string base_name, base_version; base_name="plain"; base_version="2.7";| + +\bugonpage C271, line 17 from the bottom (3/26/91) + +\ninepoint\noindent +| currentpen_path shifted (z.t_) withpen penspeck enddef;| + +\bugonpage C347, Bront''e entry (1/29/91) + +\eightpoint\noindent +[The accent was clobbered; her name should, of course, be Bront\"e. +Fix the entries for D\"urer, M\"obius, and Stravinsky in the same way.] + +\bugonpage C348, left column (1/11/92) + +\eightpoint\indent +compound statement, $\underline{155}$, 217. + +\bugonpage C353, right column (1/11/92) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +{\tt numeric}, 55, $\underline{56}$, {\it65}, 88. + +\bugonpage C354, miscellaneous entries in both columns (1/11/92) + +\eightpoint +\par\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +{\tt openwindow}, $\underline{191}$--$\underline{193}$, 220, {\it277}, + {\it312--313}. +\par\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +{\tt or}, {\it65}, $\underline{170}$, 210, 237, 288--289. +\par\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +{\tt pair}, 55, $\underline{56}$, 65. +\par\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +{\tt path}, 55, $\underline{56}$, 171. +\par\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +{\tt pen}, 55, $\underline{56}$, {\it65}, 170. +\par\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +{\tt picture}, 55, $\underline{56}$, {\it114}. + +\bugonpage C356, right column (1/11/92) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +{\tt string}, 55, $\underline{56}$, 69. + +\bugonpage C357, right column (1/11/92) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +{\tt transform}, 55, $\underline{56}$, 57, 141--143, {\it160}, 266. + +% Volume D +\hsize=35pc +\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers +\def\to{\mathrel{.\,.}} % double dot, used only in math mode + +\bugonpage D2, last line of section 2 (1/24/92) + +\ninepoint\noindent\hskip10pt +{\bf define} $\\{banner}\equiv\hbox{\tt\char'23}$% +{\tt This\]is\]METAFONT,\]Version\]2.71\char'23}\quad +$\{\,$printed when \MF\ starts$\,\}$ + +\bugonpage D102, line 15 from the bottom (11/1/91) + +\tenpoint\noindent +Then +$\\{eq\_type}(h(x))=\\{tag\_token}$ and $\\{equiv}(h(x))=p$, +where $p$~is a two-word value +node with\cutpar + +\bugonpage D188, lines 16 and 17 (1/24/92) + +\tenpoint\noindent +errors. Our subroutines also obey the identity $t[a,b]+t[b,a]=a+b$. + +\bugonpage D190, new copy before bottom four lines (1/24/92) + +\ninepoint\noindent\hskip10pt +{\bf if\/} $\\{x\_coord}(r)<\\{x\_coord}(\\{pp})$ {\bf then} + $\\{x\_coord}(r)\gets\\{x\_coord}(\\{pp})$\par\noindent\hskip10pt +{\bf else if\/} $\\{x\_coord}(r)>\\{dest\_x}$ {\bf then} + $\\{x\_coord}(r)\gets\\{dest\_x}$;\par\noindent\hskip10pt +{\bf if\/} $\\{left\_x}(r)>\\{x\_coord}(r)$ {\bf then}\par\noindent\hskip20pt +{\bf begin} $\\{left\_x}(r)\gets\\{x\_coord}(r)$; \ +{\bf if\/} $\\{right\_x}(\\{pp})>\\{x\_coord}(r)$ {\bf then} +$\\{right\_x}(\\{pp})\gets\\{x\_coord}(r)$; \ {\bf end};\par\noindent\hskip10pt +{\bf if\/} $\\{right\_x}(r)<\\{x\_coord}(r)$ {\bf then}\par\noindent\hskip20pt +{\bf begin} $\\{right\_x}(r)\gets\\{x\_coord}(r)$; \ +{\bf if\/} $\\{left\_x}(\\{qq})<\\{x\_coord}(r)$ {\bf then} +$\\{left\_x}(\\{qq})\gets\\{x\_coord}(r)$; \ {\bf end}; + +\bugonpage D191, new copy before bottom two lines of section 416 (1/24/92) + +\ninepoint\noindent\hskip10pt +{\bf if\/} $\\{x\_coord}(s)<\\{x\_coord}(r)$ {\bf then} + $\\{x\_coord}(s)\gets\\{x\_coord}(r)$\par\noindent\hskip10pt +{\bf else if\/} $\\{x\_coord}(s)>\\{dest\_x}$ {\bf then} + $\\{x\_coord}(s)\gets\\{dest\_x}$;\par\noindent\hskip10pt +{\bf if\/} $\\{left\_x}(s)>\\{x\_coord}(s)$ {\bf then}\par\noindent\hskip20pt +{\bf begin} $\\{left\_x}(s)\gets\\{x\_coord}(s)$; \ +{\bf if\/} $\\{right\_x}(r)>\\{x\_coord}(s)$ {\bf then} +$\\{right\_x}(r)\gets\\{x\_coord}(s)$; \ {\bf end};\par\noindent\hskip10pt +{\bf if\/} $\\{right\_x}(s)<\\{x\_coord}(s)$ {\bf then}\par\noindent\hskip20pt +{\bf begin} $\\{right\_x}(s)\gets\\{x\_coord}(s)$; \ +{\bf if\/} $\\{left\_x}(\\{qq})<\\{x\_coord}(s)$ {\bf then} +$\\{left\_x}(\\{qq})\gets\\{x\_coord}(s)$; \ {\bf end}; + +\bugonpage D194, lines 4 and 5 (1/24/92) + +\tenpoint\noindent[Delete those two lines; I no longer believe that the +assertion has been proved (although it might be true).] + +\bugonpage D194, lines 7--13 of section 424 (1/24/92) + +\ninepoint\noindent\hskip10pt +{\bf if\/} $\\{y\_coord}(r)<\\{y\_coord}(p)$ {\bf then} + $\\{y\_coord}(r)\gets\\{y\_coord}(p)$\par\noindent\hskip10pt +{\bf else if\/} $\\{y\_coord}(r)>\\{dest\_y}$ {\bf then} + $\\{y\_coord}(r)\gets\\{dest\_y}$;\par\noindent\hskip10pt +{\bf if\/} $\\{x\_coord}(p)+\\{y\_coord}(r)>\\{dest\_x}+\\{dest\_y}$ +{\bf then} $\\{y\_coord}(r)\gets\\{dest\_x}+\\{dest\_y}-\\{x\_coord}(p)$;\par +\noindent\hskip10pt +{\bf if\/} $\\{left\_y}(r)>\\{y\_coord}(r)$ {\bf then}\par\noindent\hskip20pt +{\bf begin} $\\{left\_y}(r)\gets\\{y\_coord}(r)$; \ +{\bf if\/} $\\{right\_y}(p)>\\{y\_coord}(r)$ {\bf then} +$\\{right\_y}(p)\gets\\{y\_coord}(r)$; \ {\bf end};\par\noindent\hskip10pt +{\bf if\/} $\\{right\_y}(r)<\\{y\_coord}(r)$ {\bf then}\par\noindent\hskip20pt +{\bf begin} $\\{right\_y}(r)\gets\\{y\_coord}(r)$; \ +{\bf if\/} $\\{left\_y}(q)<\\{y\_coord}(r)$ {\bf then} +$\\{left\_y}(q)\gets\\{y\_coord}(r)$; \ {\bf end}; + +\bugonpage D194, lines 8--11 from the bottom (1/24/92) + +\ninepoint\noindent\hskip10pt +{\bf if\/} $\\{right\_y}(r)<\\{y\_coord}(r)$ {\bf then}\par\noindent\hskip20pt +{\bf begin} $\\{right\_y}(r)\gets\\{y\_coord}(r)$; \ +{\bf if\/} $\\{left\_y}(q)<\\{y\_coord}(r)$ {\bf then} +$\\{left\_y}(q)\gets\\{y\_coord}(r)$; \ {\bf end}; + +\bugonpage D195, lines 3--9 of section 425 (1/24/92) + +\ninepoint\noindent\hskip10pt +{\bf if\/} $\\{y\_coord}(s)<\\{y\_coord}(r)$ {\bf then} + $\\{y\_coord}(s)\gets\\{y\_coord}(r)$\par\noindent\hskip10pt +{\bf else if\/} $\\{y\_coord}(s)>\\{dest\_y}$ {\bf then} + $\\{y\_coord}(s)\gets\\{dest\_y}$;\par\noindent\hskip10pt +{\bf if\/} $\\{x\_coord}(r)+\\{y\_coord}(s)>\\{dest\_x}+\\{dest\_y}$ +{\bf then} $\\{y\_coord}(s)\gets\\{dest\_x}+\\{dest\_y}-\\{x\_coord}(r)$;\par +\noindent\hskip10pt +{\bf if\/} $\\{left\_y}(s)>\\{y\_coord}(s)$ {\bf then}\par\noindent\hskip20pt +{\bf begin} $\\{left\_y}(s)\gets\\{y\_coord}(s)$; \ +{\bf if\/} $\\{right\_y}(r)>\\{y\_coord}(s)$ {\bf then} +$\\{right\_y}(r)\gets\\{y\_coord}(s)$; \ {\bf end};\par\noindent\hskip10pt +{\bf if\/} $\\{right\_y}(s)<\\{y\_coord}(s)$ {\bf then}\par\noindent\hskip20pt +{\bf begin} $\\{right\_y}(s)\gets\\{y\_coord}(s)$; \ +{\bf if\/} $\\{left\_y}(q)<\\{y\_coord}(s)$ {\bf then} +$\\{left\_y}(q)\gets\\{y\_coord}(s)$; \ {\bf end}; + +\bugonpage D195, lines 3--7 from the bottom if section 425 (1/24/92) + +\ninepoint\noindent\hskip10pt +{\bf if\/} $\\{right\_y}(s)<\\{y\_coord}(s)$ {\bf then}\par\noindent\hskip20pt +{\bf begin} $\\{right\_y}(s)\gets\\{y\_coord}(s)$; \ +{\bf if\/} $\\{left\_y}(q)<\\{y\_coord}(s)$ {\bf then} +$\\{left\_y}(q)\gets\\{y\_coord}(s)$; \ {\bf end}; + +\bugonpage D289, lines 9 and 10 (11/1/91) + +\ninepoint\noindent\hskip20pt +$p\gets\\{dep\_list}(p)$; \ $r\gets\\{inf\_val}$;\par\noindent\hskip20pt +{\bf repeat if\/} $\\{value}(\\{info}(p))\ge\\{value}(r)$ {\bf then}\par + +\bugonpage D486, line 18 (11/1/91) + +\tenpoint\noindent +The \\{label\_loc} +and \\{label\_char} arrays have been set up to record all the +starting addresses; we have\cutpar + +% volume E +\hsize=29pc +\def\dashto{\mathrel{\hbox{-\kern-.05em}\mkern3.9mu\hbox{-\kern-.05em}}} + + +\bye + diff --git a/Master/texmf-dist/source/generic/knuth/errata/errata.six b/Master/texmf-dist/source/generic/knuth/errata/errata.six new file mode 100644 index 00000000000..ad7444d8600 --- /dev/null +++ b/Master/texmf-dist/source/generic/knuth/errata/errata.six @@ -0,0 +1,528 @@ +% Bugs (sigh) in Computers \& Typesetting + +\input manmac +\font\sltt=cmsltt10 +\font\niness=cmss9 +\font\ninessi=cmssi9 +\proofmodefalse +\raggedbottom +\output{\hsize=29pc \onepageout{\unvbox255\kern-\dimen@ \vfil}} + +\def\today{\number\day\ + \ifcase\month\or + Jan\or Feb\or Mar\or Apr\or May\or Jun\or + Jul\or Aug\or Sep\or Oct\or Nov\or Dec\fi + \ \number\year} + +\def\cutpar{{\parfillskip=0pt\par}} + +\def\rhead{Bugs in {\tensl Computers \& Typesetting, 1990}} +\def\bugonpage#1(#2) \par{\bigbreak\tenpoint + \hrule width\hsize + \line{\lower3.5pt\vbox to13pt{}Page #1\hfil(#2)}\hrule width\hsize + \nobreak\medskip} +\def\buginvol#1(#2) \par{\bigbreak\penalty-1000\tenpoint + \hrule width\hsize + \line{\lower3.5pt\vbox to13pt{}Volume #1\hfil(#2)}\hrule width\hsize + \nobreak\medskip} +\def\slMF{{\manual 89:;}\-{\manual <=>:}} % slant the logo +\def\0{\raise.7ex\hbox{$\scriptstyle\#$}} +\newcount\nn +\newdimen\nsize \newdimen\msize \newdimen\ninept \ninept=9pt +\newbox\eqbox \setbox\eqbox=\hbox{\kern2pt\eightrm=\kern2pt} + +\tenpoint +\noindent This is a list of all corrections made to {\sl Computers \& +Typesetting}, Volumes A,~C, and E\null, between 30 September 1989 (when +the revisions for \TeX\ Version 3.0 and \MF\ Version 2.0 were made) and +December 31, 1990. +Corrections made to the softcover version of {\sl The \TeX book\/} are +the same as corrections to Volume~A\null. Corrections to the softcover +version of {\sl The \slMF\kern1ptbook\/} are the same as corrections +to Volume~C\null. Some of the corrections below have already been made in +reprintings of the books. Hundreds of changes, too many to list here, +have been made to Volumes B~and~D because of the upgrades to \TeX\ and +\MF\null. Readers who need up-to-date information on the \TeX\ and +\MF\ programs should refer to the |WEB| source files until new +printings of Volumes B~and~D are issued. \looseness=-1 + +% volume A + +\bugonpage A99, line 4 from the bottom (2/22/90) + +\ninepoint\indent +to be chosen because there was no feasible +way to keep total demerits small. + +\bugonpage A124, lines 18--21 (9/5/90) + +\ninepoint\noindent +Floating insertions can be accommodated +as a special case of split insertions, by making each floating topinsert +start with a small penalty, and by having +zero as the associated |\floatingpenalty|; non-floating insertions +like footnotes are accommodated by associating larger penalties with +split insertions (see Appendix~B). + +\bugonpage A137, lines 2 and 3 from the bottom (11/9/90) + +{\eightssi +\rightline{and you shouldn't even be reading this manual,} +\rightline{which is undoubtedly all English to you.} +} + +\bugonpage A141, line 15 from the bottom (10/18/90) + +\tenpoint\noindent +Thus if you type `|$1\over2$|' (in a text) you get $1\over2$, namely style +$S$ over style~$S'$;\cutpar + +\bugonpage A156, line 2 (11/18/89) + +\ninepoint +Commands like |\mathchardef\alpha="010B| are used in +Appendix~B to define\cutpar + +\bugonpage A165, lines 2--3 (8/13/90) + +\ninepoint + Type the formula $\bf\bar x^{\rm T}Mx={\rm0}\iff x=0$, +using as few keystrokes as possible. +\ (The first `0' is roman, the second is bold. The superscript `T' is roman.) + +\bugonpage A171, lines 24--26 (3/13/90) + +\ninepoint\noindent +formula produces a result exactly equivalent to +`|\left(|\<subformula>|\right)|', when the \<subformula> doesn't end +with Punct, except that the {delimiters} are forced to +be of the |\big| size regardless of the height and depth of the subformula. + +\bugonpage A193, lines 16--18 (12/2/89) + +\ninepoint\noindent +line if you insert +`^|\noalign||{|^|\break||}|' +after the |\cr| for that line. You can prohibit {\sl all\/} breaks +in an |\eqalignno| if you set ^|\interdisplaylinepenalty||=10000|; or you +can enclose the whole works in a ^|\vbox|: + +\bugonpage A233, bottom 9 lines, and top three on next page (12/2/89) + +\danger The |\+| macro in Appendix~B works +by putting the \<text> for each column that's followed by~|&| +into an hbox as follows: +\begindisplay +|\hbox to |\<column width>|{|\<text>|\hss}| +\enddisplay +The ^|\hss| means that the text is normally flush left, and that it can +extend to the right of its box. Since |\hfill| is ``more infinite'' than +|\hss| in its ability to stretch, it has the effect of right-justifying or +centering as stated above. Note that |\hfill| doesn't shrink, but |\hss| +does; if the text doesn't fit in its column, it will stick out at the right. +You could cancel the shrinkability of |\hss| by adding ^|\hfilneg|; then +an oversize text would produce an overfull box. +You could also center some text by putting `|\hss|' before it and just +`|&|' after it; in that case the text would be allowed to extend to the +left and right of its column. + The last column of a |\+|~line (i.e., the column entry that is +followed by |\cr|) is treated differently: The +\<text> is simply put into an hbox with its natural~width.\looseness=-1 + +\bugonpage A254, line 5 from the bottom (10/5/89) + +\ninepoint\noindent +|\vsize| hasn't changed, and if all insertions have been +held in place, the same page break\cutpar + +\bugonpage A286, lines 30--32 (3/13/90) + +\ninepoint\noindent +reading and expanding this \cstok{par} +token, \TeX\ will see the \<vertical command> token again. \ (The current +meaning of the control sequence ^|\par| will be used; \cstok{par} might no +longer stand for \TeX's |\par| primitive.) + +\bugonpage A290, lines 12--13 (3/24/90) + +\ninepoint\noindent +simply a single Ord atom without subscripts or superscripts, +or an Acc whose nucleus is an Ord, the +enclosing braces are effectively removed. + +\bugonpage A317, line 17 (5/17/90) + +\ninepoint +|\pretolerance=9999 \tolerance=9999 \parindent=0pt| + +\bugonpage A321, lines 16--17 (8/13/90) + +\ninepoint\noindent +\hbox to\parindent{\bf\hss18.6.\enspace}\ignorespaces +|$\bf\bar x^{\rm T}Mx={\rm0}\iff x=0$|. \ (If you typed a space between +|\rm| and~|0|, you wasted a keystroke; but don't feel guilty about it.) + +\bugonpage A340, nonblank line 11 (3/13/90) + +\tenpoint\noindent +|\topglue 1in % This makes an inch of blank space (1in=2.54cm).| + +\bugonpage A342, line 6 (3/13/90) + +\tenpoint\noindent +|\topglue| but not |\hglue|. It does not +illustrate |\raggedright| setting of para-\cutpar + +\bugonpage A346, lines 20--21 (12/3/89) + +\ninepoint\noindent +streams used by ^|\read| and ^|\write|, to math +^{families} used by ^|\fam|, to sets of hyphenation rules used by +^|\language|, and to insertions (which require +^|\box|, ^|\count|, ^|\dimen|, and ^|\skip| registers all having the +same number). + +\bugonpage A346, line 20 from the bottom (12/3/89) + +\ninepoint\noindent +manent value. These macros use registers +|\count10| through |\count20| to hold the\cutpar + +\bugonpage A346, lines 8--13 from the bottom (12/3/89) + +\ninepoint\noindent +number was allocated. The inside story of how allocation is actually performed +should be irrelevant when the allocation macros are used at a higher level; +you mustn't assume that |plain.tex| really does allocation in any +particular way. +\beginlines +|\count10=22 % this counter allocates \count registers 23, 24, 25, ...| +\endgroup + +\bugonpage A347, lines 2--5 (12/3/89) + +\ninepoint{\parindent=0pt +|\count19=0 % this counter allocates language codes 1, 2, 3, ...|\parbreak +|\count20=255 % this counter allocates insertions 254, 253, 252, ...|\parbreak +|\countdef\insc@unt=20 % nickname for the insertion counter|\parbreak +|\countdef\allocationnumber=21 % the most recent allocation|\parbreak +|\countdef|^|\m@ne||=22 \m@ne=-1 % a handy constant|\par} + +\bugonpage A347, new line after former line 17 (12/3/89) + +\ninepoint\noindent +|\outer\def|^|\newlanguage||{\alloc@9\language\chardef\@cclvi}| + +\bugonpage A352, new line before line 6 from the bottom (3/13/90) + +\ninepoint\noindent +|\def\topglue{\nointerlineskip \vglue-\topskip \vglue} % for top of page| + +\bugonpage A355, line 8 from the bottom (12/3/89) + +\ninepoint\noindent +| \noindent{\bf#1.\enspace}{\sl#2\par}%| + +\bugonpage A363, lines 8--9 from the bottom (12/8/89) + +{\ninepoint\parindent=0pt +| \if@mid \dimen@=\ht0 \advance\dimen@ by\dp\z@ |% + |\advance\dimen@ by12\p@|\parbreak% +| \advance\dimen@ by\pagetotal \advance\dimen@ by-\pageshrink| +\par} + +\bugonpage A375, line 27 (10/30/89) + +\ninepoint\noindent +depending on whether or not |\t|~contains +an asterisk. \ (Do you see why?) \ And here's\cutpar + +\bugonpage A393, lines 3--5 from the bottom (12/3/89) + +\ninepoint +|\hskip-.17em plus-3em minus.11em|\par +|\vadjust{}\penalty10000|\par +|\leaders\copy\dbox\hskip3.3\wd\dbox plus1fil minus.3\wd\dbox| + +\bugonpage A444, line 4 (3/13/90) + +\ninepoint\noindent +Shift box~$x$ down by ${1\over2}\bigl(h(x)-d(x)\bigr) +-a$, where $a=\sigma_{22}$, so that the operator character\cutpar + +\bugonpage A450, line 8 (12/3/89) + +\def\\#1{$_{\kern\scriptspace#1}$} +\ninepoint\indent +{\qquad\tt\\0h\\0e\\0n\\5a\\0t\\0 \\1n\\0a\\0 \\0n\\2a\\0t\\0 + \\1t\\0i\\0o\\0 \\2i\\0o\\0 \\0o\\2n\\0} + +\bugonpage A450, line 14 (12/3/89) + +\ninepoint +{\tt.\\0h\\0y$_3$p\\0h\\0e\\2n\\5a\\4t\\2i\\0o\\2n\\0.} + +\bugonpage A450, lines 19 and 20 (12/3/89) + +\ninepoint\vskip-10pt +\begindisplay +\tt\\0o\\2n\\0 +\\0o\\0n\\1c\\0 +\\1c\\0a\\0 +\\1n\\0a\\0 +\\0n\\2a\\0t\\0 +\\1t\\0i\\0o\\0 +\\2i\\0o\\0 +\\0o\\2n\\0 +\enddisplay +and this yields `{\tt\\0c\\0o\\2n\\1c\\0a\\0t\\0e\\1n\\2a\\1t\\2i\\0o\\2n\\0}', +i.e., `|con-cate-na-tion|'. + +\bugonpage A455, last lines before the quotes (11/30/89) + +\ninepoint\noindent +sit yourself (even in restricted horizontal mode) by saying +^|\setlanguage|\<number>;\break + this changes the current language but it +does not change |\language|. Each what-\break +sit records the current +|\lefthyphenmin| and |\righthyphenmin|. + +\bugonpage A467, right column (12/3/89) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +|\hfilneg|, 72, 100, 233, 283, 285, 290, 397. + +\bugonpage A468, right column (12/2/89) + +\eightpoint +|\interdisplaylinepenalty|, {\it193}, 349, 362. + +\bugonpage A469, left column (12/3/89) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +|\language| (hyphenation method), 273, 346, $\underline{455}$. + +\bugonpage A469, right column (10/30/89) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +|\lefthyphenmin|, 273, {\it364}, $\underline{454}$, 455. + +\bugonpage A472, left column (12/3/89) + +\eightpoint +|\newlanguage|, 346, $\underline{347}$. + +\bugonpage A476, left column (10/30/89) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +|\righthyphenmin|, 273, {\it364}, $\underline{454}$, 455. + +\bugonpage A479, new entry (3/13/90) + +\eightpoint +|\topglue|, {\it340}, $\underline{352}$. + +\bugonpage A480, right column (3/13/90) + +\eightpoint +|\vglue|, $\underline{352}$, {\it408}. + +\bugonpage A483, the Providence lines (10/8/89) + +\noindent[Change the first one to +\begintt +Providence RI 02940\kern.05em-9506, USA. +\endtt +Then the second one will be +\begindisplay +Providence RI 02940\kern.05em-9506, USA. +\enddisplay +The second line will also appear on page C361.] + +% volume B +\hsize=35pc +\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers +\def\to{\mathrel{.\,.}} % double dot, used only in math mode + + +% volume C +\hsize=29pc +\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers + +\bugonpage C11, replacement for second quotation at bottom of page (9/27/90) + +\begingroup + \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\par{\ifhmode\/\endgraf\fi}\obeylines +To anyone who has lived in a modern American city (except Boston) +at least one of the underlying ideas of ^{Descartes}' analytic geometry +will seem ridiculously evident. Yet, as remarked, +it took mathematicians all of two thousand years +to arrive at this simple thing. +\author ERIC TEMPLE ^{BELL}, {\sl Mathematics: Queen and Servant of % + Science\/} (1951) % p123 + +\endgroup + +\bugonpage C220, top line (3/13/90) + +\ninepoint\noindent +modes you get into by hitting +`|S|', `|R|', or `|Q|', respectively, in response to error messages\cutpar + +\bugonpage C252, line 16 (3/13/90) + +\ninepoint\indent +| for i:=1 upto n_windows: display blankpicture inwindow i; endfor| + +\bugonpage C262, lines 19--21 (11/9/90) + +\ninepoint\noindent +for commonly occurring idioms. +For example, `{\bf stop} |"hello"|' displays `|hello|' on the terminal and waits +until \<return> is typed. +\beginlines +|def |^|upto|| = step 1 until enddef; def |^|downto|| = step -1 until enddef;| +\endgroup + +\bugonpage C264, lines 4--6 from the bottom (3/24/90) + +\ninepoint\noindent +|vardef |^|counterclockwise|| primary c =|\par\noindent +| if turningcheck>0:|\par\noindent +| interim |^|autorounding||:=0;|\par\noindent +| if |^|turningnumber|| c <= 0: reverse fi fi c enddef;| + +\bugonpage C306, line 6 (3/13/90) + +\ninepoint\noindent +| ligtable "'": "'" =: oct"042", % close quotes| + +\bugonpage C309, second line from bottom (11/18/89) + +\ninepoint\noindent +| define_whole_vertical_blacker_pixels(vair,slab,| $\cdots$ |);| + +\bugonpage C315, line 9 from the bottom (1/2/90) + +\ninepoint\noindent +units of printer's points): + +\bugonpage C329, line 25 (12/29/90) + +\ninepoint\noindent +which can be used to specify a nonstandard file area +or directory name for the gray\cutpar + +\bugonpage C337, line 4 from the bottom (1/7/90) + +\ninepoint\noindent +|\def\startfont{\font\testfont=\fontname \spaceskip=0pt| + +\bugonpage C347, left column (9/27/90) + +\eightpoint\noindent +Bell, Eric Temple, 11. + +\bugonpage C349, left column (9/27/90) + +\eightpoint\noindent +Descartes, Ren\'e, 6, 11, 19. + +\bugonpage C356, right column (9/27/90) + +\eightpoint\noindent +[remove the entry for Rex Stout.] + +\bugonpage C358, right column (9/27/90) + +\eightpoint\noindent +[remove the entry for Nero Wolfe.] + +% Volume D +\hsize=35pc +\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers +\def\to{\mathrel{.\,.}} % double dot, used only in math mode + +% volume E +\hsize=29pc +\def\dashto{\mathrel{\hbox{-\kern-.05em}\mkern3.9mu\hbox{-\kern-.05em}}} + +\bugonpage Exiii, replacement for last four lines (4/30/90) + +\textindent{\bull}``AMS Euler---A new typeface for mathematics'' + by Donald~E. Knuth +and Hermann Zapf, {\sl Scholarly Publishing\/ \bf21} (1989), 131--157. +\ {\it The story of a design project that helps bridge the gulf between +mathematics and art.} + +\smallskip +\textindent{\bull}``Meta-Marks: + Preliminary studies for a Pandora's Box of shapes'' +by Neenie Billawala, Stanford Computer Science report 1259 (Stanford, +California, July 1989), 132~pp. +\ {\it Lavishly illus\-trated studies in parameter variation, +leading to the design of a new typeface called Pandora.} + + + +\bugonpage E325, line 13 (3/13/90) + +\ninepoint\noindent +{\bf if} \\{serifs}: $x_{3r}=\max(x_{1r},{\rm hround}(x_1+.5\\{dot\_diam} + -.2\\{jut})-.5\\{tiny})$\par\noindent +{\bf else}: $x_3=x_1-.5$ {\bf fi}; + +\bugonpage E483, line 4 (3/13/90) + +\ninepoint +\rightline{\% Character codes \oct{000}--\oct{100} and \oct{133}--\oct{177} + are generated.} + +\bugonpage E544, line 5 (3/13/90) + +\ninepoint\noindent +\hskip 3em\vdots\hskip2em\raise2pt\hbox{(the rest of the + program for `$\gamma$' in |greekl| comes here)} + +\bugonpage E557, line 9 (3/13/90) + +\ninepoint +\rightline{\sl`Nevermore---Ah nevermore.'\thinspace''} + +\bugonpage E558, line 21 (3/13/90) + +\eightpoint\noindent +|Clasp a rare and radiant maiden whom the angels name Lenore."| + +\bugonpage E570, lines 27--28 look better with proper skewchars (3/13/90) + +\begingroup +\tenpoint\bf +\textfont0=\tenbf \scriptfont0=\sevenbf +\font\boldi=cmmib10 \font\boldsy=cmbsy10 +\skewchar\boldi='177 \skewchar\boldsy='60 +\textfont1=\boldi +\textfont2=\boldsy +\noindent Here's some bold 10-point math: +${\hat A}^\Gamma_0 ++{\check B}^\Delta_1 +-{\tilde C}^\Theta_2 +\times{\acute D}^\Lambda_3 +/{\grave E}^\Xi_4 +\oplus{\dot F}^\Pi_5 +\ominus{\ddot G}^\Sigma_6 +\otimes{\breve H}^\Phi_7 +\oslash{\bar I}^\Psi_8 +\odot{\vec J}^{\,\Omega}_9$. +\endgroup + +\bye + diff --git a/Master/texmf-dist/source/generic/knuth/errata/errata.ten b/Master/texmf-dist/source/generic/knuth/errata/errata.ten new file mode 100644 index 00000000000..9efa2a3e503 --- /dev/null +++ b/Master/texmf-dist/source/generic/knuth/errata/errata.ten @@ -0,0 +1,1289 @@ +% Bugs (sigh) in Computers \& Typesetting + +\input manmac +\def\curl{\mathop{\rm curl}} +\def\cycle{{\rm cycle}}\indent +\def\dashto{\mathrel{\hbox{-\thinspace-\kern-.05em}}} +\font\sltt=cmsltt10 +\font\niness=cmss9 +\font\ninessi=cmssi9 +\proofmodefalse +\raggedbottom +\output{\hsize=29pc \onepageout{\unvbox255\kern-\dimen@ \vfil}} + +\def\today{\number\day\ + \ifcase\month\or + Jan\or Feb\or Mar\or Apr\or May\or Jun\or + Jul\or Aug\or Sep\or Oct\or Nov\or Dec\fi + \ \number\year} + +\def\cutpar{{\parfillskip=0pt\par}} + +\def\rhead{Bugs in {\tensl Computers \& Typesetting, 2000}} +\def\bugonpage#1(#2) \par{\bigbreak\tenpoint + \hrule width\hsize + \line{\lower3.5pt\vbox to13pt{}Page #1\hfil(#2)}\hrule width\hsize + \nobreak\medskip} +\def\buginvol#1(#2) \par{\bigbreak\penalty-1000\tenpoint + \hrule width\hsize + \line{\lower3.5pt\vbox to13pt{}Volume #1\hfil(#2)}\hrule width\hsize + \nobreak\medskip} +\def\slMF{{\manual 89:;}\-{\manual <=>:}} % slant the logo +\def\0{\raise.7ex\hbox{$\scriptstyle\#$}} +\newcount\nn +\newdimen\nsize \newdimen\msize \newdimen\ninept \ninept=9pt +\newbox\eqbox \setbox\eqbox=\hbox{\kern2pt\eightrm=\kern2pt} + +\tenpoint +\noindent This is a list of all substantial corrections made to {\sl Computers +\& Typesetting\/} from the mid-1990s until the first ``Millennium edition'' was +published at the end of the year 2000. +Corrections made to the softcover version of {\sl The \TeX book\/} are +the same as corrections to Volume~A\null. Corrections to the softcover +version of {\sl The \slMF\kern1ptbook\/} are the same as corrections +to Volume~C\null. Changes to the mini-indexes +and master indexes of Volumes B, D, and~E are not shown here unless they are +not obviously derivable from what has been shown. +\looseness=-1 + +% volume A + +\bugonpage A3, line 14 {(in certain printings only)} (9/6/00) + +\tenpoint\noindent +that +looks like {\tt\char'15} or {\tt\char'23}. + +\bugonpage A8, lines 14 and 15 (9/6/00) + +\tenpoint\noindent +that is not to be ignored. Notice that |\|\] is a control +sequence of the second kind, namely a control symbol, since there is a +single nonletter (\]) following\cutpar + +\bugonpage A43, line $-17$ (8/4/98) + +\tenpoint\noindent +into your manuscript, if the |b|-key on your keyboard is broken. \ +(An optional\cutpar + +\bugonpage A88, lines 14, 16, 18, and 21 (8/12/00) + +\tenpoint\noindent +[Insert two blank spaces between `{\tt blank space}' and `{\tt\char`\}}'] + +\bugonpage A96, lines 9 and 10 (8/6/98) + +\ninepoint\indent +Before 1998, some ^{German} words changed their spelling +when split between lines. For example, `backen' became `bak-ken' +and `Bettuch' sometimes became `Bett-\cutpar + +\bugonpage A107, line 2 (8/5/98) + +\ninepoint +\line{\indent\spaceskip=.4em minus.35em +ually, you might be tempted to set +|\tolerance=10000|; this allows arbitrarily bad} + +\bugonpage A115, line $-19$ (8/5/98) + +\ninepoint\noindent +If there's no room for such an insertion on this page, \TeX\ +will insert it at the top of\cutpar + +\bugonpage A119, line 15 (8/5/98) + +\ninepoint\noindent +of\/ |\dimen3|, assuming that |\dimen3| is positive. + +\bugonpage A182, middle line of the displayed commutative diagram (12/3/99) + +\ninepoint +\def\mapright#1{\smash{ + \mathop{\longrightarrow}\limits^{#1}}} +$$\matrix{ + 0&\mapright{}&{\cal O}_C&\mapright\pi& + \pi_*{\cal O}_D&\mapright\delta& + R^1f_*{\cal O}_V(-D)&\mapright{}&0\cr}$$ + +\bugonpage A233, line $-2$ (8/5/98) + +\ninepoint\noindent +could avoid this by adding |\hskip| |0pt| |minus-1fil|; then +an oversize text would\cutpar + +\bugonpage A277, line 1 (8/5/98) + +\ninepoint\indent +\<code assignment>\is\<codename>\<8-bit number>\<equals>\<number> + +\bugonpage A277, line $-11$ (8/5/98) + +\ninepoint\noindent +[Move this line, which defines \<at clause>, up to the top of the page.] + +\bugonpage A289, line 24 (2/3/97) + +\ninepoint\indent +\<math field>\is\<filler>\<math symbol>\alt\<filler>|{|\<math mode material>|}| + +\bugonpage A309, line 3 (8/12/97) + +\ninepoint +\ansno8.4: +|$|$_{3}$ |x|$_{11}$ |^|$_7$ |2|$_{12}$ |$|$_{3}$ |~|$_{13}$ \]$_{10}$ +\cstok{TeX} |b|$_{11}$ |v|$_{11}$ \]$_{10}$. The final space comes from +the\cutpar + +\bugonpage A313, line 24 (9/19/00) + +\ninepoint\noindent +stands for `|\par\vfill...|', so the next three commands are + +\bugonpage A313, line 27 (9/19/00) + +\ninepoint\indent +|{vertical mode: \par}| + +\bugonpage A318, lines 12 and 13 (8/5/98) + +\ninepoint\noindent\hbox to\parindent{\hfil\bf15.8.\enspace}% +|\advance\dimen2 by\ifnum\dimen2<0 -\fi.5\dimen3|\parbreak +|\divide\dimen2 by\dimen3 \multiply\dimen2 by\dimen3| + +\bugonpage A325, line 22 (12/3/99) + +\ninepoint +| 0&\mapright{}&{\cal O}_C&\mapright\pi&| + +\bugonpage A337, line 3 from the bottom (9/6/00) + +\rightline{\eightss DONALD E. KNUTH, {\eightssi The \TeX book\/} (1984)} + +\bugonpage A348, lines 14--16 (8/6/98) + +\ninepoint\noindent +| \def\@if#1{true}{\let#1=\iftrue}%|\par\noindent +| \expandafter\expandafter\expandafter|\par\noindent +| \def\@if#1{false}{\let#1=\iffalse}%|\par\noindent + +\bugonpage A356, line 21 (8/6/98) + +\ninepoint\noindent +|\def\AA{\leavevmode\setbox0=\hbox{!}\dimen@=\ht0 \advance\dimen@ by-1ex| + +\bugonpage A356, lines 9--21 from the bottom (8/6/98) + +\ninepoint +{\parindent=0pt +|\def\S{\mathhexbox278} \def\P{\mathhexbox27B} \def\Orb{\mathhexbox20D}|\par +\smallskip +|\def\oalign#1{\leavevmode\vtop{\baselineskip0pt \lineskip.25ex|\par +| \ialign{##\crcr#1\crcr}}} \def\o@lign{\lineskiplimit=0pt \oalign}|\par +|\def\ooalign{\lineskiplimit=-\maxdimen \oalign} % chars over each other|\par +|{\catcode`p=12 \catcode`t=12 \gdef\\#1pt{#1}} \let\getf@ctor=\\|\par +|\def\sh@ft#1{\dimen@=#1 \kern\expandafter\getf@ctor\the\fontdimen1\font|\par +| \dimen@} % kern by #1 times the current slant|\par +|\def\d#1{{\o@lign{\relax#1\crcr\hidewidth\sh@ft{-1ex}.\hidewidth}}}|\par +|\def\b#1{{\o@lign{\relax#1\crcr\hidewidth\sh@ft{-3ex}%|\par +| \vbox to.2ex{\hbox{\char'26}\vss}\hidewidth}}}|\par +|\def\c#1{{\setbox0=\hbox{#1}\ifdim\ht0=1ex \accent'30 #1%|\par +| \else\ooalign{\unhbox0\crcr\hidewidth\char'30\hidewidth}\fi}}|\par +|\def\copyright{{\ooalign{\hfil\raise.07ex\hbox{c}\hfil\crcr\Orb}}}|\par +} + +\bugonpage A364, line 9 (8/9/98) + +\ninepoint\noindent +|\def\makefootline{\baselineskip=24pt \lineskiplimit=0pt|\par\noindent +| \line{\the\footline}}| + + +\bugonpage A364, line 4 from the bottom (8/6/98) + +\ninepoint\noindent +|\def\fmtversion{3.1415926} % identifies the current format| + +\bugonpage A447, bottom line (6/3/98) + +\rightline{\eightss--- JOHN SMITH, {\eightssi The Printer's Grammar\/}\enspace + (1755)} + +\bugonpage A450, lines 11--13 (4/12/98) + +\def\\#1{$_{\kern\scriptspace#1}$}% +\tenpoint\noindent +between `|e|' and `|n|' there are five relevant values +in this case (2~from {\tt\\0h\\0e\\2n\\0}, +0~from {\tt\\0h\\0e\\0n\\0a\\4}, +0~from {\tt\\0h\\0e\\0n\\5a\\0t\\0}, +1~from {\tt\\1n\\0a\\0}, +and 0~from {\tt\\0n\\2a\\0t\\0}); the maximum of these is~2. +The result of all the maximizations is + +\bugonpage A453, line 6 (8/5/98) + +\ninepoint\noindent +tion dictionary, except that plain \TeX\ blocks hyphens after the +very first letter or be-\cutpar + +\bugonpage A458, left column (9/6/00) + +\eightpoint +\leavevmode{\tt\rlap<\char`\_}, 45, 135, 368--369; {\sl see also\/} |\le|.\par +\leavevmode{\tt\rlap/=}, 45, 135, 368--369; {\sl see also\/} |\ne|.\par +\leavevmode{\tt\rlap>\char`\_}, 45, 135, 368--369; {\sl see also\/} |\ge|. + +\bugonpage A458, right column (7/5/99) + +\eightpoint +{\tt\char'13} and {\tt\char'14}, 135, 343, 368--369, 429;\par +al-Khw\^arizm\^\i, abu `Abd All\^ah Mu\d{h}ammad ibn M\^us\^a, 53. + +\bugonpage A464, right column (8/6/98) + +\eightpoint +\newbox\astbox \setbox\astbox=\hbox to0pt{\hss\lower1pt\hbox{*}} +\def\prim#1{\par\indent\copy\astbox{\tt\char`\\#1}} +\prim{edef}, {\it215--216}, 275, {\it328}, {\it373--374}. + +\bugonpage A466, right column (8/8/98) + +\eightpoint +|\getfactor|, {\it356}, $\underline{375}$, {\it398}. + +\bugonpage A467, right column (8/5/98) + +\eightpoint +\prim{hfilneg}, 72, 100, 283, 285, 290, 397. + +\bugonpage A469, left column (8/5/98) + +\eightpoint +italic type, 13--14, 100, 127, 165, 409, 428, 430. + +\bugonpage A469--A477, passim (5/13/98) + +\eightpoint\noindent +Add page 272 to the index entries for |\lastskip|, |\pagedepth|, +|\pagefilllstretch|,\hfil\break |\pagefillstretch|, |\pagefilstretch|, +|\pagegoal|, |\pageshrink|, |\pagestretch|, |\pagetotal|,\hfil\break +|\parshape|, |\prevdepth|, and |\spacefactor|.\par +\smallskip\noindent Also change `369' to `370' in the index entries for +|\lbrack|, |\lq|, |\rbrack|, |\rq|, |\sb|, and |\sp|.\par +\smallskip\noindent Also change `Luckombe, Philip' to `Smith, John'.\par + +\bugonpage A472, right column (8/6/98) + +\eightpoint +\prim{noexpand}, $\underline{209}$, $\underline{213}$, 215, 216, + {\it377}, {\it424}. + +\bugonpage A473, left column (8/6/98) + +\eightpoint +|\Orb| ( \Orb\ ), $\underline{356}$. + +% volume B +\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers +\def\to{\mathrel{.\,.}} % double dot, used only in math mode + +\bugonpage Bix, line 16 (1/16/00) + +\tenpoint\textindent{\bull}``Word hy-phen-a-tion by com-put-er'' +by Franklin Mark Liang, Stan-\cutpar + +\bugonpage Bxiv, line 13 (4/19/96) + +\tenpoint\noindent preprocessor converts these into numeric constants that are +256 or more. This\cutpar + +\bugonpage Bxiv, line $-1$ (4/19/96) + +\ninepoint\noindent This file contains one line per string, starting with +string number 256, then number 257,\cutpar + +\bugonpage Bxv, lines 10 and 11 (4/19/96) + +\ninepoint\noindent +In this case, occurrences of |""| in the |WEB| program will be replaced by +256; occurrences of |"This longer string"| will be replaced by 257. +The symbol |@$| stands for the numeric\cutpar + +\hsize=35pc +\bugonpage B2, line $-10$ (3/8/95) + +\def\RQ/{{\char'23}} % right quote in a string +\ninepoint\noindent\quad +{\bf define} $\\{banner}\equiv\hbox{\tt\RQ/This\]is\]TeX,\]% + Version\]3.14159\RQ/}$\quad$\{\,$printed when \TeX\ starts$\,\}$ + +\bugonpage B169, line 13 (9/22/95) + +\tenpoint\noindent +something in a ``muskip'' register, or to one of the +three parameters \hbox{\tt\char`\\thinmuskip}, +\hbox{\tt\char`\\medmuskip},\cutpar + +\bugonpage B221, line 9 (3/4/95) + +\ninepoint\noindent +\quad{\bf define} $\\{non\_address}=0$\quad +$\{\,$a spurious \\{bchar\_label}$\,\}$ + +\bugonpage B221, line 17 (3/4/95) + +\ninepoint\noindent +\\{font\_params}: {\bf array}[\\{internal\_font\_number}] {\bf of} + \\{font\_index};\quad$\{\,$how many font parameters are present$\,\}$ + +\bugonpage B256, insert new line 12 before the bottom (3/7/95) + +\ninepoint\noindent\qquad +\\{glue\_temp}: \\{real};\quad $\{\,$glue value before rounding$\,\}$ + +\bugonpage B258, line 11 before the bottom becomes four lines (3/7/95) + +\ninepoint\noindent +{\tenbf 625.}\quad{\bf define} $\\{billion}\equiv + \\{float\_constant}(1000000000)$\par\noindent +{\bf define} $\\{vet\_glue}(\hbox{\tt\char`\#})\equiv + \\{glue\_temp}\gets\hbox{\tt\char`\#}$;\par\noindent +\qquad{\bf if\/} $\\{glue\_temp}>\\{billion}$ + {\bf then} $\\{glue\_temp}\gets\\{billion}$\par\noindent +\qquad{\bf else if\/} $\\{glue\_temp}<-\\{billion}$ + {\bf then} $\\{glue\_temp}\gets-\\{billion}$\smallskip\noindent +$\langle\,$Move right or output leaders{\sevenrm\kern.5em625}$\,\rangle\equiv$ + +\bugonpage B258, lines 3--6 from the bottom (3/7/95) + +\ninepoint\noindent +\qquad\qquad{\bf begin} $\\{vet\_glue}(\\{float}(\\{glue\_set} + (\\{this\_box}))*\\{stretch}(g))$;\par\noindent +\qquad\qquad$\\{rule\_wd}\gets\\{rule\_wd}+ + \\{round}(\\{glue\_temp})$;\par\noindent +\qquad\qquad{\bf end};\par\noindent +\qquad\quad{\bf end}\par\noindent +\qquad{\bf else if\/} $\\{shrink\_order}(g)=\\{g\_order}$ + {\bf then}\par\noindent +\qquad\quad{\bf begin} $\\{vet\_glue}(\\{float}(\\{glue\_set} + (\\{this\_box}))*\\{shrink}(g))$;\par\noindent +\qquad\quad$\\{rule\_wd}\gets\\{rule\_wd}-\\{round}(\\{glue\_temp})$; + +\bugonpage B260, line 13 from the bottom (6/26/93) + +\ninepoint +\noindent\hskip10pt +$\\{doing\_leaders}\gets\\{outer\_doing\_leaders}$; \ +$\\{dvi\_v}\gets\\{save\_v}$; \ +$\\{dvi\_h}\gets\\{save\_h}$; \ +$\\{cur\_v}\gets\\{base\_line}$; + +\bugonpage B261, insert new line after line 7 (3/7/95) + +\ninepoint\noindent\qquad +\\{glue\_temp}: \\{real};\quad $\{\,$glue value before rounding$\,\}$ + +\bugonpage B262, lines 3--6 from the bottom (3/7/95) + +\ninepoint\noindent +\qquad\qquad{\bf begin} $\\{vet\_glue}(\\{float}(\\{glue\_set} + (\\{this\_box}))*\\{stretch}(g))$;\par\noindent +\qquad\qquad$\\{rule\_ht}\gets\\{rule\_ht}+ + \\{round}(\\{glue\_temp})$;\par\noindent +\qquad\qquad{\bf end};\par\noindent +\qquad\quad{\bf end}\par\noindent +\qquad{\bf else if\/} $\\{shrink\_order}(g)=\\{g\_order}$ + {\bf then}\par\noindent +\qquad\quad{\bf begin} $\\{vet\_glue}(\\{float}(\\{glue\_set} + (\\{this\_box}))*\\{shrink}(g))$;\par\noindent +\qquad\quad$\\{rule\_ht}\gets\\{rule\_ht}-\\{round}(\\{glue\_temp})$; + +\bugonpage B264, line 22 (6/26/93) + +\ninepoint +\noindent\hskip10pt +$\\{doing\_leaders}\gets\\{outer\_doing\_leaders}$; \ +$\\{dvi\_v}\gets\\{save\_v}$; \ +$\\{dvi\_h}\gets\\{save\_h}$; \ +$\\{cur\_h}\gets\\{left\_edge}$; + +\bugonpage B297, line 11 (3/7/95) + +\ninepoint\noindent +\qquad $\\{width}(p)\gets\\{mu\_mult}(\\{width}(p))$; \ + $\\{subtype}(p)\gets\\{explicit}$; + +\bugonpage B309, line 7 (9/22/95) + +\ninepoint\noindent +\qquad {\bf if} $\\{cur\_style}<\\{text\_style}$ {\bf then} + \quad$\{\,$display style$\,\}$ + +\bugonpage B356, line $-5$ (3/4/95) + +\tenpoint\noindent +$\\{hang\_after}=1$, and $\\{hang\_indent}=0$. +Note that if $\\{hang\_indent}=0$, the value of $\\{hang\_after}$ is\cutpar + +\bugonpage B388, bottom line (3/4/95) + +\ninepoint\noindent +\quad {\bf if\/} $\\{bchar\_label}[\\{hf}]\ne\\{non\_address}$ {\bf then}\quad + $\{\,$put left boundary at beginning of new line$\,\}$ + +\bugonpage B406, line 10 (5/1/98) + +\ninepoint\noindent +\qquad$q\gets p$;\quad$\{\,$now node $q$ represents $p_1\ldots p_{l-1}\,\}$ + +\bugonpage B503, line 12 (3/4/95) + +\tenpoint\noindent +of the following procedure. (Exception: The tabskip +glue isn't trapped while preambles are being scanned.) + +\bugonpage B529, line 12 (3/4/95) + +\ninepoint\noindent\quad +\\{undump}(0)($\\{fmem\_ptr}-1$)(\\{bchar\_label}[$k$]);\par\noindent\quad +\\{undump}(\\{min\_quarterword})(\\{non\_char})(\\{font\_bchar}[$k$]); + +\bugonpage B531, line 2 (11/23/98) + +\tenpoint\noindent +from appearing again. + +\bugonpage B531, line 14 (11/23/98) + +\ninepoint\noindent +\quad \\{print\_int}(\\{year}); \ \\{print\_char}(|"."|); \ + \\{print\_int}(\\{month}); \ \\{print\_char}(|"."|); \ + \\{print\_int}(\\{day}); + +\bugonpage B534, insert new material between lines $-16$ and $-15$ (3/20/95) + +\ninepoint\noindent +\quad {\bf while} $\\{input\_ptr}>0$ {\bf do}\par\noindent +\qquad {\bf if\/} $\\{state}=\\{token\_list}$ {\bf then} \\{end\_token\_list} + {\bf else} \\{end\_file\_reading}; + +\bugonpage B534, line $-2$ (3/20/95) + +\ninepoint\noindent +\qquad $\\{temp\_ptr}\gets\\{cond\_ptr}$; \ + $\\{cond\_ptr}\gets\\{link}(\\{cond\_ptr})$; \ + $\\{free\_node}(\\{temp\_ptr},\\{if\_node\_size})$; + +\bugonpage B535, line 9 (3/20/95) + +\ninepoint\noindent +\qquad {\bf begin init for} $c\gets\\{top\_mark\_code}$ {\bf to} + \\{split\_bot\_mark\_code} {\bf do}\par\noindent +\qquad\qquad {\bf if\/} $\\{cur\_mark}[c]\ne\\{null}$ {\bf then} + $\\{delete\_token\_ref}(\\{cur\_mark}[c])$;\par\noindent +\qquad\quad \\{store\_fmt\_file}; \ {\bf return}; \ {\bf tini} + +\bugonpage B581, Zabala entry (8/19/00) + +\eightpoint\noindent +Zabala Salelles, Ignacio Andr\'es:\quad 2. + +% volume C +\hsize=29pc +\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers + +\bugonpage C17, lines 12 and 13 (9/6/00) + +\tenpoint +{\bf draw} $z_4\{\curl0\}\to z_2\{z_3-z_4\}\to\{\curl0\}\,z_3$;\par +{\bf draw} $z_4\{\curl2\}\to z_2\{z_3-z_4\}\to\{\curl2\}\,z_3$ + +\bugonpage C23, line $-7$ (8/5/98) + +\ninepoint\indent +$x_1=ss=w-x_5$;\quad$y_3-y_1=\\{ygap}$ + +\bugonpage C69, line 17 (9/6/00) + +\ninepoint\noindent +|"abra"|, while +$p_1$ is `$(0,0)\to(3,3)$' and $p_2$ is `$(0,0)\to(3,3)\to\cycle$'. + +\bugonpage C94, line $-11$ (3/4/95) + +\ninepoint\noindent +put +are assumed to have square pixels. But if, for +example, the {\bf mode\_def} sets\cutpar + +\bugonpage C107, line 15 (3/4/95) + +\ninepoint +{\bf labels}$(1a,1b,2a,2b,3a,3b,4a,4b,\,${\bf range} 1 {\bf thru} 36); + \ {\bf endchar\/}; + +\bugonpage C123, lines 21 and 22 (12/19/95) + +\chardef\circc=34 % rotated quartercircle +\def\chapno{ 14} \exno=2 % for exercise 14.3! +\dangerexercise +Use a {\sl rotated\/} quarter-circle to produce `{\manual\circc}\kern1pt' +in font position `{\tt c}'. + +\bugonpage C129, lines 6--17 (8/5/98) + +\ninepoint +\beginsyntax +<path primary>\is<pair primary>\alt<path variable> + \alt[(]<path expression>[)] + \alt[reverse]<path primary> + \alt[subpath]<pair expression>[of]<path primary> +<path secondary>\is<pair secondary>\alt<path primary> + \alt<path secondary><transformer> +<path tertiary>\is<pair tertiary>\alt<path secondary> +<path expression>\is<pair expression>\alt<path tertiary> + \alt<path subexpression><direction specifier> + \alt<path subexpression><path join>[cycle] +<path subexpression>\is<path expression> + \alt<path subexpression><path join><path tertiary> +\endsyntax + +\bugonpage C134, line 8 (3/4/95) + +\ninepoint\noindent +of~$p$; if $t\le 0$, precontrol~$t$ of~$p$ is~$z_0$. +In particular, if $t$ is an integer, postcontrol~$t$ of~$p$\cutpar + +\bugonpage C139, illustration (8/5/98) + +\eightpoint\noindent +[Remove the labels {\tt 2r}, {\tt 2}, and {\tt 2l} below their dots.] + +\bugonpage C143, top two lines (3/4/95) + +\danger In order to have some transform variables to work with, it's necessary +to `^{hide}' some declarations and commands before giving the next |expr|s: + +\bugonpage C147, lines 14, 16, and 19 (9/6/00) + +\noindent +[Change `{\bf savepen}' to `{\it savepen}'.] + +\bugonpage C147, line 2 from the bottom (9/6/00) + +\ninepoint\noindent +{\manual lmnj}'s {\bf penrazor} stands for +`{\bf makepen} $\bigl((-.5,0)\dashto(.5,0)\dashto \cycle\bigr)$', +and {\bf pensquare}\cutpar + +\bugonpage C171, line 19 (8/5/98) + +\ninepoint\noindent +(\<path tertiary>) and +(\<pair tertiary>). A pair expression is not considered to\cutpar + +\bugonpage C172, line 14 (8/5/98) + +\tenpoint\noindent +been evaluated and changed to numeric tokens before being +substituted for~$s$.\cutpar + +\bugonpage C175, line 23 (1/11/88) + +\ninepoint\noindent +expand into a sequence of tokens. \ +(The language {\eightrm{SIMULA67}} demonstrated that it is\cutpar + +\bugonpage C206, minor changes to lines $-19$ to $-5$ (3/4/95) + +\vbox to70mm{\ninepoint +\beginlines \advance\hsize.71pt +|Path at line 15, before subdivision into octants:| +|(1.53745,9.05345)..controls (1.53745,4.00511) and (5.75409,-0.00049)| +| ..(10.85147,-0.00049)..controls (16.2217,-0.00049) and (20.46255,4.51297)|% + \kern.5em\null +| ..(20.46255,9.94655)..controls (20.46255,14.99713) and (16.23842,19.00049)| + \kern-.71pt +| ..(11.13652,19.00049)..controls (5.77066,19.00049) and (1.53745,14.48491)|% + \kern.5em\null +| ..cycle| +\smallskip +|Cycle spec at line 15, after subdivision:| +|(1.53745,9.05345) % beginning in octant `SSE'| +| ..controls (1.53745,6.58786) and (2.54324,4.371)| +| ..(4.16621,2.74803) % segment 0| +|% entering octant `ESE'| +| ..controls (5.8663,1.04794) and (8.24362,-0.00049)| +| ..(10.85147,-0.00049) % segment 0| +|% entering octant `ENE'| +\endlines +$\ldots$ and so on; there are lots more numbers! What does this all mean? +Well, the first segment of the curve, from $(1.53745,9.05345)$ to +$(10.85147,-0.00049)$, +has been\cutpar} + +\bugonpage C207, minor changes to lines 1--23 (3/4/95) + +\ninepoint +\begingroup\let\HRULE=\hrule \def\hrule{\HRULE width\hsize} +\beginlines +|Cycle spec at line 15, after subdivision and autorounding:| +|(2,9.05348) % beginning in octant `SSE'| +| ..controls (2,6.50526) and (3.02194,4.22272)| +| ..(4.6577,2.58696) % segment 0| +|% entering octant `ESE'| +| ..controls (6.2624,0.98225) and (8.45786,0)| +| ..(10.85873,0) % segment 0| +|% entering octant `ENE'| +\endlines +Point $(1.53745,9.05345)$, where there was a vertical tangent, has been +rounded to $(2,9.05348)$; point $(10.85147,-.00049)$, where there was +\vadjust{\goodbreak}% +a horizontal tangent, has been rounded to $(10.85873,0)$; the intermediate +control points have been adjusted accordingly. \ (Rounding of $x$~coordinates +has been done separately from $y$~coordinates.) \ Finally, with +$\\{autorounding}=2$, additional adjustments are made so that the +$45^\circ$ transition point will occur at what \MF\ thinks is a good spot: +\beginlines +|Cycle spec at line 15, after subdivision and double autorounding:| +|(2,9.05348) % beginning in octant `SSE'| +| ..controls (2,6.6761) and (3.07103,4.42897)| +| ..(4.78537,2.71463) % segment 0| +|% entering octant `ESE'| +| ..controls (6.46927,1.03073) and (8.62749,0)| +| ..(10.85873,0) % segment 0| +|% entering octant `ENE'| +\endlines +(Notice that $4.78537+2.71463=7.50000$; when the slope +is~$-1$ at a transition point\cutpar +\endgroup + +\bugonpage C210, line $-7$ (8/5/98) + +\ninepoint\indent\qquad\alt\<numeric token primary> + +\bugonpage C210, line $-2$ (8/5/98) + +\ninepoint\indent\<numeric token primary>\is\<numeric token>\thinspace +{\tt/}\thinspace\<numeric token> + +\bugonpage C211, line 16 (8/5/98) + +\ninepoint\indent\qquad\alt\<numeric token primary not followed by +{\tt+} or {\tt-} or a numeric token> + +\bugonpage C213, lines 17--27 (8/5/98) + +\ninepoint +\beginsyntax +<path primary>\is<pair primary>\alt<path variable>\alt<path argument> + \alt[(]<path expression>[)] + \alt[begingroup]<statement list><path expression>[endgroup] + \alt[makepath]<pen primary>\alt[makepath]<future pen primary> + \alt[reverse]<path primary> + \alt[subpath]<pair expression>[of]<path primary> +<path secondary>\is<pair secondary>\alt<path primary> + \alt<path secondary><transformer> +<path tertiary>\is<pair tertiary>\alt<path secondary> +<path subexpression>\is<path expression> + \alt<path subexpression><path join><path tertiary> +\endsyntax + +\bugonpage C213, line $-4$ (8/5/98) + +\ninepoint\indent +\<path expression>\is\<pair expression>\alt\<path tertiary> +\endsyntax + +\bugonpage C234, line 6 (9/6/00) + +\ninepoint\noindent +line~$z_1\to z_5$ that bisects $z_4\to z_2$, so it starts out in a +south-by-southwesterly direction;\cutpar + +\bugonpage C246, line 5 of answer 14.15 (8/5/98) + +\ninepoint\indent +\qquad/ length(postcontrol $t$ of $p$ $-$ point $t$ of $p$) {\bf enddef\/}; + +\bugonpage C246, line 10 of answer 14.15 (8/5/98) + +\ninepoint\indent +\qquad/ length(precontrol $t$ of $p$ $-$ point $t$ of $p$) {\bf enddef\/}; + +\bugonpage C252, line $-6$ (8/5/98) + +\ninepoint\noindent +$h+o$ and $\\{bot}\,y_4=-o$, so nothing needs to be done there. +We should, however, say + +\bugonpage C257, large display on line 5 (3/4/95) + +\def\bb{$\,\left\{\vcenter\bgroup\halign\bgroup\hfil##\hfil\cr} +\def\ee{\crcr\egroup\egroup\right\}\,$} +\tenpoint\noindent +\bb|boolean|\cr|numeric|\cr|pair|\cr|path|\cr +|pen|\cr|picture|\cr|string|\cr|transform|\ee\<expression>; \ +\bb\<boolean>\cr\<numeric>\cr\<pair>\cr\<string>\cr\<transform>\ee + \bb|<|\cr|<=|\cr|=|\cr|<>|\cr|>=|\cr|>|\ee + \bb\<boolean>\cr\<numeric>\cr\<pair>\cr\<string>\cr\<transform>\ee; + +\bugonpage C261, line $-15$ (8/5/98) + +\tenpoint\textindent\bull {\it Hacks:\/} \ |gobble|, |gobbled|, |killtext|; \ +|capsule_def|; \ |numtok|. + +\bugonpage C286, line 15 (8/5/98) + +\ninepoint\noindent +isn't entirely expanded by {\bf expandafter\/}; only \MF's first +step in loop expansion\cutpar + +\bugonpage C299, line 2 (12/6/99) + +\ninepoint\noindent +\begindisplay +$\displaystyle t[u_1,\ldots,u_n]\;=\;\sum_{k=1}^n{n-1\choose k-1} + (1-t)^{n-k}t^{k-1}u_k,$ +\enddisplay + +\bugonpage C299, swap lines 11 and 12 (8/5/98) + +\ninepoint\begintt +def lbrack = hide(delimiters []) lookahead [ enddef; +let [[[ = [; let ]]] = ]; let [ = lbrack; +\endtt + +\bugonpage C306, line 1 (11/4/98) + +\ninepoint\noindent +| ligtable oct"013": "i" =: oct"016", "l" =: oct"017", % ffi and ffl| + +\bugonpage C311, line 2 (8/5/98) + +\ninepoint\noindent +$\\{fine}:=4-\\{eps}$, and $\\{breadth\_}[1]:=4-\\{eps}$. +\ (A small amount~\\{eps} has been subtracted\cutpar + +\bugonpage C323, line $-3$ (8/5/98) + +\ninepoint\noindent +statement occurs, +the special string `|"title "|\thinspace\&\thinspace\<title>' +is output. \ (This is how the\cutpar + +\bugonpage C332, lines 22--24 (8/5/98) + +\ninepoint +\item{}be replicated so that the final +proofs will be \\{rep} times bigger than usual, and the pattern will be clipped +slightly at the edges so that discrete pixels can be seen plainly. + + +\bugonpage C341, line 23 (10/10/96) + +\ninepoint +\noindent|\def\:{\setbox0=\hbox{\noboundary\char\n\noboundary}%| + +\bugonpage C346, left column (9/6/00) + +\eightpoint +|...| (bounded join), 18--19, 127, 248, $\underline{262}$.\par +|...| (truncation of displayed context), 44. + +\bugonpage C346, and throughout the index (3/7/95) + +\eightpoint\noindent +(Many index entries for rules of syntax in chapters 25--26 +should have been underlined) + +\bugonpage C350, left column (4/24/00) + +\eightpoint\noindent +Evetts, Leonard Charles, 153. + +\bugonpage C351, right column (9/22/97) + +\eightpoint\noindent +\llap{\lower1pt\hbox{*}}% +|intersectiontimes|, $\underline{136}$, {\it178}, 213, {\it265}, {\it294}, +{\it298}. + +\bugonpage C353, right column (8/5/98) + +\eightpoint\noindent +\<numeric token atom>, {\it delete this entry}.\par\noindent +\<numeric token primary>, 72, $\underline{210}$. + +\bugonpage C354, left column (7/26/98) + +\eightpoint\noindent +Orwell, George (= Blair, Eric Arthur), 85. + +\bugonpage C355, right column (3/7/95) + +\eightpoint\noindent +|rt|, {\it23}, {\it77}, 80, {\it103}, 147, 151, $\underline{273}$. + +\bugonpage C361, lines 14--15 (4/29/97) + +\tenpoint +\begintt +email: {\tt TUG@tug.org} +internet: {\tt http://www.tug.org/} +} +\endtt + +\bugonpage C361, bottom five lines (4/29/97) + +\begingroup \def\TeX{T\kern-.2em\lower.5ex\hbox{E}\kern-.000em X} +\baselineskip10pt +\rightline{\eightssi Don't delay, subscribe today! That address again is} +\rightline{\eightssi \TeX\ Users Group} +\rightline{\eightssi email: \eighttt TUG\char`\@ tug.org} +\rightline{\eightssi internet: \eighttt http://www.tug.org/} +\smallskip +\rightline{\eightss DONALD E. KNUTH, {\eightssi The \TeX book\/} (1996)} +\endgroup + +% Volume D +\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers +\def\to{\mathrel{.\,.}} % double dot, used only in math mode + +\bugonpage Dix, line ix (8/19/00) + +\tenpoint +\textindent{\bull}``Interfacing with graphic objects'' by +Ignacio Andr\'es Zabala Salelles,\cutpar + +\hsize=35pc + +\bugonpage D71, line 11 of section 178 (9/13/00) + +\ninepoint +\noindent\quad\qquad\qquad$\{$ previous \\{mem\_end}, \\{lo\_mem\_max}, + and \\{hi\_mem\_min} $\}$ + +\bugonpage D132, line 6 of section 291 (9/13/00) + +\tenpoint\noindent +$$=v_n+w_n\theta_0-u_n\bigl(v_1+w_1\theta_0-u_1(v_2+\cdots +-u_{n-2}(v_{n-1}+w_{n-1}\theta_0-u_{n-1}\theta_0)\ldots{})\bigr),$$ + +\bugonpage D213, line 7 (9/14/00) + +\tenpoint\noindent +$(-y+\epsilon, +x+y+\epsilon\delta)$. We should therefore round as if our skewed coordinates +were $(x+\epsilon+\epsilon\delta,y-\epsilon)$\cutpar + +\bugonpage D349, line 4 of section 784 (9/14/00) + +\ninepoint\noindent +{\bf procedure} \\{pack\_job\_name}($s\;$: \\{str\_number});\quad + $\{$ $s={}$|".log"|, |".gf"|, |".tfm"|, or \\{base\_extension} $\}$ + +\bugonpage D451, line 11 (9/14/00) + +\tenpoint\noindent +{\bf 1040}.\qquad The value of \\{cur\_mod} controls the \\{verbosity} in +the \\{print\_exp} routine: If it's \\{show\_code},\cutpar + +\bugonpage D464, bottom line (9/14/00) + +\ninepoint\noindent +\\{long\_help\_seen}: \\{boolean};\quad$\{$ has the long {\bf errmessage} + help been used? $\}$ + +\bugonpage D551, Zabala entry (8/19/00) + +\eightpoint\noindent +Zabala Salelles, Ignacio Andr\'es:\quad 812. + +% volume E +\hsize=29pc +\bugonpage Exiii, lines 3 and 4 from the bottom (7/17/98) + +\textindent{\bull}``Metamarks: +Preliminary studies for a Pandora's Box of shapes'' +by Neenie Billawala, Stanford Computer Science report 1256 (Stanford, +California,\cutpar + +\def\dashto{\mathrel{\hbox{-\kern-.05em}\mkern3.9mu\hbox{-\kern-.05em}}} +\def\ddashto{\mathrel{\hbox{-\kern-.05em}\mkern3.9mu + \hbox{-\kern-.05em}\mkern3.9mu\hbox{-\kern-.05em}}} + +\bugonpage E87, bottom line (6/4/98) + +\rightline{\eightss--- JOHN SMITH, {\eightssi The Printer's Grammar\/}\enspace + (1755)} % p129 + +\bugonpage E95, line 16 (8/8/98) + +\ninepoint\noindent +\quad$\dashto z_{1r}\dashto z_{1l}\dashto{}$% + {\bf subpath} $(t,0)$ {\bf of\/} $(z_{3l}\{z_9-z_3\}\,.\,.\,z_{5r})$ + +\bugonpage E95, line 11 from the bottom (8/8/98) + +\ninepoint\noindent +\quad$\dashto z_{1r}\dashto z_{1l}\dashto{}$% + {\bf subpath} $(t,0)$ {\bf of\/} $(z_{3r}\{z_9-z_3\}\,.\,.\,z_{5r})$ + +\bugonpage E95, line 8 from the bottom (3/6/95) + +\ninepoint\noindent +{\bf cmchar} |"Extensible vertical arrow--extension module"|; + +\bugonpage E97, line 8 from the bottom (3/6/95) + +\ninepoint\noindent +{\bf cmchar} |"Extensible double vertical arrow--extension module"|; + +\bugonpage E113, line 9 (3/6/95) + +\ninepoint\noindent +$x_5=.5[x_4,x_6]$; \ $x_4-x_6=1.2u$; \ $\\{lft}\,x_{5r}=\hbox{hround} + (.5w-.5\\{curve})$; + +\bugonpage E113, line 10 from the bottom (3/6/95) + +\ninepoint\noindent +$x_5=.5[x_4,x_6]$; \ $x_4-x_6=4.8u$; \ $\\{lft}\,x_{5r}=\hbox{hround} + (.5w-.5\\{max\_size})$; + +\bugonpage E115, line 9 (3/6/95) + +\ninepoint\noindent +$x_5=.5[x_4,x_6]$; \ $x_4-x_6=1.2u$; \ $\\{lft}\,x_{5r}=\hbox{hround} + (.5w-.5\\{curve})$; + +\bugonpage E115, line 12 from the bottom (3/6/95) + +\ninepoint\noindent +$x_5=.5[x_4,x_6]$; \ $x_4-x_6=4.8u$; \ $\\{lft}\,x_{5r}=\hbox{hround} + (.5w-.5\\{max\_size})$; + +\bugonpage E147, lines 11--14 from the bottom (7/7/97) + +\ninepoint\noindent +$\\{pos}_3(.8[\\{hair},\\{stem}],0)$; \ $\\{pos}_4(\\{vair},-90)$; \ + $\\{pos}_5(\\{hair},-180)$;\par\noindent +$\\{pos}_6(\\{vair},-270)$; \ ${pos}_7(\\{stem},-360)$; \ + $\\{pos}_8(\\{vair},-450)$; \ ${pos}_9(\\{hair},-540)$;\par\noindent +$x_0=x_1=x_9$; \ $\\{lft}\,x_{0l}=\hbox{hround}(1.5u-.5\\{hair})$; \ + $x_2=x_4=x_6=x_8=.5w-.25u$;\par\noindent +$\\{rt}\,x_{3r}=\hbox{hround}(w-1.75u)$; \ $\\{rt}\,x_{7r}=\hbox{hround}(w-u)$; + +\bugonpage E147, line 8 from the bottom (7/7/97) + +\ninepoint\noindent +$y_5=.5[y_4,y_6]$; \ $\\{top}\,y_{6r}-\\{bot}\,y_{4r}=\\{vstem}+\\{eps}$; \ +$\\{bot}\,y_8=-\\{oo}$; \ $y_7=y_9=.55[y_6,y_8]$; + +\bugonpage E165, line 6 (2/8/97) + +\ninepoint\noindent +$y_1+.5\\{hair}=h$; \ $x_1=x_2+.75u$; \ + $\\{pos}_1(\\{hair}+\\{dw},\hbox{angle}(2(x_1-x_2),y_1-y_2)+90)$; + +\bugonpage E165, line 10 (2/8/97) + +\ninepoint\noindent +$x_3=.5[x_2,x_4]$; \ $x_7-.25u=.5[x_6,x_8]$; \ + $\\{rt}\,x_{8r}=\hbox{hround}(w-.5u)$; + +\bugonpage E187, line 9 (3/6/95) + +\ninepoint\noindent +$\\{lft}\, x_{1l}=\\{lft}\, x_{2l}=\hbox{hround}(.5w-.5\\{shaved\_stem})$; \ + $\\{top}\, y_1=h$; \ $\\{bot}\, y_2=0$; + +\bugonpage E189, line 8 (3/6/95) + +\ninepoint\noindent +$\\{lft}\, x_{1l}=\\{lft}\, x_{2l}=\hbox{hround}(.5w-.5\\{shaved\_stem})$; \ + $\\{top}\, y_1=h$; \ $\\{bot}\, y_2=0$; + +\bugonpage E233, line 21 (3/6/95) + +\ninepoint\noindent +{\bf path} $p$; \ +$\{\{${\bf interim} $\\{superness}:=\\{more\_super}$; \ + $p=\\{pulled\_super\_arc}_l(3,4)(\\{pull})\}\}$; + +\bugonpage E237, line 5 (8/6/98) + +\ninepoint\noindent +$\\{lft}\,x_1={\rm hround}\,.5u$; \ $x_2=w-x_1$; \ + $y_1=y_2=\\{good}.y\,.7[\\{x\_height},\\{asc\_height}]$; + +\bugonpage E239, line 7 from the bottom (3/6/95) + +\ninepoint\noindent +$\\{lft}\,x_{6r}=\hbox{hround}\, u$; \ +$x_7=3u$; \ $x_8=w-3.5u$; \ $\\{rt}\,x_{9l}=\hbox{hround}(w-u)$; + +\bugonpage E253, line 2 from the bottom (8/9/98) + +\ninepoint +\line{\quad$.\,.\,z_{3e}\{\\{down}\}\,.\,.\,\{z_{5l}-z_{4l}\}z_{4e} + \dashto z_{5e}\dashto z_{6e}$;\hfil \% stroke} + +\bugonpage E263, line 21 (5/10/98) + +\ninepoint\noindent +{\bf path} $p$; \ +$\{\{${\bf interim} $\\{superness}:=\\{more\_super}$; \ + $p=\\{pulled\_super\_arc}_l(3,4)(\\{pull})\}\}$; + +\bugonpage E289, line 2 from the bottom (8/9/98) + +\ninepoint +\line{\quad$.\,.\,z_{3e}\{\\{down}\}\,.\,.\,\{z_{5l}-z_{4l}\}z_{4e} + \dashto z_{5e}\dashto z_{6e}$;\hfil \% stroke} + +\bugonpage E291, line 18 (3/6/95) + +\def\frac#1/#2{\leavevmode\kern.1em + \raise.5ex\hbox{\the\scriptfont0 #1}\kern-.1em + /\kern-.15em\lower.25ex\hbox{\the\scriptfont0 #2}} +\ninepoint\noindent +$x_4=\frac1/3[x_5,x_{3l}]$; \ $z_4=z_5+\\{whatever}*(15u,.1h)$; + +\bugonpage E297, line 17 (5/10/98) + +\ninepoint\noindent +{\bf path} $p$; \ +$\{\{${\bf interim} $\\{superness}:=\\{more\_super}$; \ + $p=\\{pulled\_super\_arc}_l(3,4)(\\{pull})\}\}$; + +\bugonpage E303, line 17 (5/10/98) + +\ninepoint\noindent +{\bf path} $p$; \ +$\{\{${\bf interim} $\\{superness}:=\\{more\_super}$; \ + $p=\\{pulled\_super\_arc}_l(3,4)(\\{pull})\}\}$; + +\bugonpage E309, line 7 from the bottom (5/8/98) + +\ninepoint\noindent +\quad$y_{@0}=y_{@2l}-\\{bracket}-\\{eps}$; + +\bugonpage E313, line 7 from the bottom (5/8/98) + +\ninepoint\noindent +\quad$y_{@0}=y_{@2l}+\\{bracket}+\\{eps}$; + +\bugonpage E319, line 8 (5/11/98) + +\ninepoint\noindent +$\\{loop\_top}=$ {\bf if\/} \\{serifs}: + Vround .77$[\\{vair},\\{fudged.stem}]$ {\bf else}: \\{vair} {\bf fi}; + +\bugonpage E373, lines 5 and 6 from the bottom (7/13/97) + +\ninepoint\noindent +\quad$\\{top}\,y_{1r}=\hbox{vround}\, .95h+\\{oo}$; \ +$\\{top}\,y_{2r}=h+\\{oo}$; \ $y_3=.5h$;\par\noindent +\quad$\\{bot}\,y_{4r}=-\\{oo}$; \ +$\\{bot}\,y_{5r}=\hbox{vround}\,.08h-\\{oo}$; \ +$y_{5l}:=\\{good}.y\, y_{5l}$; \ $x_{5l}:=\\{good}.x\,x_{5l}$; + +\bugonpage E381, lines 11 and 12 from the bottom (7/13/97) + +\ninepoint\noindent +\quad$\\{top}\,y_{1r}=\hbox{vround}\, .93h+\\{oo}$; \ +$\\{top}\,y_{2r}=h+\\{oo}$; \ $y_3=.5h$;\par\noindent +\quad$\\{bot}\,y_{4r}=-\\{oo}$; \ +$\\{bot}\,y_{5r}=\hbox{vround}\,.07h-\\{oo}$; + +\bugonpage E389, bottom two lines (8/7/98) + +\ninepoint\noindent +\quad {\bf numeric} $\\{aa\_},\\{bb\_},\\{cc\_}$; + \ $\\{bb\_}=b/y$; \ $\\{cc\_}=c/y$; + \ $\\{aa\_}=a*a-\\{bb\_}*\\{bb\_}$;\par\noindent +\quad $(a*(\\{cc\_}\mathbin{++}\hbox{sqrt}\,\\{aa\_})-\\{bb\_}*\\{cc\_})/\\{aa\_}$ + {\bf enddef\/}; + +\bugonpage E423, line 17 (8/8/98) + +\ninepoint\noindent\quad +$x_{13}=x_{11}-.5$; \ $\\{top}\,y_{14r}=\min(\frac10/7\\{x\_height}+ + .5\\{bulb\_diam},h)+1$; \ $\\{top}\,y_{11}=\\{x\_height}$; + +\bugonpage E427, line 21 (8/8/98) + +\ninepoint\noindent\quad +$x_{23}=x_{21}-.5$; \ $\\{top}\,y_{24r}=\min(\frac10/7\\{x\_height}+ + .5\\{bulb\_diam},h)+1$; \ $\\{top}\,y_{21}=\\{x\_height}$; + +\bugonpage E431, lines 18 and 19 (8/8/98) + +\ninepoint\noindent +{\bf filldraw} $z_0\dashto(x_0,y_{2l})\dashto z_{1l}\{\\{right}\}\,.\,.\, + \{\\{left}\}z_{1r}$\par +\noindent\quad$\dashto{}${\bf subpath} $(t,0)$ {\bf of\/} + $(z_{3r}\,.\,.\,\{2(x_0-x_3),y_0-y_3\}z_{5r})$ + +\bugonpage E431, line 2 from the bottom (8/8/98) + +\ninepoint\line{\quad +$\dashto z_{1l}\{\\{right}\}\,.\,.\,\{\\{left}\}z_{1r}\dashto + (x_0,y_{2r})\dashto{}$cycle;\hfill\% arrowhead and stem} + +\bugonpage E433, lines 13 and 14 (8/8/98) + +\ninepoint\noindent +{\bf filldraw} $z_0\dashto(x_0,y_{2l})\dashto z_{1l}\{\\{left}\}\,.\,.\, + \{\\{right}\}z_{1r}$\par +\noindent\quad$\dashto{}${\bf subpath} $(t,0)$ {\bf of\/} + $(z_{3l}\,.\,.\,\{2(x_0-x_3),y_0-y_3\}z_{5r})$ + +\bugonpage E433, line 2 from the bottom (8/8/98) + +\ninepoint\line{\quad +$\dashto z_{1l}\{\\{left}\}\,.\,.\,\{\\{right}\}z_{1r}\dashto + (x_0,y_{2r})\dashto{}$cycle;\hfill\% arrowhead and stem} + +\bugonpage E463, line 15 (8/8/98) + +\ninepoint\noindent\quad +$\ddashto z_{1r}\,.\,.\,z_{1l}\ddashto{}${\bf subpath} $(t,0)$ {\bf of\/} + $(z_{3r}\{z_9-z_3\}\,.\,.\,z_{5r})$ + +\bugonpage E463, line 3 from the bottom (8/8/98) + +\ninepoint\noindent\quad +$\ddashto z_{1r}\,.\,.\,z_{1l}\ddashto{}${\bf subpath} $(t,0)$ {\bf of\/} + $(z_{3l}\{z_9-z_3\}\,.\,.\,z_{5r})$ + +\bugonpage E465, line 16 (8/8/98) + +\ninepoint\noindent\quad +$\ddashto z_{1l}\,.\,.\,z_{1r}\ddashto{}${\bf subpath} $(t,0)$ {\bf of\/} + $(z_{3r}\{z_9-z_3\}\,.\,.\,z_{5r})$ + +\bugonpage E465, line 3 from the bottom (8/8/98) + +\ninepoint\noindent\quad +$\ddashto z_{1l}\,.\,.\,z_{1r}\ddashto{}${\bf subpath} $(t,0)$ {\bf of\/} + $(z_{3l}\{z_9-z_3\}\,.\,.\,z_{5r})$ + +\bugonpage E467, line 18 (8/8/98) + +\ninepoint\noindent\quad +$\ddashto z_{1l}\,.\,.\,z_{1r}\ddashto{}${\bf subpath} $(t,0)$ {\bf of\/} + $(z_{3r}\{z_9-z_3\}\,.\,.\,z_{5r})$ + +\bugonpage E467, line 3 from the bottom (8/8/98) + +\ninepoint\noindent\quad +$\ddashto z_{11l}\,.\,.\,z_{12r}\ddashto{}${\bf subpath} $(t,0)$ {\bf of\/} + $(z_{13l}\{z_{19}-z_{13}\}\,.\,.\,z_{15r})$ + +\bugonpage E483, lines 12--14 from the bottom (3/6/95) + +\ninepoint\noindent +{\bf beginarithchar}(oct$\,$|"004"|); \ +{\bf pickup} \\{fine}.\\{nib}; \ +{\bf pickup} \\{rule}.\\{nib};\par +\line{{\bf numeric} \\{del}; + \ $\\{del}=\\{dot\_size}-\\{currentbreadth}$;\hfill + \% $\\{currentbreadth}=\\{fine}$} +\noindent +$x_3-.5\\{del}=\\{good}.x(.5w-.5\\{del})$; + \ $\\{center\_on}(x_3)$;\par\noindent +$y_3+.5del=\\{good}.y(\\{math\_axis}+\\{math\_spread}[.5\\{x\_height} + ,.6\\{x\_height}]+.5\\{del})$; + +\bugonpage E485, bottom line (6/4/98) + +\rightline{\eightss--- JOHN SMITH, {\eightssi The Printer's Grammar\/}\enspace + (1755)} % p80 + +\bugonpage E489, line 4 (8/8/98) + +\ninepoint\noindent +$\\{lft}\,x_6={\rm hround}\,u$; \ $x_2=w-x_6$; \ $\\{top}\,y_8=h$; \ + $y_8-y_4=x_2-x_6$; + +\bugonpage E489, line 10 (8/8/98) + +\ninepoint\noindent +$\\{lft}\,x_6={\rm hround}\,u$; \ $x_2=w-x_6$; \ $\\{top}\,y_8=h$; \ + $y_8-y_4=x_2-x_6$; \ \\{circle\_points}; + +\bugonpage E491, line 3 from the bottom (3/6/95) + +\def\SH{\raise.7ex\hbox{$\scriptstyle\#$}} % sharp sign for sharped units +\ninepoint\noindent +\quad $\\{spread}:=2\hbox{ceiling}(\\{spread}\SH*\\{hppp}/2)+\\{eps}$; + \ {\bf enddef\/}; + +\bugonpage E507, line 15 (8/8/98) + +\ninepoint\noindent\quad +$\ddashto z_{1r}\,.\,.\,z_{1l}\ddashto{}${\bf subpath} $(t,0)$ {\bf of\/} + $(z_{3r}\{z_9-z_3\}\,.\,.\,z_{5r})$ + +\bugonpage E507, line 3 from the bottom (8/8/98) + +\ninepoint\noindent\quad +$\ddashto z_{11r}\,.\,.\,z_{11l}\ddashto{}${\bf subpath} $(t,0)$ {\bf of\/} + $(z_{13l}\{z_{19}-z_{13}\}\,.\,.\,z_{15r})$ + +\bugonpage E509, line 17 (8/8/98) + +\ninepoint\noindent\quad +$\ddashto z_{1l}\,.\,.\,z_{1r}\ddashto{}${\bf subpath} $(t,0)$ {\bf of\/} + $(z_{3l}\{z_9-z_3\}\,.\,.\,z_{5r})$ + +\bugonpage E509, lines 3 and 4 from the bottom (8/8/98) + +\ninepoint\noindent\quad +$\ddashto z_{1l}\,.\,.\,z_{1r}\ddashto{}${\bf subpath} $(t,0)$ {\bf of\/} + $(z_{3l}\{z_9-z_3\}\,.\,.\,z_{5r})$ + +\bugonpage E511, line 17 (8/8/98) + +\ninepoint\noindent\quad +$\ddashto z_{1l}\,.\,.\,z_{1r}\ddashto{}${\bf subpath} $(t,0)$ {\bf of\/} + $(z_{3l}\{z_9-z_3\}\,.\,.\,z_{5r})$ + +\bugonpage E511, lines 3 and 4 from the bottom (8/8/98) + +\ninepoint\noindent\quad +$\ddashto z_{1l}\,.\,.\,z_{1r}\ddashto{}${\bf subpath} $(t,0)$ {\bf of\/} + $(z_{3l}\{z_9-z_3\}\,.\,.\,z_{5r})$ + +\bugonpage E541, bottom line (2/27/97) + +{\bf labels}\kern.05em$(1,2,3,5,6,7,8,9,10,11,12,13,14,15)$; \ {\bf endchar}; + +\bugonpage E568, the example of {\tt cmtex8} (4/18/96) + +\eightpoint\indent +(The word `{\tt logician}' should not be hyphenated.) + +\bugonpage E574, left column (3/6/95) + +\eightpoint\indent +\\{currentbreadth}, 483, $\underline{545}$, 546. + +\bugonpage E575, right column (9/10/98) + +Holmes, Kris Ann, vi, vii. + +\bugonpage E576, right column (6/4/98) + +\eightpoint\noindent Delete the entry for Luckombe + +\bugonpage E579, left column (6/4/98) + +\eightpoint Smith, John, 87, 485. + +\bye diff --git a/Master/texmf-dist/source/generic/knuth/errata/errata.tex b/Master/texmf-dist/source/generic/knuth/errata/errata.tex new file mode 100644 index 00000000000..6842a82cc6e --- /dev/null +++ b/Master/texmf-dist/source/generic/knuth/errata/errata.tex @@ -0,0 +1,1554 @@ +% Bugs (sigh) in Computers \& Typesetting --- the most recent errata + +\input manmac +\def\.#1{\hbox{\tt#1}} +\font\sltt=cmsltt10 +\font\niness=cmss9 +\font\ninessi=cmssi9 +\proofmodefalse +\raggedbottom +\output{\hsize=29pc \onepageout{\unvbox255\kern-\dimen@ \vfil}} + +\def\today{\number\day\ + \ifcase\month\or + Jan\or Feb\or Mar\or Apr\or May\or Jun\or + Jul\or Aug\or Sep\or Oct\or Nov\or Dec\fi + \ \number\year} + +\def\cutpar{{\parfillskip=0pt\endgraf}} + +\def\rhead{Bugs in {\tensl Computers \& Typesetting as of \today}} +\def\bugonpage#1(#2) \par{\bigbreak\tenpoint + \hrule width\hsize + \line{\lower3.5pt\vbox to13pt{}Page #1\hfil(#2)}\hrule width\hsize + \nobreak\medskip} +\def\buginvol#1(#2) \par{\bigbreak\penalty-1000\tenpoint + \hrule width\hsize + \line{\lower3.5pt\vbox to13pt{}Volume #1\hfil(#2)}\hrule width\hsize + \nobreak\medskip} +\def\slMF{{\manual 89:;}\-{\manual <=>:}} % slant the logo +\def\0{\raise.7ex\hbox{$\scriptstyle\#$}} +\newcount\nn +\newdimen\nsize \newdimen\msize \newdimen\ninept \ninept=9pt +\newbox\eqbox \setbox\eqbox=\hbox{\kern2pt\eightrm=\kern2pt} + +\tenpoint +\noindent This is a list of all substantial corrections made to {\sl Computers +\& Typesetting\/} since the publication of the second ``Millennium Edition'' +at the close of the year 2001. (More precisely, it lists errors corrected +since the 16th printing of Volume~A, the 7th printing +of Volume~B, the 6th printing of Volume~C, the 4th printing of Volume~D, +and the 5th printing of Volume~E.) +Corrections made to the softcover version of {\sl The \TeX book\/}, +beginning with its 32nd printing, are +the same as corrections to Volume~A\null. Corrections to the softcover +version of {\sl The \slMF\kern1ptbook}, beginning with its 11th printing, +are the same as corrections to Volume~C\null. Changes to the mini-indexes +and master indexes of Volumes B, D, and~E are not shown here unless they are +not obviously derivable from what has been shown. Some (or all) of these +errors have been corrected in the most recent printings. +\looseness=-1 + +% volume A + +\bugonpage A7, line 4 from the bottom (01/15/04) + +\noindent +since control sequences of the second kind always have exactly one +symbol after\cutpar + +\bugonpage A123, line 7 from the bottom (02/27/08) + +\ninepoint\noindent +that it won't make the natural height-plus-depth +of\/ |\box|$\,n$ surpass |\dimen|$\,n$, when it~is\cutpar + +\bugonpage A124, lines 12 and 13 (02/27/08) + +\ninepoint\noindent +means that \TeX\ has tried to split an |\insert254| to height $180.2\pt$; +the natural height-plus-depth of the best such split is $175.3\pt$, +and the penalty for breaking there is~100.) + +\bugonpage A206, lines 12--17 (05/21/07) + +\ninepoint\noindent +or alignment template +is also considered to be |\outer| in this sense; for example, a +file shouldn't end in the middle of a definition. If you are designing a +format for others to use, you can help them detect errors before too much +harm is done, by using |\outer| with all control sequences that should +appear only at ``quiet times'' within a document. For example, Appendix~B +defines |\proclaim| to be |\outer|, since a user shouldn't be stating a +theorem as part of a definition or argument or preamble. + + +\bugonpage A216, line 3 from the bottom (12/20/07) + +\ninepoint\indent|\openin|\<number>|=|\<file name> + +\bugonpage A290, lines 25--26 (02/24/08) + +\ninepoint\textindent{$\bull$} +\<leaders>\<box or rule>\<horizontal skip>.\enskip +Here \<horizontal skip> refers to one of the first five glue-appending +commands just mentioned; the formal syntax for \<leaders>\cutpar + +\bugonpage A292, line 15 (12/02/02) + +\ninepoint\noindent +are defined as in the +second alternative of a \<math field>, are +recorded in a ``choice\cutpar + +\bugonpage A308, lines 25 and 26 (06/17/02) + +\ninepoint +\begintt +\def\appendroman#1#2#3{\expandafter\def\expandafter#1\expandafter + {\csname\expandafter\gobble\string#2\romannumeral#3\endcsname}} +\endtt + +\bugonpage A311, line 14 (12/02/02) + +\ninepoint\indent +|\def\\{\if\space\next\ % assume that \next is unexpandable| + +\bugonpage A311, line 17 (12/29/07) + +\ninepoint\indent +| \leavevmode\copy0\kern-\wd0\makelightbox}| + +\bugonpage A318, lines 24 and 25 (10/01/03) + +\ninepoint\noindent +\hbox to\parindent{\bf\hss15.13.\enspace}% +Yes, in severe circumstances. (1)~Previous footnotes might + have left no room for any more footnotes on the page. +(2)~If |\vadjust{\eject}| occurs on the same line\cutpar + +\bugonpage A364, lines 12--15 from the bottom (02/29/08) + +\ninepoint\noindent +|\def\loggingall{\tracingcommands=2 \tracingstats=2|\par\noindent +| \tracingpages=1 \tracingoutput=1 \tracinglostchars=1 |\par\noindent +| \tracingmacros=2 \tracingparagraphs=1 \tracingrestores=1 |\par\noindent +| \showboxbreadth=\maxdimen \showboxdepth=\maxdimen}|\par +\noindent +|\def\tracingall{\tracingonline=1 \loggingall}| + +\bugonpage A364, line 5 from the bottom (02/29/08) + +\ninepoint\noindent +|\def\fmtversion{3.141592653} % identifies the current format| + +\bugonpage A399, line 18, through what used to be page A400, line 14 (02/26/08) + +\ninepoint +Finally, the reformatting of\/ |\box\footins| can be achieved easily with +an elegant technique suggested by David Kastrup, using the following +\TeX\ code within the |\output| routine: +\begindisplay +|\def\makefootnoteparagraph{\unvbox\footins|\cr +| \baselineskip=\footnotebaselineskip \removehboxes}|\cr +|\def\removehboxes{\unskip\setbox0=\lastbox|\cr +| \ifhbox0{\removehboxes}\unhbox0 \else\noindent \fi}|\cr +\enddisplay +The key idea here is |\removehboxes|, a macro that has the magical ability to +take a vertical box such as `|\vbox{\box1\box2\box3\removehboxes}|' and +transform it into +`|\vbox{\noindent\unhbox1\unhbox2\unhbox3}|'\kern-1pt, +if\/ |\box1|, \kern-2pt|\box2|, and +|\box3| are hboxes. Notice how |\removehboxes| introduces braces so that +\TeX's {save stack} will hold all of the hboxes before they are unboxed. Each +level of recursion in this routine uses one cell of input stack space and +three cells of save stack space; thus, it is generally safe to do more than +100 footnotes without exceeding \TeX's capacity. + +In our application there is no interline glue within |\box\footins|, +so the |\unskip| command could be deleted from |\removehboxes|. + +Incidentally, the |\unskip| and |\lastbox| operations have running +times of the approximate form +$a+mb$, where $m$~is the number of items {efficiency} on the +list preceding the glue or box that is removed. Hence |\removehboxes| has a +running time of order $n^2$ when it removes $n$~boxes. +But the constant~$b$ is so small that +for practical purposes it's possible to think of\/ |\unskip| and +|\lastbox| as almost instantaneous. + +\bugonpage A416, lines 18--22 (06/08/07) + +\ninepoint\noindent\beginlines +|\def\leftheadline{\hbox to \pagewidth{\spaceskip=0pt| +| \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{\spaceskip=0pt\vbox to 10pt{}%| +\endlines + +\bugonpage A450, lines 14--16 from the bottom (12/19/02) + +\begingroup\def\\#1{$_{\kern\scriptspace#1}$} +\indent\qquad{\tt s\\1tic + \\1exp x\\3p pi\\3a \\2i\\1a i\\2al \\2id \\1do \\1ci \\2io ou\\2 \\2us} +\medskip\noindent +(where subscripts that aren't shown are zero), and this yields +$$\centerline{% +\tt.\\0s\\0u\\1p\\0e\\0r\\1c\\0a\\0l\\1i\\0f\\0r\\0a\\0g\\1i\\0l\\4i% +\\0s\\1t\\2i\\0c\\1e\\0x\\3p\\2i\\3a\\0l\\2i\\1d\\0o\\1c\\2i\\0o\\2u\\2s\\0.}$$ +\endgroup + +\bugonpage A458, left column (01/11/07) + +\eightpoint\noindent +|\\|, 38, {\it356}, {\it378}, {\it418}. + +\bugonpage A459, left column (03/17/06) + +\eightpoint\noindent +angle brackets ( $\langle\,\rangle$ ), 59, {\it146--147}, 150,~156,\par +\noindent\qquad $\underline{268}$, 420, 437; + {\sl see also\/} |\langle|, |\rangle|. + +\bugonpage A461, left column (02/24/08) + +\eightpoint\noindent +|\boxit|, 223, 331. + +\bugonpage A468, right column (02/26/08) + +\eightpoint\noindent +interline glue, 78--79, $\underline{80}$, 104, 105, 125, 221,\par +\noindent\qquad 245, 263, 281--282, 335, 352, 399, 409. + +\bugonpage A469, left column (02/26/08) + +\eightpoint\noindent +Kastrup, David Friedrich, 399. + +\bugonpage A470, left column (01/21/03) + +\eightpoint\noindent +|\loggingall|, $\underline{364}$. + +\bugonpage A477, right column (06/08/07) + +\eightpoint\noindent +\llap{*}|\spaceskip|, 76, 274, {\it317}, {\it356}, {\it416}, 429. + +\bugonpage A479, right column (09/11/07) + +\eightpoint\noindent +|\undefined|, 350, 384. + +\bugonpage A483, line 5 from the bottom (11/18/03) + +\eightpoint +\rightline{\eightss--- HIERONYMUS HORNSCHUCH, % + {\eightrm'}$O\mkern-1mu\rho\mkern1mu\vartheta o\mkern1mu % + \tau\upsilon\pi o\gamma\mkern-1mu % + \rho\alpha\phi\acute\iota\alpha\varsigma$\enspace(1608)} + +% volume B +\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers +\def\to{\mathrel{.\,.}} % double dot, used only in math mode + +\bugonpage Bvii, bottom two lines (12/20/02) + +\eightpoint\noindent +all of those changes. +I~now believe that the final bug was discovered and removed on +27~February 2008. +The finder's fee has converged to \$327.68. + +\hsize=35pc + +\bugonpage B2, line 10 from the bottom (02/29/08) + +\ninepoint\noindent\hskip10pt +{\bf define} $\\{banner}\equiv\hbox{\tt\char'23}$% +{\tt This\]is\]TeX,\]Version\]3.1415926\char'23}\quad +$\{\,$printed when \TeX\ starts$\,\}$ + +\bugonpage B3, new paragraph to follow line 9 (12/20/02) + +\tenpoint\noindent\quad +Incidentally, Pascal's standard \\{round} function can be problematical, +because it disagrees with the IEEE floating-point standard. +Many implementors have +therefore chosen to substitute their own home-grown rounding procedure. + +\bugonpage B21, lines 33 and 34 (09/11/07) + +\def\Oct#1{\hbox{\rm\char'23\kern-.2em\it#1\/\kern.05em}} % octal constant +\tenpoint\noindent +$[\Oct{41}\to\Oct{46},\Oct{60}% +\to\Oct{71},\Oct{136},\Oct{141}\to\Oct{146},\Oct{160}\to\Oct{171}]$ must be printable. +Thus, at least 81 printable characters are needed. + +\bugonpage B114, line 25 (09/11/07) + +\def\#{\hbox{\tt\char`\#}} % parameter sign +\ninepoint\noindent +{\bf define} $\\{save\_index}(\#)\equiv\\{save\_stack}[\#].\\{hh}.\\{rh}$\quad + $\{\,$\\{eqtb} location or token or \\{save\_stack} location$\,\}$ + +\bugonpage B139, line 20 (12/19/02) + +\ninepoint\noindent +\quad{\bf begin while} $(\\{state}=\\{token\_list}) \land + (\\{loc}=\\{null}) \land (\\{token\_type}\ne\\{v\_template})$ {\bf do}\par +\noindent\qquad\\{end\_token\_list};\quad$\{\,$conserve stack space$\,\}$ + +\bugonpage B144, line 14 (09/11/07) + +\ninepoint\noindent +\quad\\{cat}: $0\to\\{max\_char\_code}$;\quad$\{\,$\\{cat\_code}(\\{cur\_char}), usually$\,\}$ + +\bugonpage B153, lines 2 and 3 (09/11/07) + +\tenpoint\noindent +In fact, these three procedures account for almost every use of \\{get\_next}. + +\bugonpage B161, line 19 (12/19/02) + +\ninepoint\noindent +\quad{\bf while} $(\\{state}=\\{token\_list}) \land + (\\{loc}=\\{null}) \land (\\{token\_type}\ne\\{v\_template})$ {\bf do}\par +\noindent\qquad\\{end\_token\_list};\quad$\{\,$conserve stack space$\,\}$ + +\bugonpage B163, line 29 (12/19/02) + +\ninepoint\noindent +\quad$\\{long\_state}\gets\\{call}$; +$\\{cur\_tok}\gets\\{par\_token}$; +$\\{ins\_error}$; +{\bf goto} \\{continue}; + +\bugonpage B172, lines 2--6 from the bottom (09/11/07) + +\ninepoint\noindent +{\bf else if\/} $m=\\{vmode}$ {\bf then} \\{scanned\_result}(\\{prev\_depth})(\\{dimen\_val})\par\noindent +\quad{\bf else} \\{scanned\_result}(\\{space\_factor})(\\{int\_val}) + +\bugonpage B178, line 4 (09/11/07) + +\ninepoint\noindent +\quad$\\{cur\_val}\gets0$; +$\\{cur\_val\_level}\gets\\{int\_val}$; +$\\{radix}\gets0$; +$\\{cur\_order}\gets\\{normal}$; + +\bugonpage B184, line 9 from the bottom (04/18/07) + +\tenpoint\noindent +and denominator sum to 32768 or less. +According to the definitions here, $\rm2660\,dd\approx1000.33297\,mm$;\kern-6.6pt\cutpar + +\bugonpage B206, line 14 (10/30/02) + +\tenpoint\noindent +used input files like \.{webmac.tex}. + +\bugonpage B206, new paragraph to follow line 22 (12/20/02) + +\tenpoint\noindent\quad +The following procedures don't allow spaces to be part of +file names; but some users seem to like names that are spaced-out. +System-dependent changes to allow such things should probably +be made with reluctance, and only when an entire file name that +includes spaces is ``quoted'' somehow. + +\bugonpage B227, new line to precede line 23 (09/11/07) + +\ninepoint\noindent +{\bf if} $(\\{nw}=0)\lor(\\{nh}=0)\lor(\\{nd}=0)\lor(\\{ni}=0)$ + {\bf then} \\{abort}; + +\bugonpage B256, line 25 (12/20/02) + +\ninepoint\noindent +\qquad\\{cur\_glue}: \\{real};\quad$\{\,$glue seen so far$\,\}$\par\noindent +\qquad\\{cur\_g}: \\{scaled};\quad$\{\,$rounded + equivalent of \\{cur\_glue} times the glue ratio$\,\}$\par\noindent +\quad{\bf begin} $\\{cur\_g}\gets0$; + $\\{cur\_glue}\gets\\{float\_constant}(0)$;\par\noindent +\quad$\\{this\_box}\gets\\{temp\_ptr}$; + $\\{g\_order}\gets\\{glue\_order}(\\{this\_box})$; + $\\{g\_sign}\gets\\{glue\_sign}(\\{this\_box})$; + +\bugonpage B258, line 5 from the bottom (12/20/02) + +\ninepoint\noindent +\quad{\bf begin} $g\gets\\{glue\_ptr}(p)$; + $\\{rule\_wd}\gets\\{width}(g)-\\{cur\_g}$; + +\bugonpage B258, bottom line (12/20/02) + +\ninepoint\noindent +\qquad\qquad{\bf begin} $\\{cur\_glue}\gets\\{cur\_glue}+\\{stretch}(g)$; + $\\{vet\_glue}(\\{float}(\\{glue\_set}(\\{this\_box}))*\\{cur\_glue})$;\par +\noindent\qquad\qquad$\\{cur\_g}\gets\\{round}(\\{glue\_temp})$; + +\bugonpage B259, line 4 (12/20/02) + +\ninepoint\noindent +\qquad\qquad{\bf begin} $\\{cur\_glue}\gets\\{cur\_glue}-\\{shrink}(g)$; + $\\{vet\_glue}(\\{float}(\\{glue\_set}(\\{this\_box}))*\\{cur\_glue})$;\par +\noindent\qquad\qquad$\\{cur\_g}\gets\\{round}(\\{glue\_temp})$; + +\bugonpage B259, new line to precede old line 7 (12/20/02) + +\ninepoint\noindent +\quad$\\{rule\_wd}\gets\\{rule\_wd}+\\{cur\_g}$; + +\bugonpage B260, line 21 (12/19/02) + +\ninepoint\noindent +\qquad{\bf else begin} $\\{lx}\gets\\{lr}$ {\bf div} $(\\{lq}+1)$; + +\bugonpage B261, line 9 (12/20/02) + +\ninepoint\noindent +\qquad\\{cur\_glue}: \\{real};\quad$\{\,$glue seen so far$\,\}$\par\noindent +\qquad\\{cur\_g}: \\{scaled};\quad$\{\,$rounded + equivalent of \\{cur\_glue} times the glue ratio$\,\}$\par\noindent +\quad{\bf begin} $\\{cur\_g}\gets0$; + $\\{cur\_glue}\gets\\{float\_constant}(0)$;\par\noindent +\quad$\\{this\_box}\gets\\{temp\_ptr}$; + $\\{g\_order}\gets\\{glue\_order}(\\{this\_box})$; + $\\{g\_sign}\gets\\{glue\_sign}(\\{this\_box})$; + +\bugonpage B262, line 10 from the bottom (12/20/02) + +\ninepoint\noindent +\quad{\bf begin} $g\gets\\{glue\_ptr}(p)$; + $\\{rule\_ht}\gets\\{width}(g)-\\{cur\_g}$; + +\bugonpage B262, line 6 from the bottom (12/20/02) + +\ninepoint\noindent +\qquad\qquad{\bf begin} $\\{cur\_glue}\gets\\{cur\_glue}+\\{stretch}(g)$; + $\\{vet\_glue}(\\{float}(\\{glue\_set}(\\{this\_box}))*\\{cur\_glue})$;\par +\noindent\qquad\qquad$\\{cur\_g}\gets\\{round}(\\{glue\_temp})$; + +\bugonpage B262, line 2 from the bottom (12/20/02) + +\ninepoint\noindent +\qquad\qquad{\bf begin} $\\{cur\_glue}\gets\\{cur\_glue}-\\{shrink}(g)$; + $\\{vet\_glue}(\\{float}(\\{glue\_set}(\\{this\_box}))*\\{cur\_glue})$;\par +\noindent\qquad\qquad$\\{cur\_g}\gets\\{round}(\\{glue\_temp})$; + +\bugonpage B263, new line to precede old line 2 (12/20/02) + +\ninepoint\noindent +\quad$\\{rule\_ht}\gets\\{rule\_ht}+\\{cur\_g}$; + +\bugonpage B264, line 10 (12/19/02) + +\ninepoint\noindent +\qquad{\bf else begin} $\\{lx}\gets\\{lr}$ {\bf div} $(\\{lq}+1)$; + +\bugonpage B266, line 29 (09/11/07) + +\tenpoint\noindent +$\\{total\_pages}\ge65536$, the \.{DVI} file will lie. And if +$\\{max\_push}\ge65536$, the user deserves whatever chaos might ensue. + +\bugonpage B279, line 19 (09/11/07) + +\ninepoint\noindent +\qquad\\{p}: \\{pointer};\quad$\{\,$a new glue node$\,\}$ + +\bugonpage B288, lines 18--20 (09/11/07) + +\ninepoint\noindent +\\{left\_noad}: {\bf begin} \\{print\_esc}(\.{"left"}); + \\{print\_delimiter}(\\{delimiter}($p$));\par\noindent +\quad{\bf end};\par\noindent +\\{right\_noad}: {\bf begin} \\{print\_esc}(\.{"right"}); + \\{print\_delimiter}(\\{delimiter}($p$)); + +\bugonpage B290, line 12 (09/11/07) + +\ninepoint\noindent +\quad{\bf begin if\/} $s=\\{text\_size}$ {\bf then} + \\{print\_esc}(\.{"textfont"}); + +\bugonpage B299, line 9 (12/20/02) + +\ninepoint\noindent +\qquad\qquad\quad{\bf if\/} $\\{type}(r)=\\{kern\_node}$ {\bf then} + \quad$\{\,$unneeded italic correction$\,\}$ + +\bugonpage B332, line 6 (12/19/02) + +\tenpoint\noindent +is being scanned, or when no alignment preamble is active. + +\bugonpage B332, line 8 (12/19/02) + +\ninepoint\noindent +\quad{\bf begin if\/} $(\\{scanner\_status}=\\{aligning}) \lor + (\\{cur\_align}=\\{null})$ {\bf then} + +\bugonpage B336, line 11 from the bottom (10/13/03) + +\tenpoint\noindent +$j-i+\\{min\_quarterword}$ in their +\\{link} fields. The values of $w_{ii}$ were initialized to +\\{null\_flag},\cutpar + +\bugonpage B342, lines 5 and 6 (09/11/07) + +\tenpoint +In restricted horizontal mode, the \\{clang} part of \\{aux} is undefined; +an over-cautious Pascal runtime system may complain about this. + +\bugonpage B416, line 22 (02/29/08) + +\ninepoint\noindent +\qquad\qquad{\bf if\/} $\\{count}(t)=1000$ {\bf then} $t\gets\\{height}(r)$ +\par\noindent +\qquad\qquad{\bf else} $t\gets\\{x\_over\_n}(\\{height}(r),1000)*\\{count}(t)$; +\par\noindent +\qquad\qquad\\{print\_scaled}$(t)$ + +\bugonpage B438, lines 1--3 (09/11/07) + +\tenpoint\noindent +{\bf1035.\quad}If \\{link}(\\{cur\_q}) is nonnull when \\{wrapup} is invoked, +\\{cur\_q} points to +the list of characters that were consumed while building the ligature +character~\\{cur\_l}. + +\bugonpage B438, lines 19 and 20 (09/11/07) + +\ninepoint\noindent +\qquad\qquad\qquad{\bf begin if\/} $\\{link}(\\{cur\_q})>\\{null}$ {\bf then} +\par\noindent +\qquad\qquad\qquad\quad{\bf if\/} $\\{character}(\\{tail})=\\{qi}( + \\{hyphen\_char}[\\{main\_f}])$ {\bf then} $\\{ins\_disc}\gets\\{true}$; + +\bugonpage B438, line 4 from the bottom (09/11/07) + +\ninepoint\noindent +\quad$\\{link}(\\{tail})\gets\\{lig\_stack}$; +$\\{tail}\gets\\{lig\_stack}$\quad$\{\,$\\{main\_loop\_lookahead} is next$\,\}$ + +\bugonpage B439, line 3 (09/11/07) + +\ninepoint\noindent +\quad{\bf if\/} $\\{main\_p}>\\{null}$ {\bf then} + \\{tail\_append}(\\{main\_p});\quad$\{\,$append a single character$\,\}$ + +\bugonpage B440, new line to follow line 9 (09/11/07) + +\ninepoint\noindent +\quad{\bf if\/} $\\{cur\_r}=\\{non\_char}$ {\bf then goto} + \\{main\_loop\_wrapup}; + +\bugonpage B455, lines 3 and 4 (09/11/07) + +\ninepoint\noindent +\quad{\bf if\/} $((\\{cur\_cmd}=\\{hskip})\land(\\{abs}(\\{mode})\ne\\{vmode})) + \lor ((\\{cur\_cmd}=\\{vskip})\land(\\{abs}(\\{mode})=\\{vmode}))$ {\bf then} + +\bugonpage B472, new paragraph to follow line 10 (12/20/02) + +\tenpoint\noindent\quad +A devious user might force an \\{endv} command to occur just about anywhere; +we must defeat such hacks. + +\bugonpage B472, replacement for what used to be line 13 (12/20/02) + +\ninepoint\noindent +\quad{\bf begin} $\\{base\_ptr}\gets\\{input\_ptr}$; + $\\{input\_stack}[\\{base\_ptr}]\gets\\{cur\_input}$;\par\noindent +\quad{\bf while} $(\\{input\_stack}[\\{base\_ptr}].\\{index\_field}\ne + \\{v\_template}) \land{}$\par\noindent +\quad\qquad $(\\{input\_stack}[\\{base\_ptr}].\\{loc\_field}= + \\{null}) \land {}$\par\noindent +\quad\qquad $(\\{input\_stack}[\\{base\_ptr}].\\{state\_field}= + \\{token\_list})$ {\bf do} \\{decr}(\\{base\_ptr});\par\noindent +\quad{\bf if\/} $(\\{input\_stack}[\\{base\_ptr}].\\{index\_field}\ne + \\{v\_template}) \lor {}$\par\noindent +\quad\qquad $(\\{input\_stack}[\\{base\_ptr}].\\{loc\_field}\ne + \\{null}) \lor {}$\par\noindent +\quad\qquad $(\\{input\_stack}[\\{base\_ptr}].\\{state\_field}\ne + \\{token\_list})$ {\bf then}\par\noindent +\qquad\\{fatal\_error}(\hbox{\tt\char'23(interwoven\]alignment\]preambles\]% + are\]not\]allowed)\char'23});\par\noindent +\quad{\bf if\/} $\\{cur\_group}=\\{align\_group}$ {\bf then} + +\bugonpage B505, line 19 (09/11/07) + +\ninepoint\noindent +\qquad(\.{"since\]the\]result\]is\]out\]of\]range."});\par\noindent +\qquad{\bf if\/} $p\ge\\{glue\_val}$ {\bf then} + \\{delete\_glue\_ref}(\\{cur\_val});\par\noindent +\qquad\\{error}; {\bf return}; + +\bugonpage B506, line 1 (10/13/03) + +\tenpoint\noindent +{\bf 1237.\quad}Here we use the fact that the consecutive codes +$\\{int\_val}\to\\{mu\_val}$ and +$\\{assign\_int}\to$\cutpar + +\bugonpage B520, line 8 (06/25/04) + +\tenpoint\noindent +says, +for example, `\.{(preloaded format=plain 1982.11.19)}', showing the year, +month, and day\cutpar + +\bugonpage B535, new line to follow line 11 (09/11/07) + +\ninepoint\noindent +\qquad{\bf if\/} $\\{last\_glue}\ne\\{max\_halfword}$ {\bf then} + \\{delete\_glue\_ref}(\\{last\_glue}); + +\bugonpage B578, new entry (06/04/06) + +\eightpoint\noindent +Trabb Pardo, Luis Isidoro, 2. + +% volume C +\hsize=29pc +\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers +\def\ddashto{\mathrel{\hbox{-\thinspace-\thinspace-\kern-.05em}}} +\def\tension{\mathop{\rm tension}} +\def\controls{\mathop{\rm controls}} +\def\and{\,{\rm and}\,} + +\bugonpage Cxi, line 4 (05/20/07) + +\line{\hbox to\parindent{\bf\hbox to 1em{\hss27}\hss}% + \rm Recovery from Errors\leaders\hbox to 20pt{\kern13pt.\hss}\hfil + \hbox to 2em{\hss223}} + +\bugonpage C11, line 11 (10/11/01) + +\noindent +the area below the bar to the area above it equal to +$(\sqrt5+1)/2\approx1.61803$, the\cutpar + +\bugonpage C29, illustration for exercise 4.11 (09/09/01) + +\noindent +[points 2 and 5 should not be labeled twice] + +\bugonpage C129, line 16 (02/21/08) + +\ninepoint\beginsyntax +<path subexpression>\is<path expression not ending with direction specifier>\kern-5pt\null +\endsyntax + +\bugonpage C130, lines 13--15 from the bottom (09/13/03) + +\ninepoint\noindent +point but not after it, the +nonempty one is duplicated in a similar way. A~basic path join +`$\to\controls u\and v\to$' specifies explicit control points that +override any direction specifiers that may immediately surround it. + +\bugonpage C137, lines 5--7 from the bottom (02/21/08) + +\danger Let's conclude this chapter by applying what we've learned about +paths to a real-life example. The {\sl Journal of Algorithms\/} was +published for many years by Academic Press, and its cover page carried the +following logo, which was designed\cutpar +\enddanger + +\bugonpage C137, bottom two lines (02/21/08) + +\ninepoint\noindent +A \MF\ program to produce this logo made it possible for the editors +of the journal to use it on letterheads in their correspondence. +Here is one way to do that job,\cutpar +% actually the MS now says "to write that program," and the +% correction therefore extends to page C138 + +\bugonpage C156, line 15 from the bottom (09/09/01) + +\ninepoint\noindent +be the values they had upon entry to the group.) + +\bugonpage C159, lines 12--15 (12/01/06) + +\begintt +def --- = ..tension infinity.. enddef; +\endtt +it makes `$z_1\ddashto z_2$' become +`$z_1\to\tension\\{infinity}\to z_2$'. +The {replacement text} can be any sequence of tokens not including +`{\bf enddef}\kern1pt'; or it can include entire subdefinitions like +`{\bf def}~$\ldots$~{\bf enddef}\kern1pt', according to certain rules +that we shall explain later. + +\bugonpage C171, line 16 from the bottom (06/18/02) + +\tenpoint +\<loop>\is\<loop header>|:|\<loop text> {\tt endfor} + +\bugonpage C179, line 7 from the bottom (09/09/01) + +\ninepoint\noindent +next time \MF\ gets to the end of an input line, it will stop reading +from the\cutpar + +\bugonpage C180, lines 14--16 (04/25/03) + +\ninepoint\noindent +digits should be a +file name that works in essentially the same way on all installations of +\MF\kern-.03em\null. Uppercase letters are considered to be distinct from their +lowercase counterparts, on many systems. + +\bugonpage C180, new line to be inserted 4 from the bottom (06/25/04) + +\ninepoint\item\bull +When \MF\ is reading the symbolic tokens to be saved by {\bf save}. + +\bugonpage C203, line 12 from the bottom (04/25/03) + +\ninepoint\hbox to 237pt{point~3 at the right of the triangle +might digitize into a} + +\bugonpage C213, line 26 (02/21/08) + +\ninepoint\beginsyntax +<path subexpression>\is<path expression not ending with direction specifier>\kern-5pt\null +\endsyntax + +\bugonpage C226, line 23 (02/21/08) + +\ninepoint\noindent following nineteen things will be mentioned: + +\bugonpage C226, new line to be second from the bottom (02/21/08) + +\ninepoint\indent|independent variables|\qquad(distinct numeric variables) + +\bugonpage C246, line 12 (02/21/08) + +\ninepoint\noindent +is performed whenever \MF\ uses the last two alternatives +in the definition\cutpar + +\bugonpage C250, lines 13 and 14 (02/19/08) + +\ninepoint\noindent\hbox to\parindent{\bf\hss19.3.\enspace}% +Yes, if and only if $n-{1\over2}$ is a nonnegative even integer. +\ (Because ambiguous values are rounded upwards.) + +\bugonpage C250, line 12 from the bottom (04/25/03) + +\ninepoint\noindent +following \<boolean primary>.) + +\bugonpage C286, line 25 (09/09/01) + +\ninepoint\noindent +problem; it would simply have put |ENDFOR| into the +replacement text of |asts|, because\cutpar + +\bugonpage C289, line 7 (09/09/01) + +\vskip-6pt\ninepoint\begintt +if if pair x: x>(0,0) else: false fi: A else: B fi. +\endtt + +\bugonpage C292, line 10 from the bottom (09/09/01) + +\ninepoint\noindent +be known by saying `{\bf if\/} known $p-q$: $p=q$ {\bf else}:~{\bf false} +{\bf fi}'; transforms could be handled\cutpar + +\bugonpage C293, line 5 from the bottom (04/25/03) + +\ninepoint\noindent +given angle~$\phi$. We can consider +the common angle~$\theta$ of $z_{1r}-z_{1l}$ and $z_{0r}-z_{0l}$ to be\cutpar + +\bugonpage C315, line 15 from the bottom (04/25/03) + +\ninepoint\noindent +`b' was shipped out.) \ The second letter,~`o', is placed +in a second little box adjacent\cutpar + +\bugonpage C325, bottom line (02/29/08) + +\rightline{\eightss--- CAROLUS LINN\AE US, + {\eightssi Philosophia Botanica\/}\enspace(1751)} + +\bugonpage C332, line 4 from the bottom (04/25/03) + +\ninepoint\noindent +(The proofsheet resolution will be 50 pixels per inch, because {\it cheapo\/} +has 200 pixels per\cutpar + +\bugonpage C346, left column (06/18/02) + +\eightpoint\noindent +\llap{*}|:|, 169, 171, 317--319. + +\bugonpage C346, right column (07/09/01) + +\eightpoint\noindent +\llap{*}|angle|, {\it29}, {\it67}, $\underline{72}$, {\it107}, +{\it135}, 211, {\it238}. + +\bugonpage C351, right column (02/21/08) + +\eightpoint\noindent +independent variables, $\underline{81}$--$\underline{83}$, 88, 224, 226. + +\bugonpage C352, right column (02/29/08) + +\eightpoint\noindent +Linn\'e, Carl von (= Linn\ae us, Carolus), 325. + +\bugonpage C355, right column (02/29/08) + +\eightpoint\noindent +\llap{*}|save|, $\underline{155}$--$\underline{156}$, {\it160}, 173, + {\it178}, 180, 218,\par +\noindent\qquad{\it236}, {\it244}, {\it296}, 299. + +% Volume D +\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers +\def\to{\mathrel{.\,.}} % double dot, used only in math mode + +\bugonpage Dvii, bottom two lines (02/29/08) + +\eightpoint\noindent +corporates all of those changes. +I~now believe that the final bug was discovered on 27~December 2004, +and removed in version 2.718281. +The finder's fee has converged to \$327.68. + +\hsize=35pc +\parindent=1em + +\bugonpage D2, line $-17$ (02/27/08) + +\ninepoint\noindent +{\bf define} $\\{banner}\equiv\hbox{\tt\char'23}$% +{\tt This\]is\]METAFONT,\]Version\]2.718281\char'23}\quad +$\{\,$printed when \MF\ starts$\,\}$ + +\bugonpage D2, lines 4 and 5 from the bottom (12/23/02) + +\tenpoint\noindent +types; there are no `{\bf var}' parameters, except in the case of files +or in the system-dependent \\{paint\_row} procedure; +there are no tag fields on variant records; there are no \\{real} variables; +no procedures are declared local to other procedures.) + +\bugonpage D16, new paragraph to follow line 26 (06/25/04) + +The first line is special also because it may be read before \MF\ has +input a base file. In such cases, normal error messages cannot yet +be given. The following code uses concepts that will be explained later. +(If the Pascal compiler does not support non-local {\bf goto}, the +statement `{\bf goto} \\{final\_end}' should be replaced by something that +quietly terminates the program.) + +\bugonpage D22, line 26 (09/11/07) + +\noindent +ASCII codes $[\Oct{60}\to\Oct{71},% +\Oct{136},\Oct{141}\to\Oct{146}]$ +must be printable. + +\bugonpage D31, line 29 (06/25/04) + +\noindent +This is the only nontrivial {\bf goto} statement in the +whole program. It is used when there is no\cutpar + +\bugonpage D42, replacement for lines 8--13 (12/23/02) + +\tenpoint\noindent\quad +Notice that if 64-bit integer arithmetic were available, +we could simply compute $(2^{29}*p+\nobreak q)\allowbreak\, +\hbox{\bf div}\,(2*q)$. +But when we are restricted to Pascal's 32-bit arithmetic we +must either resort to multiple-precision maneuvering +or use a simple but slow iteration. The multiple-precision technique +would be about three times faster than the code adopted here, but it +would be comparatively long and tricky, involving about sixteen +additional multiplications and divisions. + +\bugonpage D43, line 20 (12/23/02) + +\tenpoint\noindent +language or 64-bit substitute is advisable. + +\bugonpage D44, lines 24--26 (12/23/02) + +\tenpoint\noindent\quad +Once again it is a good idea to use 64-bit arithmetic if +possible; otherwise \\{take\_scaled} will use more than 2\% of the running time +when the Computer Modern fonts are being generated. + +\bugonpage D58, line 16 from the bottom (06/25/04) + +\ninepoint\noindent +\hskip5em{\bf if\/} $\\{j\_random}=0$ {\bf then} \\{new\_randoms} + {\bf else} \\{decr}(\\{j\_random}) + +\bugonpage D63, line 21 (06/25/04) + +Locations of \\{mem} between \\{mem\_min} and \\{mem\_top} may be dumped as +part +of preloaded base\cutpar + +\bugonpage D75, line 13 (06/25/04) + +\ninepoint\noindent +\quad{\bf define} $\\{fi\_or\_else}=2$\quad$\{\,$delimiters for conditionals + {\bf elseif\/}, {\bf else}, {\bf fi})$\,\}$ + +\bugonpage D76, line 5 (06/25/04) + +\ninepoint\noindent +\quad{\bf define} $\\{type\_name}=30$\quad$\{\,$declare a type + ({\bf numeric}, {\bf pair}, etc.)$\,\}$ + +\bugonpage D77, line 16 (06/25/04) + +\ninepoint\noindent +\quad{\bf define} $\\{lig\_kern\_token}=76$\quad$\{\,$the operators + `{\bf kern}' and `\.{=:}' and `\.{=:\char'174}', etc.$\,\}$ + +\bugonpage D98, bottom two lines (06/25/04) + +\noindent +They consist of zero or more parameter tokens followed +by a code for the type of macro. + +\bugonpage D101, line 3 (06/25/04) + +\noindent +\MF\ user assigns a type to a variable like \.{x20a.b} by saying, for +example, `\.{boolean} \.{x[]a.b}'. + +\bugonpage D102, lines 10--16 (06/25/04) + +\noindent +variable that is relevant +when no attributes are attached to the parent. The \\{attr\_head} node +has the fields of either +a value node, a subscript node, or an attribute node, depending on what +the parent would be if it were not structured; but the subscript and +attribute fields are ignored, so it effectively contains only the data of +a value node. The \\{link} field in this special node points to an attribute +node whose \\{attr\_loc} field is zero; the latter node represents a collective +subscript `\.{[]}' attached to the parent, and its \\{link} field points to +the first non-special attribute node (or to \\{end\_attr} if there are none). + +\bugonpage D102, lines 7 and 8 from the bottom (06/25/04) + +\noindent +$\\{subscr\_head}(\\{q1})=\\{qq1}$; +\\{qq} is a three-word ``attribute-as-value'' node with +$\\{type}(\\{qq})=\break\\{numeric\_type}$ +(assuming that \.{x5} is numeric, because \\{qq} represents `\.{x[]}' +with no further\break + attributes), $\\{name\_type}(\\{qq})=\\{structured\_root}$, +$\\{attr\_loc}(\\{qq})=0$, $\\{parent}(\\{qq})=p$,\cutpar + +\bugonpage D103, line 6 (06/25/04) + +\noindent +The value of variable \.{x20b} +appears in node~$\\{qqq2}=\\{link}(\\{qqq1})$, as you can well imagine. +Similarly, the value of `\.{x.a}' appears in node $\\{q2}=\\{link}(\\{q1})$, +where $\\{attr\_loc}(\\{q2})=h(a)$ and $\\{parent}(\\{q2})=p$. + +\bugonpage D114, line 12 (06/25/04) + +\noindent +\qquad Such save stack entries are generated by \&{save} commands. + +\bugonpage D120, line 3 (06/25/04) + +\ninepoint\noindent +[delete the line `The code here \dots', since the + code {\it doesn't\/} use the stated fact] + +\bugonpage D126, line 10 (06/25/04) + +\tenpoint\noindent +If $\theta_0$ is supposed to have a given value $E_0$, we simply +define $C_0=1$, $D_0=0$, and $R_0=E_0$.\cutpar + +\bugonpage D138, line 11 from the bottom (10/26/06) + +\tenpoint\noindent +for the bisected interval are $z'_0=z_0$ +and $z''_0=z_0+(Z'_1+Z'_2+\cdots+Z'_n)/2^{l+1}$. + +\bugonpage D142, line 3 (06/25/04) + +\tenpoint\noindent +out to hold if and only if $x_0\le x_1$ and $x_2\le x_3$, and either +$x_1\le x_2$ or $(x_1-x_2)^2\le(x_1-x_0)(x_3-x_2)$.\cutpar + +\bugonpage D142, line 8 (10/26/06) + +\tenpoint\noindent\quad +For example, if we start with $(x_1-x_0,x_2-x_1,x_3-x_2)= +(X_1,X_2,X_3)=(7,-16,39)$, the\cutpar + +\bugonpage D142, lines 21--23 (06/25/04) + +\tenpoint\noindent +monotonic +cubic, then $B(x_0,x_1,x_2,x_3;{1\over2})$ is always between +$.06[x_0,x_3]$ and $.94[x_0,x_3]$; and it is impossible for $\bar x$ +to be within~$\epsilon$ of such a number. Contradiction! +(The constant .06 is actually $(2-\sqrt3\,)/4$; the worst case +occurs for polynomials like $B(0,2-\sqrt3,1-\sqrt3,3;t)$.) + +\bugonpage D177, line 18 (06/25/04) + +\ninepoint\noindent +$\\{cur\_x},\\{cur\_y}$: \\{scaled};\quad$\{\,$outputs of \\{skew}, + \\{unskew}, and a few other routines$\,\}$ + +\bugonpage D182, lines 27--29 (06/25/04) + +\noindent +{\bf399.\quad}If + the segment numbers on the cycle are $t_1$, $t_2$, \dots, $t_m$, +and if $m\le\\{max\_quarterword}$, +we have $t_{k-1}\le t_k$ except for at most one value of~$k$. If there are +no exceptions, $f$ will point to $t_1$; otherwise it will point to the +exceptional~$t_k$. + +\bugonpage D184, line 18 (12/21/02) + +\ninepoint\noindent +\qquad\\{chopped}: \\{integer};\quad +$\{\,$positive if data truncated, negative if data dangerously large$\,\}$ + +\bugonpage D184, line 25 (12/21/02) + +\ninepoint\noindent +\quad{\bf if\/} $(\\{internal}[\\{autorounding}]>0)\land(\\{chopped}=0)$ + {\bf then} \\{xy\_round}; + +\bugonpage D184, line 27 (12/21/02) + +\ninepoint\noindent +\quad{\bf if\/} $(\\{internal}[\\{autorounding}]>\\{unity})\land + (\\{chopped}=0)$ {\bf then} \\{diag\_round}; + +\bugonpage D184, line 32 (12/21/02) + +\ninepoint\noindent +\qquad{\bf if\/} $(\\{internal}[\\{autorounding}]\le0)\lor(\\{chopped}\ne0)$ + {\bf then} \\{print\_spec}({\tt\char`",\]after\]subdivision\char`"}) + +\bugonpage D185, lines 15--19 (12/21/02) + +\ninepoint\noindent +\quad{\bf define} \\{procrustes}({\tt\char`#})${}\equiv{}${\bf if\/} + $\\{abs}(\.\#)\ge\\{dmax}$ {\bf then}\par\noindent +\qquad\qquad\quad{\bf if\/} $\\{abs}(\.\#)>\\{max\_allowed}$ {\bf then}\par +\noindent\qquad\qquad\qquad{\bf begin} $\\{chopped}\gets1$;\par\noindent +\qquad\qquad\qquad{\bf if\/} $\.\#>0$ {\bf then} $\.\#\gets\\{max\_allowed}$ + {\bf else} $\.\#\gets-\\{max\_allowed}$;\par\noindent +\qquad\qquad\qquad{\bf end}\par\noindent +\qquad\qquad\quad{\bf else if\/} $\\{chopped}=0$ {\bf then} + $\\{chopped}\gets-1$ + +\bugonpage D185, old line 22 (12/21/02) + +\ninepoint\noindent +\quad$p\gets\\{cur\_spec}$; $k\gets1$; $\\{chopped}\gets0$; + $\\{dmax}\gets\\{half}(\\{max\_allowed})$; + +\bugonpage D185, old line 28 (12/21/02) + +\ninepoint\noindent +\quad{\bf if\/} $\\{chopped}>0$ {\bf then} + +\bugonpage D196, lines 3--8 (06/25/04) + +The first job is to fix things so that $x(t)$ plus the horizontal +pen offset is an integer multiple of the +current ``granularity'' when the derivative $x'(t)$ crosses through zero. +The given cyclic path contains regions where $x'(t)\ge0$ and regions +where $x'(t)\le0$. The \\{quadrant\_subdivide} routine is called into action +before any of the path coordinates have been skewed, but some of them +may have been negated. In regions where $x'(t)\ge0$ we have $\\{right\_type}=% +\\{first\_octant}$ or $\\{right\_type}=\\{eighth\_octant}$; in regions where +$x'(t)\le0$, +we have $\\{right\_type}=\\{fifth\_octant}$ or $\\{right\_type}=\\{fourth% +\_octant}$. + +\bugonpage D196, lines 15 and 16 (06/25/04) + +\noindent +current pen might be unsymmetric in such a way that $x$ coordinates +should round dif-\break ferently in different parts of the curve. +These considerations imply that round$(x_0)$\cutpar + +\bugonpage D200, line 4 (06/25/04) + +\noindent +and that there are similar ways to address other important offsets.\par +\smallskip\ninepoint +[Also delete the definitions of \\{north\_south\_edge}, etc., +on lines 11--15; those definitions are never used.] + +\bugonpage D212, line 18 (06/25/04) + +\noindent +at $(x_0,y_0)$ and ends at $(x_1,y_1)$, it's possible to +prove (by induction on the length of the truncated\cutpar + +\bugonpage D216, bottom line (06/25/04) + +\noindent +we list it twice (with coordinates +interchanged, so as to make the second octant look like\cutpar + +\bugonpage D217, lines 2--10 (06/25/04) + +\noindent +$$\tabskip\centering +\halign to\hsize{$\hfil#\;\mapsto\;{}$\tabskip=0pt& +$#\hfil$&\quad in the #\hfil\tabskip\centering\cr +w_2\;w_2\;w_2&(-5,6)\;(-5,6)\;(-5,6)\cr +\noalign{\vskip\belowdisplayskip +\vbox{\noindent\strut as the list of transformed and skewed offsets to use +when curves that travel in the second octant. Similarly, we will have\strut} +\vskip\abovedisplayskip} +w_2\;w_2\;w_2&(7,-6)\;(7,-6)\;(7,-6)&third;\cr +w_2\;w_2\;w_3\;w_3&(-7,1)\;(-7,1)\;(-3,2)\;(-3,2)&fourth;\cr +w_3\;w_3\;w_3&(3,-2)\;(3,-2)\;(3,-2)&fifth;\cr +w_3\;w_3\;w_0\;w_0&(-3,1)\;(-3,1)\;(1,0)\;(1,0)&sixth;\cr +w_0\;w_0\;w_0&(1,0)\;(1,0)\;(1,0)&seventh;\cr +w_0\;w_0\;w_0&(-1,1)\;(-1,1)\;(-1,1)&eighth.\cr}$$ + +\bugonpage D218, lines 2 and 3 (06/25/04) + +\noindent +count followed by pointers to the eight offset lists, followed +by an indication of the pen's range of values. + +\bugonpage D218, line 15 (06/25/04) + +The \\{link} field of a pen header node should be \\{null} if and only if +the pen is a single point. + +\bugonpage D227, line 11 (06/25/04) + +\noindent +\\{endpoint}. The cubics all have +monotone-nondecreasing $x(t)$ and $y(t)$. + +\bugonpage D228, lines 4--7 from the bottom (06/25/04) + +\noindent +In odd-numbered octants, the numerator and denominator of this fraction +will be nonnegative; in even-numbered octants they will both be nonpositive. +Furthermore we always have $0=s_0\le s_1\le\cdots\le s_n=\infty$. The goal of +\\{offset\_prep} is to find an offset index~$k$ to associate with +each cubic, such that the slope $s(t)$ of the cubic satisfies + +\bugonpage D231, line 7 (06/25/04) + +\ninepoint\noindent +\quad{\bf if\/} $\\{abs}(\\{du})\ge\\{abs}(\\{dv})$ {\bf then}\quad $\{\, + s_{k-1}\le1$ or $s_k\le1\,\}$ + +\bugonpage D231, line 16 (06/25/04) + +\noindent +and return towards $s_{k-1}$ or $s_k$, +respectively, yielding another solution of $(*)$. + +\bugonpage D246, line 4 from the bottom (06/25/04) + +\noindent +dinate fields. Hence, for example, +the point $\bigl($$\\{x\_coord}(p)-\\{left\_v}(q),\\{y\_coord}(p)+% +\\{right\_u}(p)$$\bigr)$ +also\cutpar + +\bugonpage D248, line 24 (06/25/04) + +\ninepoint\noindent +\qquad{\bf else begin} $\\{beta}\gets\\{minor\_axis}$; + $\\{gamma}\gets\\{major\_axis}$; + $\\{theta}\gets0$; + +\bugonpage D256, line 2 from the bottom (06/25/04) + +\noindent +we have $2^lu_{\min}=2^lu_0+U_{\min}$, etc.; the condition for overlap +reduces to + +\bugonpage D261, line 5 (06/25/04) + +\ninepoint\noindent +\\{tol}: \\{integer};\quad$\{\,$bound on the uncertainty in the overlap test$\,\}$ + +\bugonpage D262, lines 26 and 27 (06/25/04) + +\ninepoint\noindent +\qquad\quad$\\{uv}\gets\\{uv}+\\{int\_packets}$;\quad$\{\,$switch + from \\{l\_packets} to \\{r\_packets}$\,\}$\par\noindent +\qquad\quad$\\{decr}(\\{cur\_tt})$; + $\\{xy}\gets\\{xy}-\\{int\_packets}$;\quad$\{\,$switch + from \\{r\_packets} to \\{l\_packets}$\,\}$ + +\bugonpage D262, line 11 from the bottom (06/25/04) + +\ninepoint\noindent +\qquad$\\{xy}\gets\\{xy}+\\{int\_packets}$;\quad$\{\,$switch + from \\{l\_packets} to \\{r\_packets}$\,\}$ + +\bugonpage D274, line 15 from the bottom (06/25/04) + +\ninepoint\noindent +\qquad\qquad{\bf begin if\/} $\\{serial\_no}>\\{el\_gordo}-\\{s\_scale}$ + {\bf then}\par\noindent +\qquad\qquad\quad$\\{overflow}(\.{"independent\]variables"}, + \\{serial\_no}\mathbin{\hbox{\bf div}}\\{s\_scale})$;\par\noindent +\qquad\qquad$\\{type}(\#)\gets\\{independent}$; + $\\{serial\_no}\gets\\{serial\_no}+\\{s\_scale}$; + $\\{value}(\#)\gets\\{serial\_no}$; + +\bugonpage D309, line 21 (06/25/04) + +\noindent +{\bf670.\quad}We go to \\{restart} instead of to \\{switch}, +because we might enter \\{token\_state} after the error\cutpar + +\bugonpage D314, line 6 from the bottom (06/25/04) + +\noindent +\\{macro\_def} or \\{iteration}). + +\bugonpage D330, line 1 (06/25/04) + +\noindent +{\bf728.\quad}A {\bf suffix} or {\bf text} parameter will have been scanned as +a token list pointed to by \\{cur\_exp},\cutpar + +\bugonpage D354, lines 15 and 16 from the bottom (06/25/04) + +\noindent\hangindent 3em +$\\{cur\_type}=\\{unknown\_boolean}$ means that \\{cur\_exp} points to a +capsule node that is in +a ring of equivalent booleans whose value has not yet been defined. + +\bugonpage D354, lines 11 and 12 from the bottom (06/25/04) + +\noindent\hangindent 3em +$\\{cur\_type}=\\{unknown\_string}$ means that \\{cur\_exp} points to a +capsule node that is in +a ring of equivalent strings whose value has not yet been defined. + +\bugonpage D354, lines 7 and 8 from the bottom (06/25/04) + +\noindent\hangindent 3em +$\\{cur\_type}=\\{unknown\_pen}$ means that \\{cur\_exp} points to a +capsule node that is in +a ring of equivalent pens whose value has not yet been defined. + +\bugonpage D355, lines 1 and 2 (06/25/04) + +\noindent\hangindent 3em +$\\{cur\_type}=\\{unknown\_path}$ means that \\{cur\_exp} points to a +capsule node that is in +a ring of equivalent paths whose value has not yet been defined. + +\bugonpage D355, lines 5 and 6 (06/25/04) + +\noindent\hangindent 3em +$\\{cur\_type}=\\{unknown\_picture}$ means that \\{cur\_exp} points to a +capsule node that is in +a ring of equivalent pictures whose value has not yet been defined. + +\bugonpage D355, lines 21 and 22 (06/25/04) + +\noindent +$\\{cur\_type}=\\{token\_list}$ means that \\{cur\_exp} points to a linked list +of tokens. + +\bugonpage D356, lines 2--3 (06/25/04) + +\noindent +nodes have $\\{name\_type}=\\{capsule}$, +and their \\{type} field is one of the possibilities for \\{cur\_type} +listed above. +Also $\\{link}\le\\{void}$ in capsules that aren't part of a token list. + +\bugonpage D368, line 13 (06/25/04) + +\ninepoint\noindent +\qquad\\{my\_var\_flag}: $0\to\\{max\_command\_code}$;\quad$\{\,$initial + value of \\{var\_flag}$\,\}$ + +\bugonpage D378, line 9 from the bottom (06/25/04) + +\ninepoint\noindent +\qquad\quad{\bf begin} $\\{cur\_type}\gets\\{known}$; + $\\{cur\_exp}\gets0$; + $\\{free\_node}(q,\\{dep\_node\_size})$; + +\bugonpage D380, line 12 (06/25/04) + +\ninepoint\noindent +\qquad\qquad{\bf begin} $\\{type}(r)\gets\\{known}$; + $\\{value}(r)\gets0$; + $\\{free\_node}(p,\\{dep\_node\_size})$; + +\bugonpage D390, lines 2 and 3 (06/25/04) + +\noindent +by a previous operation. We must maintain +the value of $\\{right\_type}(q)$ in cases such as\break +`|..\\{curl2\}z\{0,0\}..|'. + +\bugonpage D437, line 1 (06/25/04) + +\noindent +{\bf996.\quad}And \\{do\_assignment} is similar to \\{do\_equation}: + +\bugonpage D439, line 10 (06/25/04) + +\ninepoint\noindent +\qquad{\bf begin} $\\{nonlinear\_eq}(v,\\{cur\_exp},\\{false})$; + $\\{cur\_type}\gets t$; + {\bf goto} \\{done}; + +\bugonpage D443, line 11 (06/25/04) + +\ninepoint\noindent +\\{done}: {\bf if\/} $\\{eq\_type}(x)\mathbin{\hbox{\bf mod}}\\{outer\_tag} + \ne\\{tag\_token}$ {\bf then} + $\\{clear\_symbol}(x,\\{false})$; + +\bugonpage D452, line 9 (06/25/04) + +\noindent +though they don't necessarily correspond to primitive tokens. + +\bugonpage D476, line 12 from the bottom (06/25/04) + +\ninepoint\noindent +\quad{\bf if\/} $\\{nl}-\\{skip\_table}[c]>128$ {\bf then} + +\bugonpage D483, line 7 (06/25/04) + +\ninepoint\noindent +\quad$\\{max\_tfm\_dimen}\gets16\ast\\{internal}[\\{design\_size}]-1 + -\\{internal}[\\{design\_size}]\mathbin{\hbox{\bf div}}\Oct{10000000}$; + +\bugonpage D483, lines 15--17 (06/25/04) + +\ninepoint\noindent +\qquad{\bf if\/} $x>0$ {\bf then} + $x\gets\\{max\_tfm\_dimen}$ {\bf else} + $x\gets-\\{max\_tfm\_dimen}$;\par\noindent +\qquad{\bf end};\par\noindent +\quad$x\gets\\{make\_scaled}(x\ast16,\\{internal}[\\{design\_size}])$; + +\bugonpage D496, line 2 (06/25/04) + +\noindent +a pointer to +an edge structure. Its mission is to describe the positive pixels +in \.{GF} form,\cutpar + +\bugonpage D500, line 16 (06/25/04) + +\ninepoint\noindent +\quad$\\{selector}\gets\\{old\_setting}$; + $\\{gf\_out}(\\{cur\_length})$; + $\\{gf\_string}(0,\\{make\_string})$; + $\\{decr}(\\{str\_ptr})$; + +\bugonpage D506, lines 8--10 (06/25/04) + +\noindent +\MF\ it says, +for example, `\.{(preloaded base=plain 1984.2.29)}', showing the year, +month, and day that the base file was created. We have $\\{base\_ident}=0$ +before \MF's tables are loaded. + +\bugonpage D514, line 14 from the bottom (06/25/04) + +\noindent +\.{CMMF}, should also be provided for commonly used bases such as \.{cmbase}. + +% volume E +\hsize=29pc + +\newbox\shorthyf \setbox\shorthyf=\hbox{-\kern-.05em} +\mathchardef\period=`\. +{\catcode`\-=\active \global\def-{\copy\shorthyf\mkern3.9mu} + \catcode`\.=\active \global\def.{\period\mkern3mu}} +\def\8#1{\mathrel{\mathcode`\.="8000 \mathcode`\-="8000 + #1\unkern}} % `..' and `--' + +\bugonpage E1, line 3 (01/06/06) + +\tenpoint\noindent +Zillions of alphabets can be generated by the programs in this book. +All\cutpar + +\bugonpage E6, lines 16--19 (12/29/04) + +\textindent\bull + {\it square\_dots\/} tells whether dots should be square, not rounded;\smallskip +\textindent\bull + {\it hefty\/} tells whether weight-reducing strategies should be used;\smallskip +\textindent\bull\hangindent\parindent + {\it monospace\/} tells whether the characters should all be forced to + have the same width; + +\bugonpage E7, line 11 (12/21/02) + +\ninepoint\indent +\\{hair}, \\{vair}, \\{stem}, \\{curve}, \\{ess}, \\{flare}, \\{dot\_size}, + \\{bar}, \\{slab}, + +\bugonpage E7, line 14 (12/21/02) + +\ninepoint\indent +\\{crisp}, \\{tiny}, \\{fine}; +\medskip\noindent +and \\{thin\_join} should not be less than \\{fine}. + +\bugonpage E19, line 19 (11/07/01) + +\tenpoint +\line{\\{cap\_notch\_cut}\hskip 0pt plus1.5fil46/36\hfil31/36\hfil25/36\hfil +24/36\hfil22/36\hskip0pt plus3fil25/36} + +\bugonpage E41, line 8 (12/21/02) + +\ninepoint\noindent\mathchardef\AM="2026 % ampersand +\quad$\\{extra\_endchar}\gets\\{extra\_endchar}\AM + \.{\char`"charcode:=charcode+code\_offset;"}$; + +\bugonpage E53, line 7 (12/21/02) + +\def\frac#1/#2{\leavevmode\kern.1em + \raise.5ex\hbox{\the\scriptfont0 #1}\kern-.1em + /\kern-.15em\lower.25ex\hbox{\the\scriptfont0 #2}} +\ninepoint\noindent +{\bf numeric} \\{mid\_thickness}; + $\\{mid\_thickness}={\rm Vround}$ \frac1/3[$\\{vair},\\{stem}$]; + +\bugonpage E125, line 6 from the bottom (07/10/05) + +\ninepoint\noindent +$\\{top}\,y_1=\\{top}\,y_6=h$; $z_2=.5[z_3,z_1]+\\{bend}$; + +\bugonpage E125, line 3 from the bottom (07/10/05) + +\ninepoint\noindent +{\bf draw} $z_1-\\{flourish\_change}\{\\{up}\}+(0,.15\\{asc\_height}) + \{\\{up}\}$\par +\line{\quad$\8{...}\{\\{right}\}(z_1+(2u,0))\8{---}z_6\8{...}\{\\{down}\}z_7$; + \hfil\% upper bar} + +\bugonpage E146, also pages 164 and 540 (02/08/03) + +\eightpoint\noindent +[The labels on the new illustrations of beta, omega, and spadesuit +are too large, and the resolution of the shapes is too small.] + +\bugonpage E147, line 11 from the bottom (04/23/04) + +\ninepoint\noindent +$x_0=x_1=x_9$; $\\{lft}\,x_{0r}={\rm hround}(1.5u-.5\\{hair})$; +$x_2=x_4=x_6=x_8=.5w-.25u$; + +\bugonpage E147, line 8 from the bottom (04/23/04) + +\ninepoint\noindent +$y_5=.5[y_4,y_6]$; $\\{top}\,y_{6r}-\\{bot}\,y_{4r}=\\{vstem}+\\{eps}$; + $\\{bot}\,y_{8r}=-\\{oo}$; $y_7=y_9=.55[y_6,y_8]$; + +\bugonpage E149, line 8 from the bottom (04/23/04) + +\ninepoint\noindent +$y_5+.1\\{x\_height}=y_7=.5[y_6,y_8]$; $\\{bot}\,y_{6r}=-\\{oo}$; + +\bugonpage E157, line 11 (02/29/08) + +\ninepoint\noindent +\line{{\bf filldraw} $z_{1l}\8{--}z_{2l}\8{...}(x_3,y_{2l})\8{...}z\8{--} + z_{1r}\8{--}\rm cycle$;\hfil\% stem} + +\bugonpage E161, line 7 from the bottom (04/23/04) + +\ninepoint\noindent +$\\{top}\,y_{1r}=\\{x\_height}+\\{oo}$; $y_2=y_4=.5[y_1,y_3]$; + $\\{bot}\,y_{3r}=-\\{oo}$; + +\bugonpage E209, line 3 (12/29/04) + +\ninepoint +\rightline{\% This lowercase italic alphabet was prepared by D. E. Knuth + in December, 1979,} + +\bugonpage E377, lines 3 and 4 from the bottom (12/22/02) + +\ninepoint\noindent +\qquad {\bf path} \\{p\_}; $\\{p\_}=z_{\$\$l}\{z_{@1}-z_{\$\$l}\}\8{...} + \\{darkness}[z_{@1},.5[z_{@2},z_{\$\$l}]]\8{...}z_{@2}$\par\noindent +\qquad\quad$\8{---}z_{\$l}\8{--}z_{\$r}\8{--}z_{@0}\8{--}z_{\$\$r}\8{--}% + {\rm cycle}$;\par\noindent +\qquad{\bf if\/} $(y_{\$\$}>y_\$) \ne ({\rm ypart}\,\hbox{\bf precontrol}\,1 + \,\hbox{\bf of\/}\,\\{p\_} > {\rm ypart}\,\hbox{\bf postcontrol}\,1\, + \,\hbox{\bf of\/}\,\\{p\_})$:\par\noindent +\qquad\quad$\\{p\_}=z_{\$\$l}\{z_{@1}-z_{\$\$l}\}\8{...} + \\{darkness}[z_{@1},.5[z_{@2},z_{\$\$l}]]$\par\noindent +\qquad\qquad$\8{---}z_{\$l}\8{--}z_{\$r}\8{--}z_{@0}\8{--}z_{\$\$r}\8{--}% + {\rm cycle}$;\ {\bf fi}\par\noindent +\line{\qquad {\bf filldraw} \\{p\_};\hfil \% arm and beak} + +\bugonpage E489, bottom line (06/25/04) + +\ninepoint\noindent +{\bf labels}$(1,2,3,4,5,6)$; {\bf endchar};\hfil\break +[Labels `\.5' and `\.6' should also be added to + the lower illustration on page E488.] + +\bugonpage E545, line 11 from the bottom (12/29/04) + +The most important general routine in |cmbase| is probably the {\it pos}\cutpar + +\bugonpage E551, line 3 from the bottom (12/29/04) + +\noindent quantities needed in the |calu| +programs are also established at this time. + + +\bugonpage E577, right column (12/23/02) + +\eightpoint\noindent +\\{p\_}\kern1pt, 305, 377.\par\noindent +{\bf padded}, 103--111, 117--121, $\underline{549}$. + +\bugonpage E578, left column (12/23/02) + +\eightpoint\noindent +{\bf postcontrol}, 347, 377.\par\noindent +{\bf precontrol}, 347, 377. + +\bye diff --git a/Master/texmf-dist/source/generic/knuth/errata/errata.three b/Master/texmf-dist/source/generic/knuth/errata/errata.three new file mode 100644 index 00000000000..5f00f73b22e --- /dev/null +++ b/Master/texmf-dist/source/generic/knuth/errata/errata.three @@ -0,0 +1,1898 @@ +% Bugs (sigh) in Computers \& Typesetting + +\input manmac +\font\sltt=cmsltt10 +\font\niness=cmss9 +\font\ninessi=cmssi9 +\proofmodefalse +\raggedbottom +\output{\hsize=29pc \onepageout{\unvbox255\kern-\dimen@ \vfil}} + +\def\cutpar{{\parfillskip=0pt\par}} + +\def\rhead{Bugs in {\tensl Computers \& Typesetting}} +\def\bugonpage#1(#2) \par{\bigbreak\tenpoint + \hrule width\hsize + \line{\lower3.5pt\vbox to13pt{}Page #1\hfil(#2)}\hrule width\hsize + \nobreak\medskip} +\def\buginvol#1(#2) \par{\bigbreak\penalty-1000\tenpoint + \hrule width\hsize + \line{\lower3.5pt\vbox to13pt{}Volume #1\hfil(#2)}\hrule width\hsize + \nobreak\medskip} +\def\slMF{{\manual 89:;}\-{\manual <=>:}} % slant the logo +\def\0{\raise.7ex\hbox{$\scriptstyle\#$}} +\newcount\nn +\newdimen\nsize \newdimen\msize \newdimen\ninept \ninept=9pt +\newbox\eqbox \setbox\eqbox=\hbox{\kern2pt\eightrm=\kern2pt} + +\noindent This is a list of all corrections made to {\sl Computers \& +Typesetting}, Volumes A--E\null, between the date of publication +(May, 1986) and 15~June 1987. +It also includes corrections made to +the softcover version of {\sl The \TeX book}, beginning with the +sixth printing (January 1986); these are the same as corrections to +Volume~A\null. Corrections to the softcover version of {\sl The +\slMF\kern1ptbook\/} are the same as corrections to Volume~C\null. +% volume A +\bugonpage A7, fourth line from the bottom (6/28/86) + +\tenpoint\line{% +since control sequences of the second kind always have exactly one +symbol after} + +\bugonpage A35, second-last line (1/31/87) + +\rightline{\eightssi He may run who reads.} +\smallskip +\rightline{\eightss--- HABAKKUK 2\thinspace:\thinspace2 (c.~600 B.C.)} +\smallskip +\rightline{\eightssi He that runs may read.} + +\bugonpage A43, lines 8--9 (8/23/86) + +\tenpoint\noindent +of Appendix B\null, which defines |%| to be a special kind of symbol so that you +can use it for comments, defines the control sequence |\%| to mean +a percent sign. + +\bugonpage A45, lines 10--13 (8/23/86) + +\ninepoint\noindent +\TeX\ adds~64. Hence +code 127 can be typed |^^?|, and +the dangerous bend sign can be obtained by saying +|{\manual^^?}|. However, you must change the category code of character +127 before using it, since this character ordinarily has category~15 +(^{invalid}); say, e.g., |\catcode`\^^?=12|. +The |^^| notation is different from |\char|, because |^^|\cutpar + +\bugonpage A76, line 7 (8/23/86) + +\ninepoint +\noindent +and extra space; for example, these quantities are +$3.33333\pt$, $1.66666\pt$, $1.11111\pt$,\cutpar + +\bugonpage A83, bottom line (5/19/87) + +\tenpoint\noindent[This line should be flush right.] + +\bugonpage A111, 7th-last line, right-hand column (2/15/87) + +\ninepoint +if $b=10000$ and $-10000<p<10000$ and $q<10000$; + +\bugonpage A117, second-last line (6/10/87) + +\eightpoint +marks; sometimes also |$\|\||$| ($\Vert$). +You can say, e.g., `|\footnote\dag{...}|'. + +\bugonpage A124, lines 6--11 (2/26/87) + +\begingroup \def\n{\thinspace$n$} +\ninepoint\noindent +of insertion; an additional `|\penalty-10000|' item is assumed +to be present at the end of the vertical list, to ensure that a legal +breakpoint exists.) \ Let $u$ be the natural height plus depth of that +least-cost box, and let $r$ be the penalty associated with the optimum +breakpoint. Decrease $g$ by~$uf$, and increase $q$ by~$r$. \ (If +|\tracingpages||=1|, the log file should now get a cryptic message that says +`|% split|\n\ |to| $v$|,|$u$ |p=|$r$'. For~example, +\begintt +% split254 to 180.2,175.3 p=100 +\endtt +\endgroup + +\bugonpage A158, lines 6--8 (2/20/87) + +\ninepoint\noindent the +second atom, which has subscript~$i$; the superscripts are empty except for the +last atom, whose superscript is~$\overline{n+1}$. This superscript is +itself a math list consisting of one atom, whose nucleus is~$n+1$; and that +nucleus is a math list consisting of three atoms. + +\bugonpage A171, line 20 (1/26/86) + +\ninepoint\line{% +will be surrounded by more space than there would be +if that subformula were enclosed} + +\bugonpage A176, line 1 (8/23/86) + +\ninepoint +You can insert `|\noalign||{|$\langle$vertical mode +material$\rangle$|}|' just after any \kern-1pt|\cr| within\cutpar + +\bugonpage A248, line 17 (6/17/86) + +\ninepoint +`|&|' or `|\span|' or `|\cr|', it needs some way to decide which +alignment is involved.\cutpar + +\bugonpage A249, line 20 (6/17/86) + +\ninepoint\noindent +line (see Chapter~8). +If you don't want a~|\cr| at the end of a certain line, +just type\cutpar + +\bugonpage A276, line 19 (1/27/86) + +\ninepoint\vskip-3pt +\beginsyntax + \alt^|\font|<control sequence><equals><file name><at clause> + \alt<global assignment> +\endsyntax +[The bottom line of p.~276 will now move to the top of p.~277.] + +\bugonpage A277, lines 31--32 (1/27/86) + +\ninepoint +\beginsyntax +<font assignment>\is^|\fontdimen|<number><font><equals><dimen> +\endsyntax + +\bugonpage A286, sixth-last line (4/28/87) + +\ninepoint\noindent +|\sfcode| table as described in Chapter~12; characters numbered 128 +to~255 set the\cutpar + +\bugonpage A287, line 19 (2/15/87) + +\ninepoint +\textindent{$\bull$}|\-|.\enskip +This ``discretionary hyphen'' command is defined in Appendix H. + +\bugonpage A292, lines 9--10 (2/15/87) + +\ninepoint +\textindent{$\bull$}|\-|.\enskip +This command is usually equivalent to `|\discretionary{-}{}{}|'; the `|-|' is +therefore interpreted as a ^{hyphen}, not as a minus sign. +\ (See Appendix~H.) + +\bugonpage A308, lines 25--26 (6/1/87) + +\ninepoint\indent +|\def\appendroman#1#2#3{\edef#1{\csname|\parbreak +| \expandafter\gobble\string#2\romannumeral#3\endcsname}}| + +\bugonpage A312, lines 10--14 (8/23/86) + +\ninepoint +\ansno12.11: The interline glue will be zero, and the natural height is +$1+1-3+2=1\pt$ (because the depth of\/ |\box2| isn't included in the natural +height); so the glue will ultimately become |\vskip-1pt| when it's set. +Thus, |\box3| is $3\pt$ high, $2\pt$ deep, $4\pt$ wide. Its reference +point coincides with that of\/ |\box2|; to get to the reference point +of\/ |\box1| you go up $2\pt$ and right $3\pt$. + +\bugonpage A312, line 21 (8/23/86) + +\ninepoint\noindent +up $4\pt$ to get to the upper left corner of +|\box4|; then down $-1.6\pt$, i.e., up $1.6\pt$, to\cutpar + +\bugonpage A319, line 20 (31/3/87) + +\ninepoint\noindent +make ordinary periods act like |\cdot| symbols: Just define +|\mathcode`.| to be |"0201|,\cutpar + +\bugonpage A328, lines 18--19 (5/14/87) + +\ninepoint\noindent +not performed +while the expansion is taking place, and the control sequences following +|\def| are expanded; so the result is an infinite string +\begintt +A\def A\def A\def A\def A\def A\def A\def A\def A... +\endtt + +\bugonpage A329, lines 14--15 (8/23/86) + +\ninepoint +\ansno20.5: The |##| feature is indispensable when the replacement text of +a definition contains other definitions. For example, consider + +\bugonpage A356, lines 6--7 (1/30/87) + +\ninepoint\noindent +| \spaceskip=.3333em \xspaceskip=.5em\relax}|\hfil\break +|\def\ttraggedright{\tt\rightskip=0pt plus2em\relax}| + +\bugonpage A356, line 33 (6/1/87) + +\ninepoint\noindent +| \vbox to.2ex{\hbox{\char'26}\vss}\hidewidth}}| + +\bugonpage A357, tenth-last line (10/13/86) + +\ninepoint\noindent +|\let\sp=^ \let\sb=_ {\catcode`\_=\active \global\let_=\_}| + +\bugonpage A357, third-last and second-last lines (2/17/87) + +\ninepoint\noindent +|\def\pr@m@s{\ifx'\next\let\nxt\pr@@@s \else\ifx^\next\let\nxt\pr@@@t|% +\hfil\break\strut +| \else\let\nxt\egroup\fi\fi \nxt}| + +\bugonpage A364, fifth-last line (1/30/87) + +\ninepoint\noindent +|\def\fmtname{plain}\def\fmtversion{2.3} % identifies the current format| + +\bugonpage A368, bottom line (2/26/86) + +\ninepoint +\line{that includes the symbols +{\tentex\char'30},~{\tentex\char1}, {\tentex\char'32}, {\tentex\char'34}, +and~{\tentex\char'35}, and he finds that this makes it much more} + +\bugonpage A396, line 13 (8/23/86) + +\ninepoint +| \hyphenpenalty=10000 \exhyphenpenalty=10000| + +\bugonpage A414, line 10 (3/4/86) + +\ninepoint\noindent +|\font\titlefont=cmssdc10 at 40pt % titles in chapter openings| + +\bugonpage A427, line 7 (2/23/86) + +\ninepoint\noindent +the author's book +{\sl Computer Modern Typefaces}.) + +\bugonpage A428, lines 18--20 (6/15/87) + +\tenpoint\noindent +The first eight of these all have essentially the same layout; +but |cmr5| needs no ligatures, and many of the symbols of |cmti10| +have different shapes. +For example, the ^{ampersand} becomes an `^{E.T.}', and the +^{dollar} changes to ^{pound} ^{sterling}: + +\bugonpage A434, lines 25--28 (8/17/86) + +\tenpoint\noindent +from |\nu|~($\nu$). Similarly, +|\varsigma|~($\varsigma$) should not be confused with |\zeta|~($\zeta$). +It turns out that |\varsigma| and |\upsilon| are almost never used in +math formulas; they are included in plain \TeX\ primarily because they are +sometimes needed in short Greek citations (cf.~Appendix~J). + +\bugonpage A447, line 32 (6/1/87) + +\ninepoint\noindent +ters +also affect mathematical typesetting: +dimension parameters + \hbox{|\delimitershortfall|}\cutpar + +\bugonpage A455, new paragraph to follow line 9 (2/15/87) + +\begingroup +\hyphenpenalty=-1000 \pretolerance=-1 \tolerance=1000 +\doublehyphendemerits=-100000 \finalhyphendemerits=-100000 +\ddanger The control sequence ^|\-| is equivalent to +|\discretionary{\char|$\,h$|}{}{}|, where $h$ is the +^|\hyphenchar| of the current font, provided that $h$ lies +between 0 and~255. Otherwise |\-| is equivalent to |\discretionary{}{}{}|. + +\endgroup % end the special hyphenation conventions + +\bugonpage A457, left column, fifth-last line (2/17/87) + +\eightpoint\indent\qquad 155, 201, {\it 305}, 324, $\underline{357}$, 394--395; + +\bugonpage A458, left column, line 6 (2/15/87) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +{\tt\char`\\-} (discretionary hyphen), 95, 283, 287,\par +\indent\qquad 292, $\underline{455}$. + +\bugonpage A458, left column, near the bottom (5/19/87) + +\eightpoint {\tt!} (exclamation point), 51, +{\it 72}, 73, 75, {\it 169}. +\nobreak\medskip\noindent[This saves a line that otherwise would make +the index too long on page 481!] + +\bugonpage A458, right column, line 10 (11/27/86) + +\eightpoint {\tt\char`\~} +(tilde), 38, 51, 343, $\underline{353}$; {\sl see also\/} ties. + +\bugonpage A458, right column (6/14/87) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +{\tt\char`\\accent} (general accent), 9, 54, 86, 283, $\underline{286}$. + +\bugonpage A461, entry for boxes (3/16/87) + +\eightpoint boxes, 63--67, 77--83, 221--229. + +\bugonpage A461, entry for {\tt\char`\\centering} (1/28/86) + +\eightpoint {\tt\char`\\centering}, $\underline{347}$, 348, 362. + +\bugonpage A462, entry for \<code assignment> (1/27/86) + +\eightpoint \<code assignment>, $\underline{277}$. + +\bugonpage A464, left column, line 3 (2/15/87) + +\eightpoint +discretionary hyphens, 28, 95--96, 453, $\underline{455}$. + +\bugonpage A465, right column, line 8 (5/3/87) + +\eightpoint +expansion of expandable tokens, 212--216, 238, + +\bugonpage A466, entry for {\tt\char`\\font}, second line (1/27/86) + +\eightpoint \indent\qquad 271, $\underline{276}$. + +\bugonpage A466, new entry (2/3/87) + +\eightpoint \indent\<fontdef token>, $\underline{271}$. + +\bugonpage A467, entry for {\tt\char`\\hideskip} (1/28/86) + +\eightpoint {\tt\char`\\hideskip}, $\underline{347}$, 348, 354. + +\bugonpage A468, left column line 2 (2/15/87) + +\eightpoint\indent\qquad 351, 395, {\it 414}, 454, 455. + +\bugonpage A470, entry for {\tt manfnt} (1/15/86) + +\eightpoint {\tt manfnt}, 44, 408, 414. + +\bugonpage A471, entry for {\tt\char`\\medbreak} (10/13/86) + +\eightpoint {\tt\char`\\medbreak}, 111, 113, $\underline{353}$, + {\it355}, {\it419}, {\it422}. + +\bugonpage A471, entry for {\tt\char`\\moveright} (2/27/87) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +{\tt\char`\\moveright}, 80--81, {\it 221}, $\underline{282}$. + +\bugonpage A471, entry for Mozart, second line (3/19/86) + +\eightpoint \indent\qquad Gottlieb (= Theophilus = Amadeus), 409. + +\bugonpage A472, the entry for {\tt\char`\\not} (2/12/87) + +\eightpoint\noindent +[The overprinting here is intentional, since {\tt\char`\\not} is a +character of width zero. More than a dozen people have reported this +as an error, but it is not!] + +\bugonpage A477, entry for {\tt\char`\\span} (5/3/87) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +{\tt\char`\\span}, 215, 238, $\underline{243}$, {\it244}, $\underline{245}$, +248, 249,\par +\indent\qquad 282, {\it330}, 385. + +\bugonpage A479, entry for ties, second line (11/27/86) + +\eightpoint \indent\qquad {\it173}, 353, {\it404}. + +\bugonpage A480, changes to various entries (6/14/87) + +\eightpoint +\newbox\astbox \setbox\astbox=\hbox to0pt{\hss\lower1pt\hbox{*}} +\def\prim#1{\par\indent\copy\astbox{\tt\char`\\#1}} +\prim{underline}, {\it130--131}, 141, 291, $\underline{443}$. +\prim{unhbox}, 120, 283, $\underline{285}$, {\it354}, {\it356}, {\it361}, + {\it399}. +\prim{unhcopy}, 120, 283, $\underline{285}$, {\it353}. +\prim{unkern}, $\underline{280}$. +\prim{unpenalty}, $\underline{280}$. +\prim{unskip}, 222--223, $\underline{280}$, 286, {\it313}, {\it392}, + {\it418--419}. +\prim{unvbox}, 120, 254, $\underline{282}$, 286, {\it354}, {\it361}, + {\it363}, {\it364}, {\it392}, {\it399}, {\it417}. +\prim{unvcopy}, 120, $\underline{282}$, 286, {\it361}. +\prim{vadjust}, 95, 105, 109, 110, 117, 259, $\underline{281}$, 393, 454. +\prim{valign}, 249, 283, $\underline{285}$--$\underline{286}$, 302, + {\it335}, {\it397}. +\prim{vcenter}, 150--151, 159, 170, 193, 222, 242, +\prim{vfil}, 71, $\underline{72}$, 111, 256, 281, 286, 417. +\prim{vfill}, 24, 25, 71, $\underline{72}$, 256--257, 281, 286. +\prim{vfilneg}, $\underline{72}$, 111, 281, 286.\par +|\voidb@x|, $\underline{347}$, 348. + +\bugonpage A481, left column (6/14/87) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +{\tt\char`\\vss}, 71, $\underline{72}$, {\it 255}, 281, 286. + +% volume B +\hsize=35pc +\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers +\def\to{\mathrel{.\,.}} % double dot, used only in math mode + +\buginvol B, in general (7/28/86) + +\tenpoint\noindent +[A number of entries were mistakenly omitted from the mini-indexes +on the right-hand pages. Here is a combined list of all the missing +items; you can mount it inside the back cover, say, as a secondary mini-index +when the first one fails\dots\ ] + +\nobreak\medskip +\setbox0=\vbox{\eightpoint \hsize=11pc \catcode`\_=\active \let_=\_ + \rightskip=0pt plus 100pt minus 10pt + \pretolerance 10000 + \hyphenpenalty 10000 \exhyphenpenalty 10000 + \noindent\vbox to1pt{}\par % 1pt = \topskip - \ninept + \def\{\hbox{\bf#1\/}} % boldface type for reserved words + \obeylines + \def\makeref #1 #2 #3#4 + {\nn=#2 \hangindent=1em \noindent\\{#1}% + \if#3:: \else\unhcopy\eqbox \fi#4, \S\number\nn.\par} + \makeref active_base 222 =$1$ + \makeref aux 213 =macro + \makeref begin_name 515 :\&{procedure} + \makeref big_switch 1030 =$60$ + \makeref choice_node 689 =$15$ + \makeref cur_boundary 271 :$0\to \\{save\_size}$ + \makeref cur_c 724 :\\{quarterword} + \makeref cur_group 271 :\\{group\_code} + \makeref cur_i 724 :\\{four\_quarters} + \makeref cur_level 271 :\\{quarterword} + \makeref do_extension 1348 :\&{procedure} + \makeref dvi_buf 595 :\&{array} + \makeref dvi_gone 595 :\\{integer} + \makeref dvi_limit 595 :\\{dvi\_index} + \makeref dvi_offset 595 :\\{integer} + \makeref dvi_ptr 595 :\\{dvi\_index} + \makeref end_graf 1096 :\&{procedure} + \makeref error 82 :\&{procedure} + \makeref error_stop_mode 73 =$3$ + \makeref font_base 12 =$0$ + \makeref font_info 549 :\&{array} + \makeref get_token 365 :\&{procedure} + \makeref glue_base 222 =$2626$ + \makeref half_buf 595 :\\{dvi\_index} + \makeref handle_right_brace 1068 :\&{procedure} + \makeref hash_base 222 =$258$ + \makeref head 213 =macro + \makeref hyf_distance 921 :\&{array} + \makeref hyf_next 921 :\&{array} + \makeref hyf_num 921 :\&{array} + \makeref index 302 =macro + \makeref inf 448 :\\{boolean} + \makeref init_col 788 :\&{procedure} + \makeref init_span 787 :\&{procedure} + \makeref input_ln 31 :\&{function} + \makeref interaction 73 :$0\to 3$ + \makeref limit 302 =macro + \makeref line_width 830 :\\{scaled} + \makeref macro_call 389 :\&{procedure} + \makeref main_control 1030 :\&{procedure} + \makeref mem 116 :\&{array} + \makeref mem_bot 12 =$0$ + \makeref mem_end 118 :\\{pointer} + \makeref mem_top 12 =macro + \makeref mlist_to_hlist 726 :\&{procedure} + \makeref mode 213 =macro + \makeref mode_line 213 =macro + \makeref more_name 516 :\&{function} + \makeref mu 448 :\\{boolean} + \makeref name 302 =macro + \makeref nest 213 :\&{array} + \makeref off_save 1064 :\&{procedure} + \makeref open_log_file 534 :\&{procedure} + \makeref output_active 989 :\\{boolean} + \makeref p 498 :\\{pointer} + \makeref param_stack 308 :\&{array} + \makeref pool_file 50 :\\{alpha\_file} + \makeref pool_ptr 39 :\\{pool\_pointer} + \makeref prefixed_command 1211 :\&{procedure} + \makeref prev_depth 213 =macro + \makeref prev_graf 213 =macro + \makeref prev_prev_r 830 :\\{pointer} + \makeref print_err 73 =macro + \makeref r 960 :\\{trie\_pointer} + \makeref reconstitute 906 :\&{function} + \makeref resume_after_display 1200 :\&{procedure} + \makeref save_ptr 271 :$0\to \\{save\_size}$ + \makeref save_stack 271 :\&{array} + \makeref scan_dimen 448 :\&{procedure} + \makeref scan_math 1151 :\&{procedure} + \makeref short_display 174 :\&{procedure} + \makeref show_node_list 182 :\&{procedure} + \makeref start 302 =macro + \makeref state 302 =macro + \makeref str_pool 39 :\&{packed}\ \&{array} + \makeref str_ptr 39 :\\{str\_number} + \makeref str_start 39 :\&{array} + \makeref tail 213 =macro + \makeref trap_zero_glue 1229 :\&{procedure} + \makeref trie 921 :\&{array} + \makeref trie_char 921 =macro + \makeref trie_link 921 =macro + \makeref trie_op 921 =macro + \makeref vlist_out 629 :\&{procedure} + \makeref write_loc 1345 :\\{pointer} + } +\hbox{\nsize=\ht0 \advance\nsize-\topskip + \divide\nsize by 3 \divide\nsize by\ninept + \multiply\nsize by\ninept \advance\nsize\topskip + \vsplit0 to\nsize \kern1pc + \msize=\ht0 \advance\msize-\topskip + \divide\msize by 2 \divide\msize by\ninept + \multiply\msize by\ninept \advance\msize\topskip + \vbox to\nsize{\vsplit0 to\msize\vss}\kern1pc + \vbox to\nsize{\box0\vss}} + +\buginvol B, in general (4/6/87) + +\tenpoint\noindent[The percent signs in all the comments (for example, +on pages 7 and 50) are in the wrong font! Change `{\tt\%}' to `\%'.] + +\bugonpage Bvi, bottom line, and top line of next page (10/12/86) + +{\hsize=29pc +\tenpoint\noindent +puter Science Report 1097 (Stanford, California, April 1986), 146~pp. +\ {\it The {\sltt WEB} programs for four utility programs that are +often used with \TeX: {\sltt POOLtype}, {\sltt TFtoPL}, +{\sltt PLtoTF}, and {\sltt DVItype}.} +\par} + +\bugonpage B2, line 32 (4/22/87) + +\ninepoint\noindent\hskip10pt +{\bf define} $\\{banner}\equiv\hbox{\tt\char'23}$% +{\tt This\]is\]TeX,\]Version\]2.2\char'23}\quad +$\{\,$printed when \TeX\ starts$\,\}$ + +\bugonpage B7, new line after line 25 (1/28/87) + +\ninepoint\noindent\hskip10pt +{\bf if} $\\{max\_in\_open}\ge128$ {\bf then} $\\{bad}\gets6$; + +\bugonpage B13, first three lines (4/7/87) + +\tenpoint\noindent +The `\\{name}' parameter, which is of type `{\bf packed array +$[\langle\\{any}\rangle]$ of \\{char}}', stands for the name of +the external file that is being opened for input or output. +Blank spaces that might appear in \\{name} are ignored. + +\bugonpage B14, line 30 (4/7/87) + +\tenpoint\noindent +{\bf 31.\quad}% +The \\{input\_ln} function brings the next line of input from the specified +file into available\cutpar + +\bugonpage B18, line 30 (5/22/86) + +\ninepoint\noindent +\\{str\_ptr}: \\{str\_number};\quad +$\{\,$number of the current string being created$\,\}$ + +\bugonpage B21, first line of mini-index, right column (6/14/87) + +\eightpoint +\indent\\{pool\_name}\unhcopy\eqbox|"string"|, \S11. + +\bugonpage B34, lines 5--6 (6/14/87) + +\tenpoint\noindent +to delete a token, and/or if some fatal error +occurs while \TeX\ is trying to fix a non-fatal one. But such recursion +is never more than two levels deep. + +\bugonpage B55, lines 12--13 (4/21/87) + +\ninepoint\noindent\hskip10pt +{\bf if} $r=p$ {\bf then if} $\\{rlink}(p)\ne p$ {\bf then} + $\langle\,$Allocate entire node $p$ and {\bf goto} \\{found}% + {\sevenrm\kern.5em129}$\,\rangle$; + +\bugonpage B57, lines 25--28 (6/14/87) + +\tenpoint\noindent +The first of these has $\\{font}=\\{font\_base}$, and its \\{link} +points to the second; +the second identifies the font and the character dimensions. +The saving feature about oriental characters is that most of them have +the same box dimensions. The \\{character} field of the first \\{char\_node} +is a ``\\{charext}'' that distinguishes between graphic symbols whose +dimensions are identical for typesetting purposes. (See the \MF\ manual.) +Such an extension of \TeX\ would not be difficult; further details are +left to the reader. + +\bugonpage B58, second line of section 136 (7/23/86) + +\tenpoint\noindent +the values corresponding to `|\hbox{}|'. The \\{subtype} field is set to +\\{min\_quarterword}, since that's\cutpar + +\bugonpage B66, lines 2--8 (4/21/87) + +\tenpoint\noindent +location is +more efficient than dynamic allocation when we can get away with it. For +example, locations \\{mem\_bot} to $\\{mem\_bot}+3$ are always used to store the +specification for glue that is `\hbox{\tt 0pt plus 0pt minus 0pt}'. The +following macro definitions accomplish the static allocation by giving +symbolic names to the fixed positions. Static variable-size nodes appear +in locations \\{mem\_bot} through \\{lo\_mem\_stat\_max}, and static +single-word nodes appear in locations \\{hi\_mem\_stat\_min} through +\\{mem\_top}, inclusive. It is harmless to let \\{lig\_trick} and +\\{garbage} share the same location of \\{mem}. + +\bugonpage B67, line 23 (4/13/87) + +\ninepoint\noindent\hskip30pt +$\{\,$previous \\{mem\_end}, \\{lo\_mem\_max}, and \\{hi\_mem\_min}$\,\}$ + +\bugonpage B71, line 17 (4/15/87) + +\ninepoint\noindent\hskip10pt +{\bf begin while} $p>\\{mem\_min}$ {\bf do} + +\smallskip\eightpoint\noindent[Now \\{null} can be removed from the mini-index.] + +\bugonpage B74, line 24 (4/15/87) + +\ninepoint\noindent +{\bf procedure} \\{show\_node\_list}($p\;{:}\;\\{integer}$);\quad +$\{\,$prints a node list symbolically$\,\}$ + +\bugonpage B74, line 33 (4/15/87) + +\ninepoint\noindent\hskip10pt +{\bf while} $p>\\{mem\_min}$ {\bf do} + +\bugonpage B84, line 12 (2/15/87) + +\ninepoint\noindent\hskip10pt +{\bf define} $\\{relax}=0$\quad$\{\,$do nothing ( {\tt\char`\\relax} )$\,\}$ + +\bugonpage B86, third line of section 210 (8/23/86) + +\tenpoint\noindent +that their special nature is easily discernible. +The ``expandable'' commands come first. + +\bugonpage B88, line 23 (5/22/86) + +\ninepoint\noindent +{\bf procedure\/}\ $\\{print\_mode}(m:\\{integer})$;\quad +$\{\,$prints the mode represented by $m\,\}$ + +\bugonpage B93, lines 3--4 (8/17/86) + +{\tenpoint\parindent=1em +In the first region we have 128 equivalents for ``active characters'' that +act as control sequences, followed by 128 equivalents for single-character +control sequences. +\par} + +\bugonpage B130, ninth-last line (5/7/87) + +\tenpoint\noindent +This variable has six possible values: + +\bugonpage B151, line 9 (4/22/87) + +\ninepoint\noindent\hskip20pt +{\bf begin if} $(\\{end\_line\_char}<0)\lor(\\{end\_line\_char}>127)$ + {\bf then} \\{incr}(\\{limit});\par\noindent\hskip20pt +{\bf if} $\\{limit}=\\{start}$ {\bf then}\quad + $\{\,$previous line was empty$\,\}$ + +\bugonpage B160, lines 17--20 (7/28/86) + +\tenpoint\noindent +{\bf 389.\quad}% +After parameter scanning is complete, the parameters are moved to the +\\{param\_stack}. Then the macro body is fed to the scanner; in other words, +\\{macro\_call} places the defined text of the control sequence at the +top of\/ \TeX's input stack, so that \\{get\_next} will proceed to read it +next. + +\bugonpage B200, top line (5/5/87) + +\tenpoint\noindent{\bf 495.\quad}% + When we begin to process a new {\tt\char`\\if}, we set +$\\{if\_limit}\gets\\{if\_code}$; then +if\/ {\tt\char`\\or} or {\tt\char`\\else} or {\tt\char`\\fi}\cutpar + +\bugonpage B217, lines 15--16 (6/14/87) + +\tenpoint\noindent +|DVI| format. + +\bugonpage B224, lines 4--7 of section 560 (10/22/86) + +\tenpoint\noindent +name and area strings \\{nom} and \\{aire}, and the +``at'' size~$s$. If $s$~is negative, it's the negative of a scale factor +to be applied to the design size; $s=-1000$ is the normal case. +Otherwise $s$ will be substituted for the design size; in this +case, $s$ must be positive and less than $2048\rm\,pt$ +(i.e., it must be less than $2^{27}$ when considered as an integer). + +\bugonpage B224, second-last line (4/28/87) + +\ninepoint\noindent +\\{done}: {\bf if} \\{file\_opened} {\bf then} \\{b\_close}(\\{tfm\_file});\par +\noindent\hskip10pt $\\{read\_font\_info}\gets g$; + +\bugonpage B255, mini-index at the bottom (4/15/87) + +\eightpoint +$\\{mag}=\rm macro$, \S236. + +\bugonpage B257, lines 11--13 (6/14/87) + +\ninepoint +\noindent\hskip20pt{\bf if} $c\ge\\{qi}(128)$ {\bf then} + \\{dvi\_out}(\\{set1});\par +\noindent\hskip20pt\\{dvi\_out}(\\{qo}($c$)); + +\bugonpage B260, lines 7--8 (4/15/87) + +\tenpoint\noindent\hskip10pt +In the case of \\{c\_leaders} (centered leaders), we want to increase \\{cur\_h} +by half of the excess space not occupied by the leaders; and in the +case of \\{x\_leaders} (expanded leaders) we increase\cutpar + +\bugonpage B267, mini-index at the bottom (4/15/87) + +\eightpoint +\\{cur\_s}: \\{integer}, \S616. +$\\{mag}=\rm macro$, \S236. +$\\{pop}=142$, \S586. + +\bugonpage B271, line 10 (8/23/86) + +\tenpoint\noindent +which will be ignored in the calculations +because it is a highly negative number. + +\bugonpage B285, lines 23 and 24 (5/4/87) + +\tenpoint\noindent +the current string would be `{\tt.\char`\^.\char`\_/}' +if $p$ points to the \\{ord\_noad} for $x$ in the (ridiculous) formula +`{\tt\char`\\sqrt\char`\{a\char`\^\char`\{\char`\\mathinner\char`\{% +b\char`\_\char`\{c\char`\\over x+y\char`\}\char`\}\char`\}\char`\}\char`\$}'. + +\bugonpage B296, lines 3--5 (5/8/87) + +\tenpoint\noindent +box~$b$ and +changes it so that the new box is centered in a box of width~$w$. +The centering is done by putting {\tt\char`\\hss} glue at the left and right +of the list inside $b$, then packaging the new box; thus, the +actual box might not really be centered, if it already contains +infinite glue. + +\bugonpage B346, line 19 (5/19/87) + +\ninepoint\noindent +\\{pass\_number}: \\{halfword};\quad +$\{\,$the number of passive nodes allocated on this pass$\,\}$ + +\bugonpage B350, lines 36 and 37 (1/28/87) + +\ninepoint\noindent +$v$: \\{pointer};\quad +$\{\,$points to a glue specification or a node ahead of \\{cur\_p}$\,\}$ +\par\noindent +$t$: \\{integer};\quad +$\{\,$node count, if \\{cur\_p} is a discretionary node$\,\}$ + +\bugonpage B353, lines 8--22 (1/28/87) + +\ninepoint +\noindent\hskip10pt$s\gets\\{cur\_p}$;\par +\noindent\hskip10pt{\bf if} $\\{break\_type}>\\{unhyphenated}$ {\bf then} + {\bf if} $\\{cur\_p}\ne\\{null}$ {\bf then}\par +\noindent\hskip30pt$\langle\,$Compute the discretionary + \\{break\_width} values{\sevenrm\kern.5em840}$\,\rangle$;\par +\noindent\hskip10pt{\bf while} $s\ne\\{null}$ {\bf do}\par +\noindent\hskip30pt\vdots\hskip30pt [as before, but indented one less notch]\par +\noindent\hskip10pt{\bf end}; + +\bugonpage B354, line 6 (1/28/87) + +\tenpoint\noindent +will be the background plus $l_1$, so the length from \\{cur\_p} to \\{cur\_p} +should be $\gamma+l_0+l_1-l$, +minus the length of nodes that will be discarded after the discretionary break. + +\bugonpage B354, lines 12--18 (1/28/87) + +\ninepoint +\noindent\hskip10pt{\bf begin} $t\gets\\{replace\_count}(\\{cur\_p})$;\kern5pt + $v\gets\\{cur\_p}$;\kern5pt $s\gets\\{post\_break}(\\{cur\_p})$;\par +\noindent\hskip10pt{\bf while} $t>0$ {\bf do}\par +\noindent\hskip20pt{\bf begin} $\\{decr}(t)$;\kern5pt + $v\gets\\{link}(v)$;\kern5pt + $\langle\,$Subtract the width of node $v$ from \\{break\_width}% + {\sevenrm\kern.5em841}$\,\rangle$;\par +\noindent\hskip20pt{\bf end};\par +\noindent\hskip10pt{\bf while} $s\ne\\{null}$ {\bf do}\par +\noindent\hskip20pt{\bf begin} $\langle\,$Add the width of + node $s$ to \\{break\_width} and increase $t$, unless it's + discardable{\sevenrm\kern.5em842}$\,\rangle$;\par + +\bugonpage B354, new line after line 21 (1/28/87) + +\ninepoint\noindent\hskip10pt +{\bf if} $t=0$ {\bf then} $s\gets\\{link}(v)$;\quad + $\{\,$more nodes may also be discardable after the break$\,\}$ + +\bugonpage B354, lines 26--34 (1/28/87) + +\ninepoint\noindent +[Change `$s$' to `$v$' throughout this section (8 times).] + +\bugonpage B354, line 9 from the bottom (1/28/87) + +\tenpoint\noindent{\bf 842.\quad}% +\ninepoint$\langle\,$Add the width of + node $s$ to \\{break\_width} and increase $t$, unless it's + discardable{\sevenrm\kern.5em842}$\,\rangle\equiv$ + +\bugonpage B355, lines 1--3 (1/28/87) + +\ninepoint +\noindent\hskip20pt$\\{hlist\_node},\\{vlist\_node},\\{rule\_node}$: + $\\{break\_width}[1]\gets\\{break\_width}[1]+\\{width}(s)$;\par +\noindent\hskip20pt\\{kern\_node}: {\bf if} $(t=0)\land + (\\{subtype}(s)\ne\\{acc\_kern})$ {\bf then} + $t\gets-1$\quad$\{\,$discardable$\,\}$\par +\noindent\hskip30pt{\bf else} $\\{break\_width}[1]\gets + \\{break\_width}[1]+\\{width}(s)$;\par +\noindent\hskip20pt{\bf othercases} + \\{confusion}({\tt\char'42 disc2\char'42})\par +\noindent\hskip20pt{\bf endcases};\par +\noindent\hskip10pt$\\{incr}(t)$ + +\bugonpage B355, patches to mini-index at bottom (1/28/87) + +\eightpoint +$\\{acc\_kern}=2$, \S155.\par +$\\{incr}=\rm macro$, \S16.\par +$t$: \\{integer}, \S830.\par +$v$: \\{pointer}, \S830. + +\bugonpage B372, lines 12--14 (1/28/87) + +\ninepoint +\noindent\hskip40pt$\langle\,$Change discretionary to compulsory + and set $\\{disc\_break}\gets\\{true}${\sevenrm\kern.5em882}$\,\rangle$\par +\noindent\hskip30pt{\bf else if\/} $(\\{type}(q)=\\{math\_node})\lor + (\\{type}(q)=\\{kern\_node})$ {\bf then} $\\{width}(q)\gets0$; + +\bugonpage B380, fifth-last line (5/7/87) + +\begingroup\tenpoint\noindent\def\!{\kern-1pt}\def\.#1{\hbox{\tt#1}} +\.b and \.c, the two patterns with and without hyphenation are +$\.a\,\.b\,\.-\,\.{c\!d}\,\.{e\!f}$ and $\.a\,\.{b\!c}\,\.{d\!e}\,\.f$. +Thus the\cutpar\endgroup + +\bugonpage B386, lines 2--4 (5/21/87) + +\tenpoint\noindent +hyphenation, +\TeX\ first looks to see if it is in the user's exception dictionary. If not, +hyphens are inserted based on patterns that appear within the given word, +using an algorithm due to Frank~M. Liang. + +\bugonpage B397, line 28 (5/21/87) + +\tenpoint\noindent +$h=z-c$. It follows that location \\{trie\_max} will +never be occupied in \\{trie}, and we will have\cutpar + +\bugonpage B415, the mini-index (4/6/87) + +\eightpoint\noindent[Delete the spurious entry for `$c$'.] + +\bugonpage B419, mini-index entry for \\{c} (4/6/87) + +\eightpoint $c$: \\{integer}, \S994. + +\bugonpage B422, line 24 (8/23/86) + +\ninepoint\noindent +\hskip20pt\\{prev\_p}: \\{pointer};\quad +$\{\,$predecessor of $p\,\}$ + +\bugonpage B435, line 16 (10/12/86) + +\ninepoint\noindent +\hskip20pt$\\{width}(p)\gets\\{font\_info}[k].\\{sc}$;\quad +$\{\,$that's \\{space}$(f)\,\}$\par\noindent +\hskip20pt$\\{stretch}(p)\gets\\{font\_info}[k+1].\\{sc}$;\quad +$\{\,$and \\{space\_stretch}$(f)\,\}$\par\noindent +\hskip20pt$\\{shrink}(p)\gets\\{font\_info}[k+2].\\{sc}$;\quad +$\{\,$and \\{space\_shrink}$(f)\,\}$\par +\smallskip\eightpoint\noindent +[And the mini-index gets three new entries: +$\\{space}=macro$, \S558. +$\\{space\_shrink}=macro$, \S558. +$\\{space\_stretch}=macro$, \S558.] + +\bugonpage B495, lines 18 and 19 (2/15/87) + +\ninepoint\noindent +[delete these lines, since the cases cannot occur] + +\bugonpage B510, line 8 (12/15/86) + +\ninepoint\noindent\hskip30pt +({\tt"Pretend\]that\]you're\]Hercule\]Poirot:\]Examine\]all\]clues,"}) + +\bugonpage B527, new line to follow line 13 (6/17/86) + +{\tenpoint\parindent=1em +This program doesn't bother to close the input files that may still be open. +\par} + +\bugonpage B534, fourth-last line (5/4/87) + +\ninepoint\noindent\hskip10pt +{\bf define} $\\{write\_stream}(\hbox{\tt\char`\#})\equiv\\{info}( + \hbox{\tt\char`\#}+1)$\quad $\{\,$stream number (0 to 17)$\,\}$ + +\bugonpage B544, left column (1/28/87) + +\eightpoint +\leftline{\\{acc\_kern}:\quad$\underline{155}$, 191, 837, 842, 879, 1125.} + +\bugonpage B546, entry for \\{c} (4/6/87) + +\eightpoint\noindent[Add a reference to section $\underline{994}$.] + +\bugonpage B547, left column (4/7/87) + +\eightpoint +\leftline{\\{char}:\quad 19, 26--27, 520, 534.} + +\bugonpage B547, left column (6/14/87) + +\eightpoint +\leftline{Chinese characters:\quad 134, 585.} + +\bugonpage B553, entry for \\{font\_base} (6/14/87) + +\eightpoint\noindent[Insert a reference to section 134.] + +\bugonpage B555, right column, new entry (10/25/86) + +\eightpoint +\leftline{{\tt Huge page...},\quad 641.} + +\bugonpage B556, entry for \\{incr} (1/28/87) + +\eightpoint\noindent[Add a reference to section 842.] + +\bugonpage B557, entry for \\{is\_char\_node} (1/28/87) + +\eightpoint\noindent[Delete the reference to section 881.] + +\bugonpage B557, right column (6/14/87) + +\eightpoint +\leftline{Japanese characters:\quad 134, 585.} + +\bugonpage B560, right column (1/28/87) + +\eightpoint +\leftline{\\{max\_in\_open}:\quad$\underline{11}$, 14, 304, 328.} + +\bugonpage B561, left column, line 10 (4/15/87) + +\eightpoint +\leftline{\qquad 169--172, 174, 178, 182, 1249, 1312, 1334.} + +\bugonpage B561, left column (5/1/87) + +\eightpoint +\leftline{{\tt Missing font identifier}:\quad 577.} + +\bugonpage B563, left column, line 2 (4/15/87) + +\eightpoint +\leftline{\qquad 136, 145, 149--154, 164, 168--169, 175--176, 182,} + +\bugonpage B563, right column (6/14/87) + +\eightpoint +\leftline{oriental characters:\quad 134, 585.} + +\bugonpage B569, right column, in appropriate places (10/12/86) + +\eightpoint +\leftline{\\{space}:\quad 547, $\underline{558}$, 752, 755, 1042.} +\leftline{\\{space\_shrink}:\quad 547, $\underline{558}$, 1042.} +\leftline{\\{space\_stretch}:\quad 547, $\underline{558}$, 1042.} + +\bugonpage B570, third-last line (1/28/87) + +\eightpoint\noindent\qquad + 786, 795, 809, 819--820, 822, 837, 842--844, 866, + +\bugonpage B571, right column (10/25/86) + +\eightpoint +\leftline{{\tt The following...deleted},\quad 641, 992, 1121.} + +\bugonpage B571, right column (4/7/87) + +\eightpoint +\leftline{\\{text\_char}:\quad $\underline{19}$, 20, 25, 47.} + +\bugonpage B573, right column (5/1/87) + +\eightpoint\noindent +[Delete the entry for `{\tt Undefined font code}'.] + +\bugonpage B576, line 2 (1/28/87) + +\ninepoint\noindent +$\langle\,$Add the width of + node $s$ to \\{break\_width} and increase $t$, unless it's + discardable{\sevenrm\kern.5em842}$\,\rangle$\par +\noindent\qquad {\eightpoint Used in section 840.} + +\bugonpage B591, line 6 from the bottom (1/28/87) + +\ninepoint\noindent + $\langle\,$Subtract the width of node $v$ from \\{break\_width}% + {\sevenrm\kern.5em841}$\,\rangle$\quad + {\eightpoint Used in section 840.} + +% volume C +\hsize=29pc +\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers + +\bugonpage C14, top two lines (3/16/87) + +\danger The recursive midpoint rule for curve-drawing was discovered in 1959 +by Paul de Casteljau, who showed that the curve could be described +algebraically by the remarkably simple formula + +\bugonpage C54, sixth-last to fourth-last lines (10/13/86) + +\ninepoint Jonathan H. Quick (a student) used `|a.plus1|' as the name +of a variable at the beginning of his program; later he said `|let| +|plus=+|'. How could he refer to the variable `|a.plus1|' after that? + +\bugonpage C76, line 14 (10/13/86) + +\tenpoint +\newdimen\longesteq +\setbox0=\hbox{\indent$z_{12}-z_{11}=z_{14}-z_{13}$\quad} +\longesteq=\wd0 +\noindent\hbox to \longesteq{\indent + $x_4=w-.01\\{in}$\hfil}% +Point 4 should be one-hundredth of an inch inside\cutpar + +\bugonpage C103, line 12 (10/12/86) + +\tenpoint +$\\{ht}\0=\\{body\_height}\0$; \ $.5[\\{ht}\0,-\\{dp}\0]=\\{axis}\0$; + +\bugonpage C105, line 13 (10/13/86) + +\ninepoint +The vertical line just to the right of the italic left parenthesis +shows the italic\cutpar + +\bugonpage C113, lines 20--27 (8/23/86) + +{\catcode`\@=\active +\def@#1@{\begingroup\def\_{\kern.04em + \vbox{\hrule width.3em height .6pt}\kern.08em}% + \ifmmode\mathop{\bf#1}\else\hbox{\bf#1\/}\fi\endgroup} +\danger The command `@erase@ @fill@ $c$' is an abbreviation for +`@cullit@; @unfill@~$c$; @cullit@'; this zeros out the pixel values inside +the cyclic path~$c$, and sets other pixel values to~1 if they were positive +before erasing took place. \ (It works because the initial @cullit@ makes +all the values 0 or~1, then the @unfill@ changes the values inside~$c$ +to 0 or negative. The final @cullit@ gets rid of the negative values, +so that they won't detract from future filling and drawing.) \ You can +also use `@draw@', `@filldraw@', or `@drawdot@' with `@erase@'; for example, +`@erase@ @draw@~$p$' is an abbreviation for `@cullit@; @undraw@~$p$; +@cullit@', which uses the currently-picked-up pen as if it were an +eraser applied to path~$p$. + +} + +\bugonpage C124, line 9 (6/17/86) + +\eightpoint +\noindent\hskip1.8in +$\\{branch}_2=\\{flex}((30,570),(10,590),(-1,616))$ + +\bugonpage C130, 3rd-last line (9/25/86) + +\ninepoint\noindent +{\sl Geometry\/ \bf 1} (1986), 123--140]: Given a sequence + +\bugonpage C144, sixth line of the program (8/23/86) + +\ninepoint\noindent\hbox to\parindent{\hfil\sevenrm6\ \ \ }% +$y_2=.1h$; \ $\\{top}\,y_3=.4h$; + +\bugonpage C148, the line before the illustration (11/27/86) + +\ninepoint\noindent +are polygons with 32 and 40 sides, respectively: + +\smallskip\noindent +[New illustrations are needed here, since \MF\ version 1.3 improves +the accuracy of pen polygons.] + +\bugonpage C149, 7th line after the illustration (10/24/86) + +\ninepoint +\line{$(200,y+100\pm\alpha)$, where +$\alpha=\sqrt5/4\approx0.559$. If we digitize these outlines and fill the} + +\bugonpage C178, second-last line (8/23/86) + +\ninepoint\noindent +(If $t_3=t_1$~transum~$t_2$, then +$z$~transformed~$t_3=z$~transformed~$t_1+z$~transformed~$t_2$,\cutpar + +\bugonpage C198, fifth-last and fourth-last lines (10/13/86) + +\ninepoint\vskip-3pt +\begindisplay +$\\{top}\,y_2={\rm round}(\\{top}\,\beta)$. +\enddisplay +Such operations occur frequently in practice, so plain \MF\ provides +convenient\cutpar + +\bugonpage C212, lines 9--11 from the bottom (8/23/86) + +\ninepoint +\qquad + \alt\[point]\<numeric expression>\[of]\<path primary>\continuerule + \alt\[precontrol]\<numeric expression>\[of]\<path primary>\continuerule + \alt\[postcontrol]\<numeric expression>\[of]\<path primary> + +\bugonpage C233, lines 13--14 (2/15/87) + +\ninepoint\noindent +one column of white +pixels, if the character is $2a$ pixels wide, because the right edge of +black pixels is specified here to have the $x$~coordinate $2a-1$. + +\bugonpage C247, lines 23--25 (11/27/86) + +\ninepoint +\ansno 16.2: + `{\bf pencircle} scaled 1.06060' is the diamond but +`{\bf pencircle} scaled 1.06061' is~the square. \ (This assumes that +$\\{fillin}=0$. If, for example, $\\{fillin}=.1$, the change doesn't +occur until the diameter is 1.20204.) \ The next change is at diameter +1.5, which\cutpar + +\bugonpage C262, lines 1--4 (7/28/86) + +\ninepoint +When we come to macros whose use has not yet been explained---for +example, somehow |softjoin| and |stop| never made it +into Chapters 1 through~27---we shall consider them from a user's +viewpoint. But most of the comments that follow are addressed to a +potential base-file designer. + +\bugonpage C266, line 16 (8/17/86) + +\ninepoint\noindent +variables; they have the side effect of changing the variable's value. + +\bugonpage C276, line 26 (6/23/86) + +\ninepoint +\noindent +| if charic<>0: r((w+charic*hppp,h.o_),(w+charic*hppp,.5h.o_)); fi| + +\bugonpage C286, lines 24--26 (10/13/86) + +\ninepoint\noindent +but \MF\ won't let you. And even if this had worked, it wouldn't have +solved the problem; it would simply have put |ENDFOR| into the +replacement text of |ast|, because expansion is inhibited when the +replacement text is being read. + +\bugonpage C290, line 1 (8/23/86) + +\ninepoint \noindent{\it 2.\enspace Fortuitous loops.\enspace}% +The `^{max}' and `^{min}' macros in Appendix~B make use of the fact\cutpar + +\bugonpage C298, third-last line (8/23/86) + +\ninepoint +$t[\,u_1,\ldots,u_n]\;=\;t\bigl[t[u_1,\ldots,u_{n-1}],t[u_2,\ldots,u_n]\,\bigr]$ + +\bugonpage C304, 14th-last line (2/15/87) + +\ninepoint\noindent +[replace this `|\smallskip|' by a |\smallskip| between lines!] + +\bugonpage C307, fifth-last line (12/7/86) + +\ninepoint +{\def\_{\kern.04em + \vbox{\hrule width.3em height .6pt}\kern.08em}% +\bf adjust\_fit}(\<left sidebearing adjustment>,\thinspace + \<right sidebearing adjustment>); + +\bugonpage C312, line 34 (10/12/86) + +\ninepoint\noindent +|params[2] = "sans_params"; fontname[2] = "cmssbx10";| + +\bugonpage C316, lines 19--21 (8/17/86) + +\ninepoint\noindent +example, +`|(some| |charht| |values| |had| |to| |be| |adjusted| |by| |as| |much| +|as| |0.12pt)|' means that~you had too many different nonzero heights, but +\MF\ found a way to reduce the number to at most~15 by changing some of +them; none of them had to be\cutpar + +\bugonpage C319, line 3 (8/23/86) + +\ninepoint\noindent +specified by saying, e.g., + +\bugonpage C321, line 6 (7/28/86) + +\ninepoint\noindent +| special "identifier " & font_identifier_;| + +\bugonpage C334, line 2 (6/23/86) + +\ninepoint\noindent +| currentpicture := currentpicture shifted-(1,1); pix := currentpicture;| + +\bugonpage C339, tenth-last line (2/4/87) + +\ninepoint\noindent +| Jackie K\=aren {\L}au\.ra Mar{\'\i}a N\H{a}ta{\l}{\u\i}e {\O}ctave| + +\bugonpage C343, second-last line (8/23/86) + +\rightline{\eightssi +the precise needs of a precise but limited intellectual goal.} + +\bugonpage C346, 2nd line of entry for `{\tt;}' (1/12/87) + +\eightpoint +\qquad 217, 223--224, 263, 312. + +\bugonpage C348, line 6 (6/17/86) + +\eightpoint +concatenation, of paths, {\eightit 70--71}, {\eightit 123}, 127, + +\bugonpage C348, just before `debugging' (3/16/87) + +\eightpoint +de Casteljau, Paul de Faget, 14. + +\bugonpage C348, right column (3/16/87) + +\eightpoint\noindent +[The entry for `|define_whole_vertical_blacker_pixels|' should be moved up +before the entry for `|define_whole_vertical_pixels|'.] + +\bugonpage C352, left column (6/1/87) + +\eightpoint\indent\hbox to0pt{\hss\lower1pt\hbox{*}}% +{\tt kern}, {\it 97}, {\it 316}, $\underline{317}$. + +\bugonpage C352, right column (3/8/87) + +\eightpoint\noindent +[The entry for `|lowres|' belongs before the entry for `|lowres_fix|'.] + +\bugonpage C353, left column (3/8/87) + +\eightpoint\noindent +[The entries for `|mode|' and `\<mode command>' belong before the entry +for `|mode_def|'.] + +\bugonpage C353, entry for {\tt mode\char`\_def} (8/17/86) + +\eightpoint +{\tt mode\char`\_def}, 94, 189, $\underline{\smash{\hbox{\it 270}}}$, +{\it 278--279}. + +\bugonpage C355, right column (4/15/86) + +\eightpoint\noindent +[The entry for `{\tt rulepen}' belongs before the entry for `rules'.] + +\bugonpage C355, right column (8/5/86) + +\eightpoint +{\tt screenstrokes}, 191, $\underline{277}$. + +\bugonpage C355, 2nd line of entry for `semicolons' (1/12/87) + +\eightpoint +\qquad 217, 223--224, 263, 312. + +\bugonpage C356, full names for the Stanfords (4/10/86) + +\eightpoint +Stanford, Amasa Leland, 340. + +Stanford, Jane Elizabeth Lathrop, 340. + +% Volume D +\hsize=35pc +\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers +\def\to{\mathrel{.\,.}} % double dot, used only in math mode + +\buginvol D, in general (7/28/86) + +\tenpoint\noindent +[A number of entries were mistakenly omitted from the mini-indexes +on the right-hand pages. Here is a combined list of all the missing +items; you can mount it inside the back cover, say, as a secondary mini-index +when the first one fails\dots\ ] + +\nobreak\medskip +\setbox0=\vbox{\eightpoint \hsize=11pc \catcode`\_=\active \let_=\_ + \rightskip=0pt plus 100pt minus 10pt + \pretolerance 10000 + \hyphenpenalty 10000 \exhyphenpenalty 10000 + \noindent\vbox to1pt{}\par % 1pt = \topskip - \ninept + \def\{\hbox{\bf#1\/}} % boldface type for reserved words + \obeylines + \def\makeref #1 #2 #3#4 + {\nn=#2 \hangindent=1em \noindent\\{#1}% + \if#3:: \else\unhcopy\eqbox \fi#4, \S\number\nn.\par} + \makeref add_or_subtract 930 :\&{procedure} + \makeref after 427 :\&{array} + \makeref arg_list 720 :\\{pointer} + \makeref b 580 :\\{pixel\_color} + \makeref bad_exp 824 :\&{procedure} + \makeref before 427 :\&{array} + \makeref begin_name 770 :\&{procedure} + \makeref bilin1 968 :\&{procedure} + \makeref binary_mac 863 :\&{procedure} + \makeref blank_rectangle 567 :\&{procedure} + \makeref boc_c 1162 :\\{integer} + \makeref boc_p 1162 :\\{integer} + \makeref cf 298 :\\{fraction} + \makeref clockwise 453 :\\{boolean} + \makeref ct 298 :\\{fraction} + \makeref cubic_intersection 556 :\&{procedure} + \makeref cur_pen 403 :\\{pointer} + \makeref cur_rounding_ptr 427 :$0\to \\{max\_wiggle}$ + \makeref cur_spec 403 :\\{pointer} + \makeref cur_x 389 :\\{scaled} + \makeref cur_y 389 :\\{scaled} + \makeref dely 557 :\\{integer} + \makeref dep_finish 935 :\&{procedure} + \makeref dep_list 587 =macro + \makeref dimen_head 1125 :\&{array} + \makeref dx 495 :\\{integer} + \makeref dy 495 :\\{integer} + \makeref d1 464 :$0\to 1$ + \makeref end_name 772 :\&{procedure} + \makeref eqtb 201 :\&{array} + \makeref error_stop_mode 68 =$3$ + \makeref firm_up_the_line 682 :\&{procedure} + \makeref get_next 667 :\&{procedure} + \makeref gf_buf 1152 :\&{array} + \makeref gf_offset 1152 :\\{integer} + \makeref gf_ptr 1152 :\\{gf\_index} + \makeref halfword 156 =$\\{min\_halfword}\to \\{max\_halfword}$ + \makeref hash 201 :\&{array} + \makeref index 629 =macro + \makeref input_ln 30 :\&{function} + \makeref interaction 68 :$0\to 3$ + \makeref j 357 :$0\to \\{move\_size}$ + \makeref known_pair 872 :\&{procedure} + \makeref limit 629 =macro + \makeref m_spread 357 :\\{integer} + \makeref materialize_pen 865 :\&{procedure} + \makeref max_allowed 403 :\\{scaled} + \makeref max_c 813 :\&{array} + \makeref max_link 813 :\&{array} + \makeref max_tfm_dimen 1130 :\\{scaled} + \makeref mem_top 12 =macro + \makeref mem 159 :\&{array} + \makeref memory_word 156 =\&{record} + \makeref more_name 771 :\&{function} + \makeref m1 464 :\\{integer} + \makeref n 580 :\\{screen\_col} + \makeref n_sin_cos 145 :\&{procedure} + \makeref name 629 =macro + \makeref negate_dep_list 904 :\&{procedure} + \makeref new_knot 871 :\&{function} + \makeref node_to_round 427 :\&{array} + \makeref n1 464 :\\{integer} + \makeref octant_dir 395 :\&{array} + \makeref o1 453 :\\{small\_number} + \makeref o2 453 :\\{small\_number} + \makeref paint_row 568 :\&{procedure} + \makeref param 1096 :\&{array} + \makeref param_stack 633 :\&{array} + \makeref path_length 916 :\&{function} + \makeref perturbation 1119 :\\{scaled} + \makeref phi 542 :\\{angle} + \makeref pool_ptr 38 :\\{pool\_pointer} + \makeref post_head 843 :\\{pointer} + \makeref pre_head 843 :\\{pointer} + \makeref print_err 68 =macro + \makeref print_macro_name 722 :\&{procedure} + \makeref quarterword 156 =$0\to 255$ + \makeref recycle_value 809 :\&{procedure} + \makeref row_transition 579 :\\{trans\_spec} + \makeref scan_text_arg 730 :\&{procedure} + \makeref scroll_mode 68 =$2$ + \makeref set_controls 299 :\&{procedure} + \makeref sf 298 :\\{fraction} + \makeref show_context 635 :\&{procedure} + \makeref sorted 325 =macro + \makeref st 298 :\\{fraction} + \makeref start 629 =macro + \makeref start_sym 1077 :\\{halfword} + \makeref str_pool 38 :\&{packed}\ \&{array} + \makeref str_ptr 38 :\\{str\_number} + \makeref str_start 38 :\&{array} + \makeref take_part 910 :\&{procedure} + \makeref tfm_changed 1130 :\\{integer} + \makeref tol 557 :\\{integer} + \makeref tt 843 :\\{small\_number} + \makeref tx 954 :\\{scaled} + \makeref txx 954 :\\{scaled} + \makeref txy 954 :\\{scaled} + \makeref ty 954 :\\{scaled} + \makeref tyx 954 :\\{scaled} + \makeref tyy 954 :\\{scaled} + \makeref unsorted 325 =macro + \makeref uv 557 :$0\to \\{bistack\_size}$ + \makeref xy 557 :$0\to \\{bistack\_size}$ + \makeref x1 542 :\\{scaled} + \makeref x2 542 :\\{scaled} + \makeref x3 542 :\\{scaled} + \makeref y1 542 :\\{scaled} + \makeref y2 542 :\\{scaled} + \makeref y3 542 :\\{scaled} + } +\hbox{\nsize=\ht0 \advance\nsize-\topskip + \divide\nsize by 3 \divide\nsize by\ninept + \multiply\nsize by\ninept \advance\nsize\topskip + \vsplit0 to\nsize \kern1pc + \msize=\ht0 \advance\msize-\topskip + \divide\msize by 2 \divide\msize by\ninept + \multiply\msize by\ninept \advance\msize\topskip + \vbox to\nsize{\vsplit0 to\msize\vss}\kern1pc + \vbox to\nsize{\box0\vss}} + +\buginvol D, in general (4/6/87) + +\tenpoint\noindent[The percent signs in all the comments (for example, +on pages 7 and 42) are in the wrong font! Change `{\tt\%}' to `\%'.] + +\bugonpage Dvii, line 9 (9/25/86) + +{\tenpoint\noindent\hsize=29pc +{\sl Discrete and Computational Geometry\/ \bf1} (1986), 123--140. +\ \it Develops the theory\cutpar} + +\bugonpage D2, line 27 (6/17/86) + +\ninepoint\noindent\hskip10pt +{\bf define} $\\{banner}\equiv\hbox{\tt\char'23}$% +{\tt This\]is\]METAFONT,\]Version\]1.3\char'23}\quad +$\{\,$printed when \MF\ starts$\,\}$ + +\bugonpage D18, line 30 (5/22/86) + +\ninepoint\noindent +\\{str\_ptr}: \\{str\_number};\quad +$\{\,$number of the current string being created$\,\}$ + +\bugonpage D23, second line of mini-index, right column (6/14/87) + +\eightpoint +\indent\\{pool\_name}\unhcopy\eqbox|"string"|, \S11. + +\bugonpage D30, lines 33--34 (6/14/87) + +\tenpoint\noindent +to delete a token, and/or if some fatal error +occurs while \MF\ is trying to fix a non-fatal one. But such recursion +is never more than two levels deep. + +\bugonpage D63, lines 13--14 (5/5/87) + +\ninepoint\noindent +[These two lines can be eliminated, since the variable \\{temp\_ptr} +is no longer used! If you delete them, also remove \S158 from the +list of sections where global variables are declared (pages D7 and D552), +and remove \\{temp\_ptr} from the index on page D540.] + +\bugonpage D66, line 6 (5/22/86) + +\ninepoint\noindent +{\bf function\/}\ $\\{get\_node}(s:\\{integer})$: \\{pointer};\quad +$\{\,$variable-size node allocation$\,\}$ + +\bugonpage D66, lines 31--32 (3/16/86) + +\tenpoint\noindent +controlled +growth helps to keep the \\{mem} usage consecutive when \MF\ is +implemented on ``virtual memory'' systems. + +\bugonpage D67, lines 7--8 (4/21/87) + +\ninepoint\noindent\hskip10pt +{\bf if} $r=p$ {\bf then if} $\\{rlink}(p)\ne p$ {\bf then} + $\langle\,$Allocate entire node $p$ and {\bf goto} \\{found}% + {\sevenrm\kern.5em171}$\,\rangle$; + +\bugonpage D86, second line of section 198 (2/27/87) + +\noindent +Individual class numbers have no semantic +or syntactic significance, except in a few instances\cutpar + +\bugonpage D101, line 2 (3/16/86) + +\tenpoint\line{% +like `{\tt x}', or they can +combine the structural properties of arrays and records, like `{\tt x20a.b}'. +A} + +\bugonpage D102, line 24 (3/16/86) + +\tenpoint\line{\kern10pt +In other words, variables have a hierarchical structure that includes +enough threads running} + +\bugonpage D127, line 10 (5/5/87) + +\ninepoint\noindent +[Variable $r$ can be eliminated, since it is not +used in this procedure! If you delete it, also remove $\underline{280}$ +from the corresponding index entry on page D536.] + +\bugonpage D129, line 15 (5/5/87) + +\ninepoint\noindent +[This line can be eliminated, since \\{sine} and \\{cosine} are not +used in this procedure! If you delete them, also remove $\underline{284}$ +from the corresponding index entries on pages D538 and D521.] + +\bugonpage D142, line 23 (4/24/87) + +\tenpoint\noindent +$(7-\sqrt{28}\,)/12$; the worst case +occurs for polynomials like $B(0,28-4\sqrt{28},14-5\sqrt{28},42;t)$.) + +\bugonpage D178, third-last line (7/30/86) + +\tenpoint\line{\quad +The following code maintains the invariant relations +$0\le \\{x0}<\max(\\{x1},\\{x1}+\\{x2})$, $\vert\\{x1}\vert<2^{30}$,} + +\bugonpage D228, line 13 (7/30/86) + +\ninepoint\noindent\kern10pt +{\bf while} $\\{max\_coef}<\\{fraction\_half}$ {\bf do} + +\smallskip\eightpoint\noindent +The mini-index at the bottom of the next page should also receive the following +new entry: +\smallskip\indent +$\\{fraction\_half}={\rm macro}$, \S105. + +\bugonpage D228, 10th-last line (5/5/87) + +\ninepoint\noindent\hskip20pt +{\bf begin} $\\{right\_type}(p)\gets k$; +\smallskip +\noindent[Also eliminate `$q,$' seven lines above this, and delete +$\underline{497}$ from the index entry for \\{q} on page D536.] + +\bugonpage D248, lines 16--21 (11/27/86) + +\ninepoint\noindent\kern10pt +$\\{alpha}\gets\\{abs}(u)$;\kern5pt + $\\{beta}\gets\\{abs}(v)$;\par\noindent\kern10pt +{\bf if} $\\{alpha}<\\{beta}$ {\bf then}\par\noindent\kern20pt +{\bf begin} $\\{alpha}\gets\\{abs}(v)$;\kern5pt + $\\{beta}\gets\\{abs}(u)$;\kern5pt +{\bf end};\quad$\{\,$now $\alpha=\max(\vert u\vert,\vert v\vert)$, + $\beta=\min(\vert u\vert,\vert v\vert)\,\}$\par\noindent\kern10pt +{\bf if} $\\{internal}[\\{fillin}]\ne0$ {\bf then}\par\noindent\kern20pt +$d\gets d-\\{take\_fraction}(\\{internal}[\\{fillin}], + \\{make\_fraction}(\\{beta}+\\{beta},\\{delta}))$;\par\noindent\kern10pt +$d\gets\\{take\_fraction}((d+4)\;{\bf div}\;8,\\{delta})$;\kern5pt +$\\{alpha}\gets\\{alpha}\;{\bf div}\;\\{half\_unit}$; + +\bugonpage D263, line 20 (3/16/86) + +\tenpoint\noindent +instead of \\{false}, the other routines will simply log the fact +that they have been called; they won't\cutpar + +\bugonpage D268, line 2 (4/28/87) + +\tenpoint\noindent +Given the number~$k$ of an open window, the pixels of positive +weight in \\{cur\_edges} will be shown\cutpar + +\bugonpage D301, line 6 of section 652 (5/5/87) + +\ninepoint\noindent +[This line can be eliminated, since variable $s$ is not +used in this procedure! If you delete it, also remove $\underline{652}$ +from the corresponding index entry on page D537; remove 652 from +the index entries for \\{param\_size} and \\{param\_start} on page D534; +and remove \\{param\_size} from the mini-index on page D301.] + +\bugonpage D376, lines 17 and 18 (11/14/86) + +\tenpoint\noindent +[these two mysterious lines should be deleted] + +\bugonpage D380, line 11 (5/5/87) + +\ninepoint\noindent +[Variables $q$ and $r$ can be eliminated, since they are not +used in this procedure! If you delete them, also remove $\underline{862}$ +from the corresponding index entries on page D536.] + +\bugonpage D429, line 14 (5/5/87) + +\ninepoint\noindent\hskip10pt +{\bf begin} $p\gets\\{cur\_exp}$; +\smallskip +\noindent[Also eliminate line 12, and delete $\underline{985}$ from the +index entry for \\{vv} on page D543.] + +\bugonpage D455, line 5 (5/5/87) + +\ninepoint\noindent +[This line can be eliminated, since variable $t$ is not +used in this procedure! If you delete it, also remove $\underline{1059}$ +from the corresponding index entry on page D540; remove 1059 from +the index entries for \\{small\_number} and \\{with\_option} on pages D539 +and D544; and remove \\{with\_option} from the mini-index on page D455.] + +\bugonpage D463, line 10 (12/15/86) + +\ninepoint\noindent\hskip30pt +({\tt"Pretend\]that\]you're\]Miss\]Marple:\]Examine\]all\]clues,"}) + +\bugonpage D465, lines 17--18 (6/14/87) + +\tenpoint\noindent +[Delete these two lines.] + +\bugonpage D474, 5th-last line (3/16/86) + +\tenpoint\noindent +depths, or italic corrections) are sorted; +then the list of sorted values is perturbed, if necessary. + +\bugonpage D481, line 12 (6/17/86) + +\ninepoint\noindent\hskip10pt +\\{print\_nl}({\tt\char`\"Font\]metrics\]written\]on\]\char`\"});\kern5pt +\\{print}(\\{metric\_file\_name});\kern5pt +\\{print\_char}({\tt\char`\".\char`\"}); + +\noindent\hskip10pt\\{b\_close}(\\{tfm\_file}) + +\smallskip\eightpoint\noindent +The mini-index at the bottom of this page should also receive the following +new entry: +\smallskip\indent +\\{print\_char}: {\bf procedure}, \S58. + +\bugonpage D510, new line to follow line 5 (6/17/86) + +{\tenpoint\parindent=1em +This program doesn't bother to close the input files that may still be open. +\par} + +\bugonpage D510, just before the fifth-last line (8/5/86) + +\ninepoint\noindent\hskip30pt$\\{internal}[\\{fontmaking}]\gets0$;\quad +$\{\,$avoid loop in case of fatal error$\,\}$ + +\bugonpage D520, right column (6/14/87) + +\eightpoint +\leftline{Chinese characters:\quad 1147.} + +\bugonpage D526, left column, lines 1--2 (7/30/86) + +\eightpoint +\leftline{\indent\\{fraction\_half}:\quad + $\underline{105}$, 111, 152, 288, 408, 496, 543,} +\leftline{\indent\qquad 1098, 1128, 1141.} + +\bugonpage D526, left column, lines 6--7 (7/30/86) + +\eightpoint +\leftline{\indent\qquad 478, 497, 499, 503, 530, 540, 547, 549, 599, 603,} +\leftline{\indent\qquad 612, 615, 815--816, 917, 1169--1170.} + +\bugonpage D528, right column (6/14/87) + +\eightpoint +\leftline{Japanese characters:\quad 1147.} + +\bugonpage D530, right column, line 45 (7/30/86) + +\eightpoint +\leftline{\indent\\{max}:\quad$\underline{539}$, 543.} + +\bugonpage D533, right column (6/14/87) + +\eightpoint +\leftline{oriental characters:\quad 1147.} + +\bugonpage D535, right column, line 27 (6/17/86) + +\eightpoint +\leftline{\indent\qquad 1134, 1163--1165, 1182, 1194, 1200, 1205, 1213.} + +\bugonpage D547, bottom two lines (11/27/86) + +\ninepoint\noindent +[These lines, and the top two on the next page, should move down +so that they appear in alphabetical order just before `Compute +test coefficients'.] +% volume E +\hsize=29pc +\def\dashto{\mathrel{\hbox{-\kern-.05em}\mkern3.9mu\hbox{-\kern-.05em}}} + +\bugonpage Exiii, lines 1--2 (7/28/86) + +\tenpoint\noindent +February 11--13, 1984), 49. +\ {\it An example meta-character of the Devanagari alphabet, worked out +``online'' with the help of Matthew Carter.} + +\bugonpage Exiii, line 6 (7/28/86) + +\tenpoint\noindent +{\it and western alphabets work also for Devanagari and Tamil.} + +\bugonpage E12, lines 15 and 19 (7/23/86) + +\tenpoint\noindent[change `17.32' to `17.28' in both places] + +\bugonpage E12, third-last line (12/18/86) + +\tenpoint\noindent[change `41' to `40'] + +\bugonpage E13, lines 3, 4, and 20 (12/18/86) + +\tenpoint\noindent[change `40' to `41', `48' to `47', `17' to `7'] + +\bugonpage E18, line 20 (7/23/86) + +\tenpoint\noindent[change `17.32' to `17.28'] + +\bugonpage E18, line 29 (12/9/86) + +\tenpoint\noindent[change `236' to `212' in the {\tt cmss9} column] + +\bugonpage E170, top illustration (11/2/86) + +\tenpoint\noindent[There should be no ``dish'' or depression in the +vicinity of point {\tt 3r}; the top edge of the character should be +straight. This error appears also in the other uses of `\\{no\_dish\_serif}' +throughout the book, since the illustrations were made before +`\\{no\_dish\_serif}' was added to the program. See page +E180~(twice at the top), E370~(twice), E374~(twice), E376~(twice), E378~(top), +E390~(bottom), E398~(top), E402~(top), E406~(top), E453~(twice).] + +\bugonpage E179, new line to be inserted after line 6 (10/13/86) + +\ninepoint\noindent +{\bf if} $\\{shaved\_stem}<\\{crisp}.\\{breadth}$: + $\\{shaved\_stem}:=\\{crisp}.\\{breadth}$; {\bf fi} + +\bugonpage E219, line 29 (6/2/87) + +\ninepoint\line{\\{top} $y_1=h$; \ $x_1=x_2$; \ + {\bf filldraw stroke} $z_{1e}\dashto z_{2'e}$;\hfil\% stem} + +\bugonpage E279, seventh line from the bottom (7/20/86) + +\rightline{\eightssi that delicious but restrained humor which + her readers found so irresistible.} + +\bugonpage E301, new line to be inserted after line 28 (5/15/87) + +\ninepoint\noindent +\quad{\bf if} $\\{lower\_side}>1.2\\{upper\_side}$: + $\\{upper\_side}:=\\{lower\_side}$; {\bf fi} + +\bugonpage E554, bottom half of page (12/18/86) + +\ninepoint\noindent[The letters will change slightly because of the +corrections to {\tt cmr17} noted on pages 12 and 13.] + +\bugonpage E561, line 3 (12/9/86) + +\ninepoint\noindent[The numerals should be `\thinspace +{\niness 0123456789}\thinspace' (i.e., 2/3 point less tall) +because of the correction made to page 18.] + +\bugonpage E562, line 9 (12/9/86) + +\ninepoint\noindent[The numerals should be `\thinspace +{\ninessi 0123456789\/}\thinspace' (i.e., 2/3 point less tall) +because of the correction made to page 18.] + +\bugonpage E572, entry for {\it breadth} (10/13/86) + +\eightpoint +{\it breadth}, 59, 75, 79, 91, 93, 179, 225, 233, + +\bugonpage E573, entry for {\tt cmcsc10} (8/17/86) + +\eightpoint +{\tt cmcsc10}, $\underline{30}$--$\underline{31}$, 567. + +\bugonpage E576, tenth-last line (5/15/87) + +\eightpoint +{\bf lowres\kern.04em\vbox{\hrule width.3em height .6pt}\kern.08em + fix}, 550. +\bye +Now here are some that I will make soon! + diff --git a/Master/texmf-dist/source/generic/knuth/errata/errata.two b/Master/texmf-dist/source/generic/knuth/errata/errata.two new file mode 100644 index 00000000000..74dde877267 --- /dev/null +++ b/Master/texmf-dist/source/generic/knuth/errata/errata.two @@ -0,0 +1,491 @@ +% More bugs (sigh) in The TeXbook + +\input manmac +\proofmodefalse +\raggedbottom +\output{\onepageout{\unvbox255\kern-\dimen@ \vfil}} + +\def\rhead{Bugs in {\tensl The \TeX book}, second printing} +\def\bugonpage#1(#2) \par{\bigbreak\tenpoint + \hrule\line{\lower3.5pt\vbox to13pt{}Page #1\hfil(#2)}\hrule\nobreak\medskip} + +\noindent This is a list of all corrections made to {\sl The \TeX book\/} +since the second printing. If your copy doesn't say `{\sl\kern-1pt Second +printing (October 1984)\/}' on the copyright page, you should also look at +the previous bug list. In fact, the most important corrections to the +first printing were discovered first, so they've already been~made. + +\bugonpage 23, line 16 (10/13/84) + +\tenpoint\indent +|This is TeX, Version 1.0 (preloaded format=plain 83.7.15)| + +\bugonpage 33, line 32 (10/21/84) + +The bottom line shows how far \TeX\ has gotten until now in the +|story|{\parfillskip=0pt\par} + +\bugonpage 41, lines 7 and 8 (10/8/85) + +\ddanger The twin operations ^|\uppercase||{|\<token list>|}| and +^|\lowercase||{|\<token list>|}| go through a given token list and convert +all of the character tokens to their\parfillskip=0pt\enddanger + +\bugonpage 57, line 17 (1/6/86) + +|dd|\quad didot point ($\rm1157\,dd=1238\,pt$) + +\bugonpage 61, lines 17--19 (12/18/85) + +\ninepoint\noindent +|depth|, |em|, |ex|, +|fil|, |height|, |in|, |l|, |minus|, |mm|, |mu|, |pc|, |plus|, +|pt|, |scaled|, |sp|, |spread|, |to|, |true|, |width|. ^^{reserved words} +\ (See Appendix~I for references to the contexts in which each of these is +recognized as a keyword.) + +\bugonpage 67, append a new exercise (1/19/85) + +\exno=5 \def\chapno{11} +\gdef\frac#1/#2{\leavevmode\kern.1em + \raise.5ex\hbox{\the\scriptfont0 #1}\kern-.1em + /\kern-.15em\lower.25ex\hbox{\the\scriptfont0 #2}} + +\ddangerexercise Construct a |\frac| macro such that `|\frac1/2|' yields +`\frac1/2'. + +\bugonpage 130, line 15 (4/17/85) + +\beginmathdemo +|$y'''_3+g'^2$|&y'''_3+g'{}^2\cr +\endmathdemo + +\bugonpage 170, line 5 (5/28/85) + +\ninepoint +\line{tall, unslanted +letter; and so on. But two of the examples involve corrections that were} + +\bugonpage 194, lines 13--15 should be centered better (10/22/84) + +\ninepoint +$$\displaylines{\hfill x\equiv x;\hfill\llap{(1)}\cr + \hfill\hbox{if}\quad x\equiv y\quad\hbox{then}\quad + y\equiv x;\hfill\llap{(2)}\cr + \hfill\hbox{if}\quad x\equiv y\quad\hbox{and}\quad + y\equiv z\quad\hbox{then}\quad + x\equiv z.\hfill\llap{(3)}\cr}$$ + +\bugonpage 215, lines 9 and 10 from the bottom (12/23/84) + +\ninepoint\noindent +general format +is the same as for |\def| and |\gdef|, but \TeX\ blindly expands the tokens +of the replacement text according to the expansion rules above. For +example, consider + +\bugonpage 233, lines 15--19 (1/19/85) + +\medskip +\settabs\+\indent&10\frac1/2 lbs.\qquad&\it Servings\qquad&\cr +\+&\negthinspace\it Weight&\it Servings& + {\it Approximate Cooking Time\/}*\cr +\smallskip +\+&8 lbs.&6&1 hour and 50 to 55 minutes\cr +\+&9 lbs.&7 to 8&About 2 hours\cr +\+&9\frac1/2 lbs.&8 to 9&2 hours and 10 to 15 minutes\cr +\+&10\frac1/2 lbs.&9 to 10&2 hours and 15 to 20 minutes\cr + +\bugonpage 236, lines 18--21 (1/19/85) + +\ninepoint +$$\vbox{\openup2pt +\halign{\hfil\bf#&\quad\hfil\it#\hfil&\quad\hfil#\hfil& + \quad\hfil#\hfil&\quad#\hfil\cr +Squab&Poussin&2&\frac3/4 to 1&Broil, Grill, Roast\cr +Broiler&Poulet Nouveau&2 to 3&1\frac1/2 to 2\frac1/2&Broil, Grill, Roast\cr +Fryer&Poulet Reine&3 to 5&2 to 3&Fry, Saut\'e, Roast\cr +Roaster&Poularde&5\frac1/2 to 9&Over 3&Roast, Poach, Fricassee\cr}}$$ +[This change should also be made at the bottom of page 237.] + +\bugonpage 236, fifth-last line (1/19/85) + +\ninepoint +| Squab&Poussin&2&\frac3/4 to 1&Broil, Grill, Roast\cr| + +\bugonpage 237, line 25 (10/10/84) + +\ninepoint\noindent +saying `^|\tabskip||=|\<glue>'. For example, +let's do the poultry table again, but with the{\parfillskip=0pt\par} + +\bugonpage 265, bottom line (11/6/85) + +[insert a comma after `{\eightss LEONTIEF}'.] + +\bugonpage 271, line 8 (11/12/85) + +\ninepoint +\beginsyntax +<fil unit>\is[fil]\alt<fil unit>[l] +\endsyntax + +\bugonpage 280, lines 7 and 8 (1/8/85) + +\ninepoint\noindent +\<4-bit number>.\enskip +The specified output stream is opened or closed, for use in |\write| +commands, as explained in Chapter~21. + +\bugonpage 300, lines 5--10 [changed for version 1.3] (11/25/84) + +\ninepoint\noindent +what part of \TeX's memory has become overloaded; +one of the following fourteen things will be mentioned: +\begindisplay +|number of strings|\qquad(names of control sequences and files)\cr +|pool size|\qquad(the characters in such names)\cr +|main memory size|\qquad(boxes, glue, breakpoints, token lists, + characters, etc.)\cr +\enddisplay + +\bugonpage 300, lines 23--29 [changed for version 1.3] (11/25/84) + +\danger If you have a job that doesn't overflow \TeX's capacity, yet +you want to see just how closely you have approached the limits, +just set ^|\tracingstats| to a positive value before the end of your +job. The log file will then conclude with a report on your actual +usage of the first eleven things named above (i.e., the number of strings, +\dots, the save size), in that order. ^^{stack positions} +Furthermore, if you set |\tracingstats| equal to 2~or~more, \TeX\ +will show its current memory usage whenever it +does a ^|\shipout| command. Such statistics are broken into two +parts; `|490&5950|' means, for example, that 490 words are being used +for ``large'' things like boxes, glue, and +breakpoints, while 5950 words are being used for ``small'' things like +tokens and characters. + +\bugonpage 302, line 14 (10/8/85) + +\begintt +.\tenrm || (ligature ---) +\endtt + +\bugonpage 305, line 26 (12/24/84) + +\ninepoint\noindent +sentable as |^^M|. Asking \TeX\ to |\show\^^M| +\looseness-1 +produces the response `|>| |\^^M=macro:->\|\]|.|'. + +\bugonpage 306, line 10 (7/1/85) + +\ninepoint\noindent +no ``^{explicit kerns},'' and an italic correction is an +explicit kern.) \ But the italic correction may be too much (especially in an +italic font); |shelf{|^|\kern||0pt}ful| is often best. + +\bugonpage 308, line 25 (3/25/85) + +\ninepoint\indent +|\def\appendroman#1#2#3{\edef#1{\def\noexpand#1{\csname| + +\bugonpage 311, insert a new answer (1/19/85) + +\ninepoint +\ansno11.6: + |\def\frac#1/#2{\leavevmode\kern.1em|\parbreak +|\raise.5ex\hbox{\the\scriptfont0 #1}\kern-.1em|\parbreak +|/\kern-.15em\lower.25ex\hbox{\the\scriptfont0 #2}}| + +\smallskip\noindent[This causes answer 12.8 to move to page 312; +answer 12.16 also moves to page 313.] + +\bugonpage 320, lines 17--20 (8/10/85) + +\ninepoint +\ansno17.16: + |\def\sqr#1#2{{\vcenter{\vbox{\hrule height.#2pt|\parbreak + | \hbox{\vrule width.#2pt height#1pt \kern#1pt|\parbreak + | \vrule width.#2pt}|\parbreak + | \hrule height.#2pt}}}}| + +\bugonpage 327, lines 26--33 (10/22/84) + +\ninepoint +\ansno19.16: + |$$\displaylines{\hfill x\equiv x;\hfill\llap{(1)}\cr|\parbreak + | \hfill\hbox{if}\quad x\equiv y\quad\hbox{then}\quad|\parbreak + | y\equiv x;\hfill\llap{(2)}\cr|\parbreak + | \hfill\hbox{if}\quad x\equiv y\quad\hbox{and}\quad|\parbreak + | y\equiv z\quad\hbox{then}\quad|\parbreak + | x\equiv z.\hfill\llap{(3)}\cr}$$|\par\medskip\noindent +There's also a trickier solution, which begins with +\begintt +$$\displaylines{x\equiv x;\hfil\llap{(1)}\hfilneg\cr +\endtt + +\bugonpage 330, line 29 (11/15/85) + +\ninepoint\indent +|\edef\next#1#2{\def#1{\b#2\d}} \next\a\c| + +\bugonpage 332, lines 17--24 (1/19/85) + +\ninepoint +\begintt +\settabs\+\indent&10\frac1/2 lbs.\qquad&\it Servings\qquad&\cr +\+&\negthinspace\it Weight&\it Servings& + {\it Approximate Cooking Time\/}*\cr +\smallskip +\+&8 lbs.&6&1 hour and 50 to 55 minutes\cr +\+&9 lbs.&7 to 8&About 2 hours\cr +\+&9\frac1/2 lbs.&8 to 9&2 hours and 10 to 15 minutes\cr +\+&10\frac1/2 lbs.&9 to 10&2 hours and 15 to 20 minutes\cr +\endtt + +\bugonpage 332, lines 33--35 (1/19/85) + +\ninepoint\noindent +proofs. \ (You weren't supposed to think of this, +but it has to be mentioned.) \ See exercise 11.\fracexno\ for the `|\frac|' +macro; it's better to say `\frac1/2' than `$1\over2$', in a cookbook.\par +Another way to treat this table would be to display it in a vbox, instead +of including a first column whose sole purpose is to specify indentation. + +\bugonpage 337, line 28 (11/12/85) + +\ninepoint\noindent |\nextnumber|. Quick should put `|\relax|' +at the end of his macro. \ (The {keywords} |l|,{\parfillskip=0pt\par} + +\bugonpage 357, lines 35 and 36 (1/8/85) + +\ninepoint\noindent +|\def\*{\discretionary{\thinspace\the\textfont2\char2}{}{}}| + +\bugonpage 357, last two lines (4/17/85) + +\ninepoint\noindent +|\def\pr@m@s{\ifx'\next\let\next\pr@@@s|% + | \else\ifx^\next\let\next\pr@@@t|\par\noindent +| \else\let\next\egroup\fi\fi \next}|\par\noindent +|\def\pr@@@s#1{\prim@s} \def\pr@@@t#1#2{#2\egroup}| + +\bugonpage 358, lines 8--12 (1/23/85) + +\ninepoint\noindent +|\def\hbar{{\mathchar'26\mkern-9muh}}|\hfil\break\null +|\def\surd{{\mathchar"1270}}|\hfil\break\null +|\def\angle{{\vbox{\ialign{$\m@th\scriptstyle##$\crcr|\hfil\break\null +| \not\mathrel{\mkern14mu}\crcr \noalign{\nointerlineskip}|\hfil\break\null +| \mkern2.5mu\leaders\hrule height.34pt\hfill\mkern2.5mu\crcr}}}}| + +\bugonpage 359, lines 7--8 (1/22/85) + +\ninepoint\noindent +|\def\ddots{\mathinner{\mkern1mu\raise7pt\vbox{\kern7pt\hbox{.}}\mkern2mu|% +\hfil\break\null +| \raise4pt\hbox{.}\mkern2mu\raise1pt\hbox{.}\mkern1mu}}| + +\bugonpage 360, line 22 (1/22/85) + +\ninepoint\noindent +| \mkern5mu \raise.6\dimen@\copy\rootbox \mkern-10mu \box0}| + +\bugonpage 361, line 3 (3/27/85) + +\ninepoint\noindent +|\def\buildrel#1\over#2{\mathrel{\mathop{\kern0pt #2}\limits^{#1}}}| + +\bugonpage 361, lines 19--20 (1/22/85) + +\ninepoint\noindent +|\def\bmod{\mskip-\medmuskip \mkern5mu|\hfil\break\null +| \mathbin{\rm mod} \penalty900 \mkern5mu \mskip-\medmuskip}| + +\bugonpage 361, line 27 (5/1/85) + +\ninepoint\noindent +|\def\matrix#1{\null\,\vcenter{\normalbaselines\m@th| + +\bugonpage 361, bottom line (5/1/85) + +\ninepoint\noindent +| \null\;\vbox{\kern\ht1\box2}\endgroup}| + +\bugonpage 362, line 9 (5/1/85) + +\ninepoint\noindent +|\def\eqalign#1{\null\,\vcenter{\openup1\jot \m@th| + +\bugonpage 362, lines 17--29 (8/10/85) + +{\parindent=0pt\ninepoint +|\def\@lign{\tabskip=0pt\everycr={}} % restore inside \displ@y|\par +|\def|^|\displaylines||#1{\displ@y|\parbreak% +| \halign{\hbox to\displaywidth{|% + |$\hfil\@lign\displaystyle##\hfil$}\crcr|\parbreak% +| #1\crcr}}| +\smallbreak +|\def|^|\eqalignno||#1{\displ@y \tabskip=|^|\centering|\parbreak% +| \halign to\displaywidth{\hfil$\@lign\displaystyle{##}$\tabskip=0pt|\parbreak% +| &$\@lign\displaystyle{{}##}$\hfil\tabskip=\centering|\parbreak% +| &\llap{$\@lign##$}\tabskip=0pt\crcr|\parbreak% +| #1\crcr}}|\par +|\def|^|\leqalignno||#1{\displ@y \tabskip=\centering|\parbreak% +| \halign to\displaywidth{\hfil$\@lign\displaystyle{##}$\tabskip=0pt|\parbreak% +| &$\@lign\displaystyle{{}##}$\hfil\tabskip=\centering|\parbreak% +| &\kern-\displaywidth\rlap{$\@lign##$}\tabskip=\displaywidth\crcr|\parbreak% +| #1\crcr}}| +\par} + +\bugonpage 363, line 9 (5/12/85) + +\ninepoint\noindent +|\def\footnote#1{\let\@sf=\empty % parameter #2 (the text) is read later| + +\bugonpage 364, line 3 (3/23/85) + +\ninepoint\noindent +|\def\plainoutput{\shipout\vbox{\makeheadline\pagebody\makefootline}%| + +\bugonpage 364, fifth-last line (9/15/85) + +\ninepoint\noindent +|\def\fmtname{plain}\def\fmtversion{2.0} % identifies the current format| + +\bugonpage 399, eighth-last line (2/11/85) + +\ninepoint\noindent +| \baselineskip=\footnotebaselineskip\noindent\unhbox0\par}| + +\bugonpage 401, line 5 (1/29/85) + +\ninepoint\noindent +{|\fontdimen| parameters to qualify as a math symbol font). +(2)~Set all the font identifiers\parfillskip=0pt\par} + +\bugonpage 414, line 10 (12/17/84) + +\ninepoint\noindent +|\font\titlefont=cmssdc40 % titles in chapter openings| + +%\bugonpage 420, line 9 (10/3/85) +% +%\ninepoint\noindent +%|\def\AmSTeX{$\cal A\kern-.1667em\lower.5ex\hbox{$\cal M$}\kern-.075em| +% that change comes under `font data', explained away below + +\bugonpage 444, bottom line (1/10/85) + +\ninepoint\noindent +depth $d(z)+v$, consisting +of box~$x$ followed by an appropriate kern followed by box~$z$. + +\bugonpage 461, entry for character codes (11/6/85) + +\eightpoint +Add `{\sl see also\/} category codes'. + +\bugonpage 463, entries for {\tt dd}, Didot, and didot (1/6/86) + +\eightpoint +Remove the circumflex accents. + +\bugonpage 466, left column (1/19/85) + +\eightpoint +fractions, 67, 139--143, 152, 170, 179,\par +\qquad 186, 444--445.\par +\quad huge, 196.\par +\quad slashed form, 67, 139--140, 233, 236. + +\bugonpage 467, index entry for {\tt\char`\\hsize} (6/14/85) + +\eightpoint +Add a reference to page {\it 60}. + +\bugonpage 469, index entry for {\tt\char`\\kern} (7/1/85) + +\eightpoint +Add a reference to page {\it 306}. + +\bugonpage 469, index entry for kerns (7/1/85) + +\eightpoint +Add a reference to page 306. + +\bugonpage 469, new entry (11/12/85) + +\eightpoint +|l| after |fil|, $\underline{271}$, 337. + +\bugonpage 469, second line on the right (9/13/85) + +\eightpoint +%\def\LaTeX{L\kern-.25em\raise.7ex\hbox{a}\kern-.05em\TeX} % old style +{L\kern -.36em\raise.6ex\hbox{\sixrm A}\kern-.15em\TeX}, 137. + +\bugonpage 470, index entries for {\tt\char`\\longleftarrow} + thru {\tt\char`\\Longrightarrow} (10/5/84) + +\eightpoint +The references to page 358 should be underlined (seven times). + +\bugonpage 475, index entry for punctuation in formulas (4/29/85) + +\eightpoint +Add a reference to page 161. + +\bugonpage 476, index entry for {\tt\char`\\scriptspace} (8/10/85) + +\eightpoint +Change `445' to `445--446'. + +\bugonpage 478, first and last lines (10/11/84) + +\noindent Delete the last line in the right-hand column +(since it appears on page 479), and add the following line +at the top of the left-hand column (since it was dropped by mistake +from the second printing): + +\smallskip +\eightpoint styles of math formatting, 140--141, 441--447. + +\bugonpage 478, new entry after tabbing (5/28/85) + +\eightpoint +tables, {\sl see\/} alignments, tabbing. + +\bugonpage 478, tabskip entries (3/25/85) + +\eightpoint\noindent Instead of `237--239' and `237--238' it should say +`$\underline{237}$--$\underline{239}$' twice. + +\bugonpage 481, the entry for {\tt\char`\\widetilde} (9/23/85) + +\eightpoint +Page 359 should be underlined. + +\bugonpage 483, lines 16--17 (1/19/85) + +|P.O. Box 9506|\parbreak +|Providence RI 02940-9506, USA.| + +\bugonpage 483, lines 22--23 (1/19/85) + +P.O. Box 9506\par +Providence RI 02940-9506, USA. + +\bigskip +\hrule +\bigskip\noindent\tenrm +Note: The next printing will use the ``real'' Computer Modern fonts +instead of the ``almost'' Computer Modern fonts. Therefore many of +the line breaks will be slightly different. Also, the font-related +numerical data on pages 27, 29, 66, 75, 76, 79, 88, 98, 99, 112, 113, 310, +314, 396, 399, 409, 420, and 459 will be different. However, these +differences need not be listed here, because the old book was correct with +respect to the old fonts. + +\bye diff --git a/Master/texmf-dist/source/generic/knuth/errata/errorlog.tex b/Master/texmf-dist/source/generic/knuth/errata/errorlog.tex new file mode 100644 index 00000000000..dc4845c1c19 --- /dev/null +++ b/Master/texmf-dist/source/generic/knuth/errata/errorlog.tex @@ -0,0 +1,2924 @@ +% Appendix to the Errors of TeX paper (updated) +% Section numbers now adjusted to TeX 3.0 equivalents +% NB: tab marks are significant in this file, they signal continuation lines +%\magnification=\magstephalf +%\pageno=35 +\input logmac +* 10 Mar 1978 +L1. Rename a few external variables to make their first six letters unique. +D2. Initialize \\{escape_char} to $-1$, not 0 [it will be set to the + first character input]. @240 +L3. Fix bug: The test `$\\{id}<\O{200}$' was supposed to distinguish one-letter + identifiers from longer (packed) ones, but negative values of + \\{id} also pass this test. @356 +B4. Fix bug: I wrote `{\bf while} $\alpha\land(\beta\lor\gamma)$' when I meant + `{\bf while} $(\alpha\land\beta)\lor\gamma$'. @259 +R5. Initialize the input routines in |INITEX| [at this time a short, + separate program not under user control], in case errors occur. @1337 +E6. Don't initialize \\{mem} in |INITEX|, it wastes time. @164 +B7. Change `\\{new_line}' [which denotes a lexical scanning state] to + `\\{next_line}' [which denotes + \\{carriage_return} and \\{line_feed}] in print commands. +F8. Include additional test `$\\{mem}[p] \ne 0\; \land$' in \\{check_mem}. @168 +M9. Fix inconsistency between the \\{eq_level} conventions of \\{macro_def} and + \\{eq_define}. @277 +# About six hours of debugging time today. +# |INITEX| appears to work, + and the test routine got through \\{start_input}, + \\{chcode} [the \TeX78 command for assigning a \\{cat_code}], + \\{get_next}, and \\{back_input} the first time. +* 11 Mar 1978 +I10. Insert space before `|(|' on terminal when opening a new file. @537 +F11. Put `$p\gets \\{link}(p)$' into the loop of \\{show_token_list}, + so that it doesn't loop forever. @292 +L12. Shift the last item found by \\{scan_toks} into the \\{info} field. + [With |SAIL| all packing of fields was done by arithmetic operations, + not by the compiler.] @474 +B13\>12. Fix the previous bugfix: I shifted by the wrong amount. @474 +I14. Add a feature that prints a warning when the end of a file page occurs within + a macro definition or call. [System dependent.] @336 +# Unintended bugs in my test routine [a format intended eventually to typeset + {\sl The Art of Computer Programming\/}] helped check out the + error recovery mechanisms. + For example, I had `|\lft{#}|' instead of `|\lft{##}|' inside a macro, + and three cases of improper |{|~and~|}| nesting. +F15. Add the forgotten case `\\{set_font}:' to \\{eq_destroy}. @275 +C16. Change |\require| to |\input|. @376 +F17. Add code for the case $\\{cur_cmd}=0$ [later known as the case + `$\,t\ge\\{cs_token_flag}$'] when scanning a tokenlist. @357 +# That's the first ``big'' error I've spotted so far. +I18. Introduce a `|d|' option in the error routine, to facilitate debugging. @84 +L19. Assign a floating-point constant \\{ignore_depth} to \\{prev_depth}, + instead of assigning the integer constant \\{flag} + [since \\{prev_depth} is type \\{real} in \TeX78]. @215 +I20. Improve the readability and spacing of \\{show_node_list} output. @182,187 +F21. Set the variable $v$ before using the {\bf case} construction in + \\{show_node_list}, because there's one case where $v$ + didn't receive a value [as part of the field unpacking]. @182 +# About seven hours today. +* 12 Mar 1978 +# One hour to enter yesterday's corrections and recompile. +# At this point \TeX\ correctly located further unintended syntax errors + in |acphdr| [the test file]. +I22. Insert \\{debug_help} into \\{succumb}, giving a chance to look at memory + before the system dies. @93 +D23. Use \\{eq_destroy} wherever necessary in \\{unsave}. @283 +L24. Change `$t \gets (t-1)$ mod 8' to `$t \gets (t-1)$ land~7' in \\{id_name}, + since |SAIL| has $-1$~mod~$8 = -1$. [At this time, \\{id_name} is a + routine that unpacks control sequence names, according to a scheme + that will become obsolete after change \#422.] +S25. Remove the space that appears at end of paragraph. + (I hadn't anticipated that.) @816 +L26. Throw away unwanted \\{line_feed} after getting a \\{carriage_return} + in response to \\{in_chr_w} [a system routine for + input from the terminal]. @83 +B27. Delete spurious call to \\{flush_list} in \\{end_token_list}. @324 +# Why did I make such a silly mistake? +F28. Fix bug in \\{get_x_token}: I forgot to say `\\{macro_call}' (which is the + main point of that routine)! @380 +# While tracking that bug down, I found out incidentally that kerning is okay. +# Also \TeX\ correctly caught an error |0p| for |0pt|. +L29. Fix bug in \\{scan_spec} ({\bf while} instead of {\bf repeat}). @404 +M30. Make the table entries for |\hfill| and |\hskip| consistent with the + program conventions. @1058 +L31. Disable unforeseen coercion: When \\{scan_spec} put \\{hsize} on + \\{save_stack}, the value changed from \\{real} to \\{integer}. @645 +I32. Use `|*|' instead of `|-1.0|' for running dimensions + of rules in \\{show_node_list}. @176 +D33. Clear \\{mem}[\\{head}] to null in \\{push_nest} [in \TeX82, this + will be done by \\{get_avail}]. @216 +# A vrule link got clobbered because I forgot to do this. +I34. Translate ASCII control codes to special form when displaying them. @48,68 +# Ligatures work, but \\{show_node_list} showed them funny. +F35. Remember to clear parameters off \\{save_stack} in \\{package} routine. @1086 +# About eight hours today. +* 13 Mar 1978 +D36. Introduce a new variable \\{hang_first} [later the sign of \\{hang_after}]. @849 +E37\>36. Simplify the new code, realizing that if $\\{hang_indent}=0$ then + \\{hang_first} is irrelevant. @848 +# Time sharing is very slow today, so I'm mostly reading technical reports while + waiting\/ {\bf three hours} for compiler, editor, and loading routine. +# I'm not counting this as debugging time! +# (Came back in the evening.) +P38. Spruce up the comments in the \\{line_break} routine, which appears to be + almost working. @813 +D39. Rethink the setting of \\{best_line}; it's 1 too high in many cases. + [The final line of a paragraph was handled in a treacherous way.] @874 +D40. Compute proper initialization for + \\{prev_depth} when beginning an |\hbox| + with a paragraph inside. [This refers to a special `paragraph box' + construction, used when an hbox of specified size becomes overfull; + \TeX78 doesn't have the concept of internal vertical mode.] @1083 +D41. Also initialize \\{tail} in that case. @1083 +M42. Also put the result of line-breaking into the correct list. +T43. Fix a typo in the \\{free_node} routine (`\\{link}' not `\\{llink}'); + by strange chance it had been harmless until today. @130 +F44. Fix bug: \\{post_line_break} forgot to set \\{adjust_tail}. @889 +D45. Update \\{act_width} properly when looking for end of word while + line breaking. @866 +B46. Repair the ``tricky'' part of \\{get_node}: I used the \\{info} field + when I meant to say \\{llink}. @127 +# Now the |\corners| macro of |acphdr| works! [See |\setcornerrules| + in {\sl The \TeX book}, page 417.] +D47. Reset \\{contrib_tail} properly in \\{build_page}. @995 +T48. Fix typo (|-| for |+|) in computation of \\{page_total}. @1004 +S49. Change the page-breaking logic: \TeX\ reached \\{fire_up} with + $\\{best_page_break}=\\{null}$ in one case, + since the badness was too bad. @1005 +M50. Perform the operation \\{delete_token_ref}(\\{top_mark}) only when + $\\{top_mark}\ne0$. @1012 +F51. Make \\{scan_toks} omit the initial |{| of an |\output| routine. @473 +I52. Insert a comma to make memory usage statistics look better. @639 +# About seven good hours of debugging today. +# Tomorrow will be first-output day (I hope). +* 14 Mar 1978 +# (Came in evening after sleeping most of day, to get computer at better time.) +# (Some day we will have personal computers and will live more normally.) +# 8:30pm, began to enter corrections to yesterday's problems. +I53. Issue an error message for non-character in filename or in font name. @771 +I54. Display `|...|' for omitted stuff in \\{show_context} routine. @643 +L55. Watch out for the |SAIL| syntax `$\alpha+\beta\mathbin{\rm lsh}\gamma$'; + it doesn't shift $\alpha+\beta$ left (only $\beta$). @464 +# That error was very hard to track down; it created a spurious link field + and sent $\\{hash}[0]=\null$|\beta| to the scanner! +# I could have found this bug an hour sooner if I had looked at the correct + stack entries for \\{name} and \\{token_type}. +D56. Show the correct page number when tracing pages before output is shipped. @638 +F57. Remember to nullify a box after using it. @1079 +I58. Issue an error message if\/ |\box255| isn't consumed by the output routine. @1015 +# I'm having trouble with the |BAIL| debugger; + it makes an illegal memory reference and dies, + when single-stepping past the entry to recursive procedures + \\{hlist_out} and \\{vlist_out}. So I have to reload and be careful + to go thru these procedures at high speed. +P59. Fix bug in comment (memory parameter description said $\ge$ not $\le$). @11 +B60. Fix typo in definition of rule output (said $x,y$ not $\\{x0},\\{y0}$). + [This part of the code went away when |DVI| files were introduced.] +B61. Correct the embarrassing bug in shellsort, where I said `$\le\\{str}[k]$' + not `$\le t$'. + [The first \TeX\ had to sort all output by vertical position on page.] +M62. Make \\{start_input} set up \\{job_name} in the form needed by \\{shipout}; + it uses obsolete conventions. @532,537 +L63. Insert |(| and |)| into the |SAIL| macro definition of \\{new_string}. + [This macro was for pre-|DVI| output.] +M64. Unscramble the parameters of \\{out_rule}: + The declaration was $(\\{x0},\\{y0},\\{x1},\\{y1})$ + while the call was $(\\{x0},\\{x1},\\{y0},\\{y1})$. +# 4:30am, \TeX's first page is successfully output! +# (It was `|\titlepage\setcpage1\corners\eject\end|'.) +* 15 Mar 1978 +# 10:30pm. Today I'm instrumenting the line-breaking routine and putting it + through a bunch of tests. +# (The inserted instrumentation had bugs that won't be mentioned here.) +C65. Don't abort the job when \\{eq_destroy} redefines a + \TeX\ control sequence. @275 +# The first word of a paragraph won't be hyphenated \dots\ so be it! +T66. Fix the typo in \\{line_break} that spoils the test for + `letters in the same font'. @896 +# The effect of that typo was to suppress all hyphenation attempts. +B67\>25. Replace the space at paragraph end by fillglue, not by zero. @816 +L68. Pack the hyphen character properly into its node. @582 +T69. Fix a typo (`{\tentex\char'30}' for `|+|') + in the computation of \\{break_width}. @838 +M70. Change the |\end| maneuver; the present code doesn't end the job, + since I forgot that \\{back_input} uses \\{cur_tok}. @1054 +A71. Add a parameter to \\{try_break}, since the width is different at + a discretionary hyphen. [This problem will be solved differently in \TeX82, + when discretionaries become much more general.] @840 +F72. Bypass kern nodes in pre-hyphenation. @896 +F73. Supply code for the forgotten case `$<$ |"a"|' in pre-hyphenation. + [This case was later generalized to a test of \\{lc_code}.] @897 +B74. Change $\\{mem}[q]$ to $\\{prev_break}(q)$ in the + reverse-linking loop. @878 +# (Such blunders. Am I getting feeble-minded?) +A75. Introduce special logic for \\{eject_penalty}; I was wrong + to think that forced ejection was exactly like an + infinitely negative penalty. @851 +A76. Use $(1+b)^2-p^2$ when computing demerits with $p<0$. @859 +# 6:30am. The line-breaking algorithm appears to be working fine + and efficiently. + On small measures (about 20 characters per line), it gives overfull boxes + instead of spaced out ones. Surprising but satisfactory. +* 16 Mar 1978 +# 9pm. The plan for tonight is to test page breaking and more paragraphing. +G77. Insert `|\topskip|' glue at beginning of page. @1001 +I78. Add `|\pausing|' feature. @363 +M79. Fix discrepancy: In \\{make_accent} I called \\{vpackage} + with a pointer to the first list item, but \\{vpackage} itself assumes + that the parameter is a pointer to that pointer. [The + \\{vpackage} of \TeX82 will be different.] @668 +# I checked for other lapses like that. Result: 14 calls OK, 12 NG. +M80. Create a new temporary list head location, \\{hold_head}, since there's + a case where \\{vpackage} is improperly called with + parameter \\{temp_head}. [At this time \\{vpackage} uses \\{temp_head} + to make a list of all insertions found.] @1014 +# 11:30pm. The machine is tied up again. +F81. Write code to handle charnodes in vlists; I forgot that I'd decided + to allow them. [Later I prohibited them again!] @669 +F82. Combine the page lists before pruning off glue + in \\{fire_up}; otherwise the pruning doesn't go far enough. @1017 +B83\>25. Fix typo where line-breaking starts: `\\{fill_glue}' should be + `\\{new_glue}(\\{fill_glue})'. @816 +I84. Add |/q| to |xspool| command (cosmetic change). [This changes a system + command that causes \TeX\ output to be printed on the Xerox Graphics + Printer (XGP), the progenitor of future laser printers; + the |/q| option says that the queue of printing requests should be + displayed on the user's terminal.] @642 +E85. Don't write a form feed after the last page of output. @642 +# To fix this, I reorganized \\{ship_out}, and it became simpler. +T86. Correct a typo (`{\tentex\char'30}' for `|+|') in the \\{vlist_node} case + within \\{hlist_out}. [The output routines were quite different + at this time, because output went directly to the XGP.] @622 +I87. Change the message `|completed page|' to `|Completed for page|'. @638 +B88\>48. Fix yet another typo in the computation of \\{page_total}: My original + code said $\\{stretch}(p)$ instead of $\\{stretch}(q)$ (terrible). @1004 +P89. Document the dirty trick about \\{bot_mark}'s reference count. + [That trick is, fortunately, no longer useful.] @1016 +A90. Rethink the algorithm for contributing an insertion: The original code + tests for a page break after incrementing the totals but + before the \\{contrib_list} is updated. [\TeX78 handles insertions + in a hardwired manner that will be greatly generalized in \TeX82.] +F91. Fix \\{get_node} again: + After the variable memory overflows, control falls through to \\{found} + instead of going to the \\{overflow} call. @125 +# I spent several hours tracking down that data structure bug! +B92. Change \\{new_line} to \\{next_line} in yet another print command (see \#7). +A93\>75. Amend the line-breaking algorithm: + |\break| in paragraph doesn't work with really bad breaks. @851 +# A problem to be diagnosed tomorrow: Each time I run the test program, + the amount of memory in use grows by 13 cells not returned. +# Seven hours tonight. +* 17 Mar 1978 +G94. Introduce \\{dead_cycles} to keep |\end| active until \\{ship_out} + occurs. @1054 +E95. Don't call \\{line_break} with an empty list. @1096 +S96. Take proper account of the (infinite) fillglue when computing + the width of a paragraph line preceding a display. @1146 +M97. Add a new parameter to \\{hpack} so that \\{line_break} won't be called + at the wrong time. + [This is for the soon-to-be-obsolete feature described in \#40.] +L98. Give a warning message if there's an |\hfill| in the middle of a paragraph; + fillglue upsets the line breaker, + because floating-point calculations don't have sufficient accuracy. @868 +# I spent an hour looking for another bug in \TeX, but the following one was in \MF: + The \\{xgp_height} data in fonts had been supplied wrong. +# It took two hours to recompile 32 fonts with proto-\MF. +R99. Make \\{show_node_list} and \\{show_token_list} + more robust in the presence of software bugs. @182 +D100\>97. Do not remove nodes with \\{eject_penalty}, + when the new parameter to \\{hpack} is \\{true}. +E101\>97. Put a fast exit into \\{hpack}; e.g., at glue nodes, test `{\bf if} + \\{paragraphing} $\land$ $\langle$current width is large$\rangle$'. +# 2am. I have to go to bed ``early'' tonight. +* 18 Mar 1978 +# 3:30pm. (Saturday) +I102. Add a parameter to \\{check_mem} (to suppress display unless needed). @167 +G103. Introduce a user-settable parameter |\maxdepth|, and + pass it as a parameter to \\{vpackage}. @668 +# I realized the need for |\maxdepth| while fixing insertions (see \#90). +G104. Introduce a user-settable parameter for \\{line_break}: The constant + 2.0 in my original algorithm becomes |\jpar| + [later |\tolerance|], to be set like |\tracing|. @828 +D105. Reclaim the \\{eject_penalty} nodes removed during line-breaking. @879 +# (Those were the 13 extra nodes reported on Thursday.) +# The \\{init_align} procedure worked right the first time! +# Also \\{init_row}, \\{init_col}. But then\thinspace\dots +S106. Rethink the command codes: \\{endv} in a token list has too high a + code for the assumptions of \\{get_next}. @207 +A107. Add a \\{prev_cmd} variable for processing delimited macro parameters; + the original algorithm loses track of braces. + [The rules will change slightly in \TeX82, and + \\{rbrace_ptr} will take on a similar function.] @400 +S108. Make the \\{get_next} routine intercept |&| and |\cr| tokens. @342 +# I'd thought I could just put |&| and |\cr| into + \\{big_switch} [i.e., in the stomach of \TeX, not the eyes]; + that was a great big mistake. +R109. Make more error checks on \\{endv}; e.g., it must not occur in + a macro definition or call. @780 +S110\>108. No, rethink alignments again; the new program still fails! @768 +# For the first time I can glimpse the + hairiness of alignment in general (e.g., `|\halign{\u#\v&...|' + when |\u| and |\v| are defined to include |&|'s and possible + alignments themselves). +# I think there's a ``simple'' solution, by considering only whether + an alignment is currently active [in \S342]. +# 11:30pm. Went to bed. +* 19 Mar 1978 +# Woke up with ``better'' idea on how to handle |&| and |\cr|. +# (Namely, to consider a special kind of\/ |\def| whose parameters don't interrupt + on |&|'s and |\cr|'s.) +# But replaced this by a much better idea (to introduce \\{align_state}). +# 11pm. Began to use computer. Performed major surgery + (inserting \\{align_state} and updating the associated routines + and documentation). +D111. Pop the alignment stacks in \\{fin_align}. @800 +T112\>110. Fix a (newly inserted) typo in \\{show_context}. @314 +D113\>110. Set \\{align_state} false when a live |&| or |\cr| is found. + [Originally \\{align_state} was of type \\{boolean}.] @789 +I114. Insert |\cr| when `|}|' occurs prematurely in an alignment. @1132 +M115. Remember to record \\{glue_stretch} when packaging an unset node. @796 +# I had a mistake in |acphdr| definition of\/ |\quoteformat|; also extra spaces. +# My first test programs, used before today, were contrived to test macro + expansion, line-breaking, and page layout. +# Next I'm using a test program based on Volume 2. +C116. Make carriage-return, space, and tab equivalent for macro matching. @348 +F117. Omit the reference count node when displaying a mark. @176 +B118. Correct a silly slip: I wrote `\\{type_displacement}' instead of + `\\{value_displacement}' when packing data in a penalty node. @158 +M119. Don't go to \\{build_page} after seeing |\noindent|; \TeX\ isn't + ready for that. + [In the original program, this was an instance of a bad {\bf goto}.] @1091 +# I had undesired spaces coming thru the scanner in my macro definitions + of\/ |\tenpoint| [see {\sl The \TeX book}, page 414]. +# 4am. \TeX\ now knows enough to typeset page 1 of Volume 2! +# Also it did its first ``math formula'' (namely `|$X$|') without crucial error. +# (Except that the italic correction was missing for some reason.) +D120. Remember to decrement \\{cur_level} in \\{fin_align}. [The routines will + eventually become more general and use \\{unsave} here.] @800 +D121. Remember to increment \\{cur_level} in error corrections by + \\{handle_right_brace}. [A better procedure will be adopted later.] @1069 +T122. Fix a typo: (`|{|' instead of `|}|') in error message for $\\{mmode}+ + \\{math_shift}$. @1065 +R123\>99. Make \\{show_noad_list} more robust and more like the new + \\{show_node_list}. [The routines will be combined in \TeX82.] @690 +L124. Fix a typo in \\{char_box}: should say \\{font_info_real}. + [In \TeX78 a single array + is used for both \\{real} and \\{integer}; in \TeX82 things will be + \\{scaled}.] @554 +B125. Fix typos in the definitions of \\{default_rule_thickness} and + \\{big_op_spacing}; they shouldn't start at \\{mathex}(7). @701 +B126. Reverse the \\{before} and \\{after} conventions in math nodes. @1196 +# I had them backwards; this turned + hyphenation on just before math, and off just after it! +# Seven and a half hours debugging today. + Got through the test program a little more. + But \TeX\ blew up on `|$Y+1$|'; tomorrow I hope to find out why. +* 20 Mar 1978 +# 8pm. I decided to work next on a super-hairy formula. +C127. Change `|\ascii|' to `|\cc|' (character code). [This name will change again + later, to `|\char|'.] @265 +E128. Don't bother to store a penalty node at the beginning of |$$| when + the paragraph-so-far fits on a single line, since such a penalty + has already been stored. [These conventions will change later, and + the |\predisplaypenalty| will always be stored.] @1203 +S129. Avoid reference to \\{tail} in \\{build_page}, + if $\\{nest_ptr}>0$. @995 +B130. Correct a silly + slip in \\{math_comp} (the exact opposite of what I did in \#118). @1158 +B131. Rectify my mental lapse in \\{make_fraction}; I said \\{nucleus} instead of + \\{thickness}. @743 +F132. Mask off the math class when scanning delimiters. @1160 +C133. Allow an optional space after |\def{...}|. [This decision + will be retracted later.] @473 +# My test example is so complicated it causes the semantic stacks to overflow! +L134. Don't test for no pages output by looking at the channel status. @642 +T135. Fix typo in definition of\/ |\mathop| (\\{open_noad} not \\{op_noad}). @1156 +A136. Rewrite \\{fin_mlist}, because `|\left(...\above...\right)|' doesn't + parse correctly; the |\left| goes into the numerator, + the |\right| into the denominator. @1184 +B137. Correct the use of \\{depth_threshold} in \\{print_subsidiary_data}: + Simple fields get shown while others look empty. @692 +I138\>78. Return the carriage before showing the first line of a new file + when pausing. @538 +M139. Fix bug: The call \\{show_noad_list}(\\{mem}[|..|]) should be + \\{show_noad_list}(|..|), in the \\{incompleat_noad} case + of \\{show_activities}. @219 +# 3am. The whole messy formula has been parsed correctly into a tree. +# The easy part is done, now comes the harder part. +F140. Don't shift single characters down in \\{make_op}. @749 +D141. Make \\{clean_box} return a box (as its name implies), not an hlist. @720 +# Font info still isn't quite right, it has the wrong value of \\{quad}. +A142. Retain the italic correction when doing \\{rebox}; + can make $\\{glue_set}\ne0$ a flag for this. [A better + solution will be adopted later.] @715 +B143. Fix the bug that makes \\{rebox} bomb out: $\\{value}(p)$ should be + $\\{value}(\\{mem}[p])$. @715 +# 6am; ten hours today. \TeX\ didn't do |$\pi\over2$| correctly, but was close. +# I found that the \\{rebox} problem (\#142) went away when I fixed the + \\{clean_box} problem (\#141); but I + will leave the extra stuff about $\\{glue_set} \ne 0$ + in the program anyway, just for weird cases. +E144. Omit extra levels of boxing when possible in \\{clean_box}. @721 +# (To do this, I need to face the \\{rebox} problem anyway.) +* 21 Mar 1978 +# 10pm. The computer is rather heavily loaded tonight. +F145. Don't forget \\{thickness} when making a square-root sign (see \#131). + [The rule thickness will later be derived from the character height.] @737 +L146. Define $p$ local to the \\{make_fraction} routine. @743 +# Unwittingly using the global $p$ was a disaster. +I147. Don't show the amount of \\{glue_set} when it's zero. @186 +D148\>142. Make \\{glue_set} nonzero in the result of \\{var_delimiter}. @706 +F149. Fix bug: The \\{math_glue} function didn't return any result. @716 +T150. Fix typo in \\{char_box} ($c$ not $w$); this caused a subscripted~$P$ to come + out the same width as an unsubscripted~$P$. [Later changes in the rules + will move this computation to \S755.] @709 +P151\>144. Revise \\{clean_box} to do operations that are needed + often because of the \\{rebox} change. @720 +D152. Use the new \\{clean_box} to avoid a bug in |\sqrt{\raise...}|. @737 +Q153. Change the definition of\/ |\not| so that it's a relation + (which will butt against the following relation). [All math + symbols and Greek letters are defined in |INITEX| at this + time, not in a changeable format definition.] +I154. Give error message `{\tt Large delimiter must be + in mathex font}', instead of calling \\{confusion}, + since the error can occur. + [This particular error is impossible in \TeX82.] @706 +F155. Change the use of $p$ in \\{var_delimiter}; it isn't always set when I say + {\bf goto} \\{found}. @706 +# Another font problem now surfaced: The mathex meta-font didn't compute \TeX\ info + in a machine-independent way. + (It took two hours to correct this.) +D156. Don't forget to set $\\{type}(b)$ in all relevant cases of + \\{var_delimiter}. @708 +B157. Use the correct sign convention for \\{shift_amount} in \\{hpackage}. @653 +F158. Always kern by \\{delta} when there's no superscript. @755 +M159. Declare \\{space_table} to be $[0\,.\,.\,6,0\,.\,.\,6]$ + not $[0\,.\,.\,7,0\,.\,.\,7]$; otherwise its entries are + pre\-loaded into the wrong positions. [The \\{space_table} in \TeX78 is + $7\times7$; it will become $8\times8$ in \TeX82, + represented as a string called \\{math_spacing}.] @764 +C160. Use a negative value, not zero, to represent a null delimiter. + [Actually zero will come back again later.] @685 +C161\>127. Change |\cc| to |\char|. @265 +L162. Don't use tricky subtraction on packed data when changing $q$ to + an \\{ord_noad} in \\{mlist_to_hlist}; subtraction isn't always safe. @729 +B163. Fix two typos in the \\{space_table} (|*| for |0|). @764 +F164. Initialize \\{cur_size} everywhere (I forgot it in two places). @703 +A165. Reset \\{op_noad} before resetting \\{bin_noad}. @728 +F166. Treat $\\{display_style}+\\{cramped}$ the same as \\{display_style} + inside \\{make_op}. @749 +B167. Shift the character correctly in the non-|\displaystyle| case of + \\{make_op}. @749 +# Still another font problem: The italic corrections are wrong because + the corresponding array was declared \\{real} in proto-\MF\ (and + italic corrections were used in nonstandard way in |mathex|). +B168. Use \\{depth} instead of \\{height} in \\{var_delimiter}. + [Later, both were used.] @714 +Q169. Skew the accents according to the font \\{slant}. [Soon retracted.] @741 +# At this point I think nearly all the math routines have been exercised. +# Tomorrow they should work! +# Eight hours debugging today. +* 22 Mar 1978 +# (Wednesday, but actually Thursday: + I began at midnight because I was proofreading a paper.) +# I checked out the font access tables, slowly (i.e., all the |\mathcode| + and special-character name entries were catalogued). +Q170\>169. Do {\bf not\/} consider slants after all in the math accent + routine, since slanted math letters are put differently into fonts. @741 +B171. Don't use $q$ for two different things simultaneously + in \\{make_math_accent}. @738 +F172. Fix bug in \\{compact_list} (I forgot to advance the loop variable). + [This procedure became unnecessary in \TeX82.] +M173. Avoid conflict between \\{var_delimiter} and \\{mlist_to_hlist}, which + want to use \\{temp_head} simultaneously. @713 +T174. Fix bad typo in \\{overbar} routine ($b$ for $p$). @705 +# Finally \TeX\ got to \\{after_math} after dealing with that + hairy formula\thinspace\dots +T175. Fix another bad typo: $p$ for $b$ this time. @1199 +L176. Insert more parentheses (twice) because of `|lsh|' precedence + in |SAIL|. @1199 +M177\>36. Use the new hanging-indentation conventions when formatting displayed + equations. @1199 +Q178. Recompute penalties so that break is allowed after \\{punct_noad}s. @761 +F179. Center the large delimiters vertically. @749 +Q180. Round all rule sizes (up) before drawing them. @589 +Q181. Provide more space over $x$ in $\sqrt x$, and more space atop vincula. + @705,737 +Q182. Make large delimiters large enough to cover formula height + (important for subscripts, superscripts). @762 +I183. Insert |/ntn=33| on XGP prompt message so that complex math + won't blow the device driver. [See \#84.] +P184\>161. Update the comment about the meaning of\/ |\char|, since it + can be used in math mode. @208 +# Six hours today. +* 23 Mar 1978 +# 11pm, Maundy Thursday. +C185\>104. Make |\tracing| and |\jpar| follow block structure. @283 +# It took me two hours to enter yesterday's corrections, + because the changes were so numerous. +M186. Fix bad call on \\{begin_token_list} when marks are to be scanned. @396 +# Now the formula looks like it should, modulo problems in fonts. +Q187. Prevent an exponent from going below baseline + xheight/4. @758 +B188. Change \\{quad} to \\{math_quad} when finishing a display + (several places). @1199 +A189. Don't use \\{append_to_vlist} when putting an |\eqno| box on a separate + line, because the page shouldn't break at glue there. + [Later, the \\{append} will be used but preceded by an + infinite penalty.] @1205 +S190. Increase the input \\{stack_size}; \TeX\ may need to back up a lot. @11 +A191. Don't assume that $p$ always points to a glue node when + a page is broken. @1017 +A192. Use \\{epsilon} in \\{scan_spec} (I had used a different + small constant). [This was a kludge to avoid the extra + parameter later called \\{exactly} or \\{additional}.] @645 +R193. Introduce a new procedure \\{scan_positive_length}, to prevent + negative or zero lengths in \\{scan_rule_spec}. + [This restrictive rule will be ``overruled'' later.] @463 +B194. Fix ridiculous bug in the leaders routine of \\{vlist_out}: + I had the initialization {\sl inside\/} the loop! @635 +L195. Eliminate confusion between the two temp variables named $h$; + one is \\{real} and the other is \\{integer}. @629 +F196. Include forgotten case (\\{leader_node}) in \\{hlist_out}. + [Type \\{leader_node} will be absorbed + into \\{glue_node} in \TeX82.] @622 +F197. Don't forget to compute \\{x0} in variable horizontal rules. @624 +# Seven and a half hours today. +# \TeX\ seems to be ready to tackle my test file based on Volume 2. +S198. Calculate \\{y00} in horizontal rules as an integer number of pixels + from the baseline, so that the baseline doesn't jump. @589 +* 25 Mar 1978 +# 2am Saturday. (Might as well drop Friday.) +D199\>185. Make \\{def_code} consistent with the new |\tracing| conventions. + [Many tracing options are packed into a single + parameter called |\tracing|.] @1233 +R200\>185. Don't allow users to change nonexistent things like |\catcode1000|. @1232 +F201\>110. Reset \\{align_state} at beginning of \\{init_align}. @774 +F202. Don't forget \\{scan_left_brace} after |\noalign|. @785 +F203\>110. Set $\\{cur_cs}\gets 0$ in \\{get_next}, after |\cr| + causes a switch to the $\langle v_j\rangle$ template. @342 +# Ouch, that was a big bad bug, which took me three hours to find + (since I thought \TeX's low-level scanning mechanism was working). +# Note to myself: I\/ {\bf knew\/} it would be cleaner to define \\{get_next} + so that it sets \\{cur_cs} to zero every time it begins [i.e., + in \S341, where this change will in fact be made in \TeX82]. + But I had avoided this on grounds of efficiency in the inner loop. + Well, now I have earned this tiny bit of efficiency. +D204. Prohibit the first word of an unavailable node from becoming negative. + [The storage allocator of \TeX78 uses + a negative value to signify a node that is available, just as + `$\\{link}=\\{max_halfword}$' will signal availability in \TeX82.] @124 +# That was another bad one, it's not my night. +# At least I'm developing more subtle diagnostic techniques. +M205. Remember to un-negate the top \\{save_stack} entry + when \\{handle_right_brace} finishes an \\{insert_group}. + [This routine was completely revised in \TeX82.] @1100 +F206\>185. Initialize |\jpar| [i.e., |\tolerance|]. @240 +B207. Correct the display of insertion nodes by \\{show_node_list}. @188 +R208. Prevent \\{show_token_list} from generating really long strings + when in a loop. @292 +D209. Increase the reference count of \\{bot_mark} when + \\{vpackage} finds it. [This was later the job of \\{fire_up}.] @1016 +M210. Remember that the tokenlist for a mark ends with a |}|. @1101 +D211. Don't let \\{vpackage} lose the top insert. (It fails when + the very first item is a |\topinsert|.) @1014 +A212. And when that stupid code is corrected, make it handle + insertions first-in-first-out. @1018 +# Seven hours today. +* 26 Mar 1978 +# Easter Sunday, will work till sunrise. +I213. Add an `|i|' feature to the \\{error} recovery routine. @87 +I214. Include a prompt. @87 +C215. Ignore space after |\noalign{...}|. @1133 +# Otherwise, things are going well tonight; + I'm finding more bugs in my test program than in \TeX. +# The `|i|' feature is proving to be very helpful. +# I increased the size of \\{mem} + (now $\\{lo_mem_max}=3500$, $\\{mem_max}=10000$). +# In fact I just needed to increase it again + (now $\\{lo_mem_max}=4500$, $\\{mem_max}=11000$). +R216. Make |INITEX| output \\{mem_top} for consistency checking. @1307 +A217. Calculate the size of delimiters by considering the enclosed formula's + distance from the axis, not from the baseline. @762 +# I'm having trouble with a |SAIL| compiler bug; I must rearrange the program, + more or less at random, until it + compiles correctly. I hope the bug isn't more severe than it appears. +D218\>210. Don't put a new group on \\{save_stack} if a null mark is expanded. + [\TeX82 will remove the `|}|' from the mark text.] @386 +# I had to redo the typewriter-style font since its width tables were wrong. +# And I increased low-memory size again to 5500, then 6500. +# Finally the entire test program was \TeX ed. Happy Easter! Six hours today. +* 27 Mar 1978 +# Beginning at 2:30am. +A219. Move |\vcenter| processing to the first pass of \\{mlist_to_hlist}; + otherwise the height, depth, subscripts, etc., are way off. @733 +C220. Omit space after closing |$$|. @1200 +# Spacing is wrong in the formula $Y_1+\cdots+Y_k$; I have to rethink the use + of three dots. +G221. Make conditional thin space available to user as |\|{\tentex\char'34}. + [Later will retract this.] @226 +Q222. Introduce |\dispaskip| and |\dispbskip| [later called + |\abovedisplayshortskip| and |\belowdisplayshortskip|]. @226 +# Reminder: I need to test line-breaking with embedded math formulas. +I223. Make sure that $\\{interaction}\ne\\{error_stop_mode}$ + in the `|Whoa|' error [\\{fatal_error}]. @93 +B224. Fix a big mistake in the \\{style_node} routine (which points to a glue spec, + not to glue itself); somehow this didn't cause trouble yesterday. + [In \TeX78, style nodes double as placeholders for math glue + like thin spaces.] @732 +C225. Make |\fntfam| obey group structure. [\TeX78's |\fntfam| operation + is a combination of \TeX82's + |\textfont|, |\scriptfont|, and |\scriptscriptfont|.] @1234 +# At this point the test routine for Volume 2 works perfectly. +# But I will change the page width in order to check harder cases. +Q226\>178. Disable automatic line breaks after punctuation in math + (e.g., consider $f(x,y)$). @761 +S227. Represent italic corrections as boxes, not glue, so that they won't be broken. + [The |\kern| command doesn't exist yet.] @1113 +# Eight hours today. +B228. Fix a bug that just clobbered the memory: Call \\{free_avail}, not + \\{free_node}, in the \\{ins_node} case of \\{vpackage}. + [This logic will change completely in \TeX82.] @1019 +* 29 Mar 1978 +# (Wednesday) Again beginning at 2:30am. +Q229. Put still more space above and below fraction lines in displayed + formulas. @746 +G230\>189. Install an infinite penalty feature, which positively suppresses breaks; + use it in displayed formulas whose |\eqno| doesn't fit. @1205 +F231. Call \\{build_page} after finishing a display; and don't + go to the |\noindent| routine because of the next remark. @1200 +S232. Put |\parskip| glue just before a paragraph, not just after + (since it interferes with a penalty after). @1091 +# Although the test program gives correct output, it generates 46 locations + of variable-size memory and 280 of one-word memory that are not freed. +F233. Recycle the ulists and vlists in \\{fin_align}. @801 +M234\>25. Fix bug when deleting space at end of paragraph: + \\{delete_glue_ref}(\\{cur_node}) not + \\{delete_glue_ref}(\\{value}(\\{cur_node})). @816 +# There's also a more mysterious type of uncollected garbage, + a \\{fraction_noad} corresponding to + |$p\choose$|, an \\{incompleat_noad} not completed. +# Couldn't find that one, so I recompiled with \#233 and \#234 corrected. +# Now it gains just 10 locations of variable-size memory and 7 of the other kind. +I235. Extend \\{search_mem} to search \\{eqtb} also. @255 +D236\>143. Fix bug in \\{rebox} when $\\{list_ptr}(b)=0$. @715 +# The seven one-word nodes were generated by this bug; + \\{rebox}\kern-1pt\ put them onto a linked list starting with + $\\{mem}[0]$, growing at the far end! +D237. Remember to complete each \\{incompleat_noad}. @1184 +# This solved the other mystery. I had never noticed that my test output + was actually wrong: |$p\choose k$| came out as `$k$'. +# After these corrections, the test routine worked\thinspace\dots\ I feel + that \TeX\ is now pretty well debugged + (except perhaps for error recovery)---it's time to celebrate! +* 1 Apr 1978 +I238. Don't quit after file lookup fails. @530 +* 2 Apr 1978 +P239. Add \\{\TeX_font_area}, so that it's easier to change the + default library area associated with a device. @514 +* 3 Apr 1978 +L240. Insert parentheses again, to cope with the precedence of\/ |lsh| + when packing data. (See \#55 and \#176.) @1114 +# I had never tried $\\{hmode}+\\{discretionary}$ before! +M241. Remember that \\{back_error} requires \\{cur_tok} to be set. + (Problem can arise during error recovery on parameter |#|$n$ + with $n$ out of range.) @476 +* 4 Apr 1978 +I242. Add a deletion feature to the \\{error} routine. @88 +* 5 Apr 1978 +Q243. Reset \\{space_factor} after |\/| [this was later rescinded] + and after math in text. @1196 +* 10 Apr 1978 +G244\>104. Replace |\jpar| and |\tracing| by a new primitive |\chpar| for parameters. + It allows a user to change those quantities as well as the penalties for + hyphens, relations, binary ops, widows. @209 +* 14 May 1978 +# Beginning to typeset a real book (Volume 2, second edition), not just a test. +Q245. Make math in text end with spacing as if it were + followed by punctuation. [This rule will soon be rescinded.] @760 +F246. Insert |\times| into the hash table; I left it out by mistake. + [It will eventually move into |plain.tex|.] +C247. Change the names of Scandinavian accents from |\o|, |\oslash|, + |\Oslash| to |\a|, |\o|, |\O|. [This will also move to |plain|.] +* 17 May 1978 +B248. Fix a silly bug that hasn't been tweaked until today: + `|\halign to size|' [obsolete in \TeX82] used \\{vsize} + instead of \\{hsize}. @645 +* 19 May 1978 +G249. Add a |\topbaseline| feature [later called |\topskip|]. @1001 +Q250\>245. Subtract the math spacing change of May 14. @760 +A251. Skip past blanks in the \\{scan_math} procedure. [This blank-skipping + will eventually go into \\{scan_left_brace}.] @403 +I252. Introduce a \\{missing_brace} routine [later generalized] to improve + error recovery in $\\{mmode}+\\{math_shift}$, when the top + of \\{save_stack} isn't a \\{math_shift_group}. @1065 +Q253. Adjust the math spacing between closing parentheses and + Ord, Op, Open, Punct. @764 +Q254. Make the underline go further under. @735 +S255\>96. Compute the proper natural width when a displayed equation follows + a paragraph whose fillglue has been deleted by \\{line_break}. @1146 +* 20 May 1978 +A256. Fix the spurious value of \\{prev_depth} inside alignments. @775 +S257. Consider (and defeat) the following scenario: + The u and v lists are built in \\{init_align} using \\{temp_head}; + then while scanning `|\tabskip 2pt\rt{...}|' the macro |\rt| is expanded, + clobbering \\{temp_head}. @779 +# That bug was more subtle than usual. +Q258. Add the parameter \\{num3}, so that the positioning of\/ |\atop| + can be different from that for fractions. @700 +Q259. Add new parameters \\{delim1} and \\{delim2}, so that + |\comb| can use fixed size delimiters, not computed as with |\left|. @748 +* 22 May 1978 +C260\>221. Change |\|{\tentex\char'34} to |\|{\tentex\char'35} and introduce + |\|{\tentex\char'34} as the negative of\/ |\|{\tentex\char'35}. + [Later obsolete.] @226 +L261. Fix the display of negative penalty nodes; \\{show_node_list} is confused + when a negative value has been packed into the middle of a word. @194 +# Memory overflow just occurred with $\\{lo_mem_max}=7500$ and $\\{mem_max}=16384$. + So I have to go to 15-bit pointers. (A problem on 32-bit machines?) +* 23 May 1978 +Q262. Add a new parameter \\{big_op_spacing5}, for + extra space above and below limits of big displayed operators. @751 +F263. Initialize \\{incompleat_noad} in |$$\halign{...}$$|. @775 +# That was another heretofore-untested operation. How much of the code + has not yet been exercised? +F264\>238. Close the file when doing lookup-failure recovery. @27 +I265. Improve the error recovery for `|Extra &|'. @792 +R266. The top piece must be calculated mod 128 in \\{var_delimiter}, + to guarantee a valid subscript range. [Obsolete in \TeX82.] @546 +B267\>252. Fix a blunder in new \\{missing_brace} code. @1065 +B268\>262. Fix a blunder in new code for limits on display operators. @751 +* 26 May 1978 +Q269. Don't insert a new penalty after an explicit penalty in math mode. @767 +# The hash table overflowed; I ought to make it much bigger. +R270\>110. Avoid possible bad memory references in alignment + when there is erroneous input after |\cr|. [Instead of + \\{extra_info}, the value of \\{cur_align} in \TeX78 is negated, + because we need only distinguish |\cr| from |&|.] @789 +S271. Make the dimension parameters like |\hsize| all global, so that they can + be set in the |\output| routine. @279 +# This led to major simplifications, also to major surgery. +# [But it was a kludgy decision, overruled in \TeX82.] +D272\>94. Don't forget to set the type of the new null box in the |\end| routine. @1054 +* 27 May 1978 +# The data overflowed memory again, both low and high, doing Section 3.3.2. +R273\>184. Mask off extra bits of\/ |\char| in math mode, + to avoid bad memory references. @1151 +B274. Zero out the negative |\medmuskip| in script styles. @732 +* 29 May 1978 +S275. Be prepared to handle an undefined control sequence during \\{get_x_token}. + (Can fix this by brute force, using \\{get_token} instead of \\{get_next}.) + @380 +D276. Correct the superscript shift when a single character is raised. @758 +R277\>184. Mask off all but 7 bits in |\char| routine, + to avoid space-factor index out of range. @435 +# More memory capacity overflows. +E278\>22. Fix \TeX's overflow stop so that I don't have to wait for loading of the + |BAIL| debug routines. [System dependent.] @93 +F279. Remember to adjust the page number + when a file page ends in mid-macro. [System dependent.] @306 +* 5 Jun 1978 +R280. Make sure that the arguments of positioning commands don't overflow + their field size. @610 +I281. Report the excess amount when giving an overfull box warning. @666,677 +* 7 Jun 1978 +Q282. Use $\ge$ instead of $>$ as termination criterion in \\{var_delimiter}. @714 +R283. Disallow |\eject| in math mode. [In \TeX78, |\eject| is + distinct from |\break|; in horizontal mode it includes + \TeX82's `|\vadjust{\break}|'.] @1102 +Q284. Don't put too much clearance above |\sqrt| in text style. @737 +* 9 Jun 1978 +G285\>110. Make \\{align_state} an integer variable, not \\{boolean}, + so that |\eqalign| can be within another |\eqalign|. @309 +C286. A |\mark| should expand its input. @1101 +* 10 Jun 1978 +E287. Provide for preloading of fonts. @1320 +L288. Close the output file before switching to edit the input file with + the `|e|' option. @84 +E289. Return adjustments found by \\{hpack} to free storage if + they're not used. [Later, \\{hpack} will detach them only + when they're used.] @655 +Q290. Strive for consistency between \\{make_under} and \\{make_over}. + @735 +* 18 Jun 1978 +B291\>236. Fix a serious error in \\{rebox} + (`$b$' instead of `$\\{list_ptr}(b)$'). @715 +# Strange that such a bug would now surface for the first time! +C292. Remove |\deg| from |INITEX|, since macros suffice. +Q293. Add an extra hyphenation penalty for two hyphenated lines in a row. @859 +* 19 Jun 1978 +S294. Introduce the `\\{no_new_control_sequence}' switch. Among other things, + this will prevent an undefined control sequence following \\{scan_math} + from clobbering the save stack. @259 +* 20 Jun 1978 +L295. Change the badness test + `$\\{glue}\le0.0$' to `$\\{glue}\le0.0001$'. [\TeX82 will avoid such + problems by calculating badness without floating point arithmetic.] @99 +R296. Force \\{badness} to be at most $10^{19}$. @108 +I297. Add \\{end_template} for better error recovery in alignments. @375 +E298\>287. Make |INITEX| more like the real \TeX; my simple scheme for + font preloading was no good because it left thousands of `dead' + words in memory. @8 +E299. Economize disk space by using internal arrays in load + modules that aren't being reinitialized. [System dependent.] +E300. Move the declaration of \\{mem} to the semantics module, so that the + object code will be more efficient. [System dependent. The code of + \TeX78 was divided into separately compiled modules for syntax, + semantics, output, extensions, and general organization.] +* 21 Jun 1978 +# Today I'm working on the user manual. +C301. Disallow |\input| except in vertical mode. [I will change this in + \TeX82, treating |\input| as a case of expansion.] @378 +I302. Add error recovery for \\{endv} and \\{par_end} occurring in math mode. + @1047 +G303. Generalize |\ifT| to |\if T|. @506 +* 22 Jun 1978 +F304. Preload the |\bullet| [later done by |plain.tex|]. +D305\>256. Get the correct \\{prev_depth} at the beginning of an alignment. @775 +C306. Change |\eject| so that it ejects only once. @1000 +* 14 Jul 1978 +I307. Look in standard area if a file isn't found in the user's area. @537 +I308. Echo all online inputs in the transcript file. @71 +* 19 Jul 1978 +Q309. Equalize spacing when only one of numerator/denominator is big. @745 +Q310. Prevent subscript from getting too high above baseline. @757 +R311. Avoid infinite loop when stack overflows: \\{push_input} should say + `{\bf if} $\\{input_ptr}\ge\\{stack_size}\;\land\;\\{interaction}= + \\{error_stop_mode}$'. @321 +* 22 Jul 1978 +C312. Make |\quad| meaningful outside math mode. (All fonts must + be generated again!) @558 +I313. Show the nesting level at the end of \\{show_activities}. + [But I decided not to do this in \TeX82.] @218 +C314. Put in |\>| [namely, |\mskip\medmuskip|; + \TeX78 already has |\|{\tentex\char'35}, for conditional |\thinmuskip|, + as well as the negative amounts |\<|,~|\|{\tentex\char'34}]. + Change the name of vector accent from |\>| to |\b|. [Math spacing + operators will become much more general in \TeX82.] @716 +* 25 Jul 1978 +Q315\>94. Give the correct |\hsize| and |\vsize| to the null boxes created + at |\end|. @1054 +A316\>94. And don't ``append'' them. [Later this was changed, so + that it would work better with generalized output routines.] @1054 +I317\>297. Remove the control sequence |\endv|, + since error recovery is now better. @375 +I318. Define another mode of tracing: It says `|OK|' and stops after + |\showlists|. @1298 +Q319\>244. Give better defaults to parameters. [Later done by |plain.tex|.] @209 +I320. Allow more bits in the packed representation of\/ |\showboxdepth|. @238 +I321. Scan past delimiters and/or dimensions when recovering from + ambiguous fractions. @1183 +R322. Reduce accent numbers modulo 128 or 512, depending on the + mode. @1165 +I323. Include a warning, `|(\end occurred on level ...)|'. @1335 +* 28 Jul 1978 +# (I'm writing Chapter 27 of the manual: `Recovery From Errors'.) +I324. Improve the error message in \\{scan_digit}. [This procedure will change + its name to \\{scan_eight_bit_int}, when the number of registers + increases from 10 to~256.] @433 +I325. Don't report overfull boxes if they're less than .1~point + over. @666,677 +I326. Give the user extra chances to define the font, if \\{read_font_info} + is unsuccessful. @560 +I327. Change default recovery for bad parameter number from |#1| to |##|, since + |#1| won't always work and since |##| is probably intended. @479 +I328. Omit the |"Negative?"| message on things like \\{scan_char_num}. @435 +I329. Improve error recovery when a large delimiter isn't in family~3. + [Obsolete.] +I330. Give a more appropriate error message when the input is `|$\right|'. @1192 +# Currently \TeX\ says `|Missing $|'! +I331. Call \\{back_input} before the error message in \\{back_error}, + not afterwards. @327 +* 1 Aug 1978 +I332. Give an appropriate warning when there's no input file and the user + types `|e|'. @84 +L333. Increase the system pushdownlist size so that the manual will compile. + [Procedures \\{hlist_out} and \\{vlist_out} can recurse deeply.] +# Yesterday I distributed 45 preliminary copies of the manual; today I + took out the ``debugging hooks'' and put \TeX\ up as a system program. +* 2 Aug 1978 +# I'm typing Volume 2 again (currently in Section 4.2.2). Culture shock! +G334. Introduce a |\ragged| parameter, to indicate a degree of raggedness. + [Previously, ragged-right setting was performed when the + |\tolerance|/100 was odd! Eventually a better approach, + with |\rightskip| and such things, will be discovered.] @886 +Q335. Omit the `widow penalty' in one-line paragraphs. @890 +* 5 Aug 1978 +G336. Generalize |\pageno| to |\count|\<digit>. @236 +D337\>285. Update \\{align_state} when recovering from `|Missing {|' and + `|Extra }|' errors. @1069,1127 +I338. Show ``runaway'' tokens, making it easier to pinpoint an error. @306 +* 22 Aug 1978 +G339. Add |\predisplaypenalty|. @1203 +I340. Clarify error messages; they should indicate when something has been + inserted, etc. @1064 +* 23 Aug 1978 +I341\>114. Substitute `|Extra }|' for the losing `|Missing \cr|' error message. @1069 +I342\>213. Go past online insertions in \\{show_context}. @311 +Q343. Exact no penalty for breaking one line before a display. @1145 +I344\>338. Check for runaways at end of file. @362 +I345. Give error message when a macro argument begins with |}|. @395 +* 24 Aug 1978 +L346\>213. Remove extra line-feed in \\{show_context} after printing insertions. + [System dependent.] @318 +* 25 Aug 1978 +Q347. Leave no glue at top of page, even after |\eject|. @997 +* 27 Aug 1978 +P348. Adopt Guy Steele's new version of the \TeX\ source files. [He has + recently made a copy and modified it by introducing + compile-time switches for MIT conventions as an alternative to SUAI. + This is the first time that \TeX\ is being ported to another site; + additional switches for PARC, TENEX, TOPS10, and TOPS20 will be + added later, using the Steele style.] +* 1 Sep 1978 +Q349. Don't pass over leader nodes in the \\{try_break} background + computation. [At this time, leaders have not yet been + unified with glue.] @837 +Q350\>82. Prune away all penalties at the top of a page. @997 +* 4 Sep 1978 +I351\>338. Include `|\|' in error message about a runaway argument. @306 +* 8 Sep 1978 +# I just remade all the fonts, with increased ligature field size. +B352\>350. Insert a necessary {\bf goto} statement in the first branch of + the new penalty routine within \\{build_page}. @997 +* 30 Sep 1978 +M353\>338. Make the token list for runaway arguments meaningful outside + of \\{macro_call}. (I just had a runaway argument ending with + `|\lcm|', which turned out to be the + control sequence in hashtable location 0.) @371 +R354. Avoid infinite loop when recovering from |$$| in + restricted horizontal mode. @1138 +L355. Fix two hyphenation bugs related to |-ages|, |-ers|. + [A completely new algorithm for hyphenation will go into \TeX82.] +Q356. Add |-est| to hyphenation routine; + also disable |puz-zled| and |rat-tled|, etc. +* 4 Oct 1978 +G357. Add new primitive |\vtop|. @1087 +Q358. Treat implicit kerns properly after discretionary hyphens have been + inserted. @914 +* 4 Nov 1978 +Q359. Forget the half quad originally required at left and right when + centering displayed equations without equation numbers. @1202 +* 11 Nov 1978 +R360. Don't let the postamble come out empty. [This could occur if no fonts were + selected.] @642 +* 15 Nov 1978 +C361. Allow optional space after digit in \\{scan_int} routine. @444 +* 17 Nov 1978 +R362. Make the \\{check_mem} procedure slightly more robust. @167 +* 20 Nov 1978 +C363. Make the |\par| in a |\def| match the |\par| that comes automatically with + a blank line. (Suggested by Terry Winograd.) @351 +G364. Add new parameter |\mathsurround| for spacing before and after + math in text. @1196 +G365. Extend |\advance| to allow increase by other than unity. [At this + time it applies only to the ten |\count| registers, and it is + called |\advcount|.] @1238 +* 25 Nov 1978 +G366. Add a new primitive: |\unskip|. @1105 +G367. Add new primitives |\uppercase| and |\lowercase|. @1288 +* 28 Nov 1978 +M368\>338. Don't let |\mark| and \\{macro_call} interfere with each other's + \\{scanner_status}. @306 +M369. Omit extra |}| after \\{show_node_list} shows a |\mark|, + since the right brace is already there. (See \#210.) @176 +G370. Add a new primitive suggested by Terry Winograd: |\xdef|. @1218 +* 29 Nov 1978 +S371. Delete a space following |\else{...}| also in the + false case. [\TeX78 uses braces, not |\fi|, for conditionals.] +D372\>320. Make |\tracing| set |\showboxbreadth| as advertised. @198 +F373. Account properly for kerns in width calculations of \\{line_break}. + @866 +Q374\>364. Delete a \\{math_node} at the beginning of a line. @148 +A375\>339. Guarantee that |\predisplaypenalty=10000| will suppress page breaking + before a display. @1005 +* 6 Dec 1978 +L376. Change the file opening statement to allow lines up to 150 characters long. + [System dependent.] +* 16 Jan 1979 +F377\>365. Initialize \\{negative} properly in the |\advance| routine + with a |\count| as argument. @440 +* 20 Jan 1979 +R378. Try to keep complex, buggy preambles of alignments from + crashing the program. @789 +* 17 Feb 1979 +I379\>376. Give more detailed information when warning about a + long line being broken. [System dependent; + the buffer size in \TeX78 is very limited.] +L380. Declare $p$ local to \\{try_break}, for the ``rare'' case code. + [My original program included the following comment: + ``This case can arise only in weird circumstances due to + changing line lengths, and the code may in fact never be executed.'' + Later Michael Plass will discover that variable line lengths require an + entirely different algorithm, using \\{last_special_line}.] + @847 +F381\>334. Don't omit the raggedness correction when the + last line of paragraph has to shrink. [Obsolete in \TeX82.] +* 22 Feb 1979 +F382\>363. Don't forget to return from \\{get_x_token} after finding |\par|. @351 +Q383. Add a new parameter: |\lineskiplimit|. @679 +C384. Change the syntactic sugar: + `|\hbox par|' replaces `|\hjust to ...{overfull}|'. [This vastly improves on + the old idea (see \#40), but there still is no internal vertical mode.] +C385. Introduce new names |\hbox| and |\vbox| for |\hjust| and |\vjust|. @1071 +G386. Add a new condition: |\ifpos|. [It will later be + generalized to |\ifnum| and |\ifdim|.] @513 +G387. Add |vu| and |\varunit|. [\TeX82 will eventually allow arbitrary + internal dimensions as units of measure.] @453 +G388\>312. Add an |em| unit. @455 +C389. Legalize |\hbox spread |\<negative dimension> [since \\{scan_spec} + no longer uses the sign as a flag]. @645 +* 10 Mar 1979 +C390\>370. Make \\{scan_toks} expand |\count| during |\xdef|. [This will + change later when |\the| and |\number| are introduced.] @367 +* 23 Mar 1979 +Q391. Put only 100000\thinspace pt stretch at the end of a paragraph instead of + 10000000000\thinspace pt. + [In \TeX78, ``infinite'' glue is actually finite but large; in the + language of \TeX82 we would say that |\parfillskip|, which is + not yet user-settable, is being changed to be like |\hfil| instead of + like |\hfill|.] @816 +Q392. Treat the last line of a paragraph more consistently with + the other lines (e.g., when |\hfil| appears in mid-paragraph), by + effectively inserting \\{inf_penalty} at the end. @816 +* 31 Mar 1979 +S393. Ensure that penalty nodes aren't wiped out, in weird cases where + breaks occur at penalties that normally disappear. @879 +* 27 Apr 1979 +A394. Correct the page number count when files begin with an empty page. + [System dependent.] +G395. Allow the \\{math_code} table to be changeable via |\chcode|. + [In \TeX82, |\chcode| will split into |\mathcode| and |\catcode|.] @1232 +I396\>332. Don't accept `|e|' after an error message if not + inputting from a file. @84 +* 29 May 1979 +F397. Don't call \\{end_file_reading} if you haven't already invoked + \\{begin_file_reading}; this could happen when trying to + recover from an error in \\{start_input}.@537 +* 7 Jun 1979 +A398\>306. Be sure to eject two pages, + when |\eject| comes just at the time another break is preferable + (e.g., when the page has just become too full). @1005 +* 27 Jun 1979 +I399\>354. Don't say `|You can't do that in math mode|' when the user + says `|$$|' in restricted horizontal mode! @1138 +* 30 Jun 1979 +G400. Add |wd|, |dp|, |ht| dimension units. @455 +I401\>307. Don't try the system area for file names whose area is explicitly + indicated. @537 +* 1 Jul 1979 +G402. Allow letters as (ASCII) numbers [without the |`| marker introduced + later]. @442 +* 2 Jul 1979 +F403. Fix a |\gdef| bug: If the control sequence was never defined before + [this later became the \\{restore_zero} option], + don't remove it at group end. @282 +* 16 Jul 1979 +I404\>320. Update \\{show_noad_list} to be like \\{show_node_list}. + [The two routines, originally separate, will be merged in \TeX82.] @238 +* 18 Jul 1979 +G405. Extend capacity from 32 fonts to 64 fonts if desired. @134 +Q406. Add new \\{extra_space} parameter to all text fonts (requested + by Frances Yao). @558 +F407. Make each \\{node_noad} print properly in \\{show_noad_list}. @183 +Q408. Make |\jpar| allow any break if it is 1000000 or more. + [In \TeX82, a |\tolerance| of 10000 or more allows any break.] @851 +* 23 Jul 1979 +E409. Introduce new primitives |\hfil|, |\vfil|, |\hfilneg|, |\vfilneg|. @1058 +G410. Add |\ifmmode|. @501 +G411. Add |\firstmark|. @1012,1016 +C412. Allow break at leaders (horizontal mode only). @149 +* 25 Jul 1979 +I413\>213. Revise \\{error} so that online insertions work properly + after end-of-file errors. @336 +B414\>411. Change `{\bf if} $\\{first_mark}\ne0$' to + `{\bf if} $\\{first_mark}\ge0$' [because $-1$ + is used to indicate `not yet given a value']. @1012 +* 28 Jul 1979 +C415\>370. Stop |\xdef| from expanding control sequences after |\def|'s. + [This decision will be rescinded later, after several more years of + experience with macro expansion will suggest better ways to cure + the problem.] @366 +I416. Change symbolic printout for control symbols. [System dependent.] @49 +L417\>308. Avoid linefeeds in the transcript file. [System dependent.] +C418\>370. Expand |\topmark|, etc., in |\xdef|. @366 +* 4 Aug 1979 +B419\>413. Fix an error introduced recently: |\par| was suddenly + omitted at end of page. [System dependent.] +* 11 Aug 1979 +P420. Change error messages that use |SAIL| characters not in + standard ASCII. @360 +* 28 Aug 1979 +D421\>411. Move the command `$\\{first_mark}\gets-1$' from \\{vpackage} + to \\{fire_up}. @1012 +S422\>403. Correct a serious |\gdef| bug: + Control sequences don't obey a last-in-first-out + discipline, so \TeX\ loses things from the hash table when deleting a + control sequence. @259 +# To fix this, I either need to restrict \TeX\ (so that + |\gdef| can be used inside a group only for control sequences already + defined on the outer level) or need to change the hash table algorithm. + Although all applications of \TeX\ known to me will agree to the + former restriction, I've chosen the latter alternative, because it gives me + a chance to improve the language: Control sequences + of arbitrary length will now be recognized. +D423. Make sure that \\{unsave} cannot call \\{eq_destroy} + with a value from the upper part of \\{eqtb}. @282 +# I noticed this long-standing bug while fixing \#422. It had very + low probability of causing damage (e.g., it required a certain field + of a floating-point number to have a certain value), but it would have + been devastating on the day it first showed up! +* 29 Aug 1979 +F424. Call \\{eq_destroy} when a control sequence is |\gdef|'ed + after being |\def|'ed. @283 +F425\>418. Treat the first token consistently + when |\topmark| and its cousins are expanded in \\{scan_toks}. @477 +# Now I've checked things pretty carefully and I think \TeX\ is ``fully debugged.'' +* 25 Jan 1980 +I426\>338. Display runaway alignment preambles. @306 +G427. Introduce active characters (one-stroke control sequences). + [I don't yet go + all the way: The meanings of `|x|' and `|\x|' have to be identical.] @344 +* 7 Feb 1980 +F428\>314. Fix a glaring omission: Op space |\>| was + never implemented in math mode! @716 +* 25 Feb 1980 +G429. Add a new dimension `|ex|' (for units of xheight). @455 +* 3 Mar 1980 +C430\>427. Allow the control sequence |\:| to be redefined + [it was the `select font' operator]; + this allows the character |:| to be active. [Obsolete.] +* 23 Mar 1980 +# An extend-\TeX-for-the-eighties party: +G431. Add a new |\copy| feature. @204 +G432. Add a new |\unbox| feature. @1110 +G433. Add a new |\open| feature [later |\openout|]. @1351 +G434. Add a new |\send| feature [later |\write|]. @1352 +G435. Add a new |\leqno| feature, requested by MDS. @1204 +G436. Add a new |\ifdimen| feature [later |\ifdim|]. @513 +C437. Make |\|\<space> in vertical mode begin a paragraph. @1090 +G438. Add a new |\font| feature [replacing the silly previous convention that + a font must be defined when it is first selected]. @1256 +G439. Add new |\parval| and |\codeval| features [later + |\the|\thinspace\<whatever>\thinspace]. @413 +C440\>427. Don't let active characters gobble the following space. @344 +G441\>208. Add a new parameter to govern amount of token list dumped. [Obsolete.] @295 +G442. Add a new |\linebreak| feature [later replaced by |\break|]. @831 +* 25 Mar 1980 +# (Still working on the above, also thought of more.) +G443. Add a new |\mskip| feature. @716 +G444. Add a new |\newname| feature (soon changed to |\let|). @1221 +G445\>430. Allow any control sequence to be redefined. @275 +I446. Send the output to the user's current file area, even when + input comes from elsewhere. @532 +* 27 Mar 1980 +Q447. Compute the xheight for accents in math mode from + family~1, not family~3. [Obsolete.] +* 28 Mar 1980 +Q448. Increase minimum clearance between subscript and superscript. @759 +* 29 Mar 1980 +Q449\>222. When a display follows a display, the second should have the + `shortskip' glue. @1146 +* 4 Apr 1980 +A450\>445. Look at current token meanings when trying to recognize + |\tabskip| in alignment preambles. @782 +* 23 Apr 1980 +I451. Estimate the length of printed output, for the new + priority feature on our XGP device driver. [System dependent.] +C452\>434. Break long |\send| lines + into pieces so that the file can be read in again. [System dependent.] +* 19 May 1980 +Q453\>182. Don't make |\left| and |\right| delimiters too large; they + need to be only 90\% of the enclosed size. [This eventually + became |\delimiterfactor|.] @762 +* 21 May 1980 +G454. Add a new |\pagebreak| feature [later |\vadjust{\break}|]. @655 +* 13 Jun 1980 +# Today I'm beginning to overhaul the line-breaking routine, + and I'll also install miscellaneous goodies. +G455. Allow a radical sign to be in different font positions. @737 +E456. Clear empty tokenlists off input stacks to allow deeper recursions + (suggested by Jim Boyce's macros for chess positions). @325 +G457. Make |\spaceskip| and |\parfillskip| changeable. @1228 +G458. Add a new parameter |\rfudge| (per request of Zippel) [later |\mag|]. @288 +G459. Add a new parameter |\loose| [later |\looseness|]; + now parameters are allowed to take negative values. @875 +E460. Remove the variable \\{just_par}. [Obsolete; it was the \\{real} equivalent + of an \\{integer}]. +* 14 Jun 1980 +Q461. Install new line-breaking routines, including |\parshape|. + (These major changes are introduced as Michael Plass + and I write our article.) @813 +G462. Add a new parameter |\exhyf| [later |\exhyphenpenalty|]. @869 +* 16 Jun 1980 +S463\>444. Change conventions in \\{eqtb} so that glue is distinguishable + from other equivalents. @275 +A464\>444. Don't expand |\b| in |\xdef{\d\b{...}}| after |\let\d=\def|. + [Obsolete.] +D465\>444. Avoid creating dead storage when doing \\{unsave} in certain regions. @275 +* 17 Jun 1980 +C466. Allow negative dimensions in rules. @138 +* 19 Jun 1980 +B467\>463. Make the new test for glue at the outer level of \\{show_eqtb}. @252 +* 27 Jun 1980 +Q468\>453. Don't let |\left| and |\right| become too small for big matrices. + [This eventually became |\delimitershortfall|.] @762 +* 3 Aug 1980 +Q469. Don't move extra-wide, numbered equations flush left unless + they begin with glue. @1202 +* 15 Sep 1980 +M470\>461. Say `$\ge\\{fz}$' instead of `$>\\{fz}$' in the pre-hyphenation + routine; I'd forgotten my definition of \\{fz} [a variable used to test + for a sequence of lowercase letters in the same font]. @897 +R471\>395. Check the range of the index in |\chcode| before saving the old value. + @1232 +* 18 Sep 1980 +D472\>457. Don't forget to increase the reference count to |\parfillskip|, + or it will mysteriously vanish. @816 +* 19 Sep 1980 +C473\>412. Make leaders break like glue in both horizontal and vertical modes. + @149 +Q474\>364. Make |\mathsurround| break properly at left and right end of lines. + @879 +* 13 Oct 1980 +I475\>461. Remove spurious overfull boxes generated when the looseness criterion + fails. [Obsolete.] +A476\>461. Redesign the iteration for looseness; breakpoints were not chosen + optimally. @875 +E477\>461. Avoid storing a lot of breakpoints when they are dominated by + others. @836 +B478\>366. Don't say `\\{cur_node}' when you mean `\\{mem}[\\{cur_node}]'. @1105 +Q479\>461. Prefer the oldest break to the youngest break + when two break nodes have the same total demerits. @836 +L480\>461. Don't make badness too big for floating-point calculations, + when forced to make an overfull box. [Obsolete.] +* 10 Dec 1980 +R481. Make it impossible to get unmatched `|}|' in a delimited macro + argument. @392 +G482. Add new |\topsep| and |\botsep| features. [These are \TeX78's + way to put space at the edge of inserts, + replaced in \TeX82 by the |\skip| register corresponding + to an |\insert| class.] @1009 +* 6 Jan 1981 +P483. Install new routines for reading the font metrics, using Ramshaw's + |TFM| files instead of\/ |TFX| files. @539 +I484. Abort after reporting 100 errors, if not pausing on errors. @82 +G485. Add new |\spacefactor| and |\specskip| and |\skip| primitives. + [At this time we write `|\specskip3=10pt|' and `|\skip3|' for what + will become `|\skip3=10pt|' and `|\hskip\skip3|' in \TeX82.] @1060 +G486\>366. |\unskip| is now allowed in internal vertical mode. @1105 +* 26 Jan 1981 +B487\>482. Don't say `\\{mem}[$q$]' when you mean `$q$'. (See \#143 and \#478.) @1009 +* 27 Feb 1981 +I488\>417. Put some linefeeds back into the transcript file, in order + to prevent overprinting in listings. [System dependent.] +G489. Add a new |\dpenalty| feature [later |\postdisplaypenalty|]. @1205 +G490. Add the dimension |cc| for European users. @458 +C491. Make \\{scan_keyword} match uppercase letters as alternatives + to lowercase ones (suggested by Barbara Beeton's experiments + with |\uppercase|). @407 +I492. Add nonstop mode so that overnight batch processing is possible. @73 +* 2 Mar 1981 +S493\>422. Fix a still more serious |\gdef| bug: The generality + of\/ |\gdef| almost makes it a crime to + forget {\sl any\/} control sequence names, ever! (The previous bug was + only the tip of an iceberg.) @259 +I494. Issue warning message at the end of a file page if nesting level isn't zero. + [System dependent.] +* 5 Mar 1981 +I495. Keep track of maximum memory usage, for statistical + reporting. [Obsolete.] @125 +Q496\>350. Prune away glue and penalties at top of page after marks, sends, + inserts. @1000 +G497. Allow |\mark| in horizontal mode. [Later it will + be |\vadjust{\mark...}|.] @655 +C498. Allow optional space before a required left brace, e.g., |\if AA {...}|. + [See \#251.] @403 +I499. Issue an incomplete |\if| error, to help catch a bad |\if|. @336 +* 17 Mar 1981 +I500\>494. Omit the warning message at end of a file page unless + the nesting level has changed on that page. [System dependent.] +Q501\>310. Fix the spacing when there is a very tall subscript with + a superscript. @759 +* 20 Mar 1981 +S502\>371. Make space-eating after |\else| fully consistent between the + true and false cases. [Obsolete.] +* 24 Mar 1981 +B503\>496. Change \\{glue_spec_size} to \\{ins_spec_size} + in \\{vpackage} [where insertions are done]. [Obsolete.] +* 5 Apr 1981 +B504\>501. Fix a typo (`|+|' instead of `|-|') in the new subscript code; + this shifted certain subscripts down instead of up. @759 +* 18 Apr 1981 +G505. Make leaders with rules of specified size act like variable rules. + @626,635 +* 29 Apr 1981 +A506\>461. Don't consider $\\{badness}>\\{threshold}$ at a line |\break| + except in an emergency. @854 +* 13 Jul 1981 +C507\>402. Allow other characters as numbers. @442 +R508\>294. Avoid dead storage if a \\{no_new_control_sequence} error occurs. + [Obsolete.] @259 +G509. Add a new |\ifx| feature. @507 +G510. Add new features |\xleaders| and |\cleaders|. @626,635 +* 14 Jul 1981 +S511\>507. Amend the new code for constants; + the `|.|' in `|.5|' is thought to mean \O{056}! @442 +L512\>507. And fix an egregious blunder in that code: New commands at the + end of a procedure are ignored when earlier statements + exit via {\bf return}. @442 +* 4 Aug 1981 +P513. Accept alphabetic codes for all online error recovery options, + instead of insisting on control codes like line feed or form feed. + [The original error-recovery codes were suggested by the + conventions of the |SAIL| compiler.] @84 +G514. Add a new |\thebox| feature [later |\lastbox|]. @1079 +* 7 Aug 1981 +G515. Add |fil|, |fill|, and |filll| as units for glue stretching + or shrinking. @454 +I516. Suppress the overfull box error when shrinkage amount is negative. @664 +* 9 Aug 1981 +Q517. Let unset boxes inherit the size of their parent in alignments. @810 +* 12 Apr 1982 +F518. Make |INITEX| dump out the \\{font_dsize} array needed by + the new |DVI| output module. @1322 +* 1 May 1982 +S519\>151. Fix \\{clean_box} so that \\{mlist_to_hlist} cannot make + $\\{link}(q)=0$ and $\\{type}(q)=\\{glue_node}$. @720 +# [That was the historic final change to \TeX78. All subsequent entries + in this log refer to \TeX82.] +* 15 Jul 1982 +# Finished draft of test program and began debugging about 1430 + [2:30\thinspace pm]. Taking my time. +BX1. Change \\{eqtb}[\\{cur_font}] to \\{eqtb}[\\{cur_font_loc}]. @232 +# Not logging changes to the exposition. +# Compile time is about 2 minutes CPU, times 5 for time-sharing; + add another half minute for linking and loading. +# Hash table and \\{get_next} seem to be working, with no changes needed! +# Time out 1630--1815 for Jill's birthday party. +LX2. Insert {\bf begin} \dots~{\bf end} around \\{dump_int} macro. @1305 +IX3. Print two blank spaces before date in \\{open_log_file}. @536 +AX4. Update $x$ and \\{var_used} outside the {\bf for} loop. @1311 +BX5. Change {\bf if} $=$ to {\bf if} $\ne$ as loop exit condition. @1315,1316 +# The |TRIP| test should preload more fonts. +LX6. Insert {\bf begin} \dots~{\bf end} around statistics output. @1334 +FX7. Must \\{get_x_token} when scanning a number. @445 +IX8. Interactive \\{debug_help} needs to print a newline. @1338 +FX9. Include \\{ignore_spaces} and \\{math_accent} in \\{print_cmd_char} cases. @266 +IX10. Don't call \\{confusion} when \\{print_cmd_char} sees unknown code. @298 +# Compiler bug causes stack overflow. Retiring for the night at 2145. +* 16 Jul 1982 +# Starting at 0700; DRF has fixed the compiler. +RX11. Allow arbitrary integer parameters in diagnostic print routines. @237,699 +TX12. Say \\{cur_tok}, not \\{cur_val}, when you mean \\{cur_tok}. @440 +FX13. Make |\pause| effective also on first line of a file. @538 +FX14. Show context after online deletion. @88 +IX15. Bypass reference count when \\{debug_help} shows a token list. @1339 +BX16. Change `{\bf case} $p$' to `{\bf case} \\{type}($p$)'. @1000 +FX17. Fix timing of \\{print_ln} when scrolling help messages. @90 +PX18. Make \\{other_char} the default category for ASCII control codes too. @232 +AX19. Use special scanning method for font number in \\{new_font}. @1257 +# Eating lunch, 1020--1035, while the machine slowly recompiles everything. +FX20. Don't forget to increase $k$ in the {\bf while} loop. @355 +DX21. Adjust \\{limit} properly after line changed when pausing. @363 +FX22. Remember to return a value in \\{new_spec} and \\{new_penalty}. @151,158 +# Now stepping through \\{line_break} in simple case. +AX23. Don't prune unwanted nodes if $\\{cur_p}=\\{null}$. @877 +FX24. Print a closing parenthesis when displaying glue nodes. @189 +SX25. Use \\{last}, not \\{limit}, in \\{term_input}; else error prompt causes + trouble when $\\{state}=\\{token_list}$. @71,87 +DX26. Set $\\{first}\gets\\{limit}+1$ after \\{init_terminal}. @331 +DX27. Make sure \\{set_trick_count} is always performed. @317 +* 17 Jul 1982 +IX28. Add new diagnostic feature |\tracingcommands|. @299,1031 +# Debugging of system-dependent code not shown in this log. +# Tangling \TeX\ now takes 1.75 minutes; about 75K bytes, 108K tokens. +# Redundant semicolon sends Pascal compiler into infinite loop! +FX29. Initialize $\\{passive}\gets\\{null}$. @864 +AX30. Fix pseudoprinting when the line is empty. @318 +EX31. Merge adjacent free areas of dynamic memory before dumping. @131 +FX32. Print the word |mode| in \\{print_mode}. @211 +IX33. Improve message and help in case of weird error. @415 +GX34. Allow optional space after |\def| and similar constructions. @473 +MX35. Declare \\{alpha} to be integer in \\{read_font_info}. @560 +AX36. Fix timing of \\{back_input} in \\{scan_dimen}. @448 +IX37. Back up after missing number error. @446 +IX38. Show the `|at|' size that is considered improper. @1259 +IX39. Streamline the dialog in \\{debug_help}. @1338 +MX40. Take output of \\{the_toks} from the advertised place. @467,1297 +TX41. Say \\{trie_fix}($q$), not \\{trie_fix}($p$). @959 +SX42. Decrease low limit of \\{error_count} to $-1$. @76 +* 18 Jul 1982 +FX43. Clear initial reference count of macro definitions. @473 +AX44. Fix timing of \\{back_input} in \\{scan_glue}. @461 +BX45. Use \\{cur_val_level}, not \\{cur_val}, when checking levels. @461 +BX46. Multiply |fil| units by $2^{16}$ for correct scaling. @454 +BX47. Don't confuse \\{glue_base} with \\{skip_base}. @1237 +AX48. Fix \\{print_scaled} so that 0.01 doesn't come out |0.1|. @103 +IX49\>X28. Show mode changes when tracing commands. @299 +LX50. Don't say {\bf if} $(n=0)\lor(\,\ldots\;\hbox{\bf div}\;n)$ in Pascal. @105 +BX51. Don't confuse \\{box_flag} with \\{box_code}. @1075 +SX52. Reset \\{offset} on \\{print_ln} even in \\{no_print} mode. @57 +SX53. Fix restarting of interrupts after \\{big_switch}. @1031 +LX54. Don't loop {\bf for} $k\gets a$ {\bf to} $b-1$ when $b=0$ if $k$ is + declared nonnegative. +IX55. Put `|=|' sign into the \\{format_ident}. @1328 +SX56. Allow $r$ to be any integer in \\{get_node}. @125 +IX57. Don't put the output of \\{print_file_name} in quotes. @518 +IX58. Say `|dumped|' after dumping. @1311 +EX59. Eliminate unnecessary initialization code. @1332 +LX60. Get the file reading started right when beginning to undump. @1308 +IX61. Give forlorn message if format file can't be loaded. @1303 +FX62. Assign value to \\{cur_val} after glue arithmetic. @1239,1240 +* 19 Jul 1982 +LX63. Don't say {\bf if} $p>\\{max}\lor\\{free}[p]$ in Pascal. @169 +AX64. Fix memory-undump logic; loops are out of phase with input. @1312 +BX65. Undump \\{hyph_word}[$j$], not \\{hyph_word}[$k$]. @1325 +# At last |trip.fmt| loads without bombing out. +PX66. Remove assignment of array to array, not allowed by IBM Pascal + (Susan Plass). @167 +PX67. Simplify an expression that's too big for IBM Pascal (Susan Plass). @1009 +AX68. Go to \\{contribute}, not \\{done}, after insertions. @1000 +IX69. Decrease \\{depth_threshold} if there's not enough string space. @198 +IX70. Show rules as `{\tt\char`\|}' in short displays. @175 +IX71. Don't show null glue in short displays. @175 +SX72. Set $\\{job_name}\gets0$ as part of output initialization. @528 +SX73. Don't complain of infinite shrinkage on |0pt minus 0fil|. @825,976,1009 +IX74. Use different prompt at beginning when accepting a file name. @37 +FX75. Reset \\{last_glue} on nonglue nodes. @996 +BX76. Remember to call \\{error} after printing |OK|. @1293 +LX77. Insert {\bf begin} \dots{ \bf end} around program text of section. @1025 +FX78. Define the |\shipout| primitive. @1071,1073 +AX79. Introduce \\{write_loc} analogous to \\{par_loc}. @1344,1371 +FX80. Dump and undump \\{par_loc} and \\{write_loc}. @1313,1314 +FX81. Allow \\{the} in \\{scan_the} [later \\{scan_something_internal}]. @413 +EX82. Interchange command codes $\\{the}:=:\\{number}$ [later \\{convert}]. @210 +BX83. Don't confuse \\{breadth} with \\{depth}. @236 +IX84. Add string printing feature to \\{debug_help}. @1339 +FX85. Set $\\{state}\gets\\{mid_line}$ in \\{begin_file_reading}. @328 +# Time out 2105--2200 to pick up Jenny from driving lesson. +LX86. Keep $c\le127$ when deleting 99 tokens. @88 +SX87. Don't check for \\{str_room} error when $\\{selector}=\\{new_string}$. @1328 +* 21 Jul 1982 +IX88. Gather more statistics: String usage, font info, hyphen exceptions, stacks. @1334 +DX89\>X79. Initialize \\{write_loc} from \\{cur_val}, not from \\{cs_ptr}. @1344 +FX90. Remember to pack file name for |\open|. @1374 +SX91\>X34. Defuse |\outer| test before scanning optional space after `|}|'. @473 +SX92. Don't allow \\{prepare_mag} to cause errors after \\{jump_out}. @84 +# The first page of |DVI| output is {\sl perfect\/}! Pause to play piano. +BX93. Don't confuse \\{dimen_base} with \\{scaled_base}. @1237 +DX94. Initialize $\\{link}(\\{page_head})\gets\\{null}$ when beginning a page. @991 +SX95. Correct \\{cur_height} more often, since \\{max_depth} might be negative. @972,973 +AX96. Calculate page dimensions properly after vertical kerns. @973 +SX97. Install new \\{page_contents} logic to handle interaction between + insertions and |\topskip|. @987,1008 +SX98. Allow \\{top_skip} glue to be a valid breakpoint. @1001 +FX99. Don't forget to count \\{dyn_used} in inner loop [erroneous analysis + retracted later]. @1034 +FX100. Set $p\gets q$ after migration step. @655 +FX101. Clear \\{prev_graf} to zero at start of paragraph. @1091 +LX102. Put parens into negated \\{leader_flag} macro. @1078 +# Time out 1720--1920 for John's birthday dinner. +DX103. Scale \\{best_height} when adjusting \\{page_goal}. @1010 +AX104. Simplify logic of split insertions; three states become two. @981,1019,1020 +MX105. Don't omit first character when showing a macro argument. @400 +RX106. Prevent clobberage if macros have too many parameters. @390 +* 22 Jul 1982 +IX107. Tell how many |DVI| bytes were output. @642 +IX108\>X88. Adjust for singular or plural statistics. @1320,1334 +SX109\>X98. Consider \\{page_head} a glue node, to inhibit unwanted break. @988 +DX110. Introduce \\{new_skip_param} to keep reference counts updated. @679,969,1001 +DX111. Record the correct size of new insertion after it's split. @1010 +DX112. Use \\{free_node}, not \\{flush_node_list}, when recycling insertion + nodes. @1022 +SX113. Make online insertions work after \\{get_next} is interrupted. @87,324,343 +BX114. Print newline on interruption stop. @98 +SX115\>X34. Put space before \\{end_write_token}. @1371 +BX116. Don't confuse \\{glue_order} with \\{stretch_order}. @838 +TX117. Set $\\{max_dimen}\gets\hbox{\it'7777777777\/}$, not {\it'777777777}. @421 +MX118. Make |\global\textfont| legal. @1211 +BX119. Fetch |\the\textfont| with \\{equiv}, not \\{fam_font}. @415 +BX120. Call $\\{new_ligature}(f,l,\ldots)$ not $(f,c,\ldots)$. @1035 +RX121. Make \\{show_box} work on random garbage. @174,177 +DX122. Count reference to \\{zero_glue} from \\{cond_math_glue}. @1171 +* 23 Jul 1982 +RX123. Allow $\\{avail}=\\{null}$ when undumping. @1312 +BX124\>X110. Set $\\{width}(\\{glue_ptr}(p))$, not $\\{width}(p)$. @679 +AX125. Put \\{begin_file_reading} inside the \\{start_input} loop. @537 +BX126\>X116. Don't confuse \\{glue_stretch} with \\{stretch_order} [the previous + fix went only half\-way]. @838 +BX127. Negate $x$ when calculating badness of shrinkage. @667,678 +LX128\>X121. Remove dangling {\bf else} that parses wrong. @174 +IX129\>X28. Print newline before |{|, not after |}|, when tracing commands. @299 +IX130. Remove colon from overfull box messages. @663,675 +DX131\>X97. Compute \\{page_goal} properly when the first box arrives after + inserts. @1001 +BX132. Don't confuse \\{page_size} [now \\{page_goal}] with \\{best_size}. @1017 +AX133. Put heldover insertions at front of contribution list. @1023 +SX134\>X88. Output stats before closing |DVI| file, since the latter + decreases \\{font_ptr}. @1333 +TX135. Don't call a |\vbox| an |\hbox|. @674 +TX136. Fix misplaced {\bf end} caused by editing error. @675 +* 24 Jul 1982 +DX137. Don't \\{eq_destroy} any paragraph shape when \\{par_shape} is null. @275 +IX138. Omit blank before |\message| at the beginning of a line. @1280 +AX139\>X104. Don't try to split an insertion when \\{best_node} isn't the + split one. @1021 +LX140. Correct another case of `{\bf if} $x\land y$' misunderstood by Pascal. + @1021 +IX141. Provide diagnostic info about insertions via |\showlists|. @986 +IX142. Add `|inside a group|' to clarify a warning message. @1335 +IX143. Report \\{prev_depth} on a separate line in |\showlists|. @219 +SX144. Back up input to avoid unexpected clobberage of \\{cur_tok}. @1090 +# Wow what a bug: \\{new_graf} calls \\{build_page}, which invokes the + output routine, after which `\/{\bf goto} \\{reswitch}' is a {\sl disaster}. +DX145. Add insertion glue to \\{page_so_far} instead of subtracting it from + the goal. @1009 +IX146. Put extra blank line before overfull box warning. @660 +CX147. Define break at kern consistently between horizontal and vertical lists. @973,1000 +DX148. Renumber so that math nodes are nondiscardable. @147 +TX149. Correct the \\{char_kern} macro: |#|, not $f$. @557 +FX150. Decrease $l$ after reconstituting discretionary break. @916 +EX151. Simplify the hyphen routine, knowing that $\\{link}(s)=\\{null}$. @918 +FX152. Initialize $r\gets q$ in discretionary destruction routine. @883 +* 25 Jul 1982 +AX153. Don't add interline penalty after last line of paragraph. @890 +IX154. Adjust spacing in diagnostic messages. @245 +DX155. Avoid simultaneous use of \\{temp_head} by \\{prune_page_top} and the + page builder. @1017 +FX156. Clear the \\{post_break} field of simple discretionaries. @916 +AX157. Split \\{offset} into independent variables \\{term_offset}, + \\{file_offset}. @54,57,58 +# Am freezing current program as version $-0.25$; a week of TUG lectures + begins tomorrow. +* 5 Aug 1982 +IX158. The `|.err|' file should be `|.log|' instead. @534 +GX159. Allow |\special| strings to contain more than 256 bytes. @585,1368 +MX160\>X99. Undo ``correction'' to a non-bug. @1034 +IX161. Suggest |\&| in help message for unexpected |&|. @1128 +GX162. Make `|E|' a standard option for exiting. @84 +GX163. Restore the use of dead cycles \`a la \TeX78. @1024,1054 +# The previous six changes were suggested during discussions with \TeX82 class. +SX164. Fix global variable conflict between \\{open_log_file} and \\{new_font}. @1257 +CX165. Allow optional `|=|' when assign to font parameter. @1253 +FX166. Set \\{cur_val} after increasing the number of font parameters. @580 +DX167. Set \\{hash_brace} when matching `|{|'. @476 +IX168\>X88. Clarify meaning of statistics printed. @1334 +GX169. Change |DVI| format to include design size. @602,1260 +DX170. Introduce \\{def_ref} for \\{runaway} messages. @306 +MX171. Restore \\{cur_cs} before calling \\{scan_toks}. @1226 +AX172\>X157. Update \\{print_nl} to dual offset conventions. @62 +AX173\>X163. Move endgame logic inside \\{main_control}, because the output + routine becomes active. @1054 +* 6 Aug 1982 +CX174. Allow |INITEX| to load format files. @1337 +EX175. Conserve input stack space by deleting finished token lists. @325 +IX176\>X74. Print the opening `|**|' in the transcript file. @534 +# Now ready to try breaking new ground in |TRIP|. +SX177. Preserve \\{align_state} from tokens deleted online. @88 +DX178. Set $t$ in all branches of \\{scan_toks}. @473 +SX179. Change `$\\{cur_cmd}\le\\{right_brace}$' to `$\\{cur_tok}\le + \\{right_brace_limit}$'; otherwise |\relax| gets through. @477 +CX180. Allow optional |=| when setting |\spacefactor|; disallow zero. @1243 +BX181. Change \\{vpackage}(\\{head}) to \\{vpackage}(\\{link}(\\{head})). @796 +# Shades of 1978! +LX182. Insert missing {\bf begin} \dots{ \bf end}. @798 +* 7 Aug 1982 +LX183. Keep \\{trie_max} declared in non-|INITEX| [later rescinded]. @950 +DX184. Watch out for empty token list when copying. @466 +DX185. Free unused reference count slot when defining |\everypar|. @1226 +GX186\>X163. Introduce |\maxdeadcycles|. @1012 +# I believe the \\{line_break} routine has passed its test perfectly. +SX187. Don't put discretionary after |-| inside a discretionary. @1039 +CX188. Change `|\minus|' to `|\minusthe|' [this feature retracted later]. @413 +BX189. Change \\{cur_p} to $r$ (three places). @875 +AX190. Increase range of \\{hc} to \\{halfword}; otherwise end-of-word mark + might match a vacant entry in the trie. @892 +FX191. Initialize $b$ in \\{shift_case} routine. @1288 +EX192. Don't back up if a space follows a decimal fraction. @452 +BX193. Don't confuse \\{glue_base} with \\{dimen_base}. @1145 +LX194. Guard against anomalous floating-point values in glue display. @186 +* 8 Aug 1982 +SX195. Avoid infinite loop when |\outer| leads to runaways. @339 +# I worked on that problem about two hours before fixing it. +IX196. Move final \\{debug_help} to \\{succumb}, except in batch mode. @93 +RX197. Insert kern after spanned box, to defeat access to floating point. @808 +* 9 Aug 1982 +CX198. Include |\leftskip| and |\rightskip| in displayed equations [rescinded + later]. @1199 +IX199. Trace line-break computations if $\\{tracing_stats}>2$. @846,856 +DX200. Keep \\{prev_p} up to date when passing a string. @867 +# Now stepping through math stuff; a lot is working. +DX201. Set $\\{link}(p)\gets z$ when making a fraction. @747 +CX202. Don't reset space factor when beginning |\valign|. @775 +IX203. Don't show glue setting if $\\{glue_sign}=\\{normal}$. @186 +DX204. Clear \\{glue_stretch} and \\{glue_shrink} when creating an unset box. @801 +BX205. Do \\{vpack} in hmode and vice versa when aligning. @804 +AX206. Remove fallacious call to \\{confusion} after alignment in display. @1206 +AX207. Don't test $\\{mode}=\\{vmode}$ in display, test $\\{nest_ptr}=1$. @1145 +FX208. Show an \\{inner_noad} as well as the other types. @690,696 +DX209. Renumber \\{mu_glue} and \\{cond_math_glue} so that the glue display logic + works. @149 +BX210. Don't confuse \\{cur_size} with \\{cur_style}. @703 +FX211. Advance $p\gets q$ during second pass over mlist. @761 +IX212. Add helpful hint about |\tracingonline=1|. @1293 +TX213. Delete spurious statement left from sloppy editing. @710 +DX214. Change the subtype when \\{mskip} becomes \\{hskip}. @732 +FX215. Don't forget to use the remainder when computing math glue. @716 +IX216\>X199. Improve paragraph diagnostics using \\{short_display}. @857 +IX217\>X199. Introduce \\{artificial_badness} for better diagnostics. @854,856 +* 11 Aug 1982 +AX218. Introduce \\{char_box} subroutine so that \\{var_delimiter} adds italic + correction. @709 +SX219. Save font and char in local variables of \\{make_math_accent}, since + it can be recursive. @738 +FX220. Call \\{error} after decrying an invalid character. @346 +* 12 Aug 1982 +IX221\>X199. Install new format for showing break nodes. @846 +# I have been testing \\{line_break} and I think it's working fine. +BX222. Change $q$ to $p$, in order to catch empty alignments. @812,1206 +SX223. Disallow third part of discretionary in math mode. @1120 +DX224. Don't change \\{tail} if discretionary third part is empty. @1120 +IX225. Say |nonscript|, not |non_script|. @189 +SX226. Inhibit math if |\scriptfont3| is improper. @1195 +IX227\>X199. Introduce {\tt\@}|firstpass| and {\tt\@}|secondpass| comments. @863 +TX228. Change $p$ to $r$ when you mean $r$. @1204 +IX229\>X108. Say |page|, not |pages|, if there's only |1|. @642 +IX230. Insert space before |[]| on truncated |\showlists|. @182 +* 28 Aug 1982 +# Back from vacation after having looked at hardcopy listing of |TRIP| test. +GX231. Allow |dm| as a unit [later |.5dm1| will be |.5\dimen1|]. @455 +IX232\>X108. Singularize |prevgraf 1 lines|. @219 +IX233. Omit trailing zero count registers when showing completed page numbers. @638 +LX234. Avoid clobbering $a$ by introducing a new local variable $t$. @986 +DX235\>X216. Fix diagnostic printing of discretionaries. @858 +IX236. Don't show unset stretch/shrink that's zero. @185 +CX237\>X198. Make |\halign| in displays consistent with other displays. (Namely, + ignore |\leftskip| and |\rightskip| in nonaligned displays; + respect the paragraph shape in aligned displays.) @800,1199 +IX238. Parenthesize `|If you're confused ...|'. @403 +IX239. Say `|\fraction|', not `|\xabovex|'. @697 +FX240. Remember to {\bf return} when you should. @1153 +PX241. Use absolute value to make sure {\bf div} is unambiguous. @737 +BX242\>X218. Don't confuse depth with height. @709 +BX243. Use $\\{delta}-\\{height}$, not $\\{height}-\\{delta}$. @736 +BX244. Increase \\{shift_down} to increase the clearance. @745 +IX245. Don't back up after improper use of |\the|. @428 +IX246. Don't give |0pt| as the default result when looking for \\{tok_val}. @428 +FX247. Initialize \\{second_indent} in the easy case. @848 +FX248. Package the equation number. @1204 +QX249. Don't resort to $v\gets\\{max_dimen}$ when glue doesn't stretch or + shrink. @1148 +IX250. Insert newline before showing current |\botmark|. +FX251. Call \\{error} after giving error message. @784 +AX252. Change implementation of |\number|; it should \\{scan_int}, not + something internal. @471 +PX253. Introduce symbolic constants like \\{format_area_length}. @524 +PX254. Change \\{quit} to \\{jump_out}, since some compilers treat \\{quit} + as a reserved word. @81 +LX255. Add more parentheses to get proper parsing. @1260 +IX256. Say |please| in order to be friendly (or at least polite). @360 +BX257. Don't confuse \\{cur_vcmd} with \\{cur_chr}. @508 +IX258. Use |&| instead of |!| to specify a preloaded format. @1337 +TX259\>X177. Correct |s3| to |s4|. @88 +GX260. Introduce new primitive |\mathchardef|, to save space and time. @1224 +CX261. Use the |[]| convention for noads as well as nodes. @692 +TX262. Correct spelling in call to \\{primitive}: |\xatopx| should be |\xoverx| + [later renamed, thank goodness]. @1178 +* 30 Aug 1982 +RX263. Don't fetch \\{link}(\\{null}) in malformed list. @175 +SX264. Initialize \\{align_state} at a better time so that \\{align_peek} + doesn't see |&| or |\span|. @785,791 +SX265. Outlaw preamble interfering with $\\{align_state}=0$. @789 +CX266. Add level of grouping to alignment to tabskip locality. @774 +FX267. Check \\{align_state} when scanning $\langle u_j\rangle$. @783 +AX268. Move `\\{unsave}; \\{new_save_level}' from \\{main_control} into + \\{fin_col}. @791,1131 +SX269\>X180. Remember \\{cur_chr} when you're looking for optional `|=|'. @1243 +TX270. Change $q$ to $r$ [in code now obsolete]. @804 +IX271. Disable interrupts during \\{back_error} so that help messages aren't + clobbered. @327 +SX272. Introduce \\{slow_print} for printing control sequences. @60 +IX273. Initialize \\{del_code}(|"."|$)\gets0$ for error recovery. @240 +SX274. Call \\{end_file_reading} before calling \\{check_outer_validity}. @362 +IX275. Don't delete an extra `|}|' when |\par| will help find a runaway. @395 +* 31 Aug 1982 +BX276. Don't confuse \\{thin_muskip} with \\{thin_muskip_code}. @413 +FX277\>X266. Recover from error if new \\{align_group} ends abnormally. @1132 +IX278. Recover from error if |\par| occurs when $\\{align_state}<0$. @1094 +CX279. Make |\hskip\the\thinmuskip| and |\mskip\the\baselineskip| erroneous. @413 +GX280. Add |\muskip| and |\setmuskip| analogs to |skip| and |\setskip|. @413,1228 +EX281. Don't output |pop| right after |push|. @601 +# The |TRIP| test looks right; now to test for wasted memory. +# When memory should be empty I find $\\{dyn_used}=18$, $\\{var_used}=267$. +* 1 Sep 1982 +# Made special |MEMTEX| program, designed to track all memory allocation. +DX282. Delete reference to \\{last_glue} when a page is packaged. @1017 +IX283. Include \\{save_stack} in the \\{search_mem} debugging routine. @285 +CX284. Disallow |\vfill| in restricted horizontal mode. @1095 +# Most of the memory locations I thought were wasted were actually in good use. +# Total 192 hours (approx) debugging time so far since July 15. +* 2 Sep 1982 +# Now looking at all zero counts in profile and extending |TRIP|. +EX285. Simplify the creation of |vtop| boxes. @1087 +CX286. Set $\\{space_factor}\gets1000$ after |\hbox|. @1076 +PX287. Introduce preamble into |DVI| format. @617 +SX288. Give special \\{chr_code} to |\relax|. @265 +IX289. Don't show `|(null)|' when token list is null, just show nothing. @295 +EX290. Delete the procedure \\{write_name_string}, which is never used. +CX291. Rename |\xabovex| to |\abovewithdelims|; do the same for + |\xatopx| and |\xoverx|. @1178 +QX292. Improve \\{clean_box} so that it recognizes cleanliness better. @720 +IX293. Report a |Missing delimiter| more meaningfully. @1161 +RX294. Give \\{endv_token} a \\{chr} code of 128 so that it will end a file name. @289 +RX295. Test present of math fonts {\sl after\/} parsing an mlist, not + before. @1138,1195 +IX296. Omit `|recent contributions|' and/or `|current page|' when they are + empty. @218,986 +IX297. Display what \TeX\ has deleted after improper discretionary list + has arisen. @1121 +IX298. Show what math character was undefined. @723 +IX299. Improve the |Incompatible magnification| error; break it into two lines. @288 +DX300. Put new cases into \\{flush_node_list}, to recycle mlist noads. @698 +* 6 Sep 1982 +FX301\>X300. Insert a necessary `{\bf goto} \\{done}' in that new material. @698 +# It took two hours to diagnose that {\bf goto} problem. +TX302\>X295. Change `|2|' to `|3|' in help message for extension fonts. @1195 +IX303. Add a special note if material is being held over for the next output. @986 +RX304. Divide before multiplying in \\{make_left_right}, to avoid overflow. @762 +IX305. Introduce the \\{box_error} routine. @992 +FX306. Clear \\{arith_error} after overflow has been reported. @460 +BX307\>X249. Don't confuse \\{stretch} with \\{glue_stretch}. @1148 +DX308. Set $\\{glue_sign}\gets\\{normal}$ when packaging with glue ratio + zero. @558,664 +AX309. Test for overflow before attaching the sign. @448 +# That all worked! Now trying |min_quarterword| negative. +LX310. Take absolute value before applying {\bf mod} in \\{new_trie_op}. @944 +LX311. Say $\\{qi}(c)$, not $c$, when testing |TFM| flags [now obsolete]. @573 +LX312. Initialize \\{token_ref_count}(\\{def_ref}) to \\{null}, not zero. @473 +LX313. Change the type of \\{vsplit} parameter $n$ from \\{quarterword} to + \\{eight_bits}. @977 +LX314. Initialize \\{null-delimiter} different form \\{null_character}. @685 +LX315. Insert \\{qi} twice in \\{scan_delimiter}. @1160 +FX316. Insert \\{qi} in \\{scan_math}. @1151 +FX317. Insert \\{qo} in \\{fetch}. @722,723 +FX318. Insert \\{qi} in \\{set_math_char}. @1155 +FX319. Insert \\{qi} in \\{math_ac}. @1165 +FX320. Insert \\{qo} in \\{mlist_to_hlist}. @755 +IX321. Use brackets around 8-bit characters in \\{print_ASCII}. @68 +IX322. Include \\{hyph_list} in the \\{search_mem} debugging routine. @933 +# Now compiling non-|INITEX| to try an industrial-strength version. +LX323. Add {\bf return} to \\{final_cleanup}, because some Pascal compilers + insist that each label be used. @1335 +DX324. Compute \\{par_token} when undumping. @1314 +* 11 Sep 1982 +IX325. Emit newline before file name, if near end of line. @537 +CX326. Define |\ifx| for arbitrary tokens. @507 +* 12 Sep 1982 +IX327. Don't ask users to type |x| twice before exiting. @84 +GX328. Install new features |\openin|, |\read|, |\ifeof|, |\closein|; rename + existing |\open|, |\send|, |\close| to be |\openout|, |\write|, + |\closeout|. @209,313,1275 +GX329. Install new feature |\expandafter|. @368 +PX330. Change the default file area from `|<TeX>|' to `|TeXinputs:|'. @574 +* 13 Sep 1982 +GX331. Install new feature |\string|. @472 +AX332. Remove spurious space printed by \\{sprint_cs}. @263 +# All tests passed now! But when I played with the system I found another bug + (undetected by |TRIP|): +FX333. Set $r\gets s$ after matching macro parameter tokens. @397 +* 16 Sep 1982 +IX334\>X199. Introduce serial numbers in line-break records, improving + readability and independence. @846 +IX335. Don't abort when \\{file_name_size} is exceeded. @519 +* 17 Sep 1982 +IX336. Remove unwanted period from font capacity message. @567 +* 18 Sep 1982 +GX337\>X329. Make |\expandafter| more powerful by moving it from semantics + to syntax [i.e., from stomach to mouth]. @368 +* 19 Sep 1982 +IX338. Improve error recovery for `|Missing number|'. @415 +* 22 Sep 1982 +QX339. Suppress italic correction between letters in math mode except in math + fonts. @752 +* 24 Sep 1982 +PX340. Define $\\{null}=\\{mem_bot}$, not \\{min_halfword}, because there's + a reference to \\{link}(\\{null}) in \\{try_break}. @115 +DX341. Initialize $\\{str_start}[0]\gets0$. @47 +IX342. Avoid blank space at beginning of line. @638 +DX343. Set type of new box in math mode to \\{ord_noad}, not \\{inner_noad}. @1076 +* 28 Sep 1982 +# Here are the first changes made to the preliminary listing of \TeX82 that was + published by the \TeX\ project earlier this month. +F520. Insert the missing cases \\{letter} and \\{other_char} after + \\{x_token} looks ahead. @1038 +C521. Change `|\pause|' to `|\pausing|'. @236 +D522. Reset \\{overfull_rule} when determining tabskip glue. @804 +A523. Fix the logic for scanning |\ifcase| [in obsolete syntax---everything + is still done with braces since `|\fi|' doesn't exist yet]. @509 +* 30 Sep 1982 +I524. Change |"0.0"| to |"?.?"| (suggested by DRF). @186 +* 2 Oct 1982 +Q525. Use conditional thin spacing next to `Inner' noads. @764 +Q526. Make thick spaces conditional. @766 +* 4 Oct 1982 +P527. Increase \\{trie_size} from 7000 to 8000, because of Frank Liang's improved + (but longer) hyphenation patterns. @11 +* 6 Oct 1982 +F528\>X330. Change the string lengths to match the new \\{\TeX_format_default}. @520 +# Version 0 of \TeX\ is being released today! +* 8 Oct 1982 +B529. Fix a blunder: I decreased $h$ mod a quarterword when it should have + been decreased mod \\{trie_op_hash_size} (HWT). @944 +* 9 Oct 1982 +P530\>X258. Fix a typo (`|!|' not `|&|') in the |WEB| documentation. @524 +F531. Remember to call \\{initialize} if a different format was preloaded + (Max D{\'\i}az). @1337 +# Version 0.1 incorporates the above changes. +* 12 Oct 1982 +G532. Add the `|\immediate|' feature, by popular request. @1375 +# Version 0.2 incorporates this (somewhat extensive) change. +* 13 Oct 1982 +P533. Introduce new |WEB| macros so that \\{glue_ratio} is more easily changed. @109 +# I began writing {\sl The \TeX book\/} today: edited the old preface and + searched in the library for quotations. +* 14 Oct 1982 +B534. Change the type of \\{hd} to \\{eight_bits}; it's + not a \\{quarterword} (HWT). @649 +S535\>X281. Revise the optimization of\/ |DVI| commands: It's not always safe to eliminate + \\{pop} when the preceding byte is \\{push}, since |DVI| commands + have variable length! (Embarrassing oversight caught by DRF.) @601 +* 15 Oct 1982 +C536. Test `$\\{prev_depth}>\\{ignore_depth}$', not `$\ne$'. @679 +# Version 0.3 incorporates the above changes. +* 16 Oct 1982 +P537. Omit definition of \\{align_size}; it's never used (Bill Scherlis). @11 +I538. Inhibit error messages when packaging box 255. @1017 +* 21 Oct 1982 +A539\>X145. Subtract $\\{width}(q)$ from \\{page_goal}, don't add it to + $\\{page_so_far}[1]$. @1009 +# Version 0.4 incorporates the above changes. +* 22 Oct 1982 +P540. Increase the amount of lower (variable-size) memory from 12000 to 13000, + since the \TeX\ program listing now needs about 11500. [At this time + there still is a fixed boundary between upper and lower memory.] @12 +G541. Add a new parameter |\boxmaxdepth|. @1086 +# Version 0.5 incorporates the above changes. +* 26 Oct 1982 +B542. Fix an off-by-one error caught by Gabi Kuper and HWT. + (I forgot `${}+1$'). @1317 +B543. Fix the spacing of displayed control sequences: \\{print_cs} should base its + decision on $\\{cat_code}(p-\\{single_base})$, not $\\{cat_code}(p)$. @262 +# The |TRIP| test detected this bug, but I didn't notice. +* 27 Oct 1982 +S544. Set \\{math_type} before saying $\\{fetch}(\\{nucleus}(q))$, since + fetching can have a side effect. @752 +* 28 Oct 1982 +G545. Install a major change: Fonts now have identifiers instead of code letters. + Eliminate the `|\:|' primitive, and give corresponding new + features to `|\the|'. @209 +# Actually I began making these changes on October 26, but I needed two days + to debug them and to put Humpty Dumpty together again. +# At this time I'm also drafting macros for typesetting {\sl The \TeX book}. +# The above changes have been incorporated into Version 0.6. +* 30 Oct 1982 +# After years of searching, I've finally found a definitive definition of + the printer's point; and (unfortunately) my previous conjecture was + wrong. The truth is that $\rm83\,pc=35\,cm$, exactly; + so I am changing \TeX\ to conform. +C546. Revise unit definitions for the `real' printer's point. @458,617 +# Version 0.7 incorporates the above. +* 1 Nov 1982 +# Oops! Retract error \#546, and retract \TeX\ Version 0.7; + the source of my information about points was flaky after all. + My original suppositions were correct, + as confirmed by NBS Circular 570. +* 4 Nov 1982 +C547. Revise the definition of |dd|, conforming to the definitive value + shown me by Chuck Bigelow. @458 +R548\>545. Introduce ``frozen'' copies of + font identifiers, to be returned by |\the\font|, so that font + manipulation is more robust. @1257 +* 5 Nov 1982 +D549. Reset \\{looseness} and paragraph shape when beginning a |\vbox|. @1083 +* 6 Nov 1982 +D550. De-update \\{align_state} when braces are in constants. @442 +I551\>X294. Improve error recovery for bad alignments. @1127 +# Today I wrapped up Chapters 4 and 5. +* 8 Nov 1982 +G552. Give more power to |\let|: the right-hand side needn't be a control + sequence. @1221 +I553. Amend \\{show_context} to say + `$(\\{base_ptr}=\\{input_ptr})\lor{}$'; otherwise undefined control + sequences can be invisible in unusual cases (John Hobby). @312 +A554. Compute demerits more suitably by adding a penalty squared, instead of + adding penalties before squaring. @859 +# Previously a slightly loose hyphenated line followed by a decent line + was considered worse than a decent hyphenated line followed by + a quite loose line. +* 10 Nov 1982 +E555. Save a bit of buffer space by declaring \\{pool_file} only in + |INITEX|. @50 +* 11 Nov 1982 +I556. Introduce a new context indicator to clarify \TeX's scanning state: + A special type + called \\{backed_up} is distinguished from other kinds of \\{inserted} + lists; it is called `recently read' or `to be read again', while + others are called `inserted'. @314 +I557. Append a comment, `|treated as zero|', to the missing-number message. @446 +I558. Ignore the settings of\/ |\hfuzz| or |\vfuzz| if\/ |\hbadness| or |\vbadness| + is less than 100. @666,677 +* 13 Nov 1982 +# Major surgery on the program is planned for today, because of new ideas + suggested by correspondence with MDS and other macro writers. +G559. Introduce a new |\tokens| register; this will be useful and easy to add, + since \TeX\ already can handle |\everypar| and |\output|. @1227 +C560\>X34. Change \\{get_x_token} to \\{get_token} when scanning an optional + space; then a construction like + |\def\foo{...}\foo| won't complain that |\foo| is undefined. @443 +# This change was retracted when it was being debugged, because it could + cause \\{endv} to abort the job. Then it was re-established again + when I found that \\{endv} needed to be more robust anyway. + [But it was eventually rescinded again.] +G561. Make |\span| mean `expand' in a preamble. @782 +E562. Use three separate {\bf if\/} tests instead of + `$\land$' in the inner loop of \\{get_next}, to gain efficiency. @342 +R563. Introduce \\{get_r_token} so that assignments have uniform error + messages and so that frozen equivalents cannot be changed. @1215 +# I gave a few variables more mnemonic names as I made these changes. +C564. Move conditional statements from the semantics (`stomach') part of + \TeX\ to the syntax (`mouth') part, by introducing `|\fi|'. + Also introduce |\csname| and |\endcsname|. @372,489\hbox{--}500 +# This makes macros much more predictable and logical, but it is by far + the most drastic change ever made to \TeX. The program began to come + back to life only after three days of solid hacking. +# Several other things were cleaned up as part of this change + because it is now more natural to handle them differently. + For example, a null control sequence has now become more logical. +# The result of all this is called Version 0.8. +* 18 Nov 1982 +# Today I resumed writing Chapter 8. Tomorrow I'm $\,2^{14}$ days old! +* 21 Nov 1982 +F565. Declare $c$ as a local variable for hyphenation (DRF). @912 +E566. Omit the ``first pass'' and try hyphenations immediately, + if\/ |\pretolerance| is negative (suggested by DRF). @863 +R567. Don't ship out incredibly huge pages; they might foul up + |DVI| files. @641 +* 2 Dec 1982 +G568. Add new features |\everymath| and |\everydisplay|. @1139,1145 +G569. Add a new feature |\futurelet|. @1221 +# The changes above have been incorporated into Version 0.9 of TeX. +* 7 Dec 1982 +G570. Add a new |\endinput| primitive (suggested by FY). @362,378 +* 8 Dec 1982 +I571. Try \\{off_save}, if\/ |\par| occurs in restricted horizontal mode. + (This avoids embarrassment if \TeX\ says `type a command or + say |\end|', then when you type |\end| it says you can't!) + [However, I soon retracted this change.] @1094 +* 21 Dec 1982 +A572. Redefine |\relax| so that its \\{chr} field exceeds 127. (This facilitates + the test for end in \\{scan_file_name}.) @265 +F573\>566. Call \\{begin_diagnostic} when omitting + the first pass of line breaking. @863 +A574. Fix the logic of glue scanning: In |\hskip-1pt plus2pt| the minus should + apply only to the |1pt|. @461 +* 23 Dec 1982 +I575. Renumber the decimal codes in paragraph statistics for loose and tight + lines; they were ordered backwards. @817 +C576. Treat a paragraph that ends with leaders like a paragraph that + ends with glue. @816 +C577. Allow commas as alternates to radix points, for Europeans. @438 +C578. Change |\hangindent| to a normal dimension parameter. [It had been + a combination of\/ |\hangindent| and |\hangafter|, with special + syntax.] @247 +G579. Make |\prevgraf| accessible to users. @422,1244 +G580. Split |\clubpenalty| off from |\widowpenalty|. @890 +# I'm typing Chapter 14 while making these changes. +* 24 Dec 1982 +S581. Use \\{back_input} instead of {\bf goto} \\{reswitch} when + inserting |\par|, because |\par| may have changed. @1095 +* 25 Dec 1982 +# It's 10pm after a very Merry Christmas! +I582\>X328. Don't prompt for a new file name if\/ |\openin| doesn't find a file. @1275 +G583. Add a new |\jobname| primitive. @472 +I584. Give the user a way to delete the dollar sign, when \TeX\ decides + to insert one. @1047 +C585. Allow optional equals after |\parshape|, and implement |\the\parshape|. + @423,1248 +* 26 Dec 1982 +I586. Add an \\{if_line_field} to the condition stack entries, + so that more informative error messages can be given. @489 +D587\>549. Introduce a \\{normal_paragraph} procedure, since initialization is needed + also within |\insert|, |\vadjust|, |\valign|, |\output|. @1070 +* 27 Dec 1982 +G588. Give users access to |\pagetotal| and |\pagegoal|. (Analogous to + \#679 and \#585, but simpler.) @1245 +I589\>X199. Introduce |\tracingpages|, allowing users to see + page-optimization calculations. Also split |\tracingparagraphs| off from + |\tracingstats|. @987,1005,1011 +# The changes above have been incorporated into Version 0.91 of \TeX. +* 31 Dec 1982 +P590. Break the \\{build_page} procedure into two parts, by extracting + the section now called \\{fire_up}. [This is necessary because + some Pascal compilers, notably for IBM mainframes, cannot + deal with large procedures.] @1012 +S591\>564. Make |\ifodd1\else| legal by introducing \\{if_code}. @489 +Q592. Improve alignments when columns don't occur: Don't append null boxes + for columns missing before |\cr|, and zero out the tabskip + glue after nonpresent columns. @802 +I593. Make the error message about overfull alignment more intelligible. + @801,804 +# The changes above have been incorporated into Version 0.92 of \TeX82, + which was the last version of 1982, + completed at 11:59pm on December 31. +* 3 Jan 1983 +# Today I'm beginning to write Chapter 15, and + planning the |\output| routine of |plain.tex|. +C594\>X186. Change the logic of \\{its_all_over}; use \\{max_dead_cycles} + here too, instead of the fixed constant~100. @1054 +F595\>X34. Don't forget to \\{pop_nest} when an insert is empty. Also disallow + optional space after |\insert|$\,n\,$|{...}|. @1100 +* 4 Jan 1983 +C596\>541. Use the |\boxmaxdepth| that's declared inside a |\vbox| when packaging it. + @1086 +C597. Rename |\groupbegin| and |\groupend| as |\begingroup| and + |\endgroup|. @265 +G598\>594. Make |\deadcycles| accessible to users. @1246 +Q599. Base the split insertions on natural height plus depth, not + on \\{delta}. @1010 +# The changes above have been incorporated into Version 0.93. +* 6 Jan 1983 +D600. Add \\{push_math} to handle a case where I forgot + to clear \\{incompleat_noad}. (This long-standing bug was + unearthed today by Phyllis Winkler.) @1136 +G601\>588. Add |\pageshrink|, etc., too. @1245 +G602. Introduce new parameters |\floatingpenalty|, |\insertpenalties|. Also + adopt a new internal representation of insertion nodes, + so that |\floatingpenalty|, |\splittopskip| and |\splitmaxdepth| + can be stored with each insertion. @140,1008 +* 7 Jan 1983 +Q603. Improve the rules for entering \\{new_line}, in particular + when the end-of-line character is active. @343 +* 9 Jan 1983 +Q604. Distinguish between implicit and explicit kerns. @155,896 +C605. Change the name |\ignorespace| to |\ignorespaces|. @265 +C606\>560. Don't omit a blank space after |\def|, |\message|, |\mark|, etc.; + the previous hodge-podge of rules is impossible to learn. @473 +# The above changes appear in Version 0.94. +* 12 Jan 1983 +# Beginning to write the chapters on math today. +G607. Add a new feature: active characters in math mode. @1151 +* 15 Jan 1983 +A608. Fix a surprise bug: `|$1-$|' treated the |-| as binary. @729 +D609. Initialize \\{space_factor} inside discretionaries. @1117 +* 16 Jan 1983 +F610. Fix an incredibly embarrassing bug: I forgot to update \\{spotless} in the + \\{error} routine! +# While fixing this, I decided to change + \\{spotless} to a more general \\{history} variable, as suggested + by IBMers who want a return code. @76,82,1335 +I611. Replace two calls of \\{confusion} by attempts at error recovery, in places + where `|This can't happen|' could actually happen. @1027,1372 +* 18 Jan 1983 +R612. Introduce the \\{normalize_selector} routine + to protect against startup anomalies + when the transcript file isn't open. Also make \\{open_log_file} + terminate in some cases. @92,535 +R613\>591. Insert |\relax|, not a blank space, to cure infinite + loop like |\ifeof\fi| (LL). @510 +G614. Change the old |\limitswitch| to |\limits|, |\nolimits|, and + |\displaylimits|. Incidentally, this fixes a bug in the former + positioning of integral signs. @682,749 +C615. Give a |\char| in math mode its inherited |\mathcode|. @1151 +Q616\>525. Make underline, overline, radical, vcenter, accent noads and |{...}| + all revert to type Ord instead of type Inner. Introduce a new primitive + |\mathinner|. (This fixes the spacing, which + got worse in some ways after change \#525.) @761 +# I'm working on Appendix G today. +* 19 Jan 1983 +G617. Introduce a |\mathchoice| primitive. @1174 +C618. Move |\input| from the stomach to the mouth. @378 +C619\>X260. Introduce |\chardef|, analogous to |\mathchardef|. @1038,1224 +G620. Change |\unbox| to |\unhbox| and |\unvbox|; also add |\unhcopy|. @1110 +C621. Consider |\spacefactor|, |\pagetotal|, etc., as part of + \\{prefixed_command}, even though they are always global. @1211 +* 20 Jan 1983 +C622. Switch modes when |\hrule| occurs in horizontal mode or |\vrule| + in vertical. @1090,1094 +G623. Add a new |\globaldefs| feature. @1211 +* 21 Jan 1983 +E624. Optimize the code, in places where it's important (based on + frequency counts of \TeX\ usage + accumulated during the past week): Introduce \\{fast_get_avail} + and \\{fast_store_new_token}; reduce procedure-call overhead + in \\{begin_token_list}, \\{end_token_list}, \\{back_input}, + \\{flush_node_list}; change some tests from `{\bf if} $a\land b$' to + `{\bf if}~$a$ {\bf then if}~$b$'. @122,371 +* 22 Jan 1983 +E625. Save space in math lists: Don't insert penalties within restricted + horizontal mode; simplify trivial boxes. @721,1196 +S626. Fix a surprising oversight in the \\{rebox} routine: + Ensure that $b$ isn't a vbox. @715 +C627\>545. Make |\nullfont| a primitive, so that \\{cur_font} always + has a value. (This is a dramatic improvement over \TeX78, where a + missing font was a fatal error called `|Whoa|'!) @552 +* 24 Jan 1983 +I628\>586. List all incomplete |\if|'s when the job ends. @1335 +* 29 Jan 1983 +C629\>552. Change initialization of \\{align_state} so that |\halign\bgroup| + works. @777 +* 30 Jan 1983 +D630\>625. Be sure to test `\\{is_char_node}($q$)' when checking for a trivial + box. @721 +# By extraordinary coincidence, this bug was caught when somebody + used font number~11 ($=\\{kern_node}$) in the second character + of a list of length~2! +I631\>X168. Improve format for stats at end of run, as suggested by DRF. @1334 +# The changes above have been incorporated into Version 0.95. +C632. Don't ignore the space after a control symbol (except `|\ |'). @354 +P633. Remove all trailing spaces at the right of input lines, + so that there's perfect compatibility with IBM systems that + extend short lines with spaces. @31 +* 3 Feb 1983 +I634. Assume that a \\{math_accent} was intended, after giving an error + message in the case $\\{mmode}+\\{accent}$. @1165 +G635. Add new primitives |\iftrue| and |\iffalse|. @488 +* 6 Feb 1983 +A636\>X304. Improve the accuracy of fixed-point arithmetic when + calculating sizes for |\left| and |\right|. (I had started by + dividing \\{delimiter_factor}, not \\{delta1}, by 500.) @762 +* 12 Feb 1983 +C637. Change the name |\delimiterlimit| to |\delimitershortfall|. @248 +C638. Make |\abovewithdelims..| equivalent to |\above|; change the + order of operands so that delimiters precede the dimension. @1182 +C639\>607. Remove the kludgy math codes introduced earlier; + make |\fam| a normal integer parameter and allow |\mathcode| + to equal $2^{15}$. @1233 +R640. Don't let |\spacefactor| become more than $2^{15}$. @1233,1243 +# I finished drafting Chapter 17 today. +* 14 Feb 1983 +I641\>639. Replace octal output (\\{print_octal}) by hexadecimal (\\{print_hex}) + so that math codes are clearer. @67 +F642\>619. Don't forget \\{char_given} in the \\{math_accent} routine. @1124 +* 17 Feb 1983 +C643\>622. Switch modes when |\halign| occurs in horizontal mode, or |\valign| + in vertical mode. @1090,1094 +* 18 Feb 1983 +I644. Add a new feature |\tracingrestores|. This requires a new procedure called + \\{show_eqtb}, whose code can be + interspersed with the \\{eqtb} definitions. @252 +* 25 Feb 1983 +I645\>622. Suggest using |\leaders| when the user tries a horizontal rule + in restricted horizontal mode. @1095 +* 27 Feb 1983 +I646. Specify the range of source lines, when giving warning messages + for underfull or overfull boxes in alignments. @662,675 +# Why did it take me all day to type the middle part of Chapter 18? +* 4 Mar 1983 +G647. Introduce a new feature |\xcr| (suggested by LL). [Changed later to + `|\crcr|'.] @785 +I648\>631. Subtract out \TeX's own string requirements from the stats. @1334 +* 6 Mar 1983 +G649. Add new features |\everyhbox| and |\everyvbox|. @1083,1167 +* 9 Mar 1983 +R650\>X295. Avoid accessing \\{math_quad} when the symbol fonts aren't known + to be present. @1199 +P651\>533. Introduce \\{float} and \\{unfloat} macros to aid portability (HWT). @109 +C652. Introduce new names |\abovedisplayskip| and |\belowdisplayskip| for + the old |\dispskip|; also |\abovedisplayshortskip| and + |\belowdisplayshortskip| for the old |\dispaskip| and |\dispbskip|. @226 +* 10 Mar 1983 +C653. Unbundle |\romannumeral| from |\number| (suggested by FY). @468 +* 12 Mar 1983 +C654. Ignore leading spaces in \\{scan_keyword}. @407 +* 14 Mar 1983 +E655\>631. Use \\{write} and \\{write_ln} directly when printing stats. @1334 +* 16 Mar 1983 +Q656\>602. Refine the page-break cost function (introducing `\\{deplorable}', + which is not quite `\\{awful_bad}'), after suggestion by LL. @974,1005 +# The changes above have been incorporated into Version 0.96. +* 18 Mar 1983 +G657. Add a new feature |\everyjob| suggested by FY. @1030 +* 19 Mar 1983 +I658. Don't treat left braces specially when showing macros. @294 +C659. Ignore blanks that would otherwise become undelimited arguments. @393 +* 21 Mar 1983 +F660\>X280. Make |\lastskip| handle \\{mu_glue} as well as ordinary glue. @424 +C661\>561. Expand only one level in a preamble |\span|. @782 +* 22 Mar 1983 +C662. Let a single |#| suffice in |\tokens|, |\message|, etc. (The previous rule, + in which |##| was always required as in macros, was a loser especially + in |\write| where you had to say |####|!) @477 +C663\>X328. Require the keyword `|to|' in |\read|. (This will avoid the common error + of an incomplete constant when no space appears + before the |\cs|.) Also allow terminal + I/O as a default when a stream number is out of range. @482,1225,1370 +* 26 Mar 1983 +C664. Replace |\ifeven|\<countnumber> by |\ifodd|\<number>, for better + consistency of language. @504 +S665\>564. Introduce the \\{change_if_limit}, to overcome a big surprise + bug relating to |\if\if aabc\fi|. @497 +# Such examples show that \\{cur_if} might not be current, + in my original implementation. +* 28 Mar 1983 +G666\>X326. Tolerate non-characters as arguments to |\if| and |\ifcat|. @506 +C667. Change `|absent|' to `|void|', a better word. @487 +C668. Clear the \\{shift_amount} in |\lastbox|, since I don't + want to figure out what it means in all cases. @1081 +* 29 Mar 1983 +I669. Wake up the terminal before giving an error message. (This + means a special \\{print_err} procedure is introduced.) + (Suggested by DRF.) @34,73 +* 1 Apr 1983 +# Today I finished Chapter 21 (boxes) and began to draft Chapter 22 (alignments). +G670. Allow periodic preambles in alignments. @793 +C671. Make |\leaders| line up according to the smallest + enclosing box. @627,636 +Q672. Allow hyphenation after whatsits (e.g., after items for an index). @896 +* 2 Apr 1983 +Q673. Call \\{build_page} when |\par| occurs in vertical mode. @1094 +C674. Clear \\{aux} in \\{init_row}, for tidyness. @786 +* 4 Apr 1983 +C675. Let digits switch families in math mode. @232 +* 7 Apr 1983 +Q676\>602. Refine the test for not splitting an insertion. @1008 +* 8 Apr 1983 +C677\>647. Rename |\xcr| as |\crcr|, at LL's request. @780 +* 9 Apr 1983 +# Took a day off and had a chance to help print a sample page on + a 150-year-old letterpress in Murphys, California. +* 11 Apr 1983 +I678. Recover more sensibly after a runaway preamble. @339 +* 12 Apr 1983 +C679\>X328. Make |\read| span several input lines, if necessary to get + balanced braces. @482 +* 14 Apr 1983 +S680. Fix a subtle bug found by JS: \S882 can make $q$ a \\{char_node}, + so we need to test `{\bf if} $\lnot\\{is_char_node}(q)$'. + [Actually I discovered much later that the real bug was + to omit `{\bf else}' at this point.] @881 +* 15 Apr 1983 +C681. Make |\uppercase| and |\lowercase| apply to all characters, regardless + of category. @1289 +# 7:30am. After working all night, I completed a draft of the manual thru + Chapter 22, for distribution to volunteer readers. +# 5pm. The changes above have been incorporated into Version 0.97. +* 17 Apr 1983 +R682. Change `\\{small_number}' to `$0\,.\,.\,65$' in the + hyphenation routine (DRF). @901 +I683. Flush patterns in the input when the user tries |\patterns| + outside of\/ |INITEX| (suggested by DRF). @1252 +# Tomorrow I fly to England, where I'll lecture and write a paper about + `Literate Programming' [{\sl Comp.~J. \bf27} (1984), 97--111]. +* 14 May 1983 +I684\>663. Improve the behavior of\/ |\read| from terminal + (suggested by Todd Allen at Yale). + [I'd forgotten to implement the extended stream numbers in \#663. + Also, the prompt is now omitted if $n<0$.] @484 +* 18 May 1983 +I685. Restrict |\write| $n$ to the transcript file only, if $n<0$. @1350 +C686\>X188. Unify the syntax for registers and internal quantities. (Remove + primitives called `|\insthe|' and `|\minusthe|'; rename + \\{scan_the} to \\{scan_something_internal}, and change its + interface accordingly; clean up command codes generally.) @209,413 +G687. Introduce new parameters |\hoffset|, |\voffset|. @617 +* 24 May 1983 +G688. Introduce a new parameter |\everycr| (suggested by MDS). @774,799 +# Many macro writers and preliminary-manual readers have been requesting + new features; I'll try to keep the language as concise and consistent + as possible. +* 25 May 1983 +G689. Introduce |\countdef|, |\dimendef|, etc.\ (suggested by DRF long ago, + easy now in view of \#686). @1224 +G690. Introduce |\advance|, |\multiply|, |\divide| (suggested by FY). @1240 +G691. Introduce |\hyphenchar|; this requires a new command + \\{assign_font_int}, plus minor changes to about 15 modules. @915 +G692. Introduce |\skewchar| (easy because of \#691). @741 +G693. Introduce |\noexpand|. (I had difficulty thinking of how to + implement this one!) @358,369 +G694. Introduce |\meaning|. @296 +G695\>X231. Remove `|dm|' and `|vu|'; allow the more general `|.5\hsize|'. @455 +C696. Change `|\texinfo| $f$ $n$' to `|\fontdimen| $n$ $f$'. @578 +* 27 May 1983 +G697. Add a new feature |\afterassignment| (suggested by ARK). @1269 +C698\>619. Adjust the timing so that commands like `|\chardef\xx=5\xx|' + behave sensibly. @1224 +* 28 May 1983 +C699. Ignore `|\relax|' as if it were a space, in math mode and in a few other + places where |\relax| would otherwise be erroneous. @404 +Q700. Improve |\mathaccent| spacing with respect to subscripts + and superscripts (suggested by HWT). @742 +* 30 May 1983 +C701\>598. Terminate a job only when $\\{dead_cycles}=0$. @1054 +# The changes above constitute Version 0.98. +* 3 Jun 1983 +# I finished the draft of Chapter 23 (output routines) today. +G702. Allow |\mark| and |\insert| and |\vadjust| in restricted + horizontal mode, and also in math mode. (This is a comparatively + big change, triggered by the fact that |\mark| in a display + presently causes \TeX\ to crash with `|This can't happen|'!) + The global variable \\{adjust_tail} is introduced. @796,888,1085 +* 6 Jun 1983 +G703\>695. Replace (and generalize) the previous uses of\/ |ht|, |wd|, and |dp| + in dimensions by introducing the new control sequences + |\ht|, |\wd|, and |\dp|. @1247 +I704. Display sub-parts of noads with the symbols |^| and |_| instead of + |(| and~|[|. @696 +C705\>694. Allow |A..F| in hex constants to be \\{other_char} as well as + \\{letter}. @445 +* 7 Jun 1983 +E706\>654. Remove an instance of \<Scan optional space>, since it's now + redundant. @457 +C707. Legalize |\mkern\thinmuskip| and |\mkern5\thinmuskip|. @456 +C708. Clean up the treatment of optional spaces in numerical specifications. @455 +# A construction like |2.5\space\space\dimen0| was previously + valid after `|plus|' or `|minus|' only! +# I'm obviously working on Chapter~24 today. +C709\>545. Allow `|\font|' as a \<font identifier> for the current font. @577 +C710\>623. Don't make |\gdef| global when $\\{global_defs}<0$. @1218 +E711. Produce \\{zero_glue} as the outcome of + |\advance\spaceskip by-\spaceskip|. @1229 +I712. Make |\show| do something appropriate for every possible token. @1294 +G713\>559. Replace the (single) |\tokens| parameter by an array of + 256 token registers. @230 +C714. Allow |\indent| in math mode; also make |\valign| in math mode produce the + `|Missing|~|$|' error. @1046,1093 +E715. Remove redundant code: There's no need to check \\{cur_group} + or call \\{off_save} when starting alignments or equation numbers + in displays. @1130,1142 +* 8 Jun 1983 +C716. Disallow |\openout-1| and |\closeout-1|. @1350 +C717. Disallow |\lastbox| in math mode. @1080 +* 9 Jun 1983 +I718. Call \\{back_error}, not \\{error}, when |\leaders| aren't followed by + proper glue. @1078 +D719. Initialize for a possible paragraph, after |\noalign| + in a |\valign|. @785 +* 10 Jun 1983 +C720\>708. Expand the optional space after an ASCII constant. @442 +* 12 Jun 1983 +C721. Set $\\{space_factor}\gets1000$ after a rule or a + constructed accent. @1056,1123 +* 14 Jun 1983 +D722. Correct a serious blunder: Set $\\{disc_width}\gets0$ before testing + if $s$ is null (caught by JS). @869 +# This is a real bug that existed since the beginning! + It showed up on page~37 of the + Version~0 |TRIP| manual, but I didn't notice the problem. +C723\>708. Make optional spaces after \<dimen> like those after \<number>. @448 +C724\>568. Insert \\{every_display} before calling \\{build_page}. @1145 +I725\>648. Report \TeX's capacity on overflow errors in a way that's + fully consistent with other statistical reports. @42 +* 17 Jun 1983 +C726. Make all |\tracing| decisions on the basis of $\ge$ versus $<$, + not $\ne$ versus~$=$. @581 +# Today I finished the draft of Chapter 27 (the last chapter)! +# The changes above were released as Version 0.99 on June 19, 1983. +* 20 Jun 1983 +C727. Set |\catcode`\%=14| in |INITEX|. @232 +C728\>587. Call \\{normal_paragraph} when |\par| occurs in vertical mode. @1094 +# Once again I'm retiring about 8am and awaking about 4pm. +* 21 Jun 1983 +C729\>558. Don't append an overfull rule solely because of\/ |\hbadness|. @666 +R730. Don't allow the glue-ratio of shrinking to be less than~$-1$. @810,811 +* 22 Jun 1983 +B731\>653. Declare the parameter to \\{print_roman_int} to be of type \\{integer}, + instead of \\{nonnegative_integer} (found by Debby Clark). @69 +C732\>690. Make the keyword `|by|' optional (suggested by LL). @1236 +* 24 Jun 1983 +I733. Say `|preloaded|' when announcing \\{format_ident}. @1328 +* 25 Jun 1983 +R734. Add extra boxes and + glue to the output of alignment. [This thwarts possible attempts + at trickery by which system-dependent glue set values + computed by |\span| could have gotten into \TeX's registers by + things like |\valign| and |\vsplit|. It also has the advantage + of perfect accuracy in alignment of vertical rules.] @809 +C735. Make leaders affect the height or width of the enclosing boxes. @656,671 +# Today I'm mainly installing a much-improved format for change files + in |WEB| programs (suggested by DRF). +* 28 Jun 1983 +C736. Permit |\unskip| in vertical mode when we know that it does nothing. @1106 +* 1 Jul 1983 +E737\>700. Avoid redundant boxes when things like `|{\bf A}|' occur in math. @1186 +G738. Add a `|scaled|' feature to |\font| input. @1258 +D739\>700. Remember to correct \\{delta} when an accented box changes. @742 +* 2 Jul 1983 +R740.Introduce \\{bypass_eoln}, to remove anomalous behavior on input files + of length~1. (Suggested by DRF after the problem was discovered by LL). @31 +* 4 Jul 1983 +G741. Allow codes like |^^b| as well as |^^B|. @352,355 +G742. Introduce new parameters |\escapechar|, |\endlinechar|, |\defaulthyphenchar|, + and |\defaultskewchar|, to make \TeX\ less dependent on the + character set. (This affects many modules, since a lot of + error messages must be broken up so that they use \\{print_esc}.) +* 7 Jul 1983 +P743. Use a system-dependent function \\{erstat} when opening or closing + files (suggested by DRF). @27 +* 11 Jul 1983 +# The computer is back up after more than 50 hours down time + (due to air conditioning failure). +I744. Show total glue in the output of\/ |\tracingpages|. @985 +R745. Guard against insertion into an hbox. @993 +C746. Legalize the assignment \<tokenvar>=\<tokenvar>. @1227 +I747. Introduce a new parameter |\errhelp|. @1283 +F748\>623. Don't forget to check \\{global_defs} when |\tabskip| is changed. @782 +* 12 Jul 1983 +C749. Allow an |\outer| macro to appear after |\string|, |\noexpand|, + and |\meaning| (Todd Allen). @369,471 +C750. Make `|\the|' an expandable control sequence (i.e., move it + from the stomach to the throat); this cleans up + several annoying glitches. @367 +C751\>620. Allow |\unhbox| and |\unhcopy| in math mode if the box is void. @1110 +* 13 Jul 1983 +# I lectured for four hours at the TUG meeting today after very little sleep! +* 16 Jul 1983 +# The following were suggested by TUG meeting discussions. +L752. Round the value of \\{default_rule} more properly: It should be 26215. @463 +Q753\>700. Fix |\mathaccent| again; it's still not right! + The final height should be the maximum of + the height of accented letter without superscript and + the height of unaccented letter with superscript. @742 +G754. Add a new feature |\newlinechar|. @59 +G755. Allow boxes and rules in discretionaries (suggested by somebody + from Hewlett-Packard). @1121 +I756\>X28. Show all token expansions, not just macros, + when |\tracingcommands|. @367 +C757. Allow |\char| in a |\hyphenation| list. @935 +G758. Introduce a new feature |\aftergroup|; it can be implemented with + \\{save_stack}. @326 +C759. Run the running dimensions to alignment boundaries (suggested + by ARK). @806 +* 17 Jul 1983 +R760. Zero out \\{hyf} values at the edges, so that + weird pattern data cannot lead to Pascal range checks. @965 +R761\>X190. Decrease the |hc| codes for hyphenation, so that code~127 cannot + possibly be matched. @937,962 +C762\>672. Allow whatsits after hyphenatable words. @899 +C763\>604. Represent an italic correction as an explicit kern. @1113 +* 18 Jul 1983 +C764. Allow lowercase letters in file names. @519 +I765. Change the message `|No output file|' to: `|No pages of output|'. @642 +I766. Confirm that a quiet mode is being entered, when error + interaction ends with |Q|, |R|, or |S| (suggested by ARK). @86 +# Version 0.999 was finally installed today; a new program listing has + been printed. +# From now on, I plan to keep all section numbers unchanged. +# I'm done writing Appendix~H; beginning to revise Chapter~20. +* 25 Jul 1983 +C767\>663. Allow space after `|to|' in the |\read| command (FY). @1215 +# To bed at 1pm today. +* 27 Jul 1983 +S768\>665. Stack the current type of\/ |\if|; this precaution is necessary + in general (FY). @498 +# To bed at 2pm today. +* 29 Jul 1983 +E769. Avoid putting a control sequence in the hash table + when it occurs after |\ifx|. (Requested by Math Reviews people.) @507 +# Finished a version of {\sl The \TeX book\/} lacking only Appendices + D, E, and~I, for distribution to interested readers. +# To bed at 10:30pm, planning to arise regularly at 6am for a change. +* 31 Jul 1983 +I770\>766. Call \\{update_terminal} when going quiet (HWT). @86 +* 1 Aug 1983 +C771. Don't put an empty line at the end of an |\input| file! (This simplifies + the rules and the program, and also gets around a bug that occurred + at the end of files with $\\{end_line_char}<0$.) @362 +# The changes above went into Version 0.9999, which was widely distributed. +* 16 Aug 1983 +B772\>665. Rectify a ridiculous gaffe: I initialized $q$ every time the loop + of \\{change_if_limit} was performed! (Found by FY.) @497 +I773\>648. Distinguish `|string|' from `|strings|' when reporting statistics. @1334 +A774. Introduce \\{lx}, to correct a bug in |\xleader| computations + (found by FY). @627 +* 20 Aug 1983 +F775. Don't forget to apply |\/| to ligatures. @1113 +# Today I began to read all previous issues of {\sl TUGboat}, in preparation for + Appendix~D. +* 27 Aug 1983 +I776. Add debugging hack number~16, to help catch subtle data structure bugs. @1339 +E777. Remove redundant setting and resetting of \\{name_in_progress}. @531 +S778\>618. Suppress |\input| during a font size spec; otherwise + \\{cur_name} is clobbered (found by MDS). @1258 +G779. Introduce new conditionals |\ifhbox| and |\ifvbox|. @505 +* 29 Aug 1983 +D780\>750. Test for an empty list, if emptiness will mess up the data structure. + (Found by Todd Allen.) @478 +E781\>624. Use \\{fast_store_new_token} in another place for efficiency. @466 +I782. Say `|has only|' instead of `|has|'. @579 +# These changes yield Version 0.99999, used only at Stanford. +* 30 Aug 1983 +C783. Make funny blank spaces showable. @298 +* 31 Aug 1983 +C784\>754. Make |\newlinechar| affect \\{print_char}, not just \\{print}. @58 +* 4 Sep 1983 +G785. Add new features |\lastkern|, |\lastpenalty|, |\unkern|, |\unpenalty|. + @424,996,1105 +# OK, Appendix D is finished!! +# The above changes have been installed in Version 0.999999. +* 17 Sep 1983 +P786\>548. Don't bother making duplicate font identifiers; that + was overkill, not really needed. @1258 +# Will this be the historic last change to \TeX? +* 18 Sep 1983 +I787. Correct a minor inconsistency, `|display|' not `|displayed|'. @211 +* 20 Sep 1983 +C788\>604. Treat the kerns inserted for accents as explicit kerns. @1125 +* 26 Sep 1983 +I789. Change `|log|' to `|transcript|' in several messages. @535,1335 +# The index was finished today; I mailed the entire {\sl \TeX book\/} to + Massachusetts for final proofreading before publication. +* 1 Oct 1983 +D790. Prevent uninitialized trie positions in case of overflow + (found by Bernd Schulze). @944 +* 7 Oct 1983 +# Henceforth our weekly `\TeX\ lunch' meetings will be called `\MF\ lunch'. +# DRF begins to produce {\sl The \TeX book\/} on our APS phototypesetter. +* 14 Oct 1983 +P791\>633. Ignore spaces at the ends of lines also in |TEX.POOL| (found + by DRF). @52 +D792\>610. Initialize the \\{history} variable at \\{start_here} (DRF). @1332 +* 18 Oct 1983 +I793. Extend \\{runaway} to catch runaway text (suggested by FY). @306 +D794. Reset \\{cur_cs} after \\{back_input}, not after scanning the + `|=|' (found by FY). @1226 +* 24 Oct 1983 +I795\>638. Change the error recovery for bad delimiters, in accordance with + the changed syntax. (Found by Barry Smith.) @1183 +* 9 Nov 1983 +E796. Optimize the code a bit more, based on empirical frequency data gathered + during September and October: In \S45, use the fact that the + result is almost always true. In \S380, delete `{\bf while} + \\{true} {\bf do}' since many compilers implement that badly. + Rewrite \S852 to avoid calling \\{badness} in the most common case. + @45,380,852 +* 3 Dec 1983 +F797. Don't forget to call |error| after the message has been + given (noticed by Gabi Kuper). @500 +# Version 1.0 released today incorporates all of the above. +* 9 Dec 1983 +# Dinner party with 36 guests to celebrate \TeX's coming of age. +* 2 Feb 1984 +S798\>786. Reinstall |\font| precautions that I thought were unnecessary. + I overlooked many problematic possibilities, like + `|{\font\a=x| |\global\a}| |\the\font|' + and `|\font\a=x| |\font\b=x| |\let\b=\undefined| |\the\a|', etc. + (Found by Mike Urban.) The new remedy involves removal of the + \\{font_ident} array and putting the identifiers into a frozen + part of the hash table; so there's a sprinkling of corrections + in lots of modules. But basically the change is quite conservative, + so it shouldn't spawn any new bugs (it says here). @222,267,1257 +* 9 Feb 1984 +S799. Remove the possibility of double interrupt, in a scenario + found by Clint Cuzzo. @1031 +* 12 Feb 1984 +Q800. Improve spacing in a formula like |$(A,<)$|. @764 +* 13 Feb 1984 +A801. Avoid a bad {\bf goto}, as diagnosed by Clint Cuzzo and George O'Connor. + (Must not go directly to \\{switch}.) @346 +E802. Conserve string pool space by not storing file name in two + guises (suggested by DRF). @537 +* 26 Feb 1984 +I803. Make scaled output look cleaner by printing fewer decimals whenever + this involves no loss of accuracy. (Suggested by \MF\ development.) @103 +* 2 Mar 1984 +R804. Maintain 17-digit accuracy, not 16; now + constants like `|.00000762939453126pt|' will round correctly. @452 +* 16 Mar 1984 +R805. Plug a loophole that permitted recursion in \\{get_next}, by disallowing + deletions in \\{check_outer_validity}. @336 +* 24 Mar 1984 +I806. Open the terminal before trying to wake it up, when the program starts bad. + @1332 +* 27 Mar 1984 +R807. Check that $k<63$, to avoid the + |\patterns{xxx...xxxdxxxdxxx}| anomaly found by Jacques D\'esarm\'enien. @962 +* 11 Apr 1984 +F808. Supply code for the missing case \\{adjust_node} in \\{copy_node_list}. @206 +# Yoicks, how could serious bugs like that have escaped detection? +* 11 Jun 1984 +D809\>627. Initialize \\{char_base}, etc., for \\{null_font}. + (Found by Nick Briggs.) @552 +R810. Clear the \\{buffer} array initially (Briggs). @331 +* 21 Jun 1984 +C811. Look ahead for ligature or kern after a |\chardef|'d item + (D\'esarm\'enien). @1038 +* 4 Jul 1984 +R812. Make the quarterword constraint explicit with a + new `\\{bad}' case (19). @111 +* 7 Jul 1984 +E813. Optimize \\{firm_up_the_line} slightly, + to be consistent with the \MF\ program. @363 +* 8 Jul 1984 +I814. Give additional diagnostics when |\tracingmacros>1|. @323 +# The changes above were incorporated in Version 1.1, released July 9, 1984. +* 27 Jul 1984 +I815. Say `|see| |the| |transcript| |file|' after handling offline |\show| + commands. (Suggested by \MF.) @1298 +* 20 Oct 1984 +I816. Allow `|0|' in response to error prompts. @84 +# Those two changes led to Version 1.2. +* 25 Nov 1984 +R817. Don't forget to check for \\{null} before looking at subfields + of a node. (This was ``dirty Pascal,'' with two quarterword 0's + read as a halfword.) @846 +R818. Ditto in another place! @939 +E819. Remove the fixed-at-compile-time + partition between lower and upper memory. @116,125,162 +# This major change in memory management + completes Version 1.3, which was published in preliminary + looseleaf form as `\TeX: The Program'. +* 20 Dec 1984 +R820. Keep the \\{node_size} field from overflowing if the lower part of memory + is too large. @125 +# That was another bug in existence from the beginning! +* 5 Jan 1985 +I821. Improve the missing-format-file error (DRF). @524 +* 7 Jan 1985 +I822. Update the terminal right away so that the welcoming message will + appear as soon as possible (DRF). @61 +* 23 Jan 1985 +I823. Convey more uncertainty in the + help message at times of \\{confusion}. @95 +I824\>610. Improve the \\{history} logic in the \\{warning_issued} case. @245 +* 18 Feb 1985 +P825\>810. Stick to standard Pascal: Don't + use \\{first} in a {\bf for} loop. [Some procedures ``threaten'' it + globally, according to British Standard 6192, section 6.8.3.9.] + (Pointed out by CET.) @331 +* 11 Apr 1985 +S826. Prevent nonexistent characters from being output by + unusual combinations of ligatures and hyphenation. @915 +* 15 Apr 1985 +L827\>819. Compute memory usage correctly in |INITEX|; the previous number + was wrong because of a |WEB| text macro without parentheses (DRF). @164 +* 16 Apr 1985 +E828. Speed up \\{flush_list} by not calling \\{free_avail} (DRF). @123 +* 17 Apr 1985 +A829\>788. Introduce a special kind of kern for accent positioning; + it must not disappear after a line break. @837,879,1125 +* 18 Apr 1985 +R830\>755. Prevent |\lastbox| and |\unkern| from removing discretionary replacements. + @1081,1105 +# That completes Version 1.4. +* 26 Apr 1985 +C831. Don't try \\{\TeX_area} if a nonstandard file area has been specified + (DRF). @537 +# That was \#401 in \TeX78; I never learn! +* 30 Apr 1985 +C832\>754. Eliminate the limitation on |\write| length; the reason for it + has disappeared (Nancy Tuma). @1370 +* 8 May 1985 +D833\>819. Allocate two words for the head of the \\{active} list (CET). @162 +* 11 May 1985 +I834. Change \\{wterm} to \\{wterm_ln} after a bad beginning (Bill Gropp). @1332 +E835\>806. Don't open the terminal twice (CET). @1332 +* 22 May 1985 +R836. Test for \\{batch_mode} after trying to open the transcript file, + not before (DRF). @92 +R837. Be prepared for string pool overflow while reading the command line! + (This bug was first found in \MF, when it could occur more easily.) @525 +* 7 Aug 1985 +A838. Fix a bug in |\edef\foo{\iffalse\fi\the\toks0}|: \TeX\ should stay in the + loop when expanding non-|\the|. (Found by Dan Brotsky.) @478 +# The above changes were incorporated in Version 1.5. +* 27 Nov 1985 +C839\>764. Make `|plain|' a lowercase name, for consistency with the manual. @521 +I840\>669. Wake up the terminal for |\show| commands. @1294,1297 +# The above changes were incorporated in Version 2.0, which was published + as Volume~B of the {\sl Computers \& Typesetting\/} series. +* 15 Dec 1986 +I841. Punctuate the Poirot help message more carefully. @1283 +* 28 Jan 1987 +R842. Make sure that \\{max_in_open} doesn't exceed 127 (DRF). @14 +D843\>680. Don't allow a |\kern| to be clobbered at the end of a pre-break list + when a discretionary break is taken. (A missing `{\bf else}' was the + source of the error, diagnosed incorrectly before.) @881 +D844. Take account of discarded nodes when computing the background width + after a discretionary. @840 +# That was the first really serious bug detected for more than 17 months! I found it + while experimenting with right-to-left extensions. +# Version 2.1 was released on January 26, 1987. +* 5 Feb 1987 +E845. Remove cases in \\{shorthand_def} that cannot occur (found by Pat Monardo). @1224 +* 14 Apr 1987 +R846. Improve robustness of data structure display + when debugging (Ronaldo Am\'a). @174,182 +* 21 Apr 1987 +E847. Make the storage allocation algorithm more elegant and efficient. @127 +* 22 Apr 1987 +A848\>742. Calculate the empty-line condition properly when \\{end_line_char} is + absent. @360 +# The previous three changes were found while I was teaching a class based + on Volume~B; they led to Version 2.2. +* 28 Apr 1987 +E849. Avoid closing a file when \TeX\ knows that it isn't open (JS). @560 +* 3 Aug 1987 +S850. Clean up unfinished output if it's necessary to + \\{jump_out} (Klaus Gunterman). @642 +# That makes Version 2.3; subsequent version numbers won't be logged here. +* 19 Aug 1987 +A851. Indent rules properly in cases like\hfil\break + |\hangindent=1pt$$\halign{...\cr\noalign{\hrule}}$$|. @806 +* 20 Aug 1987 +S852. Introduce \\{co_backup} because of cases like + |\hskip 0pt plus 1fil\ifdim| (Alan Guth). @366 +* 9 Nov 1987 +S853. Change the calculation for number of leader boxes, so that + it won't be too sensitive to roundoff error near exact multiples + (M. F. Bridgland). @626 +* 17 Nov 1987 +A854. Replace my stupid algorithm + for fixed-point multiplication of negatives (WGS). @572 +* 12 Dec 1987 +B855. Fix a typo in the initialization of hyphenation tables (PB). @952 +# That error was almost completely harmless, thus undetectable, + except if some |\lccode| is~1 and no |\patterns| are given. +* 23 Dec 1987 +S856\>564. Be more cautious when ``relaxing'' a previously undefined |\csname|; + you might be inside a group (CET). @372 +* 20 Apr 1988 +S857. Make sure \\{temp_head} is well-formed whenever it can be + printed in a ``runaway'' message: Consider constructions like + |\outer\def\a0{}\a\a| (Silvio Levy). @391 +* 24 Apr 1988 +S858\>618. Avoid conflicting use of the string pool in constructions like + |\def\\#1{}\input a\\\z| (Robert Messer). @260 +* 10 May 1988 +R859. Amend the |\patterns| data structure when $\\{trie_min}=0$ + (PB). @951,953 +* 25 May 1988 +R860. Guarantee that \\{trie_pointer} cannot be out of range. @923 +S861\>618. Avoid additional bugs like \#858 in constructions + like |\input a\romannumeral1|, etc. @464,465,470 +R862\>618. Prevent similar string pool confusion that could occur + during the processing of |**\input\romannumeral6|. @525 +* 19 Jun 1988 +S863\>819. Prevent a negative dividend from rounding upward, + causing a loop (CET). @126 +E864\>819. Adopt a smoother allocation strategy when + memory is nearly gone (CET). @126 +* 20 Jun 1988 +D865\>852. Initialize \\{cur_order}, now that it's being backed up + (Tsunetoshi Hayashi). @439 +* 6 Nov 1988 +S866\>612. Disable \\{fatal_error} in \\{prompt_input}, so that + \\{open_log_file} can use it safely (Tim Morgan). @71 +S867\>836. Force terminal output whenever \\{open_log_file} fails. @535 +* 14 Dec 1988 +P868\>866. Restore \\{fatal_error} in \\{prompt_input}, but don't + let it be unsafe for \\{open_log_file}. @92,534 +* 23 Jan 1989 +D869. Give $q$ a legal value when recovering from ``infinite shrinkage'' + error. @976,1004 +* 17 Feb 1989 +D870\>758. Avoid spurious error message for |\aftergroup\relax\dump| by avoiding + inaccessible |\aftergroup| tokens (FM and Rainer Sch\"opf). @280 +* 20 Mar 1989 +R871. Don't refer to \\{link}(\\{null}) even when it ``can't happen'' + (PB). @791 +* 7 Jun 1989 +S872. Avoid confusion from |$$\begingroup\halign{#\cr}$$| (FM). @1130 +* 20 Jun 1989 +S873. Put fraction digits into dynamic memory, not the global \\{dig} array, + because of constructions like |.5\ifdim.6| (FM). @452 +* 17 Jul 1989 +S874. Prevent embarrassing attempts to report errors before the string + mechanism has been fully initialized, for example when the + command line exceeds the buffer size (WGS). @31 +* 16 Aug 1989 +M875. Allow integer products to be 31 bits long (FM). @105 +* 31 Aug 1989 +C876\>441. Increase the number of tokens shown by \\{token_show} + (J. Lavagnino). @295 +S877. Avoid confusion from |$$\begingroup\eqno$$| (FM). @1140 +# The recent TUG meeting turned out to be an extend-\TeX-for-the-nineties + party! I agreed that some extensions for non-English languages + ought to be made while I still knew how to do them. (In other words, + I broke my firm commitment to keeping \TeX\ completely stable; + but in this case nobody objected.) The following eleven changes + were coded during the month of September. +* 30 Sep 1989 +G878. Install major change allowing general 8-bit code input. @38,352 +G879. Install major change allowing multiple hyphenation tables + (M. Ferguson). @923 +G880. Introduce new parameters |\lefthyphenmin| and |\righthyphenmin|. @923 +G881. Introduce major new ligature capabilities including implicit + boundary characters. @908,1037 +G882. Install new |\inputlineno| feature suggested by MDS. @424 +G883. Install new |\holdinginserts| feature suggested by FM. @1014 +G884. Install new |\badness| feature. @424,664 +G885. Install new |\emergencystretch| feature. @863 +G886. Install new |\errorcontextlines| feature suggested by FM. @311 +S887. Recover from anomaly when hyphenation |char_warning| clobbers + |old_setting|. @863 +P888. Make it easier to change the format extension (Don Hosek). @520,1328 +* 16 Oct 1989 +R889. Avoid range check in null font with |bc=256| (PB). @565 +* 22 Nov 1989 +S890\>856. Prevent \\{save_stack} conflicts in + |{\hbox\expandafter{\csname\endcsname}}| and\kern-3pt\break + similar constructions (WGS). @645,1117 +S891\>858. System-dependent parts of file names must be addressed relatively, + not absolutely (FM and Rainer Sch\"opf). @516,517 +* 3 Dec 1989 +G892\>880. Allow different hyphenmins in the same paragraph (M. Ferguson). @1376 +S893. Distinguish |\par| from characters on |\if| tests. (MVL). @334 +S894\>378. Alignments need to be more robust against malicious + attacks (MVL). @782 +C895. Don't let kerns in discretionaries disappear at breaks (MVL). @869 +Q896\>881. Make the new hyphenation reconstruction procedure less cautious, + so that it doesn't lose hyphens found by the old method. @914 +* 11 Dec 1989 +D897\>879. Make an undumped trie dumpable again (PB). @1325 +* 18 Dec 1989 +G898\>588. Allow access to page totals in |\output| routines + (FM and Chris Rowley). @421 +* 22 Jan 1990 +R899\>611. Recognize more cases of unbalanced |\output| (CET). @1026 +* 29 Jan 1990 +S900\>758. Make |\aftergroup| work properly after |\eqno| (Michael Downes). + @1194 +* 1 Feb 1990 +S901\>878. Fix one more case of \\{end_line_char_inactive} (WGS). @360 +* 22 Feb 1990 +R902. Don't lose the last active node when total demerits are very high (FM). + @836,854 +* 13 Mar 1990 +D903. Doublecheck math fonts after making equation number (MVL). @1194 +D904. Don't forget to rule out charnodes before testing \\{type} (MVL). + @805,1202 +* 23 Mar 1990 +F905\>881. Don't change the font of punctuation preceding a hyphenated word + (Scott C. Allendorf). @903 +I906. Balance the parentheses shown on the terminal during normal runs. @1335 +E907. Optimize |\ifx\p\q| after |\let\p=\q| (MVL). @508 +S908. Treat migration properly in displays (MVL). @1199,1205 +# We're now up to Version 3.0; I sincerely hope all bugs have been found. +* 11 May 1990 +F909\>881. Initialize |\nullfont| ligature parameters (Lance Carnes). @552 +* 22 July 1990 +S910\>579. Treat |\prevgraf| as zero within |\write| (Bogus\l aw Jackowski). + @422 +* 26 July 1990 +S911. Report `|l.1|' when first line of file overflows buffer + (George Russell). @538 +* 5 December 1990 +S912\>878. Translate unprintable characters in font identifiers (WGS). @63 +* 28 December 1990 +R913. Avoid range check when there are 65536 or more pages (Eberhard Mattes). + @642 +* 20 September 1991 +I914\>878. Improve error message for |\mathchar| out of range. @436 +S915\>878. Retain unprintable internal strings in 8-bit form (FM). @59 +S916\>881. Retain right punctuation context for ligature reconstruction + (problem found by Brian Hamilton Kelly). @903 +* 10 January 1992 +S917\>881. Also avoid producing a double kern at boundary (CET). @897 +S918. Disallow |\setbox| where it doesn't work (Robert Hunt). @1241,1270 +S919. Robustify |\mskip| and |\mkern| in presence of negative quad (WGS). + @716,717 +S920\>679. Defend against `|}{|' in |\read| (Michael Downes). @483 +E921\>798. Save string memory if font occurs repeatedly (Bogus\l aw Jackowski). + @1260 +S922\>784. Don't let |\newlinechar| interrupt unprintable expansion (Bernd + Raichle). @59,60 +* 7 February 1992 +D923\>881. Restore |cur_l| properly when boundary character doesn't exist + (Mattes and Raichle). @1036 +* 17 July 1992 +C924\>892. Use current language at beginning of horizontal mode (Rainer + Sch\"opf and CET). @1091,1200 +* 17 December 1992 +R925\>879. Avoid (harmless) range errors (Philip Taylor and CET). @934,960 +* 25 February 1993 +C926\>881. Protect kerns inserted by boundary characters (William Baxter). + @837,866 +S927\>917. Don't let boundary kern disappear after hyphenation. @897 +* 26 June 1993 +R928\>668. Avoid potential future bug (Peter Breitenlohner). @628,637 +* 17 December 1993 +S929\>881. Boundary character representation shouldn't depend on the font + memory size (Berthold Horn). @549,1323 +* 10 March 1994 +R930. Huge font parameter number may exceed array bound (CET). @549 +* 4 September 1994 +F931\>926. Math kerns are explicit (Walter Carlip). @717 +R932. Avoid overflow on huge real-to-integer conversion. @625,634 +* 19 March 1995 +R933. Avoid spurious reference counts in format files (PB). @1335 +* 23 November 1998 +R934. Make sure that TeX is certifiably Y2K-safe. @1328 +* 12 July 1999 +A935\>255. |\xleaders| often drops the final box (Hiroshi Nakashima). @627,636 +* 30 August 2001 +R789. Don't allow a million unbalanced braces followed by |\cr| + outside of any alignment (Ralf Roth). @789 +R790. Don't allow end-template except at end of template (Roth). @325,1131 +* 30 September 2002 +Q791. Improve rounding of glue during output (M. F. Bridgland). @625,634 +\relax +\bye + +Up to a point it is better to let the snags [bugs] be there +than to spend such time in design that there are none +(how many decades would this course take?). +-- A M Turing + Proposals for Development in the Mathematics Division + of an Automatic Computing Engine (ACE) + Report E882, Executive Committee, National Physical Laboratory (NPL) + 1945; reprinted in April 1972 as NPL report Com Sci 57 + page 18 + quoted by Carpenter and Doran in The Computer Journal 20 (1977), 273. + +DRF David Fuchs +HWT Howard Trickey +FY Frank Yellin +LL Leslie Lamport +JS Jim Sterken +ARK Arthur Keller +CET Chris Thompson +FM Frank Mittelbach (added subsequent to publication of paper) +PB Peter Breitenlohner (ditto) +WGS Wayne G. Sullivan (ditto) +MVL Marc van Leeuwen (ditto) +MDS Michael D. Spivak (ditto) diff --git a/Master/texmf-dist/source/generic/knuth/errata/logmac.tex b/Master/texmf-dist/source/generic/knuth/errata/logmac.tex new file mode 100644 index 00000000000..8719efc497d --- /dev/null +++ b/Master/texmf-dist/source/generic/knuth/errata/logmac.tex @@ -0,0 +1,107 @@ +% 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 diff --git a/Master/texmf-dist/source/generic/knuth/tex/glue.web b/Master/texmf-dist/source/generic/knuth/tex/glue.web new file mode 100644 index 00000000000..38a6d667c88 --- /dev/null +++ b/Master/texmf-dist/source/generic/knuth/tex/glue.web @@ -0,0 +1,421 @@ +% This program by D. E. Knuth is not copyrighted and can be used freely. +% It was written on 18 Dec 1981 and revised on 24 May 1991. + +% Here is TeX material that gets inserted after \input webmac +\def\PASCAL{Pascal} +\font\eightrm=cmr8 + +\def\title{GLUE} +\def\topofcontents{\null + \def\titlepage{F} % include headline on the contents page + \def\rheader{\mainfont\hfil \contentspagenumber} + \vfill + \centerline{\titlefont Fixed-Point Glue Setting} + \vfill} +\def\botofcontents{\vfill + \centerline{\hsize 6in\baselineskip9pt + \vbox{\eightrm\baselineskip9pt\noindent + The preparation of this report + was supported in part by the National Science + Foundation under grants IST-7921977 and MCS-7723728; + by Office of Naval Research grant N00014-81-K-0330; + and by the IBM Corporation. `\TeX' is a + trademark of the American Mathematical Society.}}} + +@* Introduction. +If \TeX\ is being implemented on a microcomputer that does 32-bit +addition and subtraction, but with multiplication and division restricted to +multipliers and divisors that are either powers of~2 or positive +integers less than~$2^{15}$, it can still do the computations associated +with the setting of glue in a suitable way. This program illustrates one +solution to the problem. + +Another purpose of this program is to provide the first ``short'' example +of the use of \.{WEB}. + +@ The program itself is written in standard \PASCAL. It begins with a +normal program header, most of which will be filled in with other parts of this +``web'' as we are ready to introduce them. +@^program header@> + +@p program GLUE(@!input,@!output); + type @<Types in the outer block@>@; + var @<Globals in the outer block@>@; + procedure initialize; {this procedure gets things started} + var @<Local variables for initialization@>@; + begin @<Set initial values@>; + end; + +@ Here are two macros for common programming idioms. + +@d incr(#) == #:=#+1 {increase a variable by unity} +@d decr(#) == #:=#-1 {decrease a variable by unity} + +@* The problem and a solution. +We are concerned here with the ``setting of glue'' that occurs when a +\TeX\ box is being packaged. Let $x_1$, \dots,~$x_n$ be integers whose sum +$s=x_1+\cdots+x_n$ is positive, and let $t$ be another positive integer. +These $x_i$ represent scaled amounts of glue in units of sp (scaled +points), where one sp is $2^{-16}$ of a printer's point. The other +quantity $t$ represents the total by which the glue should stretch or +shrink. Following the conventions of \TeX82, we will assume that the +integers we deal with are less than $2^{31}$ in absolute value. + +After the glue has been set, the actual amounts of incremental glue space +(in~sp) will be the integers $f(x_1)$, \dots,~$f(x_n)$, where $f$ is a +function that we wish to compute. We want $f(x)$ to be nearly proportional +to~$x$, and we also want the sum $f(x_1)+\cdots+f(x_n)$ to be nearly +equal to~$t$. If we were using floating-point arithmetic, we would simply +compute $f(x)\equiv(t/s)\cdot x$ and hope for the best; but the goal here +is to compute a suitable~$f$ using only the fixed-point arithmetic operations +of a typical ``16-bit microcomputer.'' + +The solution adopted here is to determine integers $a$, $b$, $c$ such that +$$f(x)=\bigl\lfloor 2^{-b}c\lfloor 2^{-a}x\rfloor\bigr\rfloor$$ +if $x$ is nonnegative. Thus, we take $x$ and shift it right by $a$~bits, +then multiply by~$c$ (which is $2^{15}$ or less), and shift the product +right by $b$~bits. The quantities $a$, $b$, and~$c$ are to be chosen +so that this calculation doesn't cause overflow and so that $f(x_1)+\cdots ++f(x_n)$ is reasonably close to~$t$. + +The following method is used to calculate $a$ and~$b$: +Suppose $$y=\max_{1\le i\le n}\vert x_i\vert\,.$$ +Let $d$ and $e$ be the smallest integers such that $t<2^ds$ and $y<2^e$. +Since $s$ and~$t$ are less than~$2^{31}$, we have $-30\le d\le31$ and +$1\le e\le31$. An error message is given if $d+e\ge31$; in such a case +some $x_m$ has $\vert x_m\vert\ge 2^{e-1}$ and we are trying to change +$\vert x_m\vert$ to $\vert(t/s)x_m\vert\ge2^{d+e-2}\ge2^{30}$~sp, which +\TeX\ does not permit. (Consider, for example, the ``worst case'' situation +$x_1=2^{30}+1$, $x_2=-2^{30}$, $t=2^{31}-1$; surely we need not bother +trying to accommodate such anomalous combinations of values.) On the other +hand if $d+e\le31$, we set $a=e-16$ and $b=31-d-e$. Notice that this choice +of~$a$ guarantees that $\lfloor2^{-a}\vert x_i\vert\rfloor<2^{16}$. We will +choose~$c$ to be at most~$2^{15}$, so that the product will be less +than~$2^{31}$. + +The computation of $c$ is the tricky part. +@^hairy mathematics@> +The ``ideal'' value for $c$ would be $\rho=2^{a+b}t/s$, since $f(x)$ should +be approximately $(t/s)\cdot x$. Furthermore it is better to have $c$ slightly +larger than~$\rho$, instead of slightly smaller, since the other operations +in $f(x)$ have a downward bias. Therefore we shall compute $c=\lceil\rho\rceil$. +Since $2^{a+b}t/s<2^{a+b+d}=2^{15}$, we have $c\le2^{15}$ as desired. + +We want to compute $c=\lceil\rho\rceil$ exactly in all cases. There is no +difficulty if $s<2^{15}$, since $c$ can be computed directly using the +formula $c=\bigl\lfloor(2^{a+b}t+s-1)/s\bigr\rfloor$; overflow will not +occur since $2^{a+b}t<2^{15}s<2^{30}$. + +Otherwise let $s=s_12^l+s_2$, where $2^{14}\le s_1<2^{15}$ and $0\le s_2<2^l$. +We will essentially carry out a long division. Let $t$ be ``normalized'' +so that $2^{30}\le2^ht<2^{31}$ for some~$h$. Then we form the quotient and +remainder of $2^ht$ divided by~$s_1$, +$$ 2^ht=qs_1+r_0, \qquad 0\le r_0<s_1.$$ +It follows that $2^{h+l}t-qs=2^lr_0-qs_2=r$, say. If $0\ge r>-s$ we have +$q=\lceil2^{h+l}t/s\rceil$; otherwise we can replace $(q,r)$ by +$(q\pm1,r\mp s)$ repeatedly until $r$ is in the correct range. It is not +difficult to prove that $q$ needs to be increased at most once and decreased +at most seven times, since $2^lr_0-qs_2<2^ls_1\le s$ and since +$qs_2/s\le(2^ht/s_1)(s_2/2^ls_1)<2^{31}/s_1^2\le8$. Finally, we have +$a+b-h-l=-1$ or~$-2$, since $2^{28+l}\le2^{14}s=2^{a+b+d-1}s\le2^{a+b}t< +2^{a+b+d}s=2^{15}s<2^{30+l}$ and $2^{30}\le2^ht<2^{31}$. Hence +$c=\lceil2^{a+b-h-l}q\rceil=\lceil{1\over2}q\rceil$ or~$\lceil{1\over4}q\rceil$. + +An error analysis shows that these values of $a$, $b$, and $c$ work +satisfactorily, except in unusual cases where we wouldn't expect them to. +@^error analysis@> +When $x\ge0$ we have +$$\eqalign{f(x)&=2^{-b}(2^{a+b}t/s+\theta_0)(2^{-a}x-\theta_1)-\theta_2\cr +&=(t/s)x+\theta_02^{-a-b}x-\theta_12^at/s-2^{-b}\theta_0\theta_1-\theta_2\cr}$$ +where $0\le\theta_0,\theta_1,\theta_2<1$. Now $0\le\theta_02^{-a-b}x +<2^{e-a-b}=2^{d+e-15}$ and $0\le\theta_12^at/s<2^{a+d}=2^{d+e-16}$, and +the other two terms are negligible. Therefore $f(x_1)+\cdots+f(x_n)$ differs +from~$t$ by at most about $2^{d+e-15}n$. Since $2^{d+e}$ is larger than +$(t/s)y$, which is the largest stretching or shrinking of glue after expansion, +the error is at worst about $n/32000$ times as much as this, so it is quite +reasonable. For example, even if fill glue is being used to stretch +20 inches, the error will still be less than $1\over1600$ of an inch. + +@ To sum up: Given the positive integers $s$, $t$, and $y$ as above, we +set $$a\gets\lfloor\lg y\rfloor-15,\qquad b\gets29-\lfloor\lg y\rfloor- +\lfloor\lg t/s\rfloor,\qquad\hbox{and}\qquad c\gets\lceil2^{a+b}t/s\rceil.$$ +The implementation below shows how to do the job in \PASCAL\ without using +large numbers. + +@ \TeX\ wants to have the glue-setting information in a 32-bit data type +called |glue_ratio|. The \PASCAL\ implementation of \TeX82 has |glue_ratio +=real|, but alternative definitions of |glue_ratio| are explicitly allowed. + +For our purposes we shall let |glue_ratio| be a record that is packed with +three fields: The |a_part| will hold the positive integer |a+16|, the +|b_part| will hold the nonnegative integer~|b|, and the |c_part| will hold +the nonnegative integer~|c|. When the formulas above tell us to take +|b>30|, we might as well set |c:=0| instead, because |f(x)| will be +zero in all cases when |b>30|. Note that we have only about 25 bits of +information in all, so it should fit in 32 bits with ease. + +@<Types...@>= +@!glue_ratio=packed record + @!a_part: 1..31; {the quantity |e=a+16| in our derivation} + @!b_part: 0..30; {the quantity |b| in our derivation} + @!c_part: 0..@'100000; {the quantity |c| in our derivation} + end; +@!scaled = integer; {this data type is used for quantities in sp units} + +@ The real problem is to define the procedures that \TeX\ needs to +deal with such |glue_ratio| values: +(a)~Given scaled numbers |s|, |t|, and~|y| as above, to compute the +corresponding |glue_ratio|. +(b)~Given a nonnegative scaled number~|x| and a |glue_ratio|~|g|, to +compute the scaled number~|f(x)|. +(c)~Given a |glue_ratio|~|g|, to print out a decimal equivalent of +|g| for diagnostic purposes. + +The procedures below can be incorporated into \TeX82 via a change file +without great difficulty. A few modifications will be needed, because +\TeX's |glue_ratio| values can be negative in unusual cases---when the +amount of stretchability or shrinkability is less than zero. Negative +values in the |c_part| will handle such problems, if proper care is +taken. The error message below should either become a warning message +or a call to \TeX's |print_err| routine; in the latter case, an +@^error message@> +appropriate help message should be given, stating that glue cannot +stretch to more than 18~feet long, but that it's OK to proceed with +fingers crossed. + +@*Glue multiplication. +The easiest procedure of the three just mentioned is the one that is +needed most often, namely, the computation of~|f(x)|. + +\PASCAL\ doesn't have built-in binary shift commands or built-in exponentiation, +although many computers do have this capability. Therefore our arithmetic +routines use an array called `|two_to_the|', containing powers of~two. +Divisions by powers of two are never done in the programs below when the +dividend is negative, so the operations can safely be replaced by right +shifts on machines for which this is most appropriate. (Contrary to popular +opinion, the operation `|x div 2|' is not the same as shifting |x| +right one binary place, on a machine with two's complement arithmetic, +when |x| is a negative odd integer. But division +{\it is\/} equivalent to shifting when |x| is nonnegative.) + +@<Globals...@>= +@!two_to_the: array[0..30] of integer; {$|two_to_the|[k]=2^k$} + +@ @<Local variables for init...@>= +@!k:1..30; {an index for initializing |two_to_the|} + +@ @<Set init...@>= +two_to_the[0]:=1; +for k:=1 to 30 do two_to_the[k]:=two_to_the[k-1]+two_to_the[k-1]; + +@ We will use the abbreviations |ga|, |gb|, and |gc| as convenient +alternatives to \PASCAL's \&{with} statement. The glue-multiplication +function |f|, which replaces several occurrences of the `|float|' macro +in \TeX82, is now easy to state: + +@d ga==g.a_part +@d gb==g.b_part +@d gc==g.c_part + +@p function glue_mult(@!x:scaled;@!g:glue_ratio):integer; + {returns |f(x)| as above, assuming that |x>=0|} +begin if ga>16 then x:=x div two_to_the[ga-16] {right shift by |a| places} +else x:=x*two_to_the[16-ga]; {left shift by |-a| places} +glue_mult:=(x*gc) div two_to_the[gb]; {right shift by |b| places} +end; {note that |b| may be as large as 30} + +@*Glue setting. +The |glue_fix| procedure computes |a|, |b|, and |c| by the method +explained above. \TeX\ does not normally compute the quantity~|y|, but +it could be made to do so without great difficulty. + +This procedure replaces several occurrences of the `|unfloat|' macro in +\TeX82. It would be written as a function that returns a |glue_ratio|, +if \PASCAL\ would allow functions to produce records as values. + +@p procedure glue_fix(@!s,@!t,@!y:scaled; var@!g:glue_ratio); +var @!a,@!b,@!c:integer; {components of the desired ratio} +@!k,@!h:integer; {$30-\lfloor\lg s\rfloor$, $30-\lfloor\lg t\rfloor$} +@!s0:integer; {original (unnormalized) value of |s|} +@!q,@!r,@!s1:integer; {quotient, remainder, divisor} +@!w:integer; {$2^l$, where $l=16-k$} +begin @<Normalize |s|, |t|, and |y|, computing |a|, |k|, and |h|@>; +if t<s then b:=15-a-k+h@+else b:=14-a-k+h; +if (b<0) or (b>30) then + begin if b<0 then write_ln('! Excessive glue.'); {error message} +@^error message@> + b:=0; c:=0; {make |f(x)| identically zero} + end +else begin if k>=16 then {easy case, $s_0<2^{15}$} + c:=(t div two_to_the[h-a-b]+s0-1) div s0 {here |1<=h-a-b<=k-14<=16|} + else @<Compute |c| by long division@>; + end; +ga:=a+16; gb:=b; gc:=c; +end; + +@ @<Normalize |s|, |t|, and |y|, computing |a|, |k|, and |h|@>= +begin a:=15; k:=0; h:=0; s0:=s; +while y<@'10000000000 do {|y| is known to be positive} + begin decr(a); y:=y+y; + end; +while s<@'10000000000 do {|s| is known to be positive} + begin incr(k); s:=s+s; + end; +while t<@'10000000000 do {|t| is known to be positive} + begin incr(h); t:=t+t; + end; +end {now $2^{30}\le t=2^ht_0<2^{31}$ and $2^{30}\le s=2^ks_0<2^{31}$, + hence $d=k-h$ if $t/s<1$} + +@ @<Compute |c| by long division@>= +begin w:=two_to_the[16-k]; +s1:=s0 div w; +q:=t div s1; +r:=((t mod s1)*w)-((s0 mod w)*q); +if r>0 then + begin incr(q); r:=r-s0; + end +else while r<=-s0 do + begin decr(q); r:=r+s0; + end; +if a+b+k-h=15 then c:=(q+1) div 2 @+else c:=(q+3) div 4; +end + +@*Glue-set printing. +The last of the three procedures we need is |print_gr|, which displays a +|glue_ratio| in symbolic decimal form. Before constructing such a procedure, +we shall consider some simpler routines, copying them from an early +draft of the program \TeX82. + +@d unity==@'200000 {$2^{16}$, represents 1.0000} + +@<Glob...@>= +@!dig:array[0..15] of 0..9; {for storing digits} + +@ An array of digits is printed out by |print_digs|. + +@p procedure print_digs(@!k:integer); {prints |dig[k-1]| \dots |dig[0]|} +begin while k>0 do + begin decr(k); write(chr(ord('0')+dig[k])); + end; +end; + +@ A nonnegative integer is printed out by |print_int|. + +@p procedure print_int(@!n:integer); {prints an integer in decimal form} +var @!k:0..12; {index to current digit; we assume that $0\le n<10^{12}$} +begin k:=0; +repeat dig[k]:=n mod 10; n:=n div 10; incr(k); +until n=0; +print_digs(k); +end; + +@ And here is a procedure to print a nonnegative |scaled| number. + +@p procedure print_scaled(s:scaled); + {prints a scaled real, truncated to four digits} +var k:0..3; {index to current digit of the fraction part} +begin print_int(s div unity); {print the integer part} +s:=((s mod unity)*10000) div unity; +for k:=0 to 3 do + begin dig[k]:=s mod 10; s:=s div 10; + end; +write('.'); print_digs(4); +end; + +@ Now we're ready to print a |glue_ratio|. Since the effective multiplier +is $2^{-a-b}c$, we will display the scaled integer $2^{16-a-b}c$, taking +care to print something special if this quantity is terribly large. + +@p procedure print_gr(@!g:glue_ratio); {prints a glue multiplier} +var @!j:-29..31; {the amount to shift |c|} +begin j:=32-ga-gb; +while j>15 do + begin write('2x'); decr(j); {indicate multiples of 2 for BIG cases} + end; +if j<0 then print_scaled(gc div two_to_the[-j]) {shift right} +else print_scaled(gc*two_to_the[j]); {shift left} +end; + +@* The driver program. +In order to test these routines, we will assume that the |input| file +contains a sequence of test cases, where each test case consists of the +integer numbers $t$, $x_1$, \dots,~$x_n$, 0. The final test case should +be followed by an additional zero. + +@<Glob...@>= +@!x:array[1..1000] of scaled; {the $x_i$} +@!t:scaled; {the desired total} +@!m:integer; {the test case number} + +@ Each case will be processed by the following routine, which assumes +that |t| has already been read. + +@p procedure test; {processes the next data set, given |t| and~|m|} +var @!n: 0..1000; {the number of items} +k:0..1000; {runs through the items} +y:scaled; {$\max_{1\le i\le n}\vert x_i\vert$} +@!g:glue_ratio; {the computed glue multiplier} +@!s:scaled; {the sum $x_1+\cdots+x_n$} +@!ts:scaled; {the sum $f(x_1)+\cdots+f(x_n)$} +begin write_ln('Test data set number ',m:1,':'); +@<Read $x_1,\ldots,x_n$@>; +@<Compute |s| and |y|@>; +if s<=0 then write_ln('Invalid data (nonpositive sum); this set rejected.') +else begin @<Compute |g| and print it@>; + @<Print the values of $x_i$, $f(x_i)$, and the totals@>; + end; +end; + +@ @<Read $x_1,\ldots,x_n$@>= +begin n:=0; +repeat incr(n); read(x[n]); +until x[n]=0; +decr(n); +end + +@ @<Compute |s| and |y|@>= +begin s:=0; y:=0; +for k:=1 to n do + begin s:=s+x[k]; + if y<abs(x[k]) then y:=abs(x[k]); + end; +end + +@ @<Compute |g| and print it@>= +begin glue_fix(s,t,y,g); {set |g|, perhaps print an error message} +write(' Glue ratio is '); print_gr(g); +write_ln(' (',ga-16:1,',',gb:1,',',gc:1,')'); +end + +@ @<Print the values of $x_i$, $f(x_i)$, and the totals@>= +begin ts:=0; +for k:=1 to n do + begin write(x[k]:20); + if x[k]>=0 then y:=glue_mult(x[k],g) + else y:=-glue_mult(-x[k],g); + write_ln(y:15); + ts:=ts+y; + end; +write_ln(' Totals',s:13,ts:15,' (versus ',t:1,')'); +end + +@ Here is the main program. +@^main program@> + +@p begin initialize; +m:=1; +read(t); +while t>0 do + begin test; + incr(m); read(t); + end; +end. + +@*Index. Here are the section numbers where various identifiers are used in the +program, and where various topics are discussed. + + + + + diff --git a/Master/texmf-dist/source/generic/knuth/web/webman.tex b/Master/texmf-dist/source/generic/knuth/web/webman.tex new file mode 100644 index 00000000000..61e12a28789 --- /dev/null +++ b/Master/texmf-dist/source/generic/knuth/web/webman.tex @@ -0,0 +1,1672 @@ +% WEB user manual -- last updated by D E Knuth on 4 Dec 89 +\input webmac +\parskip 0pt plus 1pt +\def\RA{\char'31 } % right arrow +\def\hang{\hangindent 4em\ignorespaces} +\font\ninerm=cmr9 +\font\ninett=cmtt9 +\font\eighttt=cmtt8 +\let\mc=\ninerm % medium caps for names like SAIL +\def\PASCAL{Pascal} +\font\quoterm=cmssq8 +\font\quoteit=cmssqi8 +\def\pb{\.{|...|}} +\def\lpile{\def\cr{\hfill\endline}\matrix} % I only use \lpile by itself + +\outer\def\section #1.{\penalty-50\vskip 12pt plus 3pt minus 3pt + \noindent{\bf #1.}\quad\ignorespaces} + +\def\lheader{\mainfont\the\pageno\hfill\sc\runninghead\hfill} +\def\rheader{\hfill\sc\runninghead\hfill\mainfont\the\pageno} +\def\runninghead{{\tentt WEB} USER MANUAL} + +% This verbatim mode assumes that no ? appears in the text being copied. +\def\verbatim{\begingroup + \def\do##1{\catcode`##1=12 } \dospecials + \parskip 0pt \parindent 0pt + \catcode`\ =13 \catcode`\^^M=13 + \tt \catcode`\?=0 \verbatimdefs \verbatimgobble} +{\catcode`\^^M=13{\catcode`\ =13\gdef\verbatimdefs{\def^^M{\ \par}\let =\ }} % + \gdef\verbatimgobble#1^^M{}} +\centerline{\titlefont The {\ttitlefont WEB} System + of Structured Documentation} + +\vskip 15pt plus 3pt minus 3pt +\noindent This memo describes how to write programs in the +\.{WEB} language; and it also includes the full \.{WEB} documentation for +\.{WEAVE} and \.{TANGLE}, the programs that read \.{WEB} input and produce +\TeX\ and \PASCAL\ output, respectively. The philosophy behind \.{WEB} is +that an experienced system programmer, who wants to provide the best +possible documentation of software products, needs two things +simultaneously: a language like \TeX\ for formatting, and a language like +\PASCAL\ for programming. Neither type of language can provide the best +documentation by itself. But when both are appropriately combined, we +obtain a system that is much more useful than either language separately. + +The structure of a software program may be thought of as a ``web'' that is +made up of many interconnected pieces. To document such a program, we want +to explain each individual part of the web and how it relates to its +neighbors. The typographic tools provided by \TeX\ give us an opportunity +to explain the local structure of each part by making that structure +visible, and the programming tools provided by \PASCAL\ make it possible +for us to specify the algorithms formally and unambiguously. By combining +the two, we can develop a style of programming that maximizes our ability +to perceive the structure of a complex piece of software, and at the same +time the documented programs can be mechanically translated into a working +software system that matches the documentation. + +Since \.{WEB} is an experimental system developed for internal use within +the \TeX\ project at Stanford, this report is rather terse, and it assumes +that the reader is an experienced programmer who is highly motivated to +read a detailed description of \.{WEB}'s rules. Furthermore, even if a +less terse manual were to be written, the reader would have to be warned +in advance that \.{WEB} is not for beginners and it never will be: The +user of \.{WEB} must be familiar with both \TeX\ and \PASCAL. When one +writes a \.{WEB} description of a software system, it is possible to make +mistakes by breaking the rules of \.{WEB} and/or the rules of \TeX\ and/or +the rules of \PASCAL. In practice, all three types of errors will occur, +and you will get different error messages from the different language +processors. In compensation for the sophisticated expertise needed to cope +with such a variety of languages, however, experience has shown that +reliable software can be created quite rapidly by working entirely in +\.{WEB} from the beginning; and the documentation of such programs seems +to be better than the documentation obtained by any other known method. +Thus, \.{WEB} users need to be highly qualified, but they can get some +satisfaction and perhaps even a special feeling of accomplishment when +they have successfully created a software system with this method. + +To use \.{WEB}, you prepare a file called \.{COB.WEB} (say), and then you +apply a system program called \.{WEAVE} to this file, obtaining an output +file called \.{COB.TEX}. When \TeX\ processes \.{COB.TEX}, your output +will be a ``pretty printed'' version of \.{COB.WEB} that takes appropriate +care of typographic details like page layout and the use of indentation, +italics, boldface, etc.; this output will contain extensive cross-index +information that is gathered automatically. You can also submit the same +file \.{COB.WEB} to another system program called \.{TANGLE}, which will +produce a file \.{COB.PAS} that contains the \PASCAL\ code of your \.{COB} +program. The \PASCAL\ compiler will convert \.{COB.PAS} into +machine-language instructions corresponding to the algorithms that were so +nicely formatted by \.{WEAVE} and \TeX. Finally, you can (and should) +delete the files \.{COB.TEX} and \.{COB.PAS}, because \.{COB.WEB} contains +the definitive source code. Examples of the behavior of \.{WEAVE} and +\.{TANGLE} are appended to this manual. + +Besides providing a documentation tool, \.{WEB} enhances the \PASCAL\ +language by providing a rudimentary macro capability together with the +ability to permute pieces of the program text, so that a large system can +be understood entirely in terms of small modules and their local +interrelationships. The \.{TANGLE} program is so named because it takes a +given web and moves the modules from their web structure into the order +required by \PASCAL; the advantage of programming in \.{WEB} is that the +algorithms can be expressed in ``untangled'' form, with each module +explained separately. The \.{WEAVE} program is so named because it takes +a given web and intertwines the \TeX\ and \PASCAL\ portions contained in +each module, then it knits the whole fabric into a structured document. +(Get it? Wow.) Perhaps there is some deep connection here with the fact +that the German word for ``weave'' is ``{\it web\/}'', and the +corresponding Latin imperative is ``{\it texe\/}''! + +It is impossible to list all of the related work that has influenced the +design of \.{WEB}, but the key contributions should be mentioned +here.\quad (1)~Myrtle Kellington, as executive editor for ACM +publications, developed excellent typographic standards for the +typesetting of Algol programs during the 1960s, based on the original +designs of Peter Naur; the subtlety and quality of this influential work +can be appreciated only by people who have seen what happens when other +printers try to typeset Algol without the advice of ACM's copy +editors.\quad(2)~Bill McKeeman introduced a program intended to automate +some of this task [Algorithm 268, ``Algol~60 reference language editor,'' +{\sl CACM \bf8} (1965), 667--668]; and a considerable flowering of such +programs has occurred in recent years [see especially Derek Oppen, +``Prettyprinting,'' {\sl ACM TOPLAS \bf2} (1980), 465--483; G.~A. Rose and +J. Welsh, ``Formatted programming languages,'' {\sl SOFTWARE Practice +\char`\&\ Exper.\ \bf11} (1981), 651--669].\quad(3)~The top-down style of +exposition encouraged by \.{WEB} was of course chiefly influenced by Edsger +Dijkstra's essays on structured programming in the late 1960s. The less +well known work of Pierre-Arnoul de Marneffe [``Holon programming: A +survey,'' Univ.\ de Liege, Service Informatique, Liege, Belgium, 1973; 135 +pp.\null] also had a significant influence on the author as \.{WEB} was +being formulated.\quad(4)~Edwin Towster has proposed a similar style of +documentation in which the programmer is supposed to specify the relevant +data structure environment in the name of each submodule [``A convention +for explicit declaration of environments and top-down refinement of +data,'' {\sl IEEE Trans.\ on Software Eng.\ \bf SE--5} (1979), 374--386]; +this requirement seems to make the documentation a bit too verbose, +although experience with \.{WEB} has shown that any unusual control +structure or data structure should definitely be incorporated into the +module names on psychological grounds.\quad(5)~Discussions with Luis +Trabb~Pardo in the spring of 1979 were extremely helpful for setting up a +prototype version of \.{WEB} that was called \.{DOC}.\quad (6)~Ignacio +Zabala's extensive experience with \.{DOC}, in which he created a full +implementation of \TeX\ in \PASCAL\ that was successfully transported to +many different computers, was of immense value while \.{WEB} was taking +its present form.\quad(7)~David~R. Fuchs made several crucial suggestions +about how to make \.{WEB} more portable; he and Arthur~L. Samuel +coordinated the initial installations of \.{WEB} on dozens of computer +systems, making changes to the code so that it would be acceptable to +a wide variety of \PASCAL\ compilers.\quad(8)~The name \.{WEB} itself +was chosen in honor of my wife's mother, Wilda Ernestine Bates. + +The appendices to this report contain complete \.{WEB} programs for the +\.{WEAVE} and \.{TANGLE} processors. A study of these examples, together +with an attempt to write \.{WEB} programs by yourself, is the best way +to understand why \.{WEB} has come to be like it is. +\section General rules. +A \.{WEB} file is a long string of text that has been divided into +individual lines. The exact line boundaries are not terribly crucial, and +a programmer can pretty much chop up the \.{WEB} file in whatever way seems +to look best as the file is being edited; but string constants and control +texts must end on the same line on which they begin, since this convention +helps to keep errors from propagating. The end of a line means +the same thing as a blank space. + +Two kinds of material go into \.{WEB} files: \TeX\ text and \PASCAL\ text. +A programmer writing in \.{WEB} should be thinking both of the +documentation and of the \PASCAL\ program that he or she is creating; +i.e., the programmer should be instinctively aware of the different +actions that \.{WEAVE} and \.{TANGLE} will perform on the \.{WEB} file. +\TeX\ text is essentially copied without change by \.{WEAVE}, and it is +entirely deleted by \.{TANGLE}, since the \TeX\ text is ``pure +documentation.'' \PASCAL\ text, on the other hand, is formatted by +\.{WEAVE} and it is shuffled around by \.{TANGLE}, according to rules that +will become clear later. For now the important point to keep in mind is +that there are two kinds of text. Writing \.{WEB} programs is something +like writing \TeX\ documents, but with an additional ``\PASCAL\ mode'' +that is added to \TeX's horizontal mode, vertical mode, and math mode. + +A \.{WEB} file is built up from units called {\sl modules\/} that are more +or less self-contained. Each module has three parts: + +\yskip\item{1)} A \TeX\ part, containing explanatory material about what +is going on in the module. + +\item{2)} A definition part, containing macro definitions that serve as +abbreviations for \PASCAL\ constructions that would be less comprehensible +if written out in full each time. + +\item{3)} A \PASCAL\ part, containing a piece of the program that +\.{TANGLE} will produce. This \PASCAL\ code should ideally be about a +dozen lines long, so that it is easily comprehensible as a unit and so +that its structure is readily perceived. + +\yskip\noindent The three parts of each module must appear in this order; +i.e., the \TeX\ commentary must come first, then the definitions, and +finally the \PASCAL\ code. Any of the parts may be empty. + +\eject % page break inserted Dec 88 + +A module begins with the pair of symbols `\.{@\ }' or `\.{@*}', where +`\.{\ }' denotes a blank space. A module ends +at the beginning of the next module (i.e., at the next +`\.{@\ }' or `\.{@*}'), or at the end of the file, whichever comes first. +The \.{WEB} file may also contain material that is not part of any module +at all, namely the text (if any) that occurs before the first module. +Such text is said to be ``in limbo''; it is ignored by \.{TANGLE} +and copied essentially verbatim by \.{WEAVE}, so its function is to +provide any additional formatting instructions that may be desired in the +\TeX\ output. Indeed, it is customary to begin a \.{WEB} file with +\TeX\ code in limbo that loads special fonts, defines special macros, +changes the page sizes, and/or produces a title page. + +Modules are numbered consecutively, starting with 1; these numbers appear +at the beginning of each module of the \TeX\ documentation, and they appear +as bracketed comments at the beginning of the code generated by that +module in the \PASCAL\ program. + +Fortunately, you never mention these numbers yourself when you are writing +in \.{WEB}. You just say `\.{@\ }' or `\.{@*}' at the beginning of each +new module, and the numbers are supplied automatically by \.{WEAVE} and +\.{TANGLE}. As far as you are concerned, a module has a +{\sl name\/} instead of a number; such a name is specified by writing +`\.{@<}' followed by \TeX\ text followed by `\.{@>}'. When \.{WEAVE} +outputs a module name, it replaces the `\.{@<}' and `\.{@>}' by +angle brackets and inserts the module number in small type. Thus, when you +read the output of \.{WEAVE} it is easy to locate any module that is +referred to in another module. + +For expository purposes, a module name should be a good description of the +contents of that module; i.e., it should stand for the abstraction +represented by the module. Then the module can be ``plugged into'' one or +more other modules in such a way +that unimportant details of its inner workings +are suppressed. A module name therefore ought to be long enough to convey +the necessary meaning. Unfortunately, however, it is laborious to type +such long names over and over again, and it is also difficult to specify a +long name twice in exactly the same way so that \.{WEAVE} and \.{TANGLE} +will be able to match the names to the modules. To ameliorate this difficulty, +\.{WEAVE} and \.{TANGLE} let you abbreviate a module name +after its first appearance in the \.{WEB} file; you can type simply +`\.{@<$\alpha$...@>}', where $\alpha$ is any string that is a prefix of +exactly one module name appearing in the file. For example, `\.{@<Clear +the arrays@>}' can be abbreviated to `\.{@<Clear...@>}' if no other module +name begins with the five letters `\.{Clear}'. Module names must otherwise +match character for character, except that consecutive blank spaces and/or +tab marks are treated as equivalent to single spaces, and such spaces are +deleted at the beginning and end of the name. Thus, `\.{@< Clear { }the +arrays @>}' will also match the name in the previous example. + +We have said that a module begins with `\.{@\ }' or `\.{@*}', but we +didn't say how it gets divided up into a \TeX\ part, a definition part, +and a \PASCAL\ part. The definition part begins with the first appearance +of `\.{@d}' or `\.{@f}' in the module, and the \PASCAL\ part begins with +the first appearance of `\.{@p}' or `\.{@<}'. The latter option `\.{@<}' +stands for the beginning of a module name, which is the name of the module +itself. An equals sign (\.=) must follow the `\.{@>}' at the end of this +module name; you are saying, in effect, that the module name stands for +the \PASCAL\ text that follows, so you say `$\langle\,$module +name$\,\rangle=\null$\PASCAL\ text'. Alternatively, if the \PASCAL\ part +begins with `\.{@p}' instead of a module name, the current module is said +to be {\sl unnamed}. Note that module names cannot appear in the +definition part of a module, because the first `\.{@<}' in a module +signals the beginning of its \PASCAL\ part. But any number of module names +might appear in the \PASCAL\ part, once it has started. + +The general idea of \.{TANGLE} is to make a \PASCAL\ program out of these +modules in the following way: First all the \PASCAL\ parts of unnamed +modules are copied down, in order; this constitutes the initial +approximation $T_0$ to the text of the program. (There should be at least +one unnamed module, otherwise there will be no program.) Then all module +names that appear in the initial text $T_0$ are replaced by the \PASCAL\ +parts of the corresponding modules, and this substitution process +continues until no module names remain. Then all defined macros are +replaced by their equivalents, according to certain rules that are +explained later. The resulting \PASCAL\ code is ``sanitized'' so that it +will be acceptable to an average garden-variety \PASCAL\ compiler; i.e., +lowercase letters are converted to uppercase, long identifiers are +chopped, and the lines of the output file are constrained to be at most 72 +characters long. All comments will have been removed from this \PASCAL\ +program except for the meta-comments delimited by `\.{@\{}' and +`\.{@\}}', as explained below, and except for the module-number comments +that point to the source location where each piece of the program text +originated in the \.{WEB} file. + +If the same name has been given to more than one module, the \PASCAL\ text +for that name is obtained by putting together all of the \PASCAL\ parts in +the corresponding modules. This feature is useful, for example, in a +module named `Global variables in the outer block', since one can then +declare global variables in whatever modules those variables are +introduced. When several modules have the same name, \.{WEAVE} assigns the +first module number as the number corresponding to that name, and it +inserts a note at the bottom of that module telling the reader to `See +also sections so-and-so'; this footnote gives the numbers of all the other +modules having the same name as the present one. The \PASCAL\ text +corresponding to a module is usually formatted by \.{WEAVE} so that the +output has an equivalence sign in place of the equals sign in the \.{WEB} +file; i.e., the output says `$\langle\,$module +name$\,\rangle\equiv\null$\PASCAL\ text'. However, in the case of the second +and subsequent appearances of a module with the same name, this `$\equiv$' +sign is replaced by `$\mathrel+\equiv$', as an indication that the \PASCAL\ +text that follows is being appended to the \PASCAL\ text of another +module. + +The general idea of \.{WEAVE} is to make a \.{TEX} file from the \.{WEB} +file in the following way: The first line of the \.{TEX} file will be +`\.{\\input webmac}'; this will cause \TeX\ to read in the macros that +define \.{WEB}'s documentation conventions. The next lines of the file +will be copied from whatever \TeX\ text is in limbo before the first +module. Then comes the output for each module in turn, possibly +interspersed with end-of-page marks. Finally, \.{WEAVE} will generate a +cross-reference index that lists each module number in which each \PASCAL\ +identifier appears, and it will also generate an alphabetized list +of the module names, as well as a table of contents that +shows the page and module numbers for each ``starred'' module. + +What is a ``starred'' module, you ask? A module that begins with `\.{@*}' +instead of `\.{@\ }' is slightly special in that it denotes a new major +group of modules. The `\.{@*}' should be followed by the title of this +group, followed by a period. Such modules will always start on a new page +in the \TeX\ output, and the group title will appear as a running headline +on all subsequent pages until the next starred module. The title will also +appear in the table of contents, and in boldface type at the beginning of +its module. Caution: Do not use \TeX\ control sequences in such titles, +unless you know that the \.{webmac} macros will do the right thing with +them. The reason is that these titles are converted to uppercase when +they appear as running heads, and they are converted to boldface when they +appear at the beginning of their modules, and they are also written out to +a table-of-contents file used for temporary storage while \TeX\ is +working; whatever control sequences you use must be meaningful in all +three of these modes. + +The \TeX\ output produced by \.{WEAVE} for each module consists of +the following: First comes the module number (e.g., `\.{\\M123.}' +at the beginning of module 123, except that `\.{\\N}' appears in place of +`\.{\\M}' at the beginning of a starred module). Then comes the +\TeX\ part of the module, copied almost verbatim except as noted +below. Then comes the definition part and the \PASCAL\ part, formatted +so that there will be a little extra space between them if both are +nonempty. The definition and \PASCAL\ parts are obtained by inserting +a bunch of funny looking \TeX\ macros into the \PASCAL\ program; these +macros handle typographic details about fonts and proper math spacing, +as well as line breaks and indentation. + +When you are typing \TeX\ text, you will probably want to make frequent +reference to variables and other quantities in your \PASCAL\ code, and you +will want those variables to have the same typographic treatment +when they appear in your text as when they appear in your +program. Therefore the \.{WEB} language allows you to get the effect of +\PASCAL\ editing within \TeX\ text, if you place `\.|' marks before and +after the \PASCAL\ material. For example, suppose you want to say something +like this: +$$\hbox{The characters are placed into \\{buffer}, which is a +\&{packed} \&{array} $[1\to\|n]$ \&{of} \\{char}.}$$ +The \TeX\ text would look like this in your \.{WEB} file: +$$\.{The characters are placed into |buffer|, which is a |packed +array [1..n] of char|.}$$ +And \.{WEAVE} translates this into something you are glad you didn't have +to type: +$$\lpile{\.{The characters are placed into \\\\\{buffer\},}\cr + \.{which is a \\\&\{packed\}{ }\\\&\{array\}{ }\$ + [1\\to\\|n]\${ }\\\&\{of\}{ }\\\\\{char\}.}\cr}$$ +Incidentally, the cross-reference index that \.{WEAVE} would make, in +the presence of a comment like this, would include +the current module number as one of the index entries for \\{buffer} +\vadjust{\eject}% page break inserted Dec 88 +and \\{char}, even though \\{buffer} and \\{char} +might not appear in the \PASCAL\ part of +this module. Thus, the index covers references to identifiers in +the explanatory comments as well as in the program itself; you will +soon learn to appreciate this feature. However, the identifiers +\&{packed} and \&{array} and \|n\ and \&{of\/} would not be indexed, +because \.{WEAVE} does not make index entries for reserved words or +single-letter identifiers. Such identifiers are felt to be so ubiquitous +that it would be pointless to mention every place where they occur. + +Speaking of identifiers, the author of \.{WEB} thinks that +\\{IdentifiersSeveralWordsLong} look terribly ugly when they mix +uppercase and lowercase letters. He recommends that +\\{identifiers\_several\_words\_long} be written with underline characters +to get a much better effect. The actual identifiers sent to the \PASCAL\ +compiler by \.{TANGLE} will have such underlines removed, and \.{TANGLE} +will check to make sure that two different identifiers do not become +identical when this happens. (In fact, \.{TANGLE} even checks that +the first seven characters of identifiers are unique, when lowercase +letters have been converted to uppercase; the number seven in this +constraint is more strict than \PASCAL's eight, and it can +be changed if desired.) The \.{WEAVE} processor will properly +alphabetize identifiers that have embedded underlines +when it makes the index. + +Although a module begins with \TeX\ text and ends with \PASCAL\ text, we +have noted that the dividing line isn't sharp, since \PASCAL\ text can be +included in \TeX\ text if it is enclosed in `\pb'. Conversely, \TeX\ text +also appears frequently within \PASCAL\ text, because everything in +comments (i.e., between left and right braces) is treated as \TeX\ text. +Furthermore, a module name consists of \TeX\ text; thus, a \.{WEB} file +typically involves constructions like `\.{if} \.x \.= \.0 \.{then} +\.{@<Empty} \.{the} \.{|buffer|} \.{array@>}' where we go back and forth +between \PASCAL\ and \TeX\ conventions in a natural way. +\section Macros. +A \.{WEB} programmer can define three kinds of macros to make the programs +shorter and more readable: + +\yskip\hang`\.{@d} \\{identifier} \.= \\{constant}' defines a {\sl numeric\/} +macro, allowing \.{TANGLE} to do rudimentary arithmetic. + +\yskip\hang`\.{@d} \\{identifier} \.{==} \PASCAL\ text' defines a {\sl +simple\/} macro, where the identifier will be replaced by the \PASCAL\ text +when \.{TANGLE} produces its output. + +\yskip\hang`\.{@d} \\{identifier}\.{(\#) ==} \PASCAL\ text' defines a +{\sl parametric\/} macro, where the identifier will be replaced by the \PASCAL\ +text and where occurrences of \.{\#} in that \PASCAL\ text will be +replaced by an argument. + +\yskip\noindent In all three cases, the identifier must have length greater +than one; it must not be a single letter. + +Numeric macros are subject to the following restrictions:\quad +(1)~The identifier must +be making its first appearance in the \.{WEB} file; +a numeric macro must be defined before it is used.\quad +(2)~The right-hand side of the numeric definition must be made entirely from +integer constants, numeric macros, preprocessed strings (see below), and +plus~signs or minus signs. No other operations or symbols are allowed, +not even parentheses, except that \PASCAL-like comments (enclosed in +braces) can appear. Indeed, comments are recommended, since it is usually +wise to give a brief explanation of the significance of each identifier as +it is defined.\quad +(3)~The numeric value must be less than $2^{15}=32768$ in absolute value. +(For larger values, you can use `\.{==}' in place of~`\.=', thus making use +of a simple macro instead of a numeric one. Note, however, that simple +macros sometimes have a different effect. For example, consider the three +definitions `\.{@d n1=2 @d n2=2+n1 @d n3==2+n1}'; then `\.{x-n2}' will +expand into `\.{x-4}', while `\.{x-n3}' will expand into `\.{x-2+2}' which +is quite different! It is wise to include parentheses in non-numeric +macros, e.g., `\.{@d n3==(2+n1)}', to avoid such errors.) + +When constants are connected by plus signs or minus +signs in a \PASCAL\ program, \.{TANGLE} does the arithmetic before putting +the constant into the output file. Therefore it is permissible to say, for +example, `\&{array} $[0\,.\,.\,\\{size}-1]$' if \\{size} has been declared +as a macro; note that \PASCAL\ doesn't allow this kind of compile-time +arithmetic if \\{size} is a \&{constant} quantity in the program. Another +use of \.{TANGLE}'s arithmetic is to make \&{case} statement labels such +as `$\\{flag}+1$' legitimate. Of course, it is improper to change \.{2+2} +into \.4 without looking at the surrounding context; many counterexamples +exist, such as the phrases `\.{-2+2}', `\.{x/2+2}', and `\.{2+2E5}'. The +program for \.{TANGLE}, in the appendix, gives precise details about this +conversion, which \.{TANGLE} does only when it is safe. + +The right-hand sides of simple and parametric macros +are required to have balanced parentheses, and the \PASCAL\ texts of +modules must have balanced parentheses too. Therefore when the argument +to a para\-metric macro appears in parentheses, both parentheses +will belong to the same \PASCAL\ text. + +The appendices to this report contain hundreds of typical examples of the +usefulness of \.{WEB} macros, so it is not necessary to dwell on the +subject here. However, the reader should know that \.{WEB}'s apparently +primitive macro capabilities can actually do a lot of rather surprising +things. Here is a construction that sheds further light on what is +possible: After making the definitions +$$\catcode`\#=12 +\lpile{\.{@d two\_cases(#)==case j of 1:#(1); 2:#(2); end}\cr +\.{@d reset\_file(#)==reset(input\_file@\&#)}\cr}$$ +one can write `\.{two\_cases(reset\_file)}' and the resulting \PASCAL\ +output will be +$$\.{case j of 1:reset(input\_file1); 2:reset(input\_file2); end}$$ +(but in uppercase letters and with \.\_'s removed). +The `\.{@\&}' operation used here joins together two adjacent tokens +into a single token, as explained later; otherwise the \PASCAL\ file would +contain a space between \.{input\_file} and the digit that followed it. +This trick can be used to provide the effect of an array of files, if you +are unfortunate enough to have a \PASCAL\ compiler that doesn't allow such +arrays. Incidentally, the cross-reference index made by \.{WEAVE} from +this example would contain the identifier \\{input\_file} but it would not +contain \\{input\_file1} or \\{input\_file2}. Furthermore, \.{TANGLE} +would not catch the error that \.{INPUTFILE1} and \.{INPUTFILE2} both +begin with the same nine letters; one should be more careful when using +`\.{@\&}'! But such aspects of the construction in this trick are +peripheral to our main point, which is that a parametric macro name without +arguments can be used as an argument to another parametric macro. + +Although \.{WEB}'s macros are allowed to have at most one parameter, the +following example shows that this is not as much of a restriction as it +may seem at first. Let \\{amac} and \\{bmac} be any parametric macros, and +suppose that we want to get the effect of +$$\catcode`\#=12 +\.{@d cmac(#1,#2) == amac(#1) bmac(#2)}$$ +which \.{WEB} doesn't permit. The solution is to make the definitions +$$\catcode`\#=12 +\lpile{\.{@d cmac(#) == amac(#) dmac}\cr +\.{@d dmac(#) == bmac(#)}\cr}$$ +and then to say `\.{cmac(x)(y)}'. + +There is one restriction in the generality of \.{WEB}'s parametric +macros, however: the argument to a para\-metric macro must not come from +the expansion of a macro that has not already been ``started.'' For +example, here is one of the things \.{WEB} cannot handle: +$$\catcode`\#=12 +\lpile{\.{@d arg == (p)}\cr +\.{@d identity(#) == #}\cr +\.{@p identity arg}\cr}$$ +In this case \.{TANGLE} will complain that the \.{identity} macro is not +followed by an argument in parentheses. + +The \.{WEB} language has another feature that is somewhat similar to a +numeric macro. A {\sl preprocessed string\/} is a string that is like +a \PASCAL\ string but delimited by double-quote marks (\.") instead of +single-quotes. Double-quote marks inside of such strings are indicated by +giving two double-quotes in a row. If a preprocessed string is +of length one (e.g., \.{"A"} or \.{""""}), it will be treated by \.{TANGLE} +as equivalent to the corresponding ASCII-code integer (e.g., \.{65} or +\.{34}). And if a preprocessed string is not of length one, it will be +converted into an integer equal to 256 or more. A {\sl string pool\/} +containing all such strings will be written out by the \.{TANGLE} +processor; this string pool file consists of string 256, then string 257, +etc., where each string is followed by an end-of-line and prefixed by two +decimal digits that define its length. Thus, for example, the empty string +\.{""} would be represented in the string pool file by a line containing +the two characters `\.{00}', while the string \.{"""String"""} would be +represented by `\.{08"String"}'. A given string appears at most once in +the string pool; the use of such a pool makes it easier to cope with +\PASCAL's restrictions on string manipulation. The string pool ends with +`\.{*nnnnnnnnn}', where \.{nnnnnnnnn} is a decimal number +called the {\sl string pool check sum}. If any string changes, the check +sum almost surely changes too; thus, the `\.{@\$}' feature +described below makes it possible for a program to assure itself that it +is reading its own string pool. + +Here is a simple example that combines numeric macros with preprocessed +strings of length one: +$$\lpile{\.{@d upper\_case\_Y = "Y"}\cr +\.{@d case\_difference = -"y"+upper\_case\_Y}\cr}$$ +The result is to define +$\\{upper\_case\_Y}=89$, $\\{case\_difference}=-32$. +\section Control codes. +We have seen several magic uses of `\.{@}' signs in \.{WEB} files, and it +is time to make a systematic study of +these special features. A \.{WEB} {\sl control code\/} +is a two-character combination of which the first is `\.@'. + +Here is a complete list of the legal control codes. The letters $L$, $T$, +$P$, $M$, $C$, and/or $S$ following each code indicate whether or not that +code is allowable in limbo, in \TeX\ text, in \PASCAL\ text, in module +names, in comments, and/or in strings. A bar over such a letter means +that the control code terminates the present part of the \.{WEB} file; for +example, $\overline L$ means that this control code ends the limbo material +before the first module. + +\def\@#1[#2] {\yskip\hangindent 2em\noindent\.{@#1\unskip + \spacefactor1000{ }}$[#2]$\quad} +\def\oP{\overline P} +\def\oT{\overline T\mskip1mu} + +\@@ [C,L,M,P,S,T] A double \.@ denotes the single character `\.@'. This is +the only control code that is legal in limbo, in comments, and in strings. + +\@\ [\overline L,\oP,\oT] This denotes the beginning of a new +(unstarred) module. A tab mark or end-of-line (carriage return) +is equivalent to a space when it follows an \.@ sign. + +\@* [\overline L,\oP,\oT] This denotes the beginning of a new starred +module, i.e., a module that begins a new major group. The title of the new +group should appear after the \.{@*}, followed by a period. As explained +above, \TeX\ control sequences should be avoided in such titles unless +they are quite simple. When \.{WEAVE} and \.{TANGLE} read a \.{@*}, they +print an asterisk on the terminal +followed by the current module number, so that the user +can see some indication of progress. The very first module should be starred. + +\@d [\oP,\oT] Macro definitions begin with \.{@d} (or \.{@D}), followed by +the \PASCAL\ text for one of the three kinds of macros, as explained +earlier. + +\@f [\oP,\oT] Format definitions begin with \.{@f} (or \.{@F}); they cause +\.{WEAVE} to treat identifiers in a special way when they appear in +\PASCAL\ text. The general form of a format definition is `\.{@f} \|l \.{==} +\|r', followed by an optional comment enclosed in braces, where \|l and \|r +are identifiers; \.{WEAVE} will subsequently treat identifier \|l as it +currently treats \|r. This feature allows a \.{WEB} programmer to invent +new reserved words and/or to unreserve some of \PASCAL's reserved +identifiers. The definition part of each module consists of any number of +macro definitions (beginning with \.{@d}) and format definitions (beginning +with \.{@f}), intermixed in any order. + +\@p [\oP,\oT] The \PASCAL\ part of an unnamed module begins with \.{@p} +(or \.{@P}). This causes \.{TANGLE} to append the following \PASCAL\ code +to the initial program text $T_0$ as explained above. The \.{WEAVE} +processor does not cause a `\.{@p}' to appear explicitly in the \TeX\ +output, so if you are creating a \.{WEB} file based on a \TeX-printed +\.{WEB} documentation you have to remember to insert \.{@p} in the +appropriate places of the unnamed modules. + +\@< [P,\oT] A module name begins with \.{@<} followed by \TeX\ text followed +by \.{@>}; the \TeX\ text should not contain any \.{WEB} control codes +except \.{@@}, unless these control codes appear in \PASCAL\ text that +is delimited by \pb. The module name may be abbreviated, after its first +appearance in a \.{WEB} file, by giving any unique prefix followed by \.{...}, +where the three dots immediately precede the closing \.{@>}. No module name +should be a prefix of another. Module names may not appear in \PASCAL\ +text that is enclosed in \pb, nor may they appear in the definition part +of a module (since the appearance of a module name ends the definition +part and begins the \PASCAL\ part). + +\@\' [P,T] This denotes an octal constant, to be formed from the +succeeding digits. For example, if the \.{WEB} file contains `\.{@\'100}', +the \.{TANGLE} processor will treat this an equivalent to `\.{64}'; +the constant will be formatted as ``\O{100}'' in the \TeX\ output +produced via \.{WEAVE}. You should use octal notation only for positive +constants; don't try to get, e.g., $-1$ by saying `\.{@\'777777777777}'. + +\@" [P,T] A hexadecimal constant; `\.{@"D0D0}' tangles to \.{53456} and +weaves to `\H{D0D0}'. + +\@\$ [P] This denotes the string pool check sum. + +\@\{ [P] The beginning of a ``meta comment,'' i.e., a comment +that is supposed to appear in the \PASCAL\ code, is indicated by +\.{@\{} in the \.{WEB} file. Such delimiters can be used as +isolated symbols in macros or modules, but they should be properly nested +in the final \PASCAL\ program. The \.{TANGLE} processor will convert +`\.{@\{}' into `\.\{' in the \PASCAL\ output file, unless +the output is already part of a meta-comment; in the latter case +`\.{@\{}' is converted into `\.[', since \PASCAL\ does not allow +nested comments. Incidentally, module numbers are automatically inserted +as meta-comments into the \PASCAL\ program, in order to help correlate the +outputs of \.{WEAVE} and \.{TANGLE} (see Appendix~C\null). Meta-comments +can be used to put conditional text into a \PASCAL\ program; this helps to +overcome one of the limitations of \.{WEB}, since the simple macro +processing routines of \.{TANGLE} do not include the dynamic evaluation of +boolean expressions. + +\@\} [P] The end of a ``meta comment'' is indicated by `\.{@\}}'; this is +converted either into `\.\}' or `\.{]}' in the \PASCAL\ output, according +to the conventions explained for \.{@\{} above. + +\@\& [P] The \.{@\&} operation causes whatever is on its left to be +adjacent to whatever is on its right, in the \PASCAL\ output. No spaces or +line breaks will separate these two items. However, the thing on the left +should not be a semicolon, since a line break might occur after a semicolon. + +\@\^ [P,T] The ``control text'' that follows, up to the next +`\.{@>}', will be entered into the index together with the identifiers of +the \PASCAL\ program; this text will appear in roman type. For example, to +put the phrase ``system dependencies'' into the index, you can type +`\.{@\^system dependencies@>}' in each module +that you want to index as system dependent. A control text, like a string, +must end on the same line of the \.{WEB} file as it began. Furthermore, +no \.{WEB} control codes are allowed in a control text, not even +\.{@@}. (If you need an \.{@} sign you can get around this restriction by +typing `\.{\\AT!}'.) + +\@. [P,T] The ``control text'' that follows will be entered into the index +in \.{typewriter} \.{type}; see the rules for `\.{@\^}', which is analogous. + +\@: [P,T] The ``control text'' that follows will be entered into the index +in a format controlled by the \TeX\ macro `\.{\\9}', which the user +should define as desired; see the rules for `\.{@\^}', which is analogous. + +\@t [P] The ``control text'' that follows, up to the next `\.{@>}', will +be put into a \TeX\ \.{\\hbox} and formatted along with the neighboring +\PASCAL\ program. This text is ignored by \.{TANGLE}, but it can be used +for various purposes within \.{WEAVE}. For example, you can make comments +that mix \PASCAL\ and classical mathematics, as in `$\\{size}<2^{15}$', by +typing `\.{|size < @t\$2\^\{15\}\$@>|}'. A control text must end on the +same line of the \.{WEB} file as it began, and it may not contain any +\.{WEB} control codes. + +\@= [P] The ``control text'' that follows, up to the next `\.{@>}', will +be passed verbatim to the \PASCAL\ program. + +\@\\ [P] Force end-of-line here in the \PASCAL\ program file. + +\@! [P,T] The module number in an index entry will be underlined if `\.{@!}' +immediately precedes the identifier or control text being indexed. This +convention is used to distinguish the modules where an identifier is +defined, or where it is explained in some special way, from the modules +where it is used. A~reserved word or an identifier of length one will not +be indexed except for underlined entries. An `\.{@!}' is implicitly inserted +by \.{WEAVE} just after the reserved words \&{function}, \&{procedure}, +\&{program}, and \&{var}, and just after \.{@d} and \.{@f}. But you should +insert your own `\.{@!}' before the definitions of types, constants, +variables, parameters, and components of records and enumerated types that +are not covered by this implicit convention, if you want to improve the +quality of the index that you get. + +\@? [P,T] This cancels an implicit (or explicit) `\.{@!}', so that the next +index entry will not be underlined. + +\@, [P] This control code inserts a thin space in \.{WEAVE}'s output; it is +ignored by \.{TANGLE}. Sometimes you need this extra space if you are using +macros in an unusual way, e.g., if two identifiers are adjacent. + +\@/ [P] This control code causes a line break to occur within a \PASCAL\ +program formatted by \.{WEAVE}; it is ignored by \.{TANGLE}. Line breaks +are chosen automatically by \TeX\ according to a scheme that works 99\%\ +of the time, but sometimes you will prefer to force a line break so that +the program is segmented according to logical rather than visual criteria. +Caution: `\.{@/}' should be used only after statements or clauses, not in +the middle of an expression; use \.{@|} in the middle of expressions, in +order to keep \.{WEAVE}'s parser happy. + +\@| [P] This control code specifies an optional line break in the midst of +an expression. For example, if you have a long condition between \&{if} and +\&{then}, or a long expression on the right-hand side of an assignment +statement, you can use `\.{@|}' to specify breakpoints more logical than +the ones that \TeX\ might choose on visual grounds. + +\@\# [P] This control code forces a line break, like \.{@/} does, +and it also causes a little extra white space to appear between the lines at +this break. You might use it, for example, between procedure definitions or +between groups of macro definitions that are logically separate but within +the same module. + +\@+ [P] This control code cancels a line break that might otherwise be +inserted by \.{WEAVE}, e.g., before the word `\&{else}', if you want to +put a short if-then-else construction on a single line. It is ignored by +\.{TANGLE}. + +\@; [P] This control code is treated like a semicolon, for formatting +purposes, except that it is invisible. You can use it, for example, after +a module name when the \PASCAL\ text represented by that module name ends +with a semicolon. + +\yskip\noindent +The last six control codes (namely `\.{@,}', `\.{@/}', `\.{@|}', +`\.{@\#}', `\.{@+}', and `\.{@;}') have no effect on the \PASCAL\ +program output by \.{TANGLE}; they merely help to improve the readability +of the \TeX-formatted \PASCAL\ that is output by \.{WEAVE}, in unusual +circumstances. \.{WEAVE}'s built-in formatting method is fairly good, but +it is incapable of handling all possible cases, because it must deal with +fragments of text involving macros and module names; these fragments do +not necessarily obey \PASCAL's syntax. Although \.{WEB} allows you to +override the automatic formatting, your best strategy is not to worry +about such things until you have seen what \.{WEAVE} produces automatically, +since you will probably need to make only a few corrections when you are +touching up your documentation. + +Because of the rules by which every module is broken into three parts, +the control codes `\.{@d}', `\.{@f}', and `\.{@p}' are not allowed to occur +once the \PASCAL\ part of a module has begun. +\section Additional features and caveats. + +1. The character pairs `\.{(*}', `\.{*)}', `\.{(.}', and `\.{.)}' are +converted automatically in \PASCAL\ text as though they were +`\.{@\{}', `\.{@\}}', `\.[', and `\.]', respectively, except +of course in strings. Furthermore in certain installations of \.{WEB} that +{\def\\#1#2{`{\tentex\char'#1#2}'}% +have an extended character set, the characters \\32, \\34, \\35, \\30, +\\36, \\04, \\37, \\05, and \\06} +can be typed as abbreviations for +`\.{<>}', `\.{<=}', `\.{>=}', `\.{:=}', `\.{==}', `\.{and}', `\.{or}', +`\.{not}', and `\.{in}', respectively. However, the latter abbreviations +are not used in the standard versions of \.{WEAVE.WEB} and \.{TANGLE.WEB} +that are distributed to people who are installing \.{WEB} on other +computers, and the programs are designed to produce only standard ASCII +characters as output if the input consists entirely of ASCII characters. + +2. If you have an extended character set, all of the characters listed +in Appendix C of {\sl The \TeX book\/} can be used in strings. But you should +stick to standard ASCII characters if you want to write programs that will +be useful to all the poor souls out there who don't have extended +character sets. + +3. The \TeX\ file output by \.{WEAVE} is broken into lines having at most +80 characters each. The algorithm that does this line breaking is unaware +of \TeX's convention about comments following `\.\%' signs on a line. When +\TeX\ text is being copied, the existing line breaks are copied as well, +so there is no problem with `\.\%' signs unless the original \.{WEB} file +contains a line more than eighty characters long or a line with \PASCAL\ +text in \pb\ that expands to more than eighty characters long. Such lines +should not have `\.\%' signs. + +4. \PASCAL\ text is translated by a ``bottom up'' procedure that +identifies each token as a ``part of speech'' and combines parts of speech +into larger and larger phrases as much as possible according to a special +grammar that is explained in the documentation of \.{WEAVE}. It is easy to +learn the translation scheme for simple constructions like single +identifiers and short expressions, just by looking at a few examples of +what \.{WEAVE} does, but the general mechanism is somewhat complex because +it must handle much more than \PASCAL\ itself. Furthermore the output +contains embedded codes that cause \TeX\ to indent and break lines as +necessary, depending on the fonts used and the desired page width. For +best results it is wise to adhere to the following restrictions: + +\yskip\itemitem{a)}Comments in \PASCAL\ text should appear only after +statements or clauses; i.e., after semicolons, after reserved words like +\&{then} and \&{do}, or before reserved words like \&{end} and \&{else}. +Otherwise \.{WEAVE}'s parsing method may well get mixed up. + +\itemitem{b)}Don't enclose long \PASCAL\ texts in \pb, since the +indentation and line breaking codes are omitted when the \pb\ text is +translated from \PASCAL\ to \TeX. Stick to simple expressions or +statements. + +\yskip +5. Comments and module names are not permitted in \pb\ text. After a `\.|' +signals the change from \TeX\ text to \PASCAL\ text, the next `\.|' that is +not part of a string or control text ends the \PASCAL\ text. + +6. A comment must have properly nested occurrences of left and right +braces, otherwise \.{WEAVE} and \.{TANGLE} will not know where the comment +ends. However, the character pairs `\.{\\\{}' and `\.{\\\}}' do not count +as left and right braces in comments, and the character pair `\.{\\|}' +does not count as a delimiter that begins \PASCAL\ text. (The actual rule +is that a character after `\.\\' is ignored; hence in `\.{\\\\\{}' the +left brace {\sl does\/} count.) At present, \.{TANGLE} and \.{WEAVE} treat +comments in slightly different ways, and it is necessary to satisfy both +conventions: \.{TANGLE} ignores `\.|' characters entirely, while \.{WEAVE} +uses them to switch between \TeX\ text and \PASCAL\ text. Therefore, a +comment that includes a brace in a string in \pb---e.g., `\.{\{{ }look at +this |"\{"| \}}'---will be handled correctly by \.{WEAVE}, but \.{TANGLE} +will think there is an unmatched left brace. In order to satisfy both +processors, one can write `\.{\{{ }look at this \\leftbrace\\{ }\}}', after +setting up`\.{\\def\\leftbrace\{|"\{"|\}}'. + +7. Reserved words of \PASCAL\ must appear entirely in lowercase letters +in the \.{WEB} file; otherwise their special nature will not be recognized +by \.{WEAVE}. You could, for example, have a macro named \\{END} and it +would not be confused with \PASCAL's \&{end}. + +However, you may not want to capitalize macro names just to distinguish them +from other identifiers. Here is a way to unreserve \PASCAL's reserved word +`\&{type}' and to substitute another word `\&{mtype}' in the \.{WEB} file. +$$\vbox{\halign{\tt #\hfil\cr +@d type(\char'43) == mem[\char'43].t\cr +@d mtype == t \char'100\char'46{} y \char'100\char'46{} p + \char'100\char'46{} e\cr +@f mtype == type\cr +@f type == true\cr}}$$ +In the output of \.{TANGLE}, the macro \.{mtype} now produces `\.{TYPE}' +and the macro \.{type(x)} now produces `\.{MEM[X].T}'. In the output of +\.{WEAVE}, these same inputs produce \&{mtype} and \\{type}(\|x), +respectively. + +8. The \.{@f} feature allows you to define one identifier to act like +another, and these format definitions are carried out sequentially, as the +example above indicates. However, a given identifier has only one printed format +throughout the entire document (and this format will even be used before +the \.{@f} that defines it). The reason is that \.{WEAVE} operates in two +passes; it processes \.{@f}'s and cross-references on the first pass and +it does the output on the second. + +9. You may want some \.{@f} formatting that doesn't correspond to any +existing reserved word. In that case, \.{WEAVE} could be extended in a +fairly obvious way to include new ``reserved words'' in its vocabulary. +The identifier `\&{xclause}' has in fact been included already as a +reserved word, so that it can be used to format the `\&{loop}' macro, +where `\&{loop}' is defined to be equivalent to `\&{while \\{true} do}'. + +10. Sometimes it is desirable to insert spacing into \PASCAL\ code that is +more general than the thin space provided by `\.{@,}'. The \.{@t} feature +can be used for this purpose; e.g., `\.{@t\\hskip 1in@>}' will +leave one inch of blank space. Furthermore, `\.{@t\\4@>}' can be +used to backspace by one unit of indentation, since the control sequence +\.{\\4} is defined in \.{webmac} to be such a backspace. (This +control sequence is used, for example, at the beginning of lines that +contain labeled statements, so that the label will stick out a little at +the left.) + +11. \.{WEAVE} and \.{TANGLE} are designed to work with two input files, +called \\{web\_file} and \\{change\_file}, where \\{change\_file} contains +data that overrides selected portions of \\{web\_file}. The resulting merged +text is actually what has been called the \.{WEB} file elsewhere in this +report. + +Here's how it works: The change file consists of zero or more ``changes,'' +where a change has the form `\.{@x}$\langle$old lines$\rangle$\.{@y}$\langle$% +new lines$\rangle$\.{@z}'. The special control codes \.{@x}, \.{@y}, \.{@z}, +which are allowed only in change files, must appear at the beginning of a line; +the remainder of such a line is ignored. +The $\langle$old lines$\rangle$ represent material that exactly matches +consecutive lines of the \\{web\_file}; the $\langle$new lines$\rangle$ +represent zero or more lines that are supposed to replace the old. Whenever +the first ``old line'' of a change is found to match a line in the +\\{web\_file}, all the other lines in that change must match too. + +Between changes, before the first change, and after the last change, +the change file can have any number of lines that do not begin with +`\.{@x}', `\.{@y}', or~`\.{@z}'. Such lines are bypassed and not used for +matching purposes. + +This dual-input feature is useful when working with a master \.{WEB} file +that has been received from elsewhere (e.g., \.{TANGLE.WEB} or +\.{WEAVE.WEB} or \.{TEX.WEB}), when changes are desirable to customize the +program for your local computer system. You will be able to debug your +system-dependent changes without clobbering the master web file; and once +your changes are working, you will be able to incorporate them readily +into new releases of the master web file that you might receive from time +to time. +\section Appendices. +The basic ideas of \.{WEB} can be understood most easily by looking at +examples of ``real'' programs. Appendix~A shows the \.{WEB} input that +generated modules 55--59 of the \.{WEAVE} program; Appendix~B shows the +corresponding \TeX\ code output by \.{WEAVE}; and Appendix~C shows excerpts +from the corresponding \PASCAL\ code output by \.{TANGLE}. + +The complete webs for \.{WEAVE} and \.{TANGLE} appear as the bulk of this +report, in Appendices D and~E. The reader should first compare Appendix~A +to the corresponding portion of Appendix~D; then the same material should +be compared to Appendices B and~C. Finally, if time permits, the reader may +enjoy studying the complete programs in Appendices D and~E, since \.{WEAVE} +and \.{TANGLE} contain several interesting aspects, and since an attempt +has been made in these appendices to evolve a style of programming that +makes good use of the \.{WEB} language. + +Finally, Appendix F is the `\.{webmac}' file that sets \TeX\ up to accept +the output of \.{WEAVE}; Appendix~G discusses how to use some of its macros +to vary the output formats; and Appendix~H discusses what needs to be done +when \.{WEAVE} and \.{TANGLE} are installed in a new operating environment. +\section Performance statistics. +The programs in Appendices D and E will optionally keep statistics on +how much memory they require. Here is what they once printed out when +processing themselves: + +\def\pstat#1#2#3 +#4{\yskip\noindent\.{#1} applied to \.{#2} (cpu time #3 sec)\par +\halign{\quad\tt##\hfil\cr#4}} + +\pstat{TANGLE}{TANGLE}{15} +{Memory usage statistics:\cr +456 names, 215 replacement texts;\cr +3396+3361 bytes, 6685+7329+5805 tokens.\cr} + +\pstat{TANGLE}{WEAVE}{30} +{Memory usage statistics:\cr +692 names, 339 replacement texts;\cr +4576+4294 bytes, 10184+9875+9150 tokens.\cr} + +\pstat{WEAVE}{TANGLE}{45} +{Memory usage statistics: 478 names, 2045 cross references, 4159+3729 bytes;\cr +parsing required 684 scraps, 1300 texts, 3766 tokens, 119 levels;\cr +sorting required 34 levels.\cr} + +\pstat{WEAVE}{WEAVE}{65} +{Memory usage statistics: 737 names, 3306 cross references, 4896+4962 bytes;\cr +parsing required 684 scraps, 1300 texts, 3766 tokens, 119 levels;\cr +sorting required 73 levels.\cr} + +\yskip\noindent The cpu time for \PASCAL\ to process \.{TANGLE.PAS} was +approximately 13 seconds, and \.{WEAVE.PAS} took approximately 26 seconds; +thus the tangling time was slightly more than the compiling time. The cpu +time for \TeX\ to process \.{TANGLE.TEX} was approximately 500 seconds, +and \.{WEAVE.TEX} took approximately 750 seconds (i.e., about 7 +seconds per printed page, where these pages are substantially larger than +the pages in a normal book). All cpu times quoted are for a DECsystem-10. + +\def\K{{\mc K}} +The file \.{TANGLE.WEB} is about 125\K\ characters long; \.{TANGLE} +reduces it to a file \.{TANGLE.PAS} whose size is about 42\K\ characters, +while \.{WEAVE} expands it to a file \.{TANGLE.TEX} of about 185\K\null. +The corresponding file sizes for \.{WEAVE.WEB}, \.{WEAVE.PAS}, and +\.{WEAVE.TEX} are 180\K, 89\K, and 265\K. + +The much larger file \.{TEX.WEB} led to the following numbers: + +\pstat{TANGLE}{TEX}{110} +{Memory usage statistics:\cr +3750 names, 1768 replacement texts;\cr +41895+41053 bytes, 42378+45074+41091 tokens.\cr} + +\pstat{WEAVE}{TEX}{270} +{Memory usage statistics: 3412 names, 19699 cross references, + 37900+40232 bytes;\cr +parsing required 685 scraps, 1303 texts, 3784 tokens, 104 levels;\cr +sorting required 52 levels.\cr} + +\yskip\noindent +\PASCAL\ did \.{TEX.PAS} in about 75 seconds; \TeX\ did \.{TEX.TEX} +in about 3600. +% Here is a quotation that could not really be omitted + +\vfill + +{\baselineskip9pt +\halign to\hsize{\hfil\quoteit#\tabskip 0pt plus 100pt& + \hfil\quoteit#\tabskip 0pt\cr +O, what a tangled web we weave& + O, what a tangled WEB we weave\cr +When first we practise to deceive!& + When \TeX\ we practise to conceive!\cr +\noalign{\vskip 2pt} +\quoterm ---SIR WALTER SCOTT, {\quoteit Marmion} 6:17 (1808)& + \quoterm ---RICHARD PALAIS (1982)\cr +}} +\eject +\def\runninghead{APPENDIX A --- {\tentt WEB} FILE FORMAT} +\section Appendix A. +This excerpt from \.{WEAVE.WEB} produced modules 55--59 in Appendix~D. +Note that some of the lines are indented to show the program structure. +The indentation is ignored by \.{WEAVE} and \.{TANGLE}, but users find +that \.{WEB} files are quite readable if they have some such indentation. + +\vskip 6pt +\begingroup \def\tt{\eighttt} \baselineskip9pt +% Note to myself: I had to remove SAIL characters from the file here! +% Also tabs replaced by double-space. The changes were made in WEAVE source. +\verbatim +@* Searching for identifiers. +The hash table described above is updated by the |id_lookup| procedure, +which finds a given identifier and returns a pointer to its index in +|byte_start|. The identifier is supposed to match character by character +and it is also supposed to have a given |ilk| code; the same name may be +present more than once if it is supposed to appear in the index with +different typesetting conventions. +If the identifier was not already present, it is inserted into the table. + +Because of the way \.{WEAVE}'s scanning mechanism works, it is most convenient +to let |id_lookup| search for an identifier that is present in the |buffer| +array. Two other global variables specify its position in the buffer: the +first character is |buffer[id_first]|, and the last is |buffer[id_loc-1]|. + +@<Glob...@>= +@!id_first:0..long_buf_size; {where the current identifier begins in the buffer} +@!id_loc:0..long_buf_size; {just after the current identifier in the buffer} +@# +@!hash:array [0..hash_size] of sixteen_bits; {heads of hash lists} + +@ Initially all the hash lists are empty. + +@<Local variables for init...@>= +@!h:0..hash_size; {index into hash-head array} + +@ @<Set init...@>= +for h:=0 to hash_size-1 do hash[h]:=0; + +@ Here now is the main procedure for finding identifiers (and index +entries). The parameter |t| is set to the desired |ilk| code. The +identifier must either have |ilk=t|, or we must have +|t=normal| and the identifier must be a reserved word. + +@p function id_lookup(@!t:eight_bits):name_pointer; {finds current identifier} +label found; +var i:0..long_buf_size; {index into |buffer|} +@!h:0..hash_size; {hash code} +@!k:0..max_bytes; {index into |byte_mem|} +@!w:0..ww-1; {row of |byte_mem|} +@!l:0..long_buf_size; {length of the given identifier} +@!p:name_pointer; {where the identifier is being sought} +begin l:=id_loc-id_first; {compute the length} +@<Compute the hash code |h|@>; +@<Compute the name location |p|@>; +if p=name_ptr then @<Enter a new name into the table at position |p|@>; +id_lookup:=p; +end; + +@ A simple hash code is used: If the sequence of +ASCII codes is $c_1c_2\ldots c_m$, its hash value will be +$$(2^{n-1}c_1+2^{n-2}c_2+\cdots+c_n)\,\bmod\,|hash_size|.$$ + +@<Compute the hash...@>= +h:=buffer[id_first]; i:=id_first+1; +while i<id_loc do + begin h:=(h+h+buffer[i]) mod hash_size; incr(i); + end +?endgroup % end of verbatim mode +\endgroup +\vfill\eject +\def\runninghead{APPENDIX B --- TRANSLATION BY {\tentt WEAVE}} +\section Appendix B. +This excerpt from \.{WEAVE.TEX} corresponds to Appendix A. + +% I've inserted \vfill's here at the blank lines, to squeeze this on one page! +\begingroup \def\tt{\eighttt} \baselineskip9pt +\verbatim +?vfill?verbatimgobble +\N55. Searching for identifiers. +The hash table described above is updated by the \\{id\_lookup} procedure, +which finds a given identifier and returns a pointer to its index in +\\{byte\_start}. The identifier is supposed to match character by character +and it is also supposed to have a given \\{ilk} code; the same name may be +present more than once if it is supposed to appear in the index with +different typesetting conventions. +If the identifier was not already present, it is inserted into the table. +?vfill?verbatimgobble +Because of the way \.{WEAVE}'s scanning mechanism works, it is most convenient +to let \\{id\_lookup} search for an identifier that is present in the % +\\{buffer} +array. Two other global variables specify its position in the buffer: the +first character is $\\{buffer}[\\{id\_first}]$, and the last is $\\{buffer}[% +\\{id\_loc}-1]$. +?vfill?verbatimgobble +\Y\P$\4\X9:Globals in the outer block\X\mathrel{+}\S$\6 +\4\\{id\_first}: \37$0\to\\{long\_buf\_size}$;\C{where the current identifier +begins in the buffer}\6 +\4\\{id\_loc}: \37$0\to\\{long\_buf\_size}$;\C{just after the current +identifier in the buffer}\7 +\4\\{hash}: \37\&{array} $[0\to\\{hash\_size}]$ \1\&{of}\5 +\\{sixteen\_bits};\C{heads of hash lists}\2\par +\fi +?vfill?verbatimgobble +\M56. Initially all the hash lists are empty. +?vfill?verbatimgobble +\Y\P$\4\X16:Local variables for initialization\X\mathrel{+}\S$\6 +\4\|h: \37$0\to\\{hash\_size}$;\C{index into hash-head array}\par +\fi +?vfill?verbatimgobble +\M57. \P$\X10:Set initial values\X\mathrel{+}\S$\6 +\&{for} $\|h\K0\mathrel{\&{to}}\\{hash\_size}-1$ \1\&{do}\5 +$\\{hash}[\|h]\K0$;\2\par +\fi +?vfill?verbatimgobble +\M58. Here now is the main procedure for finding identifiers (and index +entries). The parameter \|t is set to the desired \\{ilk} code. The +identifier must either have $\\{ilk}=\|t$, or we must have +$\|t=\\{normal}$ and the identifier must be a reserved word. +?vfill?verbatimgobble +\Y\P\4\&{function}\1\ \37$\\{id\_lookup}(\|t:\\{eight\_bits})$: \37\\{name% +\_pointer};\C{finds current identifier}\6 +\4\&{label} \37\\{found};\6 +\4\&{var} \37\|i: \37$0\to\\{long\_buf\_size}$;\C{index into \\{buffer}}\6 +\|h: \37$0\to\\{hash\_size}$;\C{hash code}\6 +\|k: \37$0\to\\{max\_bytes}$;\C{index into \\{byte\_mem}}\6 +\|w: \37$0\to\\{ww}-1$;\C{row of \\{byte\_mem}}\6 +\|l: \37$0\to\\{long\_buf\_size}$;\C{length of the given identifier}\6 +\|p: \37\\{name\_pointer};\C{where the identifier is being sought}\2\6 +\&{begin} \37$\|l\K\\{id\_loc}-\\{id\_first}$;\C{compute the length}\6 +\X59:Compute the hash code \|h\X;\6 +\X60:Compute the name location \|p\X;\6 +\&{if} $\|p=\\{name\_ptr}$ \1\&{then}\5 +\X62:Enter a new name into the table at position \|p\X;\2\6 +$\\{id\_lookup}\K\|p$;\6 +\&{end};\par +\fi +?vfill?verbatimgobble +\M59. A simple hash code is used: If the sequence of +ASCII codes is $c_1c_2\ldots c_m$, its hash value will be +$$(2^{n-1}c_1+2^{n-2}c_2+\cdots+c_n)\,\bmod\,\\{hash\_size}.$$ +?vfill?verbatimgobble +\Y\P$\4\X59:Compute the hash code \|h\X\S$\6 +$\|h\K\\{buffer}[\\{id\_first}]$;\5 +$\|i\K\\{id\_first}+1$;\6 +\&{while} $\|i<\\{id\_loc}$ \1\&{do}\6 +\&{begin} \37$\|h\K(\|h+\|h+\\{buffer}[\|i])\mathbin{\&{mod}}\\{hash\_size}$;\5 +$\\{incr}(\|i)$;\6 +\&{end}\2\par +\U section~58.\fi +?endgroup +\endgroup +\eject +\def\runninghead{APPENDIX C --- TRANSLATION BY {\tentt TANGLE}} +\section Appendix C. +The \.{TANGLE} processor converts \.{WEAVE.WEB} into a syntactically +correct (but not very pretty) \PASCAL\ program \.{WEAVE.PAS}. +The first three and last two lines of output are shown here, together with the +lines of code generated by modules 55--62 and the environments of +those lines. There are 1559 lines in all; the notation +`\.. \\. \\.' stands for portions that are not shown. + +Note that, for example, the code corresponding to +module 55 begins with `\.{\{55:\}}' and ends with `\.{\{:55\}}'; +the code from modules 59--62 has been tangled into the code from module 58. + +\vskip6pt +\verbatim +{2:}{4:}{$C-,A+,D-}{[$C+,D+]}{:4} +PROGRAM WEAVE(WEBFILE,CHANGEFILE,TEXFILE);LABEL 9999;CONST{8:} +MAXBYTES=45000;MAXNAMES=5000;MAXMODULES=2000;HASHSIZE=353;BUFSIZE=100; + . . . +TOKPTR:0..MAXTOKS;{MAXTOKPTR,MAXTXTPTR:0..MAXTOKS;}{:53}{55:} +IDFIRST:0..LONGBUFSIZE;IDLOC:0..LONGBUFSIZE; +HASH:ARRAY[0..HASHSIZE]OF SIXTEENBITS;{:55}{63:}CURNAME:NAMEPOINTER; + . . . +PROCEDURE INITIALIZE;VAR{16:}I:0..127;{:16}{40:}WI:0..1;{:40}{56:} +H:0..HASHSIZE;{:56}{247:}C:ASCIICODE;{:247}BEGIN{10:}HISTORY:=0;{:10} + . . . +TOKPTR:=1;TEXTPTR:=1;TOKSTART[0]:=1;TOKSTART[1]:=1;{MAXTOKPTR:=1; +MAXTXTPTR:=1;}{:54}{57:}FOR H:=0 TO HASHSIZE-1 DO HASH[H]:=0;{:57}{94:} +SCANNINGHEX:=FALSE;{:94}{102:}MODTEXT[0]:=32;{:102}{124:}OUTPTR:=1; + . . . +IF R=0 THEN XREF[P]:=XREFPTR ELSE XMEM[R].XLINKFIELD:=XREFPTR;END;{:51} +{58:}FUNCTION IDLOOKUP(T:EIGHTBITS):NAMEPOINTER;LABEL 31; +VAR I:0..LONGBUFSIZE;H:0..HASHSIZE;K:0..MAXBYTES;W:0..1; +L:0..LONGBUFSIZE;P:NAMEPOINTER;BEGIN L:=IDLOC-IDFIRST;{59:} +H:=BUFFER[IDFIRST];I:=IDFIRST+1; +WHILE I<IDLOC DO BEGIN H:=(H+H+BUFFER[I])MOD HASHSIZE;I:=I+1;END{:59}; +{60:}P:=HASH[H]; +WHILE P<>0 DO BEGIN IF(BYTESTART[P+2]-BYTESTART[P]=L)AND((ILK[P]=T)OR((T +=0)AND(ILK[P]>3)))THEN{61:}BEGIN I:=IDFIRST;K:=BYTESTART[P];W:=P MOD 2; +WHILE(I<IDLOC)AND(BUFFER[I]=BYTEMEM[W,K])DO BEGIN I:=I+1;K:=K+1;END; +IF I=IDLOC THEN GOTO 31;END{:61};P:=LINK[P];END;P:=NAMEPTR; +LINK[P]:=HASH[H];HASH[H]:=P;31:{:60};IF P=NAMEPTR THEN{62:} +BEGIN W:=NAMEPTR MOD 2; +IF BYTEPTR[W]+L>MAXBYTES THEN BEGIN WRITELN(TERMOUT); +WRITE(TERMOUT,'! Sorry, ','byte memory',' capacity exceeded');ERROR; +HISTORY:=3;JUMPOUT;END; +IF NAMEPTR+2>MAXNAMES THEN BEGIN WRITELN(TERMOUT); +WRITE(TERMOUT,'! Sorry, ','name',' capacity exceeded');ERROR;HISTORY:=3; +JUMPOUT;END;I:=IDFIRST;K:=BYTEPTR[W]; +WHILE I<IDLOC DO BEGIN BYTEMEM[W,K]:=BUFFER[I];K:=K+1;I:=I+1;END; +BYTEPTR[W]:=K;BYTESTART[NAMEPTR+2]:=K;NAMEPTR:=NAMEPTR+1;ILK[P]:=T; +XREF[P]:=0;END{:62};IDLOOKUP:=P;END;{:58}{66:} +FUNCTION MODLOOKUP(L:SIXTEENBITS):NAMEPOINTER;LABEL 31;VAR C:0..4; + . . . +WRITE(TERMOUT,'(That was a fatal error, my friend.)');END;END{:263}; +END.{:261} +?endgroup +\vfill\eject +\pageno=197 % take account of the page numbers for App's D and E. +\def\runninghead{APPENDIX F --- MACROS FOR FORMATTING} +\section Appendix F: The \.{webmac.tex} file. +This is the file that extends ``plain \TeX'' format in order to support the +features needed by the output of \.{WEAVE}. + +\vskip6pt +\verbatim +% standard macros for WEB listings (in addition to PLAIN.TEX) +\xdef\fmtversion{\fmtversion+WEBMAC4.0} % identifies current set of macros +\parskip 0pt % no stretch between paragraphs +\parindent 1em % for paragraphs and for the first line of Pascal text + +\font\eightrm=cmr8 \let\sc=\eightrm % NOT 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) + +\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 + +\newbox\bak \setbox\bak=\hbox to -1em{} % backspace one em +\newbox\bakk\setbox\bakk=\hbox to -2em{} % backspace two ems + +\newcount\ind % current indentation in ems +\def\1{\global\advance\ind by1\hangindent\ind em} % indent one more notch +\def\2{\global\advance\ind by-1} % indent one less notch +\def\3#1{\hfil\penalty#10\hfilneg} % optional break within a statement +\def\4{\copy\bak} % backspace one notch +\def\5{\hfil\penalty-1\hfilneg\kern2.5em\copy\bakk\ignorespaces}% optional break +\def\6{\ifmmode\else\par % forced break + \hangindent\ind em\noindent\kern\ind em\copy\bakk\ignorespaces\fi} +\def\7{\Y\6} % forced break and a little extra space + +\let\yskip=\smallskip +\def\to{\mathrel{.\,.}} % double dot, used only in math mode +\def\note#1#2.{\Y\noindent{\hangindent2em\baselineskip10pt\eightrm#1~#2.\par}} +\def\lapstar{\rlap{*}} +\def\startsection{\Q\noindent{\let\*=\lapstar\bf\modstar.\quad}} +\def\defin#1{\global\advance\ind by 2 \1\&{#1 }} % begin `define' or `format' +\def\A{\note{See also section}} % crossref for doubly defined section name +\def\As{\note{See also sections}} % crossref for multiply defined section name +\def\B{\mathopen{\.{@\{}}} % begin controlled comment +\def\C#1{\ifmmode\gdef\XX{\null$\null}\else\gdef\XX{}\fi % Pascal comments + \XX\hfil\penalty-1\hfilneg\quad$\{\,$#1$\,\}$\XX} +\def\D{\defin{define}} % macro definition +\def\E{\cdot10^} % exponent in floating point constant +\def\ET{ and~} % conjunction between two section numbers +\def\ETs{, and~} % conjunction between the last two of several section numbers +\def\F{\defin{format}} % format definition +\let\G=\ge % greater than or equal sign +\def\H#1{\hbox{\rm\char"7D\tt#1}} % hexadecimal constant +\let\I=\ne % unequal sign +\def\J{\.{@\&}} % TANGLE's join operation +\let\K=\gets % left arrow +\let\L=\le % less than or equal sign +\outer\def\M#1.{\MN#1.\ifon\vfil\penalty-100\vfilneg % beginning of section + \vskip12ptminus3pt\startsection\ignorespaces} +\outer\def\N#1.#2.{\MN#1.\vfil\eject % beginning of starred section + \def\rhead{\uppercase{\ignorespaces#2}} % define running headline + \message{*\modno} % progress report + \edef\next{\write\cont{\Z{#2}{\modno}{\the\pageno}}}\next % to contents file + \ifon\startsection{\bf\ignorespaces#2.\quad}\ignorespaces} +\def\MN#1.{\par % common code for \M, \N + {\xdef\modstar{#1}\let\*=\empty\xdef\modno{#1}} + \ifx\modno\modstar \onmaybe \else\ontrue \fi \mark{\modno}} +\def\O#1{\hbox{\rm\char'23\kern-.2em\it#1\/\kern.05em}} % octal constant +\def\P{\rightskip=0pt plus 100pt minus 10pt % go into Pascal mode + \sfcode`;=3000 + \pretolerance 10000 + \hyphenpenalty 10000 \exhyphenpenalty 10000 + \global\ind=2 \1\ \unskip} +\def\Q{\rightskip=0pt % get out of Pascal mode + \sfcode`;=1500 \pretolerance 200 \hyphenpenalty 50 \exhyphenpenalty 50 } +\let\R=\lnot % logical not +\let\S=\equiv % equivalence sign +\def\T{\mathclose{\.{@\}}}} % terminate controlled comment +\def\U{\note{This code is used in section}} % crossref for use of a section +\def\Us{\note{This code is used in sections}} % crossref for uses of a section +\let\V=\lor % logical or +\let\W=\land % logical and +\def\X#1:#2\X{\ifmmode\gdef\XX{\null$\null}\else\gdef\XX{}\fi % section name + \XX$\langle\,$#2{\eightrm\kern.5em#1}$\,\rangle$\XX} +\def\Y{\par\yskip} +\let\Z=\let % now you can \send the control sequence \Z +\def\){\hbox{\.{@\$}}} % sign for string pool check sum +\def\]{\hbox{\.{@\\}}} % sign for forced line break +\def\=#1{\kern2pt\hbox{\vrule\vtop{\vbox{\hrule + \hbox{\strut\kern2pt\.{#1}\kern2pt}} + \hrule}\vrule}\kern2pt} % verbatim string +\let\~=\ignorespaces +\let\*=* + +\def\onmaybe{\let\ifon=\maybe} \let\maybe=\iftrue +\newif\ifon \newif\iftitle \newif\ifpagesaved +\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{\.{WEB} OUTPUT} % this running head is reset by starred sections +\def\title{} % an optional title can be set by the user +\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\contentspagenumber{0} % default page number for table of contents +\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\contentsfile{CONTENTS} % file that gets table of contents info +\def\readcontents{\input CONTENTS} + +\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\ch{\note{The following sections were changed by the change file:} + \let\*=\relax} +\newbox\sbox % saved box preceding the index +\newbox\lbox % lefthand column in the index +\def\inx{\par\vskip6pt plus 1fil % we are beginning the index + \write\cont{} % ensure that the contents file isn't empty + \closeout\cont % the contents information has been fully gathered + \output{\ifpagesaved\normaloutput{\box\sbox}\lheader\rheader\fi + \global\setbox\sbox=\page \global\pagesavedtrue} + \pagesavedfalse \eject % eject the page-so-far and predecessors + \setbox\sbox\vbox{\unvbox\sbox} % take it out of its box + \vsize=\pageheight \advance\vsize by -\ht\sbox % the remaining height + \hsize=.5\pagewidth \advance\hsize by -10pt + % column width for the index (20pt between cols) + \parfillskip 0pt plus .6\hsize % try to avoid almost empty lines + \def\lr{L} % this tells whether the left or right column is next + \output{\if L\lr\global\setbox\lbox=\page \gdef\lr{R} + \else\normaloutput{\vbox to\pageheight{\box\sbox\vss + \hbox to\pagewidth{\box\lbox\hfil\page}}}\lheader\rheader + \global\vsize\pageheight\gdef\lr{L}\global\pagesavedfalse\fi} + \message{Index:} + \parskip 0pt plus .5pt + \outer\def\:##1, {\par\hangindent2em\noindent##1:\kern1em} % index entry + \let\ttentry=\. \def\.##1{\ttentry{##1\kern.2em}} % give \tt a little room + \def\[##1]{$\underline{##1}$} % underlined index item + \rm \rightskip0pt plus 2.5em \tolerance 10000 \let\*=\lapstar + \hyphenpenalty 10000 \parindent0pt} +\def\fin{\par\vfill\eject % this is done when we are ending the index + \ifpagesaved\null\vfill\eject\fi % output a null index column + \if L\lr\else\null\vfill\eject\fi % finish the current page + \parfillskip 0pt plus 1fil + \def\rhead{NAMES OF THE SECTIONS} + \message{Section names:} + \output{\normaloutput\page\lheader\rheader} + \setpage + \def\note##1##2.{\hfil\penalty-1\hfilneg\quad{\eightrm##1 ##2.}} + \linepenalty=10 % try to conserve lines + \def\U{\note{Used in section}} % crossref for use of a section + \def\Us{\note{Used in sections}} % crossref for uses of a section + \def\:{\par\hangindent 2em}\let\*=*\let\.=\ttentry} +\def\con{\par\vfill\eject % finish the section names + \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 +?endgroup +\vfill\eject +\def\runninghead{APPENDIX G --- NOTES ON FORMATTING} +\section Appendix G: How to use \.{WEB} macros. +The macros in \.{webmac} make it possible to produce a variety of formats +without editing the output of \.{WEAVE}, and the purpose of this appendix +is to explain some of the possibilities. + +\def\point#1.{\yskip\indent#1.\quad\ignorespaces} + +\point 1. Three fonts have been declared in addition to the standard fonts of +\.{PLAIN} format: You can say `\.{\{\\sc STUFF\}}' to get {\sc STUFF} +in small caps; and you can select the largish fonts \.{\\titlefont} +and \.{\\ttitlefont} in the title of your document, where \.{\\ttitlefont} +is a typewriter style of type. + +\point 2. When you mention an identifier in \TeX\ text, you normally call +it `\.{|identifier|}'. But you can also say `\.{\\\\\{identifier\}}'. The +output will look the same in both cases, but the second alternative +doesn't put \\{identifier} into the index, since +it bypasses \.{WEAVE}'s translation from \PASCAL\ mode. + +\point 3. To get typewriter-like type, as when referring to `\.{WEB}', you +can use the `\.{\\.}' macro (e.g., `\.{\\.\{WEB\}}'). In the argument to +this macro you should insert an additional backslash before the symbols +listed as `special string characters' in the index to \.{WEAVE}, i.e., +before backslashes and dollar signs and the like. +A `\.{\\\ }' here will result in the visible space symbol; to get an +invisible space following a control sequence you can say `\.{\{\ \}}'. + +\point 4. The three control sequences \.{\\pagewidth}, \.{\\pageheight}, +and \.{\\fullpageheight} can be redefined in the limbo section at the +beginning of your \.{WEB} file, to change the dimensions of each page. +The standard settings +$$\lpile{\.{\\pagewidth=6.5in}\cr + \.{\\pageheight=8.7in}\cr + \.{\\fullpageheight=9in}\cr}$$ +were used to prepare the present report; \.{\\fullpageheight} is +\.{\\pageheight} plus room for the additional heading and page numbers at +the top of each page. If you change any of these quantities, you should +call the macro \.{\\setpage} immediately after making the change. + +\point 5. The \.{\\pageshift} macro defines an amount by which right-hand +pages (i.e., odd-numbered pages) are shifted right with respect to +left-hand (even-numbered) ones. By adjusting this amount you may be +able to get two-sided output in which the page numbers line up on +opposite sides of each sheet. + +\point 6. The \.{\\title} macro will appear at the top of each page +in small caps. For example, Appendix~D was produced after saying +`\.{\\def\\title\{WEAVE\}}'. + +\point 7. The first page usually is assigned page number 1. +To start on page 16, with contents +on page 15, say this: `\.{\\def\\contentspagenumber\{15\}} +\.{\\pageno=\\contentspagenumber} \.{\\advance\\pageno by 1}'. (Appendix~D +was generated that way.) + +\point 8. The macro \.{\\iftitle} will suppress the header line if it is +defined by `\.{\\titletrue}'. The normal value is \.{\\titlefalse} +except for the table of contents; thus, the contents +page is usually unnumbered. + +Two macros are provided to give flexibility to the table of +contents: \.{\\topofcontents} is invoked just before the contents +info is read, and \.{\\botofcontents} is invoked just after. +For example, Appendix~D was produced with the following definitions: +$$\lpile{\.{\\def\\topofcontents\{\\null\\vfill}\cr + \.{ { }\\titlefalse \% include headline on the contents page}\cr + \.{ { }\\def\\rheader\{\\mainfont Appendix D\\hfil 15\}}\cr + \.{ { }\\centerline\{\\titlefont The \{\\ttitlefont WEAVE\}{ }processor\}}\cr + \.{ { }\\vskip 15pt \\centerline\{(Version 4)\}{ }\\vfill\}}\cr}$$ +Redefining \.{\\rheader}, which is the headline for right-hand pages, +suffices in this case to put the desired information at the top of the +contents page. + +\point 9. Data for the table of contents is written to a file that +is read after the indexes have been \TeX ed; there's one line of data +for every starred module. For example, when Appendix~D was being generated, +a file \.{CONTENTS.TEX} containing +$$\lpile{\.{\\Z \{{ }Introduction\}\{1\}\{16\}}\cr + \.{\\Z \{{ }The character set\}\{11\}\{19\}}\cr}$$ +and similar lines was created. The \.{\\topofcontents} macro could +redefine \.{\\Z} so that the information appears in another format. + +\point 10. Sometimes it is necessary or desirable to divide the output of +\.{WEAVE} into subfiles that can be processed separately. For example, +the listing of \TeX\ runs to more than 500 pages, and that is enough to +exceed the capacity of many printing devices and/or their software. +When an extremely large job isn't cut into smaller pieces, the entire +process might be spoiled by a single error of some sort, making it +necessary to start everything over. + +Here's a safe way to break a woven file into three parts: +Say the pieces are $\alpha$, +$\beta$, and $\gamma$, where each piece begins with a starred module. +All macros should be defined in the opening limbo section of $\alpha$, +and copies of this \TeX\ code should be placed at the +beginning of $\beta$ and of $\gamma$. In order to process the parts +separately, we need to take care of two things: The starting page +numbers of $\beta$ and $\gamma$ need to be set up properly, and +the table of contents data from all three runs needs to be +accumulated. + +The \.{webmac} macros include two control sequences \.{\\contentsfile} and +\.{\\readcontents} that facilitate the necessary processing. We include +`\.{\\def\\contentsfile\{CONT1\}}' in the limbo section of $\alpha$, and +we include `\.{\\def\\contentsfile\{CONT2\}}' in the limbo section of +$\beta$; this causes \TeX\ to write the contents data for $\alpha$ and $\beta$ +into \.{CONT1.TEX} and \.{CONT2.TEX}. Now in $\gamma$ we say +$$\.{\\def\\readcontents\{\\input CONT1 \\input CONT2 \\input CONTENTS\}};$$ +this brings in the data from all three pieces, in the proper order. + +However, we still need to solve the page-numbering problem. One way to +do it is to include the following in the limbo material for $\beta$: +$$\lpile{\.{\\message\{Please type the last page number of part 1: \}}\cr + \.{\\read -1 to \\temp \\pageno=\\temp \\advance\\pageno by 1}\cr}$$ +Then you simply provide the necessary data when \TeX\ requests +it; a similar construction is used at the beginning of $\gamma$. + +This method can, of course, be used to divide a woven file into +any number of pieces. + +\point 11. Sometimes it is nice to include things in the index that are +typeset in a special way. For example, we might want to have an +index entry for `\TeX'. \.{WEAVE} provides two simple ways to +typeset an index entry (unless the entry is an identifier or a reserved word): +`\.{@\^}' gives roman type, and `\.{@.}' gives typewriter type. +But if we try to typeset `\TeX' in roman type by saying, e.g., +`\.{@\^\\TeX@>}', the backslash character gets in the way, +and this entry wouldn't appear in the index with the T's. + +The solution is to use the `\.{@:}' feature, declaring a macro that +simply removes a sort key as follows: +$$\.{\\def\\9\#1\{\}}$$ +Now you can say, e.g., `\.{@:TeX\}\{\\TeX@>}' in your \.{WEB} file; \.{WEAVE} +puts it into the index alphabetically, based on the sort key, and +produces the macro call `\.{\\9\{TeX\}\{\\TeX\}}' which will ensure that +the sort key isn't printed. + +A similar idea can be used to insert hidden material into module +names so that they are alphabetized in whatever way you might wish. +Some people call these tricks ``special refinements''; others call +them ``kludges''. + +\point 12. The control sequence \.{\\modno} is set to the number of the +module being typeset. + +\point 13. If you want to list only the modules that have changed, +together with the index, put the command `\.{\\let\\maybe=\\iffalse}' in +the limbo section before the first module of your \.{WEB} file. It's +customary to make this the first change in your change file. + +\point 14. To get output in languages other than English, redefine the +macros \.{\\A}, \.{\\As}, \.{\\ET}, \.{\\ETs}, \.{\\U}, \.{\\Us}, +\.{\\ch}, \.{\\fin}, and \.{\\con}. \.{WEAVE} itself need not be changed. + +\vfill\eject +\def\runninghead{APPENDIX H --- GETTING STARTED} +\section Appendix H: Installing the \.{WEB} system. +Suppose you want to use the \.{WEB} programs on your computer, and suppose +that you can't simply borrow them from somebody else who has the same +kind of machine. Here's what to do: + +\yskip +\def\step(#1){\par\hangindent 2em\noindent\hbox to 2em{\hfil(#1) }\ignorespaces} +\step(1) Get a tape that contains the files \.{WEAVE.WEB}, \.{TANGLE.WEB}, +\.{TANGLE.PAS}, and \.{WEBMAC.TEX}. The tape will probably also contain an +example change file \.{TANGLE.CH}. +\step(2) Look at the sections of \.{TANGLE} that are listed under ``system +dependencies'' in the index of Appendix~E above, and figure out what changes +(if any) will be needed for your system. +\step(3) Make a change file \.{TANGLE.CH} that contains the changes of~(2); +do not change your copy of \.{TANGLE.WEB}, leave it intact. (The +rules for change files are explained at the end of the manual just before +the appendices; you may want to look at the example change file that +arrived with your copy of \.{TANGLE.WEB}. It's also a good idea to +define all the ``switches'' like \&{debug} and \&{gubed} to be null in your +first change files; then you can sure that your compiler will handle +all of the code.) +\step(4) Make the changes of (2) in your copy of \.{TANGLE.PAS}. (If these +changes are extensive, you might be better off finding some computer that +that already has \.{TANGLE} running, and making the new \.{TANGLE.PAS} +from \.{TANGLE.WEB} and your \.{TANGLE.CH}.) +\step(5) Use your \PASCAL\ compiler to convert your copy of \.{TANGLE.PAS} +to a running program \.{TANGLE}. +\step(6) Check your changes as follows: Run \.{TANGLE} on \.{TANGLE.WEB} +and your \.{TANGLE.CH}, yielding $\.{TANGLE.PAS}'$; make a running +program $\.{TANGLE}'$ by applying \PASCAL\ to +$\.{TANGLE.PAS}'$; run $\.{TANGLE}'$ on \.{TANGLE.WEB} and +your \.{TANGLE.CH}, yielding $\.{TANGLE.PAS}''$; and check +that $\.{TANGLE.PAS}''$ is identical to +$\.{TANGLE.PAS}'$. Once this test has been passed, you have got a +working \.{TANGLE} program. +\step(7) Make a change file \.{WEAVE.CH} analogous to (3), but this time +consider the system-dependent parts of \.{WEAVE} that are listed in +the index to Appendix~D. +\step(8) Run \.{TANGLE} on \.{WEAVE.WEB} and your \.{WEAVE.CH}, obtaining +\.{WEAVE.PAS}. +\step(9) Use \PASCAL\ on \.{WEAVE.PAS} to make a running \.{WEAVE} program. +\step(10) Run \.{WEAVE} on \.{TANGLE.WEB} and \.{TANGLE.CH} to produce +\.{TANGLE.TEX}. +\step(11) Run \TeX\ on \.{TANGLE.TEX}, obtaining a listing analogous to +Appendix~E. This listing will incorporate your changes. +\step(12) Run \.{WEAVE} on \.{WEAVE.WEB} and your \.{WEAVE.CH} to produce +\.{WEAVE.TEX}. +\step(13) Run \TeX\ on \.{WEAVE.TEX}, obtaining a listing analogous to +Appendix~D that incorporates your changes. + +\yskip\noindent +This description assumes that you already have a working \TeX82 system. +But what if you don't have \TeX82? Then you start with a tape that also +contains \.{TEX.WEB} and \.{plain.tex}, and you refer to a hardcopy +listing of the \TeX82 program corresponding to \.{TEX.WEB}. Between steps +(10) and (11) you do the following: + +\yskip +\def\substep(10.#1){\par\hangindent 4em\noindent + \hbox to 4em{\hfil(10.#1) }\ignorespaces} +\substep(10.1) Make a change file \.{TEX.CH} to fix the system dependent +portions of \.{TEX.WEB}, in a manner analogous to step~(2). Since \TeX\ is +a much more complex program than \.{WEAVE} or \.{TANGLE}, there are more +system-dependent features to think about, but by now you will be good at +making such modifications. Do not make any changes to \.{TEX.WEB}. +\substep(10.2) Make an almost-copy of your \.{TEX.CH} called \.{INITEX.CH}; +this one will have the `\&{init}' and `\&{tini}' macros redefined in order +to make the initialization version of \TeX. It also might have smaller +font memory and dynamic memory areas, since \.{INITEX} doesn't need as +much memory for such things; by setting the memory smaller in \.{INITEX}, +you guarantee that the production system will have a ``cushion.'' +\substep(10.3) Run \.{TANGLE} on \.{TEX.WEB} and \.{INITEX.CH}, obtaining +\.{INITEX.PAS} and \.{TEX.POOL}. +\substep(10.4) Run \PASCAL\ on \.{INITEX.PAS}, obtaining \.{INITEX}. +\substep(10.5) Run \.{INITEX} on \.{TEX.POOL}, during which run you type +`\.{plain}' and `\.{\\dump}'. This will produce a file \.{plain.fmt} +containing the data needed to initialize \TeX's memory. +\substep(10.6) Run \.{TANGLE} on \.{TEX.WEB} and the \.{TEX.CH} of (10.1), +obtaining \.{TEX.PAS}. +\substep(10.7) Run \PASCAL\ on \.{TEX.PAS}, obtaining \.{VIRTEX}. +\substep(10.8) If your operating system supports programs whose core images +have been saved, run \.{VIRTEX}, type `\.{\&plain}', then save the core image +and call it \TeX. Otherwise, \.{VIRTEX} will be your \TeX, and it will +read `\.{plain.fmt}' (or some other \.{fmt} file) each time you run. + +\yskip +This 21-step process may seem long, but it is actually an oversimplification, +since you also need fonts and a way to print the device-independent files +that \TeX\ spews out. On the other hand, the total number of steps is not +quite so large when you consider that \.{TANGLE}-followed-by-\PASCAL\ and +\.{WEAVE}-followed-by-\TeX\ may be regarded as single operations. + +If you have only the present report, not a tape, you will have to prepare +files \.{WEAVE.WEB} and \.{TANGLE.WEB} by hand, typing them into the +computer by following Appendices D and E. Then you have to simulate the +behavior of \.{TANGLE} by converting \.{TANGLE.WEB} manually into +\.{TANGLE.PAS}; with a good text editor this takes about six hours. Then +you have to correct errors that were made in all this hand work; but still +the whole project is not impossibly difficult, because in fact the entire +development of \.{WEAVE} and \.{TANGLE} (including the writing of the +programs and this manual) took less than two months of work. +\vfill\end |