Bugs in Computers & Typesetting as of 26 Mar 1995 1

This is a list of all corrections made to Computers & Typesetting since the publication of the final printed versions of those books. Corrections made to the softcover version of The TEXbook are the same as corrections to Volume A. Corrections to the softcover version of The book are the same as corrections to Volume C. 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.

Page A31, line 8 (3/6/95)

TEX begins its error messages with ‘!’, and it shows what it was reading at the

Page A46, line 8 (1/22/95)

out for the occasional times when the adjacent characters aa, ae, and o/ should not be

Page A331, bottom two lines (6/25/93)

if you know that the enclosing box is sufficiently small; and \leaders\vrule\vfill works fine in vertical mode.

Page A354, lines 19–22 (3/5/95)

\def\sett@b{\ifx\next\+\def\nxt{\afterassignment\s@tt@b\let\nxt}%
  \else\let\nxt=\s@tcols\fi
  \let\next=\relax \nxt} % turn off \outerness
\def\s@tt@b{\let\nxt=\relax \us@false\m@ketabbox}

Page A356, lines 13–20 from the bottom (3/5/95)

\def\oalign#1{\leavevmode\vtop{\baselineskip0pt \lineskip.25ex
  \ialign{##\crcr#1\crcr}}} \def\o@lign{\lineskiplimit=0pt \oalign}
\def\ooalign{\lineskiplimit=-\maxdimen \oalign} % chars over each other
\def\sh@ft#1{\dimen0=.00#1ex \multiply\dimen0 by\fontdimen1\font
  \kern-.0156\dimen0} % compensate for slant in lowered accents
\def\d#1{{\o@lign{\relax#1\crcr\hidewidth\sh@ft{10}.\hidewidth}}}
\def\b#1{{\o@lign{\relax#1\crcr\hidewidth\sh@ft{29}%
    \vbox to.2ex{\hbox{\char'26}\vss}\hidewidth}}}

Page A357, lines 7–12 (3/7/95)

\def\rightarrowfill{$\m@th \smash- \mkern-6mu
  \cleaders\hbox{$\mkern-2mu \smash- \mkern-2mu$}\hfill
  \mkern-6mu \mathord\rightarrow$}
\def\leftarrowfill{$\m@th \mathord\leftarrow \mkern-6mu
  \cleaders\hbox{$\mkern-2mu \smash- \mkern-2mu$}\hfill
  \mkern-6mu \smash-$}

Page A357, lines 16–20 (6/25/93)

  \setbox0=\hbox{$\braceld$}%
  \bracelu\leaders\vrule height\ht0 depth0pt\hfill\bracerd
  \braceld\leaders\vrule height\ht0 depth0pt\hfill\braceru$}
\def\downbracefill{$\m@th
  \setbox0=\hbox{$\braceld$}%
  \braceld\leaders\vrule height\ht0 depth0pt\hfill\braceru
  \bracelu\leaders\vrule height\ht0 depth0pt\hfill\bracerd$}

[Also delete lines 21 and 22, as the usage is no longer restricted.]

Page A359, line 25 (3/5/95)

\def\skew#1#2#3{{\muskip0=#1mu \mkern.5\muskip0
    #2{\mkern-.5\muskip0{#3}\mkern.5\muskip0}\mkern-.5\muskip0}{}}

Page A360, line 5 from the bottom (3/5/95)

\def\@vereq#1#2{\lower.5pt\vbox{\lineskiplimit\maxdimen \lineskip-.5pt

Page A361, lines 19 and 20 (3/5/95)

\def\bmod{\nonscript\mskip-\medmuskip \mkern5mu
  \mathbin{\rm mod} \penalty900 \mkern5mu \nonscript\mskip-\medmuskip}

Page A362, lines 14–18 (3/5/95)

  \everycr{\noalign{\ifdt@p \global\dt@pfalse \ifdim\prevdepth>-1000pt
      \vskip-\lineskiplimit \vskip\normallineskiplimit \fi
      \else \penalty\interdisplaylinepenalty \fi}}}
\def\@lign{\tabskip=0pt\everycr={}} % restore inside \displ@y
\def\displaylines#1{\displ@y \tabskip=0pt

Page A363, lines 8–9 from the bottom (12/8/89)

  \if@mid \dimen@=\ht0 \advance\dimen@ by\dp\z@ \advance\dimen@ by12\p@
    \advance\dimen@ by\pagetotal \advance\dimen@ by-\pageshrink

Page A364, line 5 from the bottom (3/4/95)

\def\fmtname{plain}
\def\fmtversion{3.14159} % identifies the current format

Page A374, line 3 (3/7/95)

        \begingroup\aftergroup\def\aftergroup\asts\aftergroup{

Page A451, line 16 (8/8/93)

But when plain TEX is tried on the name of a famous Welsh village,

Page A462, right column (3/5/95)

\cong ( ≅ ), 151, \underline{360}, 436.

Page A463, right column (6/25/93)

direct sum, see \oplus.

Page A464, left column (6/25/93)

\downbracefill ( ), 225–226, \underline{357}.

Page B2, line −10 (3/8/95)

define banner ≡ ´ This␣is␣TeX,␣Version␣3.14159´ { printed when TEX starts }

Page B221, line 9 (3/4/95)

define non address = 0 { a spurious bchar label }

Page B221, line 17 (3/4/95)

font params : array[internal font number ] of font index ; { how many font parameters are present }

Page B256, insert new line 12 before the bottom (3/7/95)

glue temp: real ; { glue value before rounding }

Page B258, line 11 before the bottom becomes four lines (3/7/95)

625. define vet glue(#) ≡ glue temp ← #; if glue temp > float constant (1000000000) then glue temp ← float constant (1000000000) else if glue temp < −float constant (1000000000) then glue temp ← −float constant (1000000000)

⟨ Move right or output leaders 625 ⟩ ≡

Page B258, lines 3–6 from the bottom (3/7/95)

begin vet glue(float (glue set (this box )) ∗ stretch (g)); rule wd ← rule wd + round (glue temp); end;

end else if shrink order (g) = g order then

begin vet glue(float (glue set (this box )) ∗ shrink (g)); rule wd ← rule wd − round (glue temp);

Page B260, line 13 from the bottom (6/26/93)

doing leaders ← outer doing leaders ; dvi v ← save v ; dvi h ← save h ; cur v ← base line;

Page B261, insert new line after line 7 (3/7/95)

glue temp: real ; { glue value before rounding }

Page B262, lines 3–6 from the bottom (3/7/95)

begin vet glue(float (glue set (this box )) ∗ stretch (g)); rule ht ← rule ht + round (glue temp); end;

end else if shrink order (g) = g order then

begin vet glue(float (glue set (this box )) ∗ shrink (g)); rule ht ← rule ht − round (glue temp);

Page B264, line 22 (6/26/93)

doing leaders ← outer doing leaders ; dvi v ← save v ; dvi h ← save h ; cur h ← left edge;

Page B297, line 11 (3/7/95)

width (p) ← mu mult (width (p)); subtype(p) ← explicit ;

Page B356, line −5 (3/4/95)

hang after = 1, and hang indent = 0. Note that if hang indent = 0, the value of hang after is

Page B388, bottom line (3/4/95)

if bchar label [hf ] ≠ non address then { put left boundary at beginning of new line }

Page B503, line 12 (3/4/95)

of the following procedure. (Exception: The tabskip glue isn’t trapped while preambles are being scanned.)

Page B529, line 12 (3/4/95)

undump(0)(fmem ptr − 1)(bchar label [k]); undump(min quarterword )(non char )(font bchar [k]);

Page B534, insert new material between lines −16 and −15 (3/20/95)

while input ptr > 0 do if state = token list then end token list else end file reading ;

Page B534, line −2 (3/20/95)

temp ptr ← cond ptr ; cond ptr ← link (cond ptr ); free node(temp ptr , if node size);

Page B535, line 9 (3/20/95)

begin init for c ← top mark code to split bot mark code do

if cur mark [c] ≠ null then delete token ref (cur mark [c]); store fmt file; return; tini

Page C94, line −11 (3/4/95)

put are assumed to have square pixels. But if, for example, the mode def sets

Page C107, line 15 (3/4/95)

labels(1a, 1b, 2a, 2b, 3a, 3b, 4a, 4b, range 1 thru 36); endchar.

Page C129, lines 12–16 (3/6/95)

⟨path tertiary⟩ ⟶ ⟨path secondary⟩ | ⟨pair tertiary⟩

⟨path expression⟩ ⟶ ⟨path subexpression⟩ | ⟨path subexpression⟩⟨direction specifier⟩ | ⟨path subexpression⟩⟨path join⟩ cycle

⟨path subexpression⟩ ⟶ ⟨path tertiary⟩

Page C134, line 8 (3/4/95)

of p; if t ≤ 0, precontrol t of p is z_{0}. In particular, if t is an integer, postcontrol t of p

Page C143, top two lines (3/4/95)

In order to have some transform variables to work with, it’s necessary to ‘hide’ some declarations and commands before giving the next exprs:

Page C206, minor changes to lines −19 to −5 (3/4/95)

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)
 ..(20.46255,9.94655)..controls (20.46255,14.99713) and (16.23842,19.00049)
 ..(11.13652,19.00049)..controls (5.77066,19.00049) and (1.53745,14.48491)
 ..cycle
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'

… 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

Page C207, minor changes to lines 1–23 (3/4/95)

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'

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 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^{∘} transition point will occur at what thinks is a good spot:

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'

(Notice that 4.78537 + 2.71463 = 7.50000; when the slope is −1 at a transition point

Page C213, lines 25–26 (3/6/95)

⟨path tertiary⟩ ⟶ ⟨path secondary⟩ | ⟨pair tertiary⟩ ⟨path subexpression⟩ ⟶ ⟨path tertiary⟩

Page C257, large display on line 5 (3/4/95)

\begin{cases}boolean \\ numeric \\ pair \\ path \\ pen \\ picture \\ string \\ transform \end{cases}\} ⟨expression⟩; \begin{cases}⟨boolean⟩ \\ ⟨numeric⟩ \\ ⟨pair⟩ \\ ⟨string⟩ \\ ⟨transform⟩ \end{cases}\} \begin{cases}< \\ <= \\ = \\ <> \\ >= \\ > \end{cases}\} \begin{cases}⟨boolean⟩ \\ ⟨numeric⟩ \\ ⟨pair⟩ \\ ⟨string⟩ \\ ⟨transform⟩ \end{cases}\};

Page C346, and throughout the index (3/7/95)

(Many index entries for rules of syntax in chapters 25–26 should have been underlined)

Page C355, right column (3/7/95)

rt, 23, 77, 80, 103, 147, 151, \underline{273}.

Page D2, line −17 (3/8/95)

define banner ≡ ´ This␣is␣METAFONT,␣Version␣2.718´  { printed when  starts }

Page D138, line 14 from the bottom (3/6/95) 2′) Let Z_{k}^{(j+1)} = \frac{1}{2}(Z_{k}^{(j)} + Z_{k+1}^{(j)}), for 1 ≤ k ≤ n − j, for 1 ≤ j < n.

Page D190, D191, D194, D195 (3/8/95) ( bug 560 introduced extensive changes to the code on these four pages)

Page D289, lines 9 and 10 (3/8/95)

p ← dep list (p); r ← inf val ;

repeat if value(info(p)) ≥ value(r) then

Page D363, lines 10 and 11 (3/1/95)

begin if (max c[dependent ] div ´ 10000 ≥ max c[proto dependent ]) then t ← dependent

Page D518, insert new material between lines 7 and 8 (3/20/95)

while input ptr > 0 do

if token state then end token list else end file reading ; while loop ptr ≠ null do stop iteration ;

Page D518, line 18 (3/20/95)

loop ptr ← cond ptr ; cond ptr ← link (cond ptr ); free node(loop ptr , if node size);

Page E95, line 8 from the bottom (3/6/95)

cmchar "Extensible vertical arrow--extension module";

Page E97, line 8 from the bottom (3/6/95)

cmchar "Extensible double vertical arrow--extension module";

Page E113, line 9 (3/6/95)

x_{5} = .5[x_{4}, x_{6}]; x_{4} − x_{6} = 1.2u; lft x_{5r} = hround(.5w − .5curve);

Page E113, line 10 from the bottom (3/6/95)

x_{5} = .5[x_{4}, x_{6}]; x_{4} − x_{6} = 1.2u; lft x_{5r} = hround(.5w − .5max size);

Page E115, line 9 (3/6/95)

x_{5} = .5[x_{4}, x_{6}]; x_{4} − x_{6} = 1.2u; lft x_{5r} = hround(.5w − .5curve);

Page E115, line 12 from the bottom (3/6/95)

x_{5} = .5[x_{4}, x_{6}]; x_{4} − x_{6} = 1.2u; lft x_{5r} = hround(.5w − .5max size);

Page E187, line 9 (3/6/95)

lft x_{1l} = lft x_{2l} = hround(.5w − .5shaved stem ); top y_{1} = h; bot y_{2} = 0;

Page E189, line 8 (3/6/95)

lft x_{1l} = lft x_{2l} = hround(.5w − .5shaved stem ); top y_{1} = h; bot y_{2} = 0;

Page E233, line 21 (3/6/95)

path p; {{interim superness := more super ; p = pulled super arc_{l}(3, 4)(pull )}};

Page E239, line 7 from the bottom (3/6/95)

lft x_{6r} = hround u; x_{7} = 3u; x_{8} = w − 3.5u; rt x_{9l} = hround(w − u);

Page E291, line 18 (3/6/95)

x_{4} = ^{1}/_{3}[x_{5}, x_{3l}]; z_{4} = z_{5} + whatever ∗ (15u, .1h);

Page E389, bottom two lines (3/6/95)

numeric a , b , c ; b = b/y; c = c/y; a = a ∗ a − b ∗ b ; (a ∗ (c ++ sqrt a ) − b ∗ c )/a enddef;

Page E483, lines 12–14 from the bottom (3/6/95)

beginarithchar(oct "004"); pickup fine.nib; pickup rule.nib; numeric del ; del = dot size − currentbreadth ; x_{3} − .5del = good .x(.5w − .5del ); center on (x_{3}); y_{3} + .5del = good .y(math axis + math spread [.5x height , .6x height ] + .5del );

Page E491, line 3 from the bottom (3/6/95)

spread := 2ceiling(spread^{#} ∗ hppp/2) + eps ; enddef;

Page E574, left column (3/6/95)

currentbreadth , 483, \underline{545}, 546.