summaryrefslogtreecommitdiff
path: root/systems/knuth
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2021-02-10 03:01:13 +0000
committerNorbert Preining <norbert@preining.info>2021-02-10 03:01:13 +0000
commit7428e668f046bec10d1200214789e40390fa51e7 (patch)
treed28de61e9d3ed96c80ebf2300d0ba3d6a76414e6 /systems/knuth
parent1350502b809c028b8f123dec94ca92782eda564f (diff)
CTAN sync 202102100301
Diffstat (limited to 'systems/knuth')
-rw-r--r--systems/knuth/dist/errata/errata.nine2
-rw-r--r--systems/knuth/dist/errata/errata.tex2474
-rw-r--r--systems/knuth/dist/errata/errata.three2
-rw-r--r--systems/knuth/dist/errata/errata.twelve1709
-rw-r--r--systems/knuth/dist/errata/errorlog.tex25
-rw-r--r--systems/knuth/dist/errata/mf84.bug109
-rw-r--r--systems/knuth/dist/errata/tex82.bug180
-rw-r--r--systems/knuth/dist/etc/vftovp.web4
-rw-r--r--systems/knuth/dist/etc/vptovf.web8
-rw-r--r--systems/knuth/dist/lib/grayf.mf2
-rw-r--r--systems/knuth/dist/lib/plain.tex6
-rw-r--r--systems/knuth/dist/lib/slant.mf4
-rw-r--r--systems/knuth/dist/lib/webmac.tex22
-rw-r--r--systems/knuth/dist/mf/mf.web139
-rw-r--r--systems/knuth/dist/mf/mfbook.tex755
-rw-r--r--systems/knuth/dist/mf/trap.72270gfbin0 -> 1028 bytes
-rw-r--r--systems/knuth/dist/mf/trap.fot4
-rw-r--r--systems/knuth/dist/mf/trap.log90
-rwxr-xr-x[-rw-r--r--]systems/knuth/dist/mf/trap.pl0
-rw-r--r--systems/knuth/dist/mf/trap.typ2
-rw-r--r--systems/knuth/dist/mf/trapin.fot78
-rw-r--r--systems/knuth/dist/mf/trapin.log8
-rw-r--r--systems/knuth/dist/mfware/gftodvi.web4
-rw-r--r--systems/knuth/dist/mfware/gftopk.web18
-rw-r--r--systems/knuth/dist/mfware/gftype.web4
-rw-r--r--systems/knuth/dist/mfware/mft.web22
-rw-r--r--systems/knuth/dist/tex/glue.web2
-rw-r--r--systems/knuth/dist/tex/tex.web213
-rw-r--r--systems/knuth/dist/tex/texbook.tex393
-rw-r--r--systems/knuth/dist/tex/trip.dvibin0 -> 2920 bytes
-rw-r--r--systems/knuth/dist/tex/trip.fot2
-rw-r--r--systems/knuth/dist/tex/trip.log16
-rw-r--r--systems/knuth/dist/tex/trip.tex2
-rw-r--r--systems/knuth/dist/tex/trip.typ2
-rw-r--r--systems/knuth/dist/tex/tripin.fot89
-rw-r--r--systems/knuth/dist/tex/tripin.log6
-rw-r--r--systems/knuth/dist/texware/dvitype.web6
-rw-r--r--systems/knuth/dist/texware/pltotf.web10
-rw-r--r--systems/knuth/dist/texware/pooltype.web8
-rw-r--r--systems/knuth/dist/texware/tftopl.web4
-rw-r--r--systems/knuth/dist/web/tangle.web35
-rw-r--r--systems/knuth/dist/web/weave.web33
-rw-r--r--systems/knuth/dist/web/webman.tex10
43 files changed, 4448 insertions, 2054 deletions
diff --git a/systems/knuth/dist/errata/errata.nine b/systems/knuth/dist/errata/errata.nine
index fe9a20adad..f562cb0bd8 100644
--- a/systems/knuth/dist/errata/errata.nine
+++ b/systems/knuth/dist/errata/errata.nine
@@ -215,7 +215,7 @@ direct sum, {\sl see\/} |\oplus|.
\eightpoint
|\downbracefill| (\hbox to 4em{\downbracefill}), 225--226, $\underline{357}$.
-\bugonpage A483, lines 15--21 (4/29/97)
+\bugonpage A483, lines 15--21 (4/29/96)
\tenpoint
\begintt
diff --git a/systems/knuth/dist/errata/errata.tex b/systems/knuth/dist/errata/errata.tex
index c53b83902b..3a0d367f0c 100644
--- a/systems/knuth/dist/errata/errata.tex
+++ b/systems/knuth/dist/errata/errata.tex
@@ -1,5 +1,6 @@
% Bugs (sigh) in Computers \& Typesetting --- the most recent errata
+\tracingpages=1
\input manmac
\def\.#1{\hbox{\tt#1}}
\font\sltt=cmsltt10
@@ -34,11 +35,12 @@
\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.)
+\& Typesetting\/} since the beginning of 2014.
+(More precisely, it lists errors corrected
+since the 19th printing of Volume~A, the 9th printing
+of Volume~B, the 8th printing of Volume~C, the 6th printing of Volume~D,
+and the 7th printing of Volume~E. % 2012 for A-D, 2013 for E
+But it omits changes that are ``purely cosmetic.'')
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
@@ -51,1650 +53,1750 @@ errors have been corrected in the most recent printings.
% 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 A153, line 7 (01/03/14)
-
-\ninepoint\noindent
-of three fonts: one for text size, one for
-script size, and one for scriptscript size. The\cutpar
-
-\bugonpage A206, lines 12--17 (05/21/07)
+\bugonpage A34, line 3 from the bottom (01/09/20)
\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.
+not, you can say
+`\.{I\char`\\errorcontextlines=100} \.{\char`\\oops}' and try again. \ (That
+will usually\cutpar
+\bugonpage A43, line 6 (07/24/14)
-\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
+\tenpoint\noindent
+keyboard, or that have been
+pre\"empted for formatting?
-\bugonpage A292, line 15 (12/02/02)
+\bugonpage A49, cummings quote (08/03/19)
-\ninepoint\noindent
-are defined as in the
-second alternative of a \<math field>, are
-recorded in a ``choice\cutpar
+(delete the period at the end of the line)
-\bugonpage A308, lines 25 and 26 (06/17/02)
+\bugonpage A66, line 3 from the bottom (08/26/17)
\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)
+Such displays of box contents will be discussed further in
+Chapters 12 and~27.\cutpar
+
+\bugonpage A105, lines 9--16 (01/16/21)
+
+\ddanger If you say \.{\char`\\vadjust\char`\{}$\langle\,$vertical
+mode material$\,\rangle$\.{\char`\}} within a
+paragraph, \TeX\ will use internal vertical mode to insert the specified
+material into the vertical
+list that encloses the paragraph, immediately after whatever line
+contained the position of the \.{\char`\\vadjust}. For example, you can say
+`\.{\char`\\vadjust\char`\{\char`\\kern1pt\char`\}}'
+to increase the amount of space between lines of a
+paragraph if those lines would otherwise come out too close together. \ (The
+\vadjust{\kern1pt}author
+did that in the current line, just to illustrate what happens.) \ Also,
+if you want to make sure that a page break will occur immediately after a
+certain line, you can say `\.{\char`\\vadjust\char`\{\char`\\eject\char`\}}'
+anywhere in that line.
+
+\bugonpage A122, lines 3--8 (11/24/19)
+
+\ninepoint\noindent
+\.{\char`\\count255}, \.{\char`\\dimen255}, \.{\char`\\skip255},
+\.{\char`\\muskip255}, and \.{\char`\\toks255} are
+traditionally kept available for such purposes. Furthermore, plain \TeX\
+reserves \.{\char`\\dimen0} to \.{\char`\\dimen9},
+\.{\char`\\skip0} to \.{\char`\\skip9}, \.{\char`\\muskip0} to
+\.{\char`\\muskip9}, and \.{\char`\\box0} to \.{\char`\\box9}
+for ``scratchwork''; these registers
+are never allocated by the \.{\char`\\new...}\null\ operations. We have seen that
+\.{\char`\\count0} through \.{\char`\\count9} are special,
+and \.{\char`\\box255} also turns out to
+be special; so those registers should be avoided unless you know what you
+are doing.
+
+\bugonpage A155, line 8 from the bottom (01/17/21)
\ninepoint\indent
-| \leavevmode\copy0\kern-\wd0\makelightbox}|
+\.{\char`\\mathopen\char`\{\char`\\hbox\char`\{\char`\$\char`\\left\char`\#1}%
+$\langle\,$strut$\,\rangle$\.{\char`\\right.\char`\$\char`\}\char`\}}
-\bugonpage A318, lines 24 and 25 (10/01/03)
+\bugonpage A155, the bottom six lines (12/10/18)
\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
+dividual symbols; \.{\char`\\left}$\,\ldots\,$\.{\char`\\right}
+constructions are treated as ``inner'' subformulas, which means that
+they will be surrounded by additional space in certain circumstances.
+All other subformulas are generally treated as ordinary symbols,
+whether they are formed by \.{\char`\\overline} or
+\.{\char`\\hbox} or \.{\char`\\vcenter} or
+by simply being enclosed in braces. Thus, \.{\char`\\mathord} isn't really
+a necessary part of the \TeX\ language; instead of typing
+`\.{\char`\$1\char`\\mathord,234\char`\$}' you can get the same
+effect from `\.{\char`\$1\char`\{,\char`\}234\char`\$}'.
-\bugonpage A364, lines 12--15 from the bottom (02/29/08)
+\bugonpage A158, line 19 (12/10/18)
-\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}|
+\ninepoint\indent
+Inner\quad is an inner atom produced by
+ `\.{\char`\\left}$\,\ldots\,$\.{\char`\\right}';
-\bugonpage A364, line 5 from the bottom (02/29/08)
+\bugonpage A170, lines 18 and 19 (12/10/18)
\ninepoint\noindent
-|\def\fmtversion{3.141592653} % identifies the current format|
+subformulas delimited by \.{\char`\\left} and \.{\char`\\right}
+are treated as type~Inner. The following table is
+used to determine the spacing between pairs of adjacent atoms:
-\bugonpage A373, lines 4 and 5 from the bottom (01/02/14)
+\bugonpage A171, line 19 from the bottom (06/15/19)
\ninepoint\noindent
-And here's another solution (which may be faster, because
-token list registers can be expanded more quickly than macros
-on some implementations, using |\the|):
-
-\bugonpage A373, line 2 from the bottom (01/02/14)
+formula produces a result essentially equivalent to
+`\.{\char`\\left(}$\langle\,$subformula$\,\rangle$\.{\char`\\right)}',
+when\cutpar
-\ninepoint\indent
-|\loop \ifnum\m>0 \t=\expandafter{\the\t*}\advance\m-1 \repeat|
-
-\bugonpage A399, line 18, through what used to be page A400, line 14 (02/26/08)
+\bugonpage A215, line 16 from the bottom becomes two lines (10/13/20)
\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 A418, line 8 from the bottom (12/13/11)
-
-\ninepoint\noindent\beginlines
-| \def\\{#3} \advance\hsize by -18mm|
-\endlines
-
-\bugonpage A418, line 3 from the bottom (12/13/11)
-
-\ninepoint\noindent\beginlines
-| \halign{\line{\titlefont\hss##}\\#4\unskip\\}|
-\endlines
-
-\bugonpage A442, lines 7 and 8 from the bottom (01/03/14)
-
-\def\rule#1.{\smallskip\textindent{\bf#1.}\ignorespaces}
-\ninepoint\textindent{\bf 3.}%
-If the current item is a style change, set $C$ to the specified
-style and move on to the next item.
-
-\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|.
+\item\bull Just after a token such as \.{\char`\$}$_3$
+that begins math mode, to see if
+another token of category 3 follows.
-\bugonpage A461, left column (02/24/08)
+\bugonpage A222, lines 21--23 (01/16/21)
-\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)
+\ninepoint
+\halign{\indent#\hfil&\quad(see Chapter #)\hfil\cr
+\.{\char`\\hbox}$\langle\,$box specification$\,\rangle$%
+ \.{\char`\{}$\langle\,$horizontal mode material$\,\rangle$\.{\char`\}}&12\cr
+\.{\char`\\vbox}$\langle\,$box specification$\,\rangle$%
+ \.{\char`\{}$\langle\,$vertical mode material$\,\rangle$\.{\char`\}}&12\cr
+\.{\char`\\vtop}$\langle\,$box specification$\,\rangle$%
+ \.{\char`\{}$\langle\,$vertical mode material$\,\rangle$\.{\char`\}}&12\cr
+}
-\eightpoint\noindent
-Kastrup, David Friedrich, 399.
+\bugonpage A222, lines 11--13 from the bottom (01/16/21)
-\bugonpage A470, left column (01/21/03)
+\ninepoint\noindent
+ter~15. The \.{\char`\\vsplit} operation
+is also explained in Chapter~15. In math modes an additional
+type of box is available:
+\.{\char`\\vcenter}$\langle\,$box specification$\,\rangle$%
+ \.{\char`\{}$\langle\,$vertical mode material$\,\rangle$\.{\char`\}}
+(see Chapter~17).
-\eightpoint\noindent
-|\loggingall|, $\underline{364}$.
+\bugonpage A232, line 14 (01/10/21)
-\bugonpage A477, right column (06/08/07)
+\ninepoint\noindent
+tabs outside; `\.{\char`\\global\char`\\settabs}' will not do what
+you might think it should.
-\eightpoint\noindent
-\llap{*}|\spaceskip|, 76, 274, {\it317}, {\it356}, {\it416}, 429.
+\bugonpage A233, lines 3--5 (04/27/15)
-\bugonpage A479, right column (09/11/07)
+\tenpoint\noindent
+Only two tabs are set in this case, because only two \.{\char`\&}'s
+appear in the sample line. \ (A sample line usually
+ends with~\.{\char`\&\char`\\cr}, as it does here,
+because text material between the last tab and \.{\char`\\cr}
+isn't used for anything.)
-\eightpoint\noindent
-|\undefined|, 350, 384.
+\bugonpage A252, lines 5--7 (12/25/20)
-\bugonpage A483, line 5 from the bottom (11/18/03)
+\ninepoint\noindent
+blank, and
+the footline is normally a centered page number, but you can specify any
+headline and footline that you want by changing the token lists
+\.{\char`\\headline} and \.{\char`\\footline}. For example,
-\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)}
+\bugonpage A253, lines 7--9 from the bottom (10/27/20)
- % volume B
-\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers
-\def\to{\mathrel{.\,.}} % double dot, used only in math mode
+\ninepoint\indent
+\.{\char`\\everypar} or \.{\char`\\errhelp}, except that \TeX\
+retains the begin-group symbol~`\.{\char`\{}' at the beginning
+and the end-group symbol~`\.{\char`\}}' at the end. These
+grouping characters
+help to keep the output routine from interfering with what
+\TeX\ was doing\cutpar
-\bugonpage Bv, page number change (12/27/11)
+\bugonpage A256, line 19 (08/28/15)
-\eightpoint\noindent[For consistency with Volumes A, C, and E, the
-preface now begins on page v instead of page~vii. This change was first
-made in the ninth printing.]
+\ninepoint\indent
+\tt \char`\\baselineskip=24pt \char`\\lineskiplimit=0pt
-\bugonpage Bv {(formerly Bvii)}, bottom two lines (01/06/14)
+\bugonpage A277, lines 9 and 10 from the bottom (08/26/17)
-\eightpoint\noindent
-all of those changes.
-I~now believe that the final bug was discovered on 14 September 2008
-and removed in version 3.14159265.
-The finder's fee has converged to \$327.68.
+\ninepoint\indent
+$\langle\,$hyphenation assignment$\,\rangle$\is
+ \.{\char`\\hyphenation}$\langle\,$filler$\,\rangle$%
+ \.{\char`\{}$\langle\,$hyphenations$\,\rangle$\.{\char`\}}\par
+\qquad \alt \.{\char`\\patterns}$\langle\,$filler$\,\rangle$%
+ \.{\char`\{}$\langle\,$patterns$\,\rangle$\.{\char`\}}
-\bugonpage Bxiii {(formerly Bxv)}, line $-7$ (12/27/11)
+\bugonpage A286, bottom two lines {(and affecting the top lines
+of page 287)} (08/26/17)
\ninepoint\noindent
-Format specs have no effect on the corresponding Pascal program, but they
-do influence\cutpar
+stands for zero or more \<assignment>
+commands other than \.{\char`\\setbox}, possibly with \<filler>.
+If the assignments are not followed by a \<character>, where
+\<character> stands\cutpar
-\hsize=35pc
+\bugonpage A287, lines 11--17 (04/22/20)
-\bugonpage B2, line 10 from the bottom (01/02/14)
+\ninepoint
+\textindent{$\bull$} \.{\char`\\discretionary}%
+ \<disc text>\<disc text>\<disc text>.\enskip
+A \<disc text> has the form
+`\<filler>\.{\char`\{}\<horizontal mode material>\.{\char`\}}',
+where the material is processed in restricted horizontal mode and
+should contain only fixed-width things.
+More precisely, the horizontal list formed by each
+\<disc text> must consist only of characters, ligatures,
+kerns, boxes, and rules; there should be no glue or penalty items, etc.
+This command appends a discretionary item to the current list; see
+Chapter~14 for the meaning of a discretionary item. The space factor is
+not changed.
+
+\bugonpage A292, lines 8--10 (04/22/20)
-\ninepoint\noindent\hskip10pt
-{\bf define} $\\{banner}\equiv\hbox{\tt\char'23}$%
-{\tt This\]is\]TeX,\]Version\]3.14159265\char'23}\quad
-$\{\,$printed when \TeX\ starts$\,\}$
+\ninepoint
+\textindent{$\bull$} \.{\char`\\discretionary}%
+ \<disc text>\<disc text>\<disc text>.\enskip
+This command has the same effect as in horizontal mode (see Chapter~25), but the
+third \<disc text> must produce an empty list.
-\bugonpage B3, new paragraph to follow line 9 (12/20/02)
+\bugonpage A299, line 11 from the bottom (11/01/20)
-\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.
+\ninepoint\noindent
+is corrupted or was prepared for a different version of \TeX.
-\bugonpage B21, lines 33 and 34 (09/11/07)
+\bugonpage A305, bottom line (06/30/20)
-\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.
+\ninepoint\indent
+\tt \char`\\setbox0=\char`\\hbox\char`\{\char`\#1\char`\}%
+\char`\\advance\char`\\dimen0 by -\char`\\wd0 \char`\}\rm.
-\bugonpage B109, line 16 (01/06/14)
+\bugonpage A309, line 2 becomes two lines (12/06/20)
\ninepoint\noindent
-\qquad\qquad{\bf begin} $\\{print\_esc}(\.{"csname"})$;
-$\\{print\_esc}(\.{"endcsname"})$;
-$\\{print\_char}(\.{"\ "})$;
-{\bf end}
+represent text entered from the user's terminal, or with
+`\.{<insert>}', when they
+represent text inserted during error recovery).
-\bugonpage B114, line 25 (09/11/07)
+\bugonpage A316, lines 17 and 18 from the bottom (09/03/15)
-\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$\,\}$
+(The next line must also not be too tall.)
+Here \.{\char`\\specialstar} is a box of height zero and depth
+\.{\char`\\strutdepth},
+and it puts an asterisk in the left margin:
-\bugonpage B139, line 20 (12/19/02)
+\bugonpage A320, lines 5--9 from the bottom (06/27/15)
\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$\,\}$
+{\bf 17.21.}\enspace Assigning \.{\char`\\delcode\char`\`\char`\{}
+would not work to allow `\.{\char`\\left\char`\{}', because
+the brace has category~1 and isn't a legal \<delim>.
+Allowing brace delimiters would be a bad idea because it would
+mess up other constructions, such as arguments to macros, and
+components of alignments. Moreover, a user who
+gets away with `\.{\char`\\left\char`\{}'
+is likely to try also `\.{\char`\\bigl\char`\{}', which
+fails miserably.
-\bugonpage B144, line 14 (09/11/07)
+\bugonpage A326, line 12 (08/26/17)
\ninepoint\noindent
-\quad\\{cat}: $0\to\\{max\_char\_code}$;\quad$\{\,$\\{cat\_code}(\\{cur\_char}), usually$\,\}$
+its natural width. The \.{\char`\\hbox} version also invokes
+\.{\char`\\everyhbox} and \.{\char`\\everymath}.
-\bugonpage B153, lines 2 and 3 (09/11/07)
+\bugonpage A329, line 3 of answer 20.7 (05/15/19)
-\tenpoint\noindent
-In fact, these three procedures account for almost every use of \\{get\_next}.
+\ninepoint\noindent
+the three tokens \.{!1}, \.{\char`\#2}, \.{[}$_1$; the
+\<replacement text> consists of the six tokens
+\.{\char`\{}$_1$, \.{\char`\#}$_6$,\cutpar
-\bugonpage B161, line 19 (12/19/02)
+\bugonpage A329, line 6 of answer 20.7 (05/15/19)
\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$\,\}$
+is otherwise irrelevant. Thus, `\.{\char`\\def\char`\\!!1\char`\#2\char
+ `\#[\char`\{\char`\#\char`\#]!!\char`\#2]}'
+would produce an essentially\cutpar
-\bugonpage B163, line 29 (12/19/02)
+\bugonpage A329, line 5 from the bottom of answer 20.7 (05/15/19)
-\ninepoint\noindent
-\quad$\\{long\_state}\gets\\{call}$;
-$\\{cur\_tok}\gets\\{par\_token}$;
-$\\{ins\_error}$;
-{\bf goto} \\{continue};
+\ninepoint\indent
+\.{!1<-x}
-\bugonpage B172, lines 2--6 from the bottom (09/11/07)
+\bugonpage A329, bottom line of answer 20.7 (05/15/19)
\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})
+final parameter in the parameter text;
+`\.{!1}' would have been rendered `\.{\char`\#1}'.
-\bugonpage B178, line 4 (09/11/07)
+\bugonpage A332, lines 13 and 14 (08/26/17)
\ninepoint\noindent
-\quad$\\{cur\_val}\gets0$;
-$\\{cur\_val\_level}\gets\\{int\_val}$;
-$\\{radix}\gets0$;
-$\\{cur\_order}\gets\\{normal}$;
+{\bf 21.10.}\enspace If you say
+`\.{\char`\{\char`\\let}\stretch
+\.{\char`\\the=0\char`\\edef}\stretch
+\.{\char`\\next}\stretch
+\.{\char`\{\char`\\write}\stretch
+\.{\char`\\cont}\stretch
+\.{\char`\{}\<token list>\.{\char`\}\char`\}\char`\\next}\stretch
+\.{\char`\}}',
+the \.{\char`\\write} will be exercuted after
+\.{\char`\\edef} expands everything except \.{\char`\\the}.
-\bugonpage B184, line 9 from the bottom (04/18/07)
+\bugonpage A332, bottom line (11/15/19)
-\tenpoint\noindent
-and denominator sum to 32768 or less.
-According to the definitions here, $\rm2660\,dd\approx1000.33297\,mm$;\kern-6.6pt\cutpar
+\ninepoint\indent\quad
+\tt \char`\\+\char`\&\char`\{\char`\\bf end\char`\};\char`\\cr \
+ \char`\%\ note that the semicolon isn't bold
-\bugonpage B206, line 14 (10/30/02)
+\bugonpage A342, lines 12 and 13 (08/14/20)
\tenpoint\noindent
-used input files like \.{webmac.tex}.
+of plain \TeX\ format; but some of them are primitive (built in),
+such as `\.{\char`\\par}' (end of
+paragraph), `\.{\char`\\noindent}' (beginning of
+non-indented paragraph), and `\.{\char`\/}' (italic\cutpar
-\bugonpage B206, new paragraph to follow line 22 (12/20/02)
+\bugonpage A345, lines 10--13 from the bottom (06/27/15)
-\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.
+\ninepoint\noindent
+Braces are used for grouping, when supplying
+arguments to macros; so they cannot also be used as math delimiters, or as
+arguments to macros such as \.{\char`\\big}. (One could change their catcodes
+to~12, and use some other pair of characters for grouping; but that
+would not be plain \TeX.)
-\bugonpage B227, new line to precede line 23 (09/11/07)
+\bugonpage A346, lines 10--22 (11/24/19)
\ninepoint\noindent
-{\bf if} $(\\{nw}=0)\lor(\\{nh}=0)\lor(\\{nd}=0)\lor(\\{ni}=0)$
- {\bf then} \\{abort};
+number identification.) \ (2)~The registers
+\.{\char`\\count255}, \.{\char`\\dimen255}, \.{\char`\\skip255},
+\.{\char`\\toks255}, and \.{\char`\\muskip255}
+are freely available in the same way.
+\ (3)~All assignments to the scratch registers whose numbers are
+1,~3, 5, 7, and~9 should be \.{\char`\\global}; all assignments to the
+other scratch registers (0,~2, 4, 6, 8,~255) should be non-\.{\char`\\global}.
+\ (This prevents the phenomenon of ``save stack buildup'' discussed
+in Chapter~27.)
+\ (4)~Furthermore, it's possible to
+use any register in a group, if you ensure that \TeX's grouping
+mechanism will restore the register when you're done with the group, and
+if you are certain that other macros will not make global assignments
+to that register when you need it. \ (5)~But when a register is used
+by several macros, or over long spans of time, it should be allocated
+by \.{\char`\\newcount}, \.{\char`\\newdimen}, \.{\char`\\newbox},
+etc. \ (6)~Similar remarks
+apply to input/output streams used by \.{\char`\\read} and \.{\char`\\write},
+to math families used by \.{\char`\\fam}, to sets of hyphenation rules used by
+\.{\char`\\language}, and to insertions (which require
+\.{\char`\\box}, \.{\char`\\count}, \.{\char`\\dimen},
+and \.{\char`\\skip} registers all having the
+same number).\looseness=-1
-\bugonpage B256, line 25 (12/20/02)
+\bugonpage A347, line 6 (06/30/20)
\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})$;
+\tt \char`\\def\char`\\wlog\char`\{\char`\\immediate\char`\\write-1 \char`\}
+\ \char`\%\ this will write on log file (only)
-\bugonpage B258, line 5 from the bottom (12/20/02)
+\bugonpage A347, line 10 (11/24/19)
\ninepoint\noindent
-\quad{\bf begin} $g\gets\\{glue\_ptr}(p)$;
- $\\{rule\_wd}\gets\\{width}(g)-\\{cur\_g}$;
+\tt \char`\\outer\char`\\def\char`\\newmuskip\char`\{\char`\\alloc@3%
+\char`\\muskip\char`\\muskipdef\char`\\@cclv\char`\}
-\bugonpage B258, bottom line (12/20/02)
+\bugonpage A347, line 14 (11/24/19)
\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})$;
+\tt \char`\\outer\char`\\def\char`\\newtoks\char`\{\char`\\alloc@5%
+\char`\\toks\char`\\toksdef\char`\\@cclv\char`\}
-\bugonpage B259, line 4 (12/20/02)
+\bugonpage A350, lines 15 and 16 from the bottom (01/17/21)
\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})$;
+format; it shouldn't cost much for people to acquire all the
+fonts of plain \TeX\ in addition to the ones that they really want. Second, it
+is desirable on many computer systems to\cutpar
-\bugonpage B259, new line to precede old line 7 (12/20/02)
+\bugonpage A364, line 5 from the bottom (01/14/21)
\ninepoint\noindent
-\quad$\\{rule\_wd}\gets\\{rule\_wd}+\\{cur\_g}$;
+\tt \char`\\def\char`\\fmtversion\char`\{3.1415926535\char`\}
+\ \char`\%\ identifies the current format
-\bugonpage B260, line 21 (12/19/02)
+\bugonpage A370, lines 11 and 12 (08/26/17)
\ninepoint\noindent
-\qquad{\bf else begin} $\\{lx}\gets\\{lr}$ {\bf div} $(\\{lq}+1)$;
+close as possible to the ASCII conventions.
+\ (b)~Make sure that codes \oct{041}--\oct{046}, \oct{060}--\oct{071},
+\oct{136}, \oct{141}--\oct{146}, and \oct{160}--\oct{171} are present and that
+each unrepresentable in-\cutpar
-\bugonpage B261, line 9 (12/20/02)
+\bugonpage A373, lines 21 and 22 (01/17/21)
\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})$;
+and \.{\char`\\if...\char`\\fi}
+tests, as well as special operations like \.{\char`\\the}
+and \.{\char`\\input}, while the
+latter category includes the primitive commands listed in Chapters~24--26.
+The expansion of\cutpar
-\bugonpage B262, line 10 from the bottom (12/20/02)
+\bugonpage A375, bottom three lines (06/30/20)
\ninepoint\noindent
-\quad{\bf begin} $g\gets\\{glue\_ptr}(p)$;
- $\\{rule\_ht}\gets\\{width}(g)-\\{cur\_g}$;
+|$$\generaldisplay$$| to be invoked, with |\eq| defined to be $\alpha$.
+Furthermore, when an equation number~$\beta$ is present, it should be stored
+in |\eqn|, and the test |\ifeqno| should be true.
+In such cases |\ifleqno| should distinguish |\leqno| from |\eqno|.
+Here\cutpar
-\bugonpage B262, line 6 from the bottom (12/20/02)
+\bugonpage A398, lines 4 and 5 (08/26/17)
-\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})$;
+\ninepoint\indent
+|\setbox2=\lastbox \setbox\footins=\vbox{\box2}|\par
+\smallskip\noindent
+since |\lastbox| will be the result of\/ |\rigidbalance|, which is an hbox.
-\bugonpage B262, line 2 from the bottom (12/20/02)
+\bugonpage A407, line 5 from the bottom (06/30/20)
-\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})$;
+\ninepoint\noindent\quad
+| \interlinepenalty5000\def\par{\endgraf\penalty5000 }}|
-\bugonpage B263, new line to precede old line 2 (12/20/02)
+\bugonpage A413, line 11 from the bottom (05/14/19)
-\ninepoint\noindent
-\quad$\\{rule\_ht}\gets\\{rule\_ht}+\\{cur\_g}$;
+\ninepoint\indent
+The computer file |texbook.tex| that generated {\sl The \TeX book\/} begins
+with a\cutpar
-\bugonpage B264, line 10 (12/19/02)
+\bugonpage A418, line 4 (05/14/19)
\ninepoint\noindent
-\qquad{\bf else begin} $\\{lx}\gets\\{lr}$ {\bf div} $(\\{lq}+1)$;
+\TeX\ commands
+that look like this in the file |texbook.tex|:
-\bugonpage B266, line 29 (09/11/07)
+\bugonpage A420, line 11 (06/30/20)
-\tenpoint\noindent
-$\\{total\_pages}\ge65536$, the \.{DVI} file will lie. And if
-$\\{max\_push}\ge65536$, the user deserves whatever chaos might ensue.
+\ninepoint\noindent
+|\def\bull{\vrule height.9ex width.8ex depth-.1ex \relax} % square bullet|
-\bugonpage B279, line 19 (09/11/07)
+\bugonpage A423, line 16 (06/30/20)
\ninepoint\noindent
-\qquad\\{p}: \\{pointer};\quad$\{\,$a new glue node$\,\}$
+| \vrule height6pt depth2pt width0pt \relax} % a strut for \insert\margin|
-\bugonpage B288, lines 18--20 (09/11/07)
+\bugonpage A445, lines 10--14 (12/10/18)
-\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$));
+\ninepoint
+\textindent{\bf 15e.} Enclose the vbox that was constructed in Rule 15c or 15d by
+delimiters $(\lambda,\rho)$
+whose height plus depth is at least $\sigma_{20}$, if $C>T$, and at
+least $\sigma_{21}$ otherwise. Shift the delimiters up or down so that they are
+vertically centered with respect to the axis. Replace the generalized
+fraction by an Ord atom whose nucleus is the resulting sequence of three boxes
+($\lambda$, vbox, $\rho$). Go to rule~19.
-\bugonpage B290, line 12 (09/11/07)
+\bugonpage A446, the bottom three lines of Rule 19 become four lines (01/10/21)
\ninepoint\noindent
-\quad{\bf begin if\/} $s=\\{text\_size}$ {\bf then}
- \\{print\_esc}(\.{"textfont"});
+atom and the right boundary item to
+a Close atom. The entire resulting list now becomes the nucleus of an
+Inner atom. \ (All of the calculations in this step are done with
+$C$ equal to the starting style of the math list; style items in the
+middle of the list do not affect the style of the right boundary item.)
-\bugonpage B299, line 9 (12/20/02)
+\bugonpage A454, lines 17 and 18 from the bottom (04/13/20)
\ninepoint\noindent
-\qquad\qquad\quad{\bf if\/} $\\{type}(r)=\\{kern\_node}$ {\bf then}
- \quad$\{\,$unneeded italic correction$\,\}$
+of the process; the trial word consists of all the letters found in admissible
+items, up to a maximum of~63. Notice that all of these letters are in font~$f$.
-\bugonpage B332, line 6 (12/19/02)
+\bugonpage A458 and following, selected amendments to the index (01/18/21)
-\tenpoint\noindent
-is being scanned, or when no alignment preamble is active.
+\eightpoint
+|[1]| (progress report), 23, $\underline{119}$.\par
+|\aa| ( \aa\ ), {\it52}, $\underline{356}$.\par
+|\AA| ( \AA\ ), {\it52}, $\underline{356}$.\par
+\<disc text>, $\underline{287}$, 292.\par
+\<general text>, $\underline{276}$, 279, 280.\par
+\<horizontal mode material>, 278, 285, 287.\par
+integral signs, {\sl see\/} |\int|, |\oint|, |\smallint|.\par
+\<math mode material>, 287, 289--293.\par
+|\null|, 311, {\it312}, {\it316}, {\it332}, {\it335}, $\underline{351}$, {\it354}, {\it360}--{\it362}, {\it419}.\par
+|\o| ( \o\ ), {\it52}, $\underline{356}$.\par
+|\O| ( \O\ ), {\it52}, $\underline{356}$.\par
+programs, for computers, 38, 165, {\it234}.\par
+repeating templates, {\sl see\/} periodic preambles.\par
+replacement text, {\it200}--{\it204}, 212, 280, 300, 329.\par
+right delimiters, {\sl see\/} closings.\par
+struts, $\underline{82}$, 125, 131, 142, 155, 178, 245--247, 255, 329, 416, 422, 423.\par
+\<vertical mode material>, 278, 280--282, 290.
-\bugonpage B332, line 8 (12/19/02)
-\ninepoint\noindent
-\quad{\bf begin if\/} $(\\{scanner\_status}=\\{aligning}) \lor
- (\\{cur\_align}=\\{null})$ {\bf then}
+ % volume B
+\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers
+\def\dts{\mathrel{.\,.}} % double dot, used only in math mode
-\bugonpage B336, line 11 from the bottom (10/13/03)
+\bugonpage Bv {(formerly Bvii)}, bottom two lines (01/15/21)
-\tenpoint\noindent
-$j-i+\\{min\_quarterword}$ in their
-\\{link} fields. The values of $w_{ii}$ were initialized to
-\\{null\_flag},\cutpar
+\eightpoint\noindent
+all of those changes.
+I~now believe that the final bug was discovered on 22 October 2020
+and removed in version 3.141592653. % on 12 January 2021
+The finder's fee has converged to \$327.68.
+
+\hsize=35pc
-\bugonpage B342, lines 5 and 6 (09/11/07)
+\bugonpage B2, line 10 from the bottom (01/15/21)
-\tenpoint
-In restricted horizontal mode, the \\{clang} part of \\{aux} is undefined;
-an over-cautious Pascal runtime system may complain about this.
+\ninepoint\noindent\hskip10pt
+{\bf define} $\\{banner}\equiv\hbox{\tt\char'23}$%
+{\tt This\]is\]TeX,\]Version\]3.141592653\char'23}\quad
+$\{\,$printed when \TeX\ starts$\,\}$
-\bugonpage B416, line 22 (02/29/08)
+\bugonpage B4, line 8 of \S7 (04/02/17)
-\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)$
+\tenpoint\noindent
+diagnostic information for \.{\char`\\tracingparagraphs},
+\.{\char`\\tracingpages}, and \.{\char`\\tracingrestores}.
-\bugonpage B438, lines 1--3 (09/11/07)
+\bugonpage B21, lines 33 and 34 (04/02/17)
+\def\Oct#1{\hbox{\rm\char'23\kern-.2em\it#1\/\kern.05em}} % octal constant
\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}.
+$[\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 80 printable characters are needed.
-\bugonpage B438, lines 19 and 20 (09/11/07)
+\bugonpage B28, lines 3 and 4 (04/02/17)
-\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}$;
+\tenpoint\noindent
+not serious since we assume that this
+part of the program is system dependent.
-\bugonpage B438, line 4 from the bottom (09/11/07)
+\bugonpage B28, line 2 from the bottom (04/02/17)
-\ninepoint\noindent
-\quad$\\{link}(\\{tail})\gets\\{lig\_stack}$;
-$\\{tail}\gets\\{lig\_stack}$\quad$\{\,$\\{main\_loop\_lookahead} is next$\,\}$
+\ninepoint\noindent\quad
+{\bf var} $k$: $0\dts23$;\quad$\{\,$index to current digit; we assume
+ that $\vert n\vert<10^{23}\,\}$
-\bugonpage B439, line 3 (09/11/07)
+\bugonpage B35, line 2 of \S83 becomes two lines (06/27/20)
-\ninepoint\noindent
-\quad{\bf if\/} $\\{main\_p}>\\{null}$ {\bf then}
- \\{tail\_append}(\\{main\_p});\quad$\{\,$append a single character$\,\}$
+\ninepoint\noindent\quad
+{\bf loop begin} \\{continue}: {\bf if} $\\{interaction}\ne\\{error\_stop\_mode}$
+ {\bf then return};\par
+\noindent\qquad
+\\{clear\_for\_error\_prompt}; \ \\{prompt\_input}(\.{"?\]"});
-\bugonpage B440, new line to follow line 9 (09/11/07)
+\bugonpage B36, line 11 of \S84 (07/03/20)
-\ninepoint\noindent
-\quad{\bf if\/} $\\{cur\_r}=\\{non\_char}$ {\bf then goto}
- \\{main\_loop\_wrapup};
+\ninepoint\noindent\quad
+\.{"E"}: {\bf if} $\\{base\_ptr}>0$ {\bf then if}
+ $\\{input\_stack}[\\{base\_ptr}].\\{name\_field}\ge256$ {\bf then}
-\bugonpage B452, line 18 (28/03/11)
+\bugonpage B36, line 5 of \S85 becomes two lines (07/03/20)
-\noindent\\{hmode}, where the latter two are used to denote
- \.{\char`\\vbox} and \.{\char`\\hbox}, respectively.
+\ninepoint\noindent\quad
+{\bf if} $\\{base\_ptr}>0$ {\bf then}\par
+\noindent\qquad
+{\bf if} $\\{input\_stack}[\\{base\_ptr}].\\{name\_field}\ge256$ {\bf then}
+\\{print}(\.{"E\]to\]edit\]your\]file."}
-\bugonpage B455, lines 3 and 4 (09/11/07)
+\bugonpage B40, line 5 from the bottom (08/07/20)
-\ninepoint\noindent
-\quad{\bf if\/} $((\\{cur\_cmd}=\\{hskip})\land(\\{abs}(\\{mode})\ne\\{vmode}))
- \lor ((\\{cur\_cmd}=\\{vskip})\land(\\{abs}(\\{mode})=\\{vmode}))$ {\bf then}
+\ninepoint\noindent\qquad
+(\.{"Try\]to\]insert\]an\]instruction\]for\]me\](e.g.,\]%
+ \char`\`I\char`\\showlists\char`\'),"})
-\bugonpage B472, new paragraph to follow line 10 (12/20/02)
+\bugonpage B58, lines 2 and 3 of \S136 (10/11/20)
-\tenpoint\noindent\quad
-A devious user might force an \\{endv} command to occur just about anywhere;
-we must defeat such hacks.
+\tenpoint\noindent
+the values corresponding to `\.{\char`\\hbox\char`\{\char`\}}'.
+The \\{sub\_type}
+field is set to \\{min\_quarterword}, for historic reasons that are no
+longer relevant.
-\bugonpage B472, replacement for what used to be line 13 (12/20/02)
+\bugonpage B88, line 16 (10/22/20)
-\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}
+\tenpoint\noindent
+The mode is temporarily set to zero while processing \.{\char`\\write} texts.
+
+\bugonpage B102, lines 3 and following of \S241 (12/11/20)
-\bugonpage B505, line 19 (09/11/07)
+\tenpoint\noindent
+information, something special
+is needed. The program here simply assumes that suitable values appear in
+the global variables \\{sys\_time}, \\{sys\_day}, \\{sys\_month}, and
+\\{sys\_year} (which are initialized to noon on 4 July 1776,
+in case the implementor is careless).
+\smallskip
+\ninepoint\noindent
+{\bf procedure} \\{fix\_date\_and\_time};\par
+\noindent\quad{\bf begin}
+$\\{sys\_time}\gets12\ast60$; \
+$\\{sys\_day}\gets4$; \
+$\\{sys\_month}\gets7$; \
+$\\{sys\_year}\gets1776$;\quad
+$\{\,$self-evident truths$\,\}$\par
+\noindent\quad$\\{time}\gets\\{sys\_time}$;\quad
+ $\{\,$minutes since midnight$\,\}$\par
+\noindent\quad$\\{day}\gets\\{sys\_day}$;\quad$\{\,$day of the month$\,\}$\par
+\noindent\quad$\\{month}\gets\\{sys\_month}$;\quad$\{\,$month of the year$\,\}$\par
+\noindent\quad$\\{year}\gets\\{sys\_year}$;\quad$\{\,$Anno Domini$\,\}$\par
+\noindent\quad{\bf end};
+
+\bugonpage B103, replacement for \S246 (12/11/20)
+\tenpoint\noindent
+{\bf 246.}\quad Of course we had better declare a few more global variables,
+if the previous routines are going to work.
+\smallskip
\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};
+$\langle\,$Global variables {\sevenrm\kern.5em13}$\,\rangle+\equiv$\par
+\noindent\\{old\_setting}: $0\dts\\{max\_selector}$;\par
+\noindent\\{sys\_time}, \\{sys\_day}, \\{sys\_month}, \\{sys\_year}: \\{integer};
+\quad$\{\,$date and time supplied by external system$\,\}$
-\bugonpage B506, line 1 (10/13/03)
+\goodbreak
+\bugonpage B122, lines 9 and 10 of \S291 (10/12/20)
-\tenpoint\noindent
-{\bf 1237.\quad}Here we use the fact that the consecutive codes
-$\\{int\_val}\to\\{mu\_val}$ and
-$\\{assign\_int}\to$\cutpar
+\tenpoint\noindent\quad
+The enclosing \.{\char'173} and \.{\char'175} characters of a macro
+definition are omitted, but an output routine
+will be enclosed in braces.
-\bugonpage B520, line 8 (06/25/04)
+\bugonpage B143, lines 2, 3, 4 become four lines (01/15/17)
\tenpoint\noindent
-says,
-for example, `\.{(preloaded format=plain 1982.11.19)}', showing the year,
-month, and day\cutpar
+routines that should be aborted, but we can sketch the
+ideas here: For a runaway definition or a runaway balanced text,
+we will insert a right brace; for a
+runaway preamble, we will insert a special \.{\char`\\cr} token and a right
+brace; and for a runaway argument, we will set \\{long\_state} to
+\\{outer\_call} and insert \.{\char`\\par}.
-\bugonpage B535, new line to follow line 11 (09/11/07)
+\bugonpage B188, line 8 (04/02/17)
\ninepoint\noindent
-\qquad{\bf if\/} $\\{last\_glue}\ne\\{max\_halfword}$ {\bf then}
- \\{delete\_glue\_ref}(\\{last\_glue});
+{\bf function} \\{str\_toks}$(b:\\{pool\_pointer})$: \\{pointer};\quad
+ $\{\,$converts \\{str\_pool}$[b\dts\\{pool\_ptr}-1]$ to a token list$\,\}$
-\bugonpage B578, new entry (06/04/06)
+\bugonpage B192, line 17 (10/22/20)
-\eightpoint\noindent
-Trabb Pardo, Luis Isidoro, 2.
+\ninepoint\noindent\quad
+{\bf label} \\{found}, \\{continue}, \\{done}, \\{done1}, \\{done2};
- % 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 B192, line 3 of \S474 (10/22/20)
-\bugonpage Cxi, line 4 (05/20/07)
+\ninepoint\noindent\qquad
+{\bf begin} \\{continue}: \\{get\_token};\quad$\{\,$set \\{cur\_cmd},
+ \\{cur\_chr}, \\{cur\_tok}$\,\}$
-\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 B193, line 4 of \S476 (05/20/20)
-\bugonpage C11, line 11 (10/11/01)
+\ninepoint\noindent\quad
+{\bf if} $\\{cur\_tok}<\\{left\_brace\_limit}$ {\bf then}
-\noindent
-the area below the bar to the area above it equal to
-$(\sqrt5+1)/2\approx1.61803$, the\cutpar
+\bugonpage B193, line 10 of \S476 becomes two lines (10/22/20)
-\bugonpage C29, illustration for exercise 4.11 (09/09/01)
+\ninepoint\noindent\qquad
+\\{help2}(\.{"I\char`\'m\]going\]to\]ignore\]the\]\#\]sign\]you\]just\]used,"})\par
+\noindent\qquad
+(\.{"as\]well\]as\]the\]token\]that\]followed\]it."});
+\\{error}; {\bf goto} \\{continue};
-\noindent
-[points 2 and 5 should not be labeled twice]
+\bugonpage B196, line 5 from the bottom (02/17/18)
-\bugonpage C32, line 5 from the bottom (01/04/14)
+\ninepoint\noindent\qquad\quad
+\\{help1}(\.{"This\]\char`\\read\]has\]unbalanced\]braces."});
+$\\{align\_state}\gets1000000$;
+$\\{limit}\gets0$;
+\\{error};
-\noindent
-\hbox to\parindent{\hfil\sevenrm20\ \ }%
-| penpos1(stem,15); penpos2(.9stem,12); penpos3(stem,10);|
+\bugonpage B199, lines 1--3 of \S494 (10/25/20)
-\bugonpage C36, line 5 from the bottom (01/05/14)
+\tenpoint\noindent
+{\bf 494.} \ \ Here is a procedure that ignores text until coming to an \.{\char`\\or},
+\.{\char`\\else}, or \.{\char`\\fi} at the current level
+of $\.{\char`\\if}\ldots\.{\char`\\fi}$
+nesting. After it has acted, \\{cur\_chr} will indicate the token that
+was found, but \\{cur\_tok} will not be set (because this makes the
+procedure run faster).
+
+
+\bugonpage B214, lines 2--6 of \S536 (12/11/20)
+
+\ninepoint\noindent\quad
+{\bf begin} \\{wlog}(\\{banner});
+\\{slow\_print}(\\{format\_ident});
+\\{print}(\.{"\]\]"});
+\\{print\_int}(\\{sys\_day});
+\\{print\_char}(\.{"\]"});\par
+\noindent\quad
+$\\{months}\gets\.{\char`\'JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC\char`\'}$;\par
+\noindent\quad
+{\bf for} $k\gets3\ast\\{sys\_month}-2$ {\bf to} $3\ast\\{sys\_month}$
+{\bf do} \\{wlog}(\\{months}[$k$]);\par
+\noindent\quad
+\\{print\_char}(\.{"\]"});
+\\{print\_int}(\\{sys\_year});
+\\{print\_char}(\.{"\]"});
+\\{print\_two}(\\{sys\_time} {\bf div} 60);
+\\{print\_char}(\.{":"});\par
+\noindent\quad
+\\{print\_two}(\\{sys\_time} {\bf mod} 60);
+
+\bugonpage B214, line 2 of \S537 becomes two lines (10/29/20)
-\noindent
-line~12, where it
-says `|x1l|', not `|x11|' or~`|xll|'); be sure to distinguish between\cutpar
+\tenpoint\noindent
+command is being processed.
+Beware: For historic reasons, this code foolishly conserves a tiny bit
+of string pool space; but that can confuse the interactive `\.E' option.
-\bugonpage C55, lines 5 and 6 (01/05/14)
+\bugonpage B214, bottom line (10/29/20)
\ninepoint\noindent
-suffixed or subscripted.
-Thus, the syntax rule for \<variable>
-should actually be replaced by a slightly more complicated pair of rules:
+{\bf if} $\\{name}=\\{str\_ptr}-1$ {\bf then}
+\ $\{\,$conserve string pool space (but see note above)$\,\}$
+\bugonpage B219, lines 18--20 of \S545 (09/19/19)
-\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.
+\tenpoint\noindent
+so-called boundary character of this font;
+the value of \\{next\_char} need not lie between \\{bc} and~\\{ec}.
+If the very last instruction of the \\{lig\_kern} array has $\\{skip%
+\_byte}=255$,
+there is a special ligature/kerning program for a boundary character at the
+left, beginning at location $256\ast\\{op\_byte}+$\cutpar
-\bugonpage C137, lines 5--7 from the bottom (02/21/08)
+\bugonpage B282, line 1 {(and change lines 20--23 accordingly)} (04/02/17)
-\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
+\tenpoint\noindent
+{\bf 682.} Each portion of a formula is classified as Ord, Op, Bin, Rel, Open,
+Close, Punct, or Inner, for\cutpar
-\bugonpage C137, bottom two lines (02/21/08)
+\bugonpage B299, line 4 from the bottom of \S722 (10/06/20)
-\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
+\ninepoint\noindent\qquad\quad
+{\bf begin} \\{char\_warning}(\\{cur\_f}, \\{qo}(\\{cur\_c}));
+$\\{math\_type}(a)\gets\\{empty}$;
+$\\{cur\_i}\gets\\{null\_character}$;
-\bugonpage C156, line 15 from the bottom (09/09/01)
+\bugonpage B318, lines 16 and 17 of \S761 become one (03/25/19)
\ninepoint\noindent
-be the values they had upon entry to the group.)
+\\{fraction\_noad}: $s\gets\\{fraction\_noad\_size}$;
-\bugonpage C159, lines 12--15 (12/01/06)
+\bugonpage B333, line 5 of \S793 becomes two lines (01/10/20)
-\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.
+\ninepoint\noindent\quad
+$\\{cur\_loop}\gets\\{link}(\\{cur\_loop})$;
+$\\{link}(p)\gets\\{new\_glue}(\\{glue\_ptr}(\\{cur\_loop}))$;\par
+\noindent\quad
+$\\{subtype}(\\{link}(p))\gets\\{tab\_skip\_code}+1$;
-\bugonpage C171, line 16 from the bottom (06/18/02)
+\bugonpage B348, insert a new line after line 5 of \S826 (01/15/17)
-\tenpoint
-\<loop>\is\<loop header>|:|\<loop text> {\tt endfor}
+\ninepoint\noindent\qquad
+{\bf stat if} $\\{tracing\_paragraphs}>0$ {\bf then}
+\\{end\_diagnostic}(\\{true}); \ {\bf tats}
-\bugonpage C179, line 7 from the bottom (09/09/01)
+\bugonpage B348, insert a new line to be the seventh line after the previous change (01/15/17)
-\ninepoint\noindent
-next time \MF\ gets to the end of an input line, it will stop reading
-from the\cutpar
+\ninepoint\noindent\qquad
+{\bf stat if} $\\{tracing\_paragraphs}>0$ {\bf then}
+\\{begin\_diagnostic}; \ {\bf tats}
-\bugonpage C180, lines 14--16 (04/25/03)
+\bugonpage B377, line 6 (10/31/20)
\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.
+\\{hn}: $0\dts64$; \ $\{\,$the number of positions occupied in \\{hc};
+ not always a \\{small\_number}$\,\}$
-\bugonpage C180, new line to be inserted 4 from the bottom (06/25/04)
+\bugonpage B417, mini-index (04/02/17)
-\ninepoint\item\bull
-When \MF\ is reading the symbolic tokens to be saved by {\bf save}.
+\eightpoint\noindent
+The entry `\\{height}, \S981.' here and on many later
+odd-numbered pages should be `$\\{height}=\rm macro$, \S135.'
-\bugonpage C203, line 12 from the bottom (04/25/03)
+\bugonpage B522, line 3 of \S1306. (10/25/20)
-\ninepoint\hbox to 237pt{point~3 at the right of the triangle
-might digitize into a}
+\tenpoint\noindent
+to be in the range $a\le x\le b$.
+System error messages should be suppressed when undumping.
-\bugonpage C213, line 26 (02/21/08)
+\bugonpage B533, lines 5--8 of \S1333. (10/15/20)
-\ninepoint\beginsyntax
-<path subexpression>\is<path expression not ending with direction specifier>\kern-5pt\null
-\endsyntax
+\tenpoint\noindent
+loop.
+(Actually there's one way to get error messages, via \\{prepare\_mag};
+but that can't cause infinite recursion.)\par
+\noindent\quad
+If \\{final\_cleanup} is bypassed, this program doesn't bother to
+close the input files that may still be open.
-\bugonpage C226, line 23 (02/21/08)
+\bugonpage B533, line 12 of \S1333. (11/29/20)
-\ninepoint\noindent following nineteen things will be mentioned:
+\ninepoint\noindent\quad
+{\bf begin} $\langle\,$Finish the extensions{\sevenrm\kern.5em1378}$\,\rangle$;
+$\\{new\_line\_char}\gets-1$;
-\bugonpage C226, new line to be second from the bottom (02/21/08)
+\bugonpage B534, line 6 of \S1335. (11/29/20)
-\ninepoint\indent|independent variables|\qquad(distinct numeric variables)
+\ninepoint\noindent\quad
+{\bf begin} $c\gets\\{cur\_chr}$;
+{\bf if} $c\ne1$ {\bf then} $\\{new\_line\_char}\gets-1$;
-\bugonpage C236, line 7 from the bottom (01/05/14)
+\bugonpage B537, line 18 of \S1338 becomes two lines (10/05/20)
-\ninepoint\noindent
-\hbox to\parindent{\hss\bf 7.4.\enspace}False.
-After `|newinternal x;|' you can't say `|x|\<tag>' in a \<suffix list>.
+\ninepoint\noindent\quad
+{\bf begin} \\{clear\_terminal};\par
+\noindent\quad
+{\bf loop}
-\bugonpage C246, line 12 (02/21/08)
+\bugonpage B537, lines 11 and 12 from the bottom of \S1338
+ become three lines (04/02/17)
-\ninepoint\noindent
-is performed whenever \MF\ uses the last two alternatives
-in the definition\cutpar
+\ninepoint\noindent\qquad\qquad
+{\bf begin goto} \\{breakpoint};\par
+\noindent\qquad\qquad\quad$\{\,$go to every declared label at least once$\,\}$\par
+\noindent\qquad\quad\\{breakpoint}: $m\gets0$;
+ \.{@\char`\{\char`\'BREAKPOINT\char`\'@\char`\}}
-\bugonpage C250, lines 13 and 14 (02/19/08)
+\bugonpage B600, the bottom five lines (05/14/19)
-\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.)
+\tenpoint\noindent
+they occupy in a typical production system
+(executable code size for dark blocks, global data size for light blocks).
+In this way the chart indicates a total of about
+$12\times22=264${\ninerm K} bytes of memory, plus
+$12\times10=120${\ninerm K} for the
+dynamic memory region not shown explicitly. The dynamic memory
+is often considerably larger in practice, because it is desirable to
+accommodate large macro packages and large pages.
-\bugonpage C250, line 12 from the bottom (04/25/03)
-\ninepoint\noindent
-following \<boolean primary>.)
+ % volume C
+\hsize=29pc
+\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers
+\def\dashto{\mathrel{\hbox{-\thinspace-\kern-.05em}}}
+\def\ddashto{\mathrel{\hbox{-\thinspace-\thinspace-\kern-.05em}}}
+\def\tension{\mathop{\rm tension}}
+\def\controls{\mathop{\rm controls}}
+\def\and{\,{\rm and}\,}
-\bugonpage C286, line 25 (09/09/01)
+\bugonpage Cx, line 4 from the bottom (06/14/20)
-\ninepoint\noindent
-problem; it would simply have put |ENDFOR| into the
-replacement text of |asts|, because\cutpar
+\count255=1
+\def\diamondleaders{\global\advance\count255 by 1
+ \ifodd\count255 \kern-10pt \fi
+ \leaders\hbox to 20pt{\ifodd\count255 \kern13pt \else\kern3pt \fi
+ .\hss}}
+\line{\strut
+ \hbox to\parindent{\bf\hbox to 1em{\hss20}\hss}%
+ \rm More About Macros\diamondleaders\hfil\hbox to 2em{\hss175}}
-\bugonpage C289, line 7 (09/09/01)
+\bugonpage C39, lines 10 and 11 become three lines (07/04/20)
-\vskip-6pt\ninepoint\begintt
-if if pair x: x>(0,0) else: false fi: A else: B fi.
-\endtt
+\tenpoint\noindent
+that has already been designed. All you'll see is
+`|(io.mf| |The| |letter| |O| |[79])|' or possibly only `|(io.mf| |[79])|',
+followed by~`|*|'. Now the fun starts: You should type
-\bugonpage C292, line 10 from the bottom (09/09/01)
+\bugonpage C68, lines 9, 28, 35, 36, 38 (11/11/17)
-\ninepoint\noindent
-be known by saying `{\bf if\/} known $p-q$: $p=q$ {\bf else}:~{\bf false}
-{\bf fi}'; transforms could be handled\cutpar
+\ninepoint
+\halign{\indent\hbox to 160pt{\tt#\hfil}&\tt#\hfil\cr
+uniformdeviate -100&-36.1628\cr
+z slanted 1/6&(0.16667y+x,y)\cr
+(a,b)zscaled(3,4)&(-4b+3a,3b+4a)\cr
+(a,b)zscaled dir 30&(-0.5b+0.86603a,0.86603b+0.5a)\cr
+(a,b)dotprod(3,4)&4b+3a\cr
+}
+
+\bugonpage C72, lines 4--18 (07/16/20)
+
+\ninepoint\noindent
+\beginsyntax
+<numeric atom>\is<numeric variable>
+ \alt<numeric token primary>
+ \alt[(]<numeric expression>[)]
+ \alt[normaldeviate]
+ \alt[length]<string primary>
+ \alt[length]<path primary>
+ \alt[length]<pair primary>
+ \alt[angle]<pair primary>
+ \alt[xpart]<pair primary>
+ \alt[ypart]<pair primary>
+ \alt<numeric operator><numeric primary>
+<numeric token primary>\is<numeric token>[/]<numeric token>
+ \alt<numeric token not followed by %
+ `{\tt/}$\thinspace\langle$numeric token$\rangle$'\thinspace>
+<numeric primary>\is<numeric atom not followed by {[\char'133]<expression>[,]}>
+ \alt<numeric atom>[\char'133]<numeric expression>%
+ [,]<numeric expression>[\char'135]
+\endsyntax
-\bugonpage C293, line 5 from the bottom (04/25/03)
+\bugonpage C76, lines 8--16 from the bottom (11/11/17)
-\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
+\newdimen\longesteq
+\setbox0=\hbox{\indent$z_{12}-z_{11}=z_{14}-z_{13}$\quad}
+\longesteq=\wd0
+\tenpoint\noindent \hangindent\longesteq \hangafter0
+tom edge of the type.
+\ (With plain \MF's {\bf beginchar} each
+character has a ``bounding box'' that runs from $(0,h)$
+at the upper left and $(w,h)$ at the upper right to $(0,-d)$ and~$(w,-d)$
+at the lower left and lower right; variable $d$ represents the depth of
+the type. The values of $w$, $h$, and~$d$ might change from character to
+character, since the individual pieces of type need not have the same size
+in a computer-produced font.)
-\bugonpage C315, line 15 from the bottom (04/25/03)
+\bugonpage C80, line 14 (06/13/20)
-\ninepoint\noindent
-`b' was shipped out.) \ The second letter,~`o', is placed
-in a second little box adjacent\cutpar
+\tenpoint\indent
+\\{penpos}\<suffix>(\<unknown>,\thinspace\<known>).
-\bugonpage C325, bottom line (02/29/08)
+\bugonpage C83, line 16 (06/13/20)
-\rightline{\eightss--- CAROLUS LINN\AE US,
- {\eightssi Philosophia Botanica\/}\enspace(1751)}
+\ninepoint\indent
+|### 0.5a=-c-0.5b+1.5|
-\bugonpage C332, line 4 from the bottom (04/25/03)
+\bugonpage C83, line 19 (06/13/20)
\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)
+the only
+dependent variable is now $d$, which equals $0.5c+0.75b+0.75$. \ (This is\cutpar
-\eightpoint\noindent
-\llap{*}|angle|, {\it29}, {\it67}, $\underline{72}$, {\it107},
-{\it135}, 211, {\it238}.
+\bugonpage C96, line 13 from the bottom (10/31/20)
-\bugonpage C346, right column (10/04/04)
+\tenpoint\noindent
+illustrates the
+use of $u\0$, $s\0$, $\\{ht}\0$, \\{logo\_pen}, \\{leftstemloc}, $o$,
+\\{xgap}, and \\{barheight}:
-\eightpoint\noindent
-arccosine, arcsine, arctangent, {\sl see\/} |angle|.
+\bugonpage C106, lines 19--21 (07/03/20)
-\bugonpage C351, right column (02/21/08)
+\ninepoint\noindent
+pixels. \ (Some typesetting
+systems use both of these device-dependent amounts to alter their current
+position on a page, just after typesetting each character. Other systems,
+like typical |dvi| software associated with \TeX, assume that $\\{chardy}=0$
+but use \\{chardx}\cutpar
-\eightpoint\noindent
-independent variables, $\underline{81}$--$\underline{83}$, 88, 224, 226.
+\bugonpage C113, lines 5--11 from the bottom (07/20/20)
-\bugonpage C352, right column (02/29/08)
+\def\cycle{\hbox{\rm cycle}}
+\ninepoint\noindent
+\begindisplay
+$s\0:=5\\{pt}\0$; \ {\bf define\_pixels}$(s)$; \ \% side of the square\cr
+$z_1=(0,0)$; \ $z_2=(s,0)$; \ $z_3=(0,s)$; \ $z_4=(s,s)$;\cr
+{\bf for} $k=1$ {\bf upto} 4:
+ $z[k+4]=z[k]+({2\over3}s,{1\over3}s)$; \ {\bf endfor}\cr
+{\bf pickup pencircle} scaled $.4\\{pt}$; \
+{\bf draw} $z_5\dashto z_6\dashto z_8\dashto z_7\dashto \cycle$;\cr
+{\bf pickup pencircle} scaled $1.6\\{pt}$; \
+{\bf erase draw} $z_2\dashto z_4\dashto z_3$;\cr
+{\bf pickup pencircle} scaled $.4\\{pt}$; \
+{\bf draw} $z_1\dashto z_2\dashto z_4\dashto z_3\dashto \cycle$;\cr
+{\bf for} $k=1$ {\bf upto} 4:
+ {\bf draw} $z[k]\dashto z[k+4]$; \ {\bf endfor}.\cr
+\enddisplay
-\eightpoint\noindent
-Linn\'e, Carl von (= Linn\ae us, Carolus), 325.
+\bugonpage C114, line 7 (07/20/20)
-\bugonpage C355, right column (02/29/08)
+\ninepoint\indent
+{\bf for} $k=0$ {\bf upto} 4: \ $z[k]=\\{center}+(\\{radius},0)$
+ rotated$(90+{360\over5}k)$; \ {\bf endfor}
-\eightpoint\noindent
-\llap{*}|save|, $\underline{155}$--$\underline{156}$, {\it160}, 173,
- {\it178}, 180, 218,\par
-\noindent\qquad{\it236}, {\it244}, {\it296}, 299.
+\bugonpage C128, lines 13 and 14 (06/13/20)
- % Volume D
-\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers
-\def\to{\mathrel{.\,.}} % double dot, used only in math mode
+\ninepoint\noindent
+changed. Plain \MF\ has a {\bf tensepath} operation
+that does this. For example, {\bf tensepath}~\\{unitsquare}~$=$
+$(0,0)\ddashto(1,0)\ddashto(1,1)\ddashto(0,1)\ddashto\cycle$.
-\bugonpage Dv, page number change (12/27/11)
+\bugonpage C136, lines 18 and 19 (07/17/20)
-\eightpoint\noindent[For consistency with Volumes A, C, and E, the
-preface now begins on page v instead of page~vii. This change was first
-made in the sixth printing.]
+\ninepoint\noindent
+only
+about 0.28 with respect to the initial and final directions; since \MF\ insists
+that tensions be at least~0.75, this anomalous path could never have arisen
+if the control\cutpar
-\bugonpage Dv {(formerly Dvii)}, bottom two lines (01/06/14)
+\bugonpage C155, line 7 (10/07/20)
-\eightpoint\noindent
-corporates all of those changes.
-I~now believe that the final bug was discovered on 03~June 2008,
-and removed in version 2.7182818.
-The finder's fee has converged to \$327.68.
+\tenpoint\indent
+\<program>\is\<statement list>\<statement>\thinspace|end|
-\bugonpage Dxiii {(formerly Dxv)}, line $-7$ (12/27/11)
+\bugonpage C160, lines 7--9 (06/25/20)
\ninepoint\noindent
-Format specs have no effect on the corresponding Pascal program, but they
-do influence\cutpar
-
-\hsize=35pc
-\parindent=1em
+might produce a transcript
+that includes the following diagnostic information:
+\begintt
+rotatedaround(EXPR0)(EXPR1)->
+ shifted-(EXPR0)rotated(EXPR1)shifted(EXPR0)
+\endtt
-\bugonpage D2, line $-17$ (01/03/14)
+\bugonpage C165, lines 5--7 from the bottom (11/11/17)
\ninepoint\noindent
-{\bf define} $\\{banner}\equiv\hbox{\tt\char'23}$%
-{\tt This\]is\]METAFONT,\]Version\]2.7182818\char'23}\quad
-$\{\,$printed when \MF\ starts$\,\}$
-
-\bugonpage D2, lines 4 and 5 from the bottom (12/23/02)
+(i.e., parameters in parentheses),
+then we name zero or one or two undelimited parameters.
+Then comes an `$=$'~sign,
+followed by the replacement text, and {\bf enddef}. The `$=$'~sign might also
+be~`$:=$'\thinspace; both mean the same thing.
-\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 C171, lines 18--20 (08/16/20)
-\bugonpage D31, line 29 (06/25/04)
+\ninepoint\indent
+Chapter~14's syntax rules for
+\<path primary>, via \<pair primary>.
+A pair expression is not considered to be
+of type {\bf path} unless the path interpretation is the only~possibility.
-\noindent
-This is the only nontrivial {\bf goto} statement in the
-whole program. It is used when there is no\cutpar
+\bugonpage C176, line 7 from the bottom (07/09/20)
-\bugonpage D42, replacement for lines 8--13 (12/23/02)
+\ninepoint\indent
+\quad {\bf if} |@#|$(\\{x\_})\colon\ \\{tx\_} \ \hbox{\bf else}\colon\
+ \\{fx\_}\ \hbox{\bf fi}$
+ :=\ \\{x\_}\thinspace; {\bf endfor}
-\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)
+\bugonpage C180, line 3 from the bottom (06/24/20)
-\tenpoint\noindent
-language or 64-bit substitute is advisable.
+\ninepoint\indent
+`$=$' or `$:=$' following {\bf let}.
-\bugonpage D44, lines 24--26 (12/23/02)
+\bugonpage C187, line11 from the bottom (07/12/20)
-\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.
+\ninepoint\indent\qquad
+\alt|substring|\thinspace\<pair expression>\thinspace|of|\thinspace
+ \<string primary>
-\bugonpage D58, line 16 from the bottom (06/25/04)
+\bugonpage C189, line 14 (06/13/20)
\ninepoint\noindent
-\hskip5em{\bf if\/} $\\{j\_random}=0$ {\bf then} \\{new\_randoms}
- {\bf else} \\{decr}(\\{j\_random})
+`|! |' and followed
+by~`|.|', followed by lines of context as in \MF's normal error\cutpar
-\bugonpage D63, line 21 (06/25/04)
+\bugonpage C200, line 12 from the bottom (08/27/20)
-Locations of \\{mem} between \\{mem\_min} and \\{mem\_top} may be dumped as
-part
-of preloaded base\cutpar
+\ninepoint\indent
+$y_1=y_2=\\{good.y}(.5[-d,h]+1.1\\{pt})$;
+
+\bugonpage C202, line 17 from the bottom (06/13/20)
+
+\ninepoint\noindent
+command,
+and it works only when the \\{penpos} angle is~0. If the \\{penpos} command
+is\cutpar
+
+\bugonpage C210, bottom eight lines, and top ten lines of page C211 (07/16/20)
+
+\ninepoint\noindent
+\beginsyntax
+<numeric atom>\is<numeric variable>\alt<numeric argument>
+ \alt<numeric token primary>
+ \alt<internal quantity>
+ \alt[normaldeviate]
+ \alt[(]<numeric expression>[)]
+ \alt[begingroup]<statement list><numeric expression>[endgroup]
+ \alt[length]<numeric primary>\alt[length]<pair primary>
+ \alt[length]<path primary>\alt[length]<string primary>
+ \alt[ASCII]<string primary>\alt[oct]<string primary>\alt[hex]<string primary>
+ \alt<pair part><pair primary>\alt<transform part><transform primary>
+ \alt[angle]<pair primary>
+ \alt[turningnumber]<path primary>\alt[totalweight]<picture primary>
+ \alt<numeric operator><numeric primary>
+ \alt[directiontime]<pair expression>[of]<path primary>
+<numeric token primary>\is<numeric token>[/]<numeric token>
+ \alt<numeric token not followed by %
+ `{\tt/}$\thinspace\langle$numeric token$\rangle$'\thinspace>
+<numeric primary>\is<numeric atom not followed by {[\char'133]<expression>[,]}>
+ \alt<numeric atom>[\char'133]<numeric expression>%
+ [,]<numeric expression>[\char'135]
+\endsyntax
-\bugonpage D75, line 13 (06/25/04)
+\bugonpage C214, line 6 becomes two lines (07/17/20)
\ninepoint\noindent
-\quad{\bf define} $\\{fi\_or\_else}=2$\quad$\{\,$delimiters for conditionals
- {\bf elseif\/}, {\bf else}, {\bf fi})$\,\}$
+\beginsyntax
+<future pen primary>\is<future pen argument>
+ \alt[pencircle]
+\endsyntax
-\bugonpage D76, line 5 (06/25/04)
+\bugonpage C214, line 6 from the bottom (07/12/20)
\ninepoint\noindent
-\quad{\bf define} $\\{type\_name}=30$\quad$\{\,$declare a type
- ({\bf numeric}, {\bf pair}, etc.)$\,\}$
+\beginsyntax
+ \alt[substring]<pair expression>[of]<string primary>
+\endsyntax
-\bugonpage D77, line 16 (06/25/04)
+\bugonpage C217, lines 20--25 (10/07/20)
\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)
+\beginsyntax
+<program>\is<statement list><non-title statement>[end]
+ \alt<statement list><non-title statement>[dump]
+<statement list>\is<empty>\alt<statement>[;]<statement list>
+<statement>\is<empty>\alt<title>
+ \alt<equation>\alt<assignment>\alt<declaration>
+ \alt<definition>\alt<compound>\alt<command>
+\endsyntax
-\noindent
-\MF\ user assigns a type to a variable like \.{x20a.b} by saying, for
-example, `\.{boolean} \.{x[]a.b}'.
+\bugonpage C219, line 25 (05/25/20)
-\bugonpage D102, lines 10--16 (06/25/04)
+\ninepoint\noindent
+to see which of its subscripts and suffixes have occurred.
+For example, if you're\cutpar
-\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)
+\bugonpage C224, lines 7--9 from the bottom (12/21/18)
-\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
+\tenpoint\indent
+|y4r=-0.9848thinn+259.00049|\par
+|x4r=-0.08682thinn+144|\par
+|y4=-0.4924thinn+259.00049|
-\bugonpage D103, line 6 (06/25/04)
+\bugonpage C226, lines 9 and 10 (11/01/20)
-\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$.
+\ninepoint\noindent
+This means that the preloaded base you have specified cannot be used,
+because it is corrupted or was prepared for a different version of
+\MF\kern-.03em.
-\bugonpage D114, line 12 (06/25/04)
+\bugonpage C228, line 27 (06/19/20)
-\noindent
-\qquad Such save stack entries are generated by \&{save} commands.
+\ninepoint\indent
+|l.94 endfor|
-\bugonpage D120, line 3 (06/25/04)
+\bugonpage C228, line 4 from the bottom (07/12/20)
\ninepoint\noindent
-[delete the line `The code here \dots', since the
- code {\it doesn't\/} use the stated fact]
+might want to review now.) \
+You probably also have a |proof| mode diagram:
-\bugonpage D126, line 10 (06/25/04)
+\bugonpage C234, line 4 of answer 4.6 (07/20/20)
-\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
+\ninepoint\indent
+{\bf for} $k=1$ {\bf upto} 6: $z[k]'=.2[z[k],z_0]$; {\bf endfor}
-\bugonpage D138, line 11 from the bottom (10/26/06)
+\bugonpage C241, line 2 (11/11/17)
-\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}$.
+\ninepoint\indent
+|\mode=cheapo; input cheaplogo10|
-\bugonpage D142, line 3 (06/25/04)
+\bugonpage C242, line 11 of answer 13.7 (07/20/20)
-\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
+\ninepoint\indent
+{\bf for} $k=1$ {\bf upto} 4:
+ $z[k+4]=z[k]+({2\over3}s,{1\over3}s)$; \ {\bf endfor}
-\bugonpage D142, line 8 (10/26/06)
+\bugonpage C243, lines 7 and 8 (11/08/15)
-\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
+\ninepoint\indent
+\indent {\bf draw} subpath$(k,k+1)$ of \\{star}; {\bf cullit};\par\indent
+\indent {\bf undraw} subpath$(k+2,k+3)$ of \\{star} {\bf withpen}
+ \\{eraser}; {\bf cullit};
-\bugonpage D142, lines 21--23 (06/25/04)
+\bugonpage C243, line 3 of answer 13.11 (06/17/20)
-\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)$.)
+\ninepoint\indent
+{\bf def overdraw expr} $c$ = {\bf begingroup save} \\{region};
-\bugonpage D177, line 18 (06/25/04)
+\bugonpage C243, lines 12--16 of answer 13.11 (05/24/20)
\ninepoint\noindent
-$\\{cur\_x},\\{cur\_y}$: \\{scaled};\quad$\{\,$outputs of \\{skew},
- \\{unskew}, and a few other routines$\,\}$
+\begindisplay
+{\bf beginchar}$(\hbox{\tt"M"},1.25\\{in}\0,.5\\{in}\0,0)$; \
+ {\bf pickup pencircle} scaled .4\\{pt};\cr
+$z_1=(20,-13)$; \ $z_2=(30,-6)$; \ $z_3=(20,1)$; \ $z_4=(4,-7)$;\cr
+\indent $z_5=(-12,-13)$; \ $z_6=(-24,-4)$; \ $z_7=(-15,6)$;\cr
+{\bf path} $M$; $M=(\\{origin}\dts
+ z_1\dts z_2\dts z_3\dts z_4\dts z_5\dts z_6\dts z_7\dts$\cr
+\indent$\\{origin}\dts -z_7\dts -z_6\dts -z_5\dts -z_4\dts
+ -z_3\dts -z_2\dts -z_1\dts\cycle)$\cr
+\enddisplay
-\bugonpage D182, lines 27--29 (06/25/04)
+\bugonpage C246, line 2 of answer 14.13 (08/16/20)
-\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$.
+\ninepoint\noindent
+path $z_0\dashto z_1$ is equivalent to `$z_0\dts
+\controls1/3[z_0,z_1]\and2/3[z_0,z_1]\dts z_1$', and the\cutpar
-\bugonpage D184, line 18 (12/21/02)
+\bugonpage C247, line 1 of answer 15.5 (06/13/20)
\ninepoint\noindent
-\qquad\\{chopped}: \\{integer};\quad
-$\{\,$positive if data truncated, negative if data dangerously large$\,\}$
+\quad{\bf 15.5.}\enspace
+{\bf beginchar}$(126,25u\0,\\{h\_height}\0+\\{border}\0,0)$; \
+|"Dangerous left bend"|;
-\bugonpage D184, line 25 (12/21/02)
+\bugonpage C247, replacement for answer 15.7 (07/21/20)
\ninepoint\noindent
-\quad{\bf if\/} $(\\{internal}[\\{autorounding}]>0)\land(\\{chopped}=0)$
- {\bf then} \\{xy\_round};
+\quad{\bf 15.7.}\enspace
+Replace lines 10 and 11 by
+\begindisplay
+{\bf pickup pencircle} scaled 3/4\\{pt} yscaled 1/3 rotated $-60$;\cr
+{\bf draw} ($z_1\ldots p$) transformed $t$;\cr
+{\bf addto} \\{currentpicture} {\bf also} \\{currentpicture}\cr
+\qquad rotatedaround$\bigl((.5w,.5h)$ yscaled \\{aspect\_ratio}$,-180\bigr)$;\cr
+\enddisplay
-\bugonpage D184, line 27 (12/21/02)
+\bugonpage C249, line 1 of answer 18.9 (08/02/20)
\ninepoint\noindent
-\quad{\bf if\/} $(\\{internal}[\\{autorounding}]>\\{unity})\land
- (\\{chopped}=0)$ {\bf then} \\{diag\_round};
+\quad{\bf 18.9.}\enspace
+{\bf beginchar}\kern1pt(|"H"|$,13u\0,"ht"\0,0)$; \
+ {\bf pickup} \\{broad\_pen};
-\bugonpage D184, line 32 (12/21/02)
+\bugonpage C249, line 11 of answer 18.9 (08/02/20)
-\ninepoint\noindent
-\qquad{\bf if\/} $(\\{internal}[\\{autorounding}]\le0)\lor(\\{chopped}\ne0)$
- {\bf then} \\{print\_spec}({\tt\char`",\]after\]subdivision\char`"})
+\ninepoint\indent
+{\bf filldraw} $\\{bot\_serif\_edge}_4$
-\bugonpage D185, lines 15--19 (12/21/02)
+\bugonpage C250, line 4 of answer 19.1 (04/19/20)
\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$
+because it saves a wee bit of time and because
+`;'\ often belongs before {\bf endfor}.
-\bugonpage D185, old line 22 (12/21/02)
+\bugonpage C250, replacement for answer 19.3 (07/12/20)
\ninepoint\noindent
-\quad$p\gets\\{cur\_spec}$; $k\gets1$; $\\{chopped}\gets0$;
- $\\{dmax}\gets\\{half}(\\{max\_allowed})$;
+\quad{\bf 19.3.}\enspace
+Yes, if and only if $n-{1\over2}$ is an even integer.
+\ (Because ambiguous values are rounded upwards.)
-\bugonpage D185, old line 28 (12/21/02)
+\bugonpage C251, replacement for answer 22.1 (07/12/20)
\ninepoint\noindent
-\quad{\bf if\/} $\\{chopped}>0$ {\bf then}
-
-\bugonpage D196, lines 3--8 (06/25/04)
+\quad{\bf 22.1}\enspace
+(a) If and only if $n$ is an integer between 0 and 255.
+(b) If and only if $s$ is a string of length~1.
-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 C254, lines 10--13 from the bottom become five lines (06/26/20)
-\bugonpage D196, lines 15 and 16 (06/25/04)
+\ninepoint\noindent
+\begintt
+? H
+I found no right delimiter to match a left one. So I've
+put one in, behind the scenes; this may fix the problem.
+|null
+?
+\endtt
-\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 C260, the ``line'' after line 3 (06/14/20)
-\bugonpage D200, line 4 (06/25/04)
+\def\bb{$\,\left\{\vcenter\bgroup\halign\bgroup\hfil##\hfil\cr}
+\def\ee{\crcr\egroup\egroup\right\}\,$}
+\tenpoint\noindent
+\bb|font_size|\cr|font_slant|\cr|font_normal_space|\cr
+ |font_normal_stretch|\cr|font_normal_shrink|\cr|font_x_height|\cr
+ |font_quad|\cr|font_extra_space|\ee
+\bb|=|\cr\noalign{\kern-2pt}|:=|\cr\noalign{\kern-2pt}\<empty>\ee
+\<numeric$\0$>; \
+\bb|ligtable|\<ligs/kerns>\cr|charlist|\<codes>\cr|extensible|\<codes>\cr
+ |fontdimen|\<info>\cr|headerbyte|\<info>\ee;\kern-10pt
-\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 C261, lines 16 and 17 from the bottom (06/14/20)
-\bugonpage D212, line 18 (06/25/04)
+\tenpoint\noindent
+\bb|proofrule|\cr|screenrule|\ee|(|\<pair>|,|\<pair>|)|; \
+|makegrid(|\<numerics>|)(|\<numerics>|)|;\smallskip\noindent
+|proofrulethickness| \<numeric$\0$>; \ |proofoffset| \<pair>.
-\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 C266, lines 19 and 20 (07/04/20)
-\bugonpage D216, bottom line (06/25/04)
+\ninepoint\noindent
+You can say either `|incr|~|x|' or `|incr|~|(x)|', within
+an expression; but neither of them are valid statements by themselves.
-\noindent
-we list it twice (with coordinates
-interchanged, so as to make the second octant look like\cutpar
+\bugonpage C269, line 11 (01/10/21)
-\bugonpage D217, lines 2--10 (06/25/04)
+\ninepoint\indent
+|\smode="specmode"; mag=|\<magnification>|; input |\<font file name>
-\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)
+\bugonpage C277, lines 15--19 (03/06/17)
+\ninepoint\noindent
+|def openit = openwindow currentwindow from origen % and please correct|\par
\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)
-
+| to (screen_rows,screen_cols) at (-50,300) enddef; % "(-50,300)" too|\par
\noindent
-\\{endpoint}. The cubics all have
-monotone-nondecreasing $x(t)$ and $y(t)$.
-
-\bugonpage D228, lines 4--7 from the bottom (06/25/04)
-
+|def showit_ = display currentpicture inwindow currentwindow enddef;|\par
\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
+|def showit = openit; let showit=showit_; showit enddef; % first time only|\par
+\kern3pt\hrule\medskip\noindent
+Plain \MF\ has several other terse commands
+similar to `{\bf openit}' and `{\bf showit}':
-\bugonpage D231, line 7 (06/25/04)
+\bugonpage C279, line 1 (11/11/17)
\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 $(*)$.
+| blacker:=.1; % make pens a teeny bit blacker|
-\bugonpage D246, line 4 from the bottom (06/25/04)
+\bugonpage C289, line 20 (10/07/20)
-\noindent
-dinate fields. Hence, for example,
-the point $\bigl($$\\{x\_coord}(p)-\\{left\_v}(q),\\{y\_coord}(p)+%
-\\{right\_u}(p)$$\bigr)$
-also\cutpar
+\ninepoint\indent
+|if {{(pair x) cand x>(0,0)}}: A else: B fi.|
-\bugonpage D248, lines 14 and 15 (01/06/14)
+\bugonpage C291, line 18 (07/24/20)
-\noindent
-the $x$-axis at the point
-$\bigl((a^2-b^2)\sin\theta\cos\theta/\rho\bigr)+i\rho$, where
-\vadjust{\vskip1pt}%
-$\rho=\sqrt{(a\sin\theta)^2+(b\cos\theta)^2}$. It reaches
-furthest to the right of~the $y$-axis at the point
-$\sigma+i(a^2-b^2)\sin\theta\cos\theta/\sigma$, where
-$\sigma=$\cutpar
+\ninepoint\indent
+| save u_; setu_ u; let switch_ = if; if false: enddef.|
-\bugonpage D248, line 24 (06/25/04)
+\bugonpage C292, line 10 from the bottom (10/23/20)
\ninepoint\noindent
-\qquad{\bf else begin} $\\{beta}\gets\\{minor\_axis}$;
- $\\{gamma}\gets\\{major\_axis}$;
- $\\{theta}\gets0$;
-
-\bugonpage D251, line 1 (01/06/14)
-
-\noindent
-{\bf536.\quad}Only the coordinates need to be copied, not the class numbers
-and other stuff. At this point either $\\{link}(p)$ or
-$\\{link}(\\{link}(p))$ is \\{null}.
+be known by saying `{\bf if} known $(p-q)$: $p=q$ {\bf else}:~{\bf false fi}';
+transforms could be handled\cutpar
-\bugonpage D251, line 10 (01/06/14)
+\bugonpage C293, lines 13 and 14 from the bottom (10/27/20)
\ninepoint\noindent
-\\{done1}: {\bf if\/} $(\\{link}(p)\ne\\{null})$ {\bf then}
-$\\{free\_node}(\\{link}(p),\\{knot\_node\_size})$;\hfil\break
-\null\quad$\\{link}(p)\gets s$;
-$\\{beta}\gets-\\{y\_coord}(h)$;
-
-\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
+$f(-1)$ is false! When $c\rightarrow0$, the quantity $a^3+b^3$
+approaches $-\infty$ when $c$~is positive, $+\infty$ when $c$~is
+negative. An attempt to `\\{solve} $f(1,-1)$' will divide by zero and
+come\cutpar
-\bugonpage D261, line 5 (06/25/04)
+\bugonpage C295, line 2 (07/04/20)
\ninepoint\noindent
-\\{tol}: \\{integer};\quad$\{\,$bound on the uncertainty in the overlap test$\,\}$
+`interpolate $(1,1)\dts(3,2)\dts(15,4)$ of~7' the approximate value 3.37.
-\bugonpage D262, lines 26 and 27 (06/25/04)
+\bugonpage C299, bottom four lines of code become five (08/06/20)
\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}$\,\}$
+\begintt
+primarydef t Bernshtein nn = begingroup save r; r =
+ begingroup for n=nn downto 2:
+ for k=1 upto n-1: u_[[[k]]]:=t[[[u_[[[k]]],u_[[[k+1]]] ]]];
+ endfor endfor u_[[[1]]] endgroup; numeric u_[[[]]];
+ r endgroup enddef;
+\endtt
-\bugonpage D262, line 11 from the bottom (06/25/04)
+\bugonpage C299, line 5 after the code becomes two lines (08/06/20)
\ninepoint\noindent
-\qquad$\\{xy}\gets\\{xy}+\\{int\_packets}$;\quad$\{\,$switch
- from \\{l\_packets} to \\{r\_packets}$\,\}$
+brackets are nested inside of brackets.
+However, the auxiliary variables `|u_[[[|$k$|]]]|' must not remain
+independent at the end.
-\bugonpage D274, line 15 from the bottom (06/25/04)
+\bugonpage C305, lines 14--18 (07/08/20)
\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)
-
+|width_adj#:=0pt#; % width adjustment for certain characters|\par
\noindent
-\\{macro\_def} or \\{iteration}).
-
-\bugonpage D330, line 1 (06/25/04)
-
+|serif_fit#:=0pt#; % extra sidebar near lowercase serifs|
+\vskip-3pt\noindent\qquad\vdots\par\noindent
+|low_asterisk:=false; % should the asterisk be centered at the axis?|\par
\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.
+|math_fitting:=false; % should math-mode spacing be used?|
-\bugonpage D354, lines 11 and 12 from the bottom (06/25/04)
+\bugonpage C317, line 21 becomes two lines (11/11/17)
-\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.
+\ninepoint\noindent
+\beginsyntax
+<label>\is<code label>\alt<code>[::]\alt[\\\\:]
+<code label>\is\<code>[:]
+\endsyntax
-\bugonpage D355, lines 1 and 2 (06/25/04)
+\bugonpage C318, lines 10--16 from the bottom (11/11/17)
-\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.
+\ninepoint\noindent
+\beginsyntax
+ \alt<code label><labeled code>
+<extensible command>\is[extensible]<code label><four codes>
+<four codes>\is<code>[,]<code>[,]<code>[,]<code>
+\endsyntax
+Notice that a \<code label> can appear in a {\bf ligtable}, {\bf charlist}, or
+{\bf extensible} command.
+ These appearances are mutually exclusive: No code may be
+used more than once as a label. Thus, for example, a character with a
+ligature/kerning program cannot also be {\bf extensible}, nor can it be
+in a {\bf charlist} (except as the final item).
-\bugonpage D355, lines 5 and 6 (06/25/04)
+\bugonpage C333, line 29 (10/25/19)
-\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.
+\ninepoint\noindent
+| "if charcode>0:currentpicture:=currentpicture scaled mg;fi;"|
-\bugonpage D355, lines 21 and 22 (06/25/04)
+\bugonpage C333, bottom two lines become one (11/11/17)
-\noindent
-$\\{cur\_type}=\\{token\_list}$ means that \\{cur\_exp} points to a linked list
-of tokens.
+\ninepoint\noindent
+| if unknown scale: scale := max(1,round(pixels_per_inch/300)); fi|
-\bugonpage D356, lines 2--3 (06/25/04)
+\bugonpage C339, line 3 (05/21/20)
-\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.
+\ninepoint\noindent
+ing `\char'31', `\char'32',
+`\char'33', and~`\char'34') and the uppercase letters (including
+`\char'35', `\char'36', and~`\char'37') are\cutpar
-\bugonpage D368, line 13 (06/25/04)
+\bugonpage C341, line 14 from the bottom (11/11/17)
\ninepoint\noindent
-\qquad\\{my\_var\_flag}: $0\to\\{max\_command\_code}$;\quad$\{\,$initial
- value of \\{var\_flag}$\,\}$
+prints the |\table| and the |\text|; ^|\bigtest| gives
+you the works, plus a mysterious word\cutpar
-\bugonpage D378, line 9 from the bottom (06/25/04)
+\bugonpage C345 and following, selected amendments to the index (01/20/21)
-\ninepoint\noindent
-\qquad\quad{\bf begin} $\\{cur\_type}\gets\\{known}$;
- $\\{cur\_exp}\gets0$;
- $\\{free\_node}(q,\\{dep\_node\_size})$;
+\eightpoint
+*|,| (comma), 57, 72, 73, 129, 155, 165--167, 171, 211--213, 218, 317, 318.\par
+`A', 10--11, 163, 164, 248, 302--303.\par
+\<addto command>, 118, $\underline{220}$.\par
+bell-shaped distribution, $\underline{183}$, 251.\par
+|black|, 270, 332--333.\par
+\<code> and \<code label>, $\underline{317}$.\par
+concatenation, of paths, {\it70}--{\it71}, {\it123}, 127--129, $\underline{130}$, 137, {\it245}, {\it266}.\par
+\quad of strings, {\it69}, 73, 84--85, $\underline{187}$, {\it278}, {\it286}, {\it312}.\par
+*|directiontime|, {\it135}, $\underline{\it136}$, 211, 245, 265, {\it298}.\par
+distance, 76, 84, {\sl see also\/} |length|.\par
+|dotprod|, {\it68}--{\it69}, 178, {\it238}, 265.\par
+efficiency, 39, 99, 116, 141, 144, 147, 228, 230, 234, 244, 264, 265, 277, 291, 297, 298.\par
+empty option in {\bf for\/} list, 171, $\underline{172}$, {\it299}.\par
+forbidden tokens, 173, $\underline{218}$--$\underline{219}$, 286.\par
+*|from|, $\underline{191}$, 220, {\it252}, {\it277}, {\it312}.\par
+Giotto di Bondone, 139.\par
+independent variables, $\underline{81}$--$\underline{83}$, 88, 224, 226, 299.\par
+|\init|, $\underline{337}$, 342.\par
+internal quantities, 54--55, 88, 218, 262, 265--266.\par
+*|inwindow|, $\underline{191}$, 220, {\it277}.\par
+\<keep or drop>, $\underline{118}$, 220.\par
+|labels|, {\it107}, $\underline{274}$, 327--328.\par
+*|length|, {\it66}, {\it69}, 72, 210, 238.\par
+*|ligtable|, {\it97}, {\it305}--{\it306}, $\underline{316}$--$\underline{317}$.\par
+loops, 169, 171--173, 179, 226--227, 259, 290--291, 299.\par
+`N', 184--185, 302--303.\par
+\<numeric token primary>, 72, $\underline{211}$.\par
+|o|, {\it23}, {\it34}, $\underline{93}$, 197, 200, 204, 240, 302.\par
+`O', 32--37, 161, 199, 302--303.\par
+overshoot, 23, 34, 93, 197, 200, 204, 302.\par
+|penpos|, {\it26}--{\it29}, 37, 80, {\it103}, {\it162}, $\underline{273}$, 310.\par
+pens, 21--29, 147--152, 297--298.\par
+*|rotated|, {\it21}--{\it22}, {\it25}, 27, 44, {\it68}, 73, {\it107}, {\it114}, {\it117}, $\underline{141}$, 213, {\it238}.\par
+|rule|, 274, 328.\par
+*|scaled|, {\it21}--{\it23}, {\it68}, 73, $\underline{141}$, 213, 244, 291.\par
+*|showstopping|, 211, 219, {\it227}, 230, {\it262}.\par
+string expressions, {\it69}, 187--189, 258, 286.\par
+\<suffix list>, $\underline{171}$, 236.\par
+sum, of vectors, 9, {\it68}.\par
+|test.mf|, 311--313.\par
+\TeX, 1, 34, 40, 91, 96, 98, 101--103, 315, 336--343, 361.\par
+text arguments, 219, 288--291, 299.\par
+|.tfm|, 39, 315--321, 333, 335.\par
+*|to|, $\underline{191}$, 220, {\it252}, {\it277}, {\it312}.\par
+undelimited suffix parameters, $\underline{167}$, 176, 266, 270.\par
+|undraw|, 113, 118, 120, {\it242}, $\underline{271}$.\par
+|unitsquare|, {\it116}, 123--124, 128, 132, 136, $\underline{263}$.\par
+*|unknown|, $\underline{170}$, 210.\par
+unknown quantities, nonnumeric, 84--85, 143.\par
+values, disappearance of, 56, 83, 88, 156--157, 177--178, 218, 239, 299.\par
+\<vardef heading>, 165, $\underline{178}$.\par
+*|xscaled|, {\it21}--{\it22}, {\it68}, 73, $\underline{141}$, 213, 244, 291.\par
-\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)
+ % Volume D
+\def\\#1{\hbox{\it#1\/\kern.05em}} % italic type for identifiers
+\def\to{\mathrel{.\,.}} % double dot, used only in math mode
-\noindent
-by a previous operation. We must maintain
-the value of $\\{right\_type}(q)$ in cases such as\break
-`|..\\{curl2\}z\{0,0\}..|'.
+\bugonpage Dv, line 16 (01/16/21)
-\bugonpage D437, line 1 (06/25/04)
+\tenpoint\noindent
+\kern12.5mm I believe that the final bug in \MF\ was discovered on January\cutpar
-\noindent
-{\bf996.\quad}And \\{do\_assignment} is similar to \\{do\_equation}:
+\bugonpage Dv, bottom two lines (01/16/21)
-\bugonpage D439, line 10 becomes two lines (06/25/04)
+\eightpoint\noindent
+corporates all of those changes.
+I~now believe that the final bug was discovered on 03 July 2020
+and removed in version 2.71828182. % on 16 January 2021
+The finder's fee has converged to \$327.68.
-\ninepoint\noindent
-\qquad{\bf begin} $\\{nonlinear\_eq}(v,\\{cur\_exp},\\{false})$;
- $\\{cur\_type}\gets t$;
- {\bf goto} \\{done};
+\hsize=35pc
-\bugonpage D443, line 11 (06/25/04)
+\bugonpage D2, last line of \S2 (01/15/21)
\ninepoint\noindent
-\\{done}: {\bf if\/} $\\{eq\_type}(x)\mathbin{\hbox{\bf mod}}\\{outer\_tag}
- \ne\\{tag\_token}$ {\bf then}
- $\\{clear\_symbol}(x,\\{false})$;
+$$\hbox{{\bf define} $\\{banner}\equiv\.{\char`\'This\]is\]METAFONT,\]Version\]2.71828182\char`\'}$\quad
+$\{\,$printed when \MF\ starts$\,\}$}$$
-\bugonpage D452, line 9 (06/25/04)
+\bugonpage D14, line 1 of \S30 (05/05/14)
-\noindent
-though they don't necessarily correspond to primitive tokens.
+\tenpoint\noindent
+{\bf 20.} \quad The \\{input\_ln} function brings the next line of input from the specified
+file into available\cutpar
-\bugonpage D476, line 12 from the bottom (06/25/04)
+\bugonpage D21, line 8 of \S47 (10/11/20)
-\ninepoint\noindent
-\quad{\bf if\/} $\\{nl}-\\{skip\_table}[c]>128$ {\bf then}
+\ninepoint\noindent\quad
+$g$: \\{str\_number};\quad$\{\,$the string just created$\,\}$
-\bugonpage D483, line 7 (06/25/04)
+\bugonpage D27, lines 3 and 4 of \S61 (04/02/17)
-\ninepoint\noindent
-\quad$\\{max\_tfm\_dimen}\gets16\ast\\{internal}[\\{design\_size}]-1
- -\\{internal}[\\{design\_size}]\mathbin{\hbox{\bf div}}\Oct{10000000}$;
+\tenpoint\noindent
+is not serious since we assume that this
+part of the program is system dependent.
-\bugonpage D483, lines 15--17 (06/25/04)
+\bugonpage D28, line 7 (04/02/17)
-\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}])$;
+\ninepoint\noindent\quad
+{\bf var} $k$: $0\dts23$;\quad$\{\,$index to current digit; we assume
+ that $\vert n\vert<10^{23}\,\}$
-\bugonpage D496, line 2 (06/25/04)
+\bugonpage D32, line 2 of \S78 becomes two lines (06/27/20)
-\noindent
-a pointer to
-an edge structure. Its mission is to describe the positive pixels
-in \.{GF} form,\cutpar
+\ninepoint\noindent\quad
+{\bf loop begin} \\{continue}: {\bf if} $\\{interaction}\ne\\{error\_stop\_mode}$
+ {\bf then return};\par
+\noindent\qquad
+\\{clear\_for\_error\_prompt}; \ \\{prompt\_input}(\.{"?\]"});
-\bugonpage D500, line 16 (06/25/04)
+\bugonpage D32, line 11 of \S79 (07/03/20)
-\ninepoint\noindent
-\quad$\\{selector}\gets\\{old\_setting}$;
- $\\{gf\_out}(\\{cur\_length})$;
- $\\{gf\_string}(0,\\{make\_string})$;
- $\\{decr}(\\{str\_ptr})$;
+\ninepoint\noindent\quad
+\.{"E"}: {\bf if} $\\{file\_ptr}>0$ {\bf then if}
+ $\\{input\_stack}[\\{file\_ptr}].\\{name\_field}\ge256$ {\bf then}
-\bugonpage D506, lines 8--10 (06/25/04)
+\bugonpage D33, line 5 of \S80 (07/03/20)
-\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.
+\ninepoint\noindent\quad
+{\bf if} $\\{file\_ptr}>0$ {\bf then}\par
+\noindent\qquad
+{\bf if} $\\{input\_stack}[\\{file\_ptr}].\\{name\_field}\ge256$ {\bf then}
+\\{print}(\.{"E\]to\]edit\]your\]file."}
-\bugonpage D514, line 14 from the bottom (06/25/04)
+\bugonpage D37, line 9 of \S93 (08/07/20)
-\noindent
-\.{CMMF}, should also be provided for commonly used bases such as \.{cmbase}.
+\ninepoint\noindent\qquad
+(\.{"Try\]to\]insert\]an\]instruction\]for\]me\](e.g.,\]%
+ \char`\`I\]show\]x;\char`\'),"})
- % volume E
-\hsize=29pc
+\bugonpage D82, line 2 from the bottom (09/19/19)
-\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 `--'
+\ninepoint\noindent\quad
+{\bf define} $\\{boundary\_char}=41$\quad$\{\,$the boundary character for ligatures$\,\}$
-\bugonpage E1, line 3 (01/06/06)
+\bugonpage D85, lines 3 and 4 of \S194 {(and \S194 actually moves to page D86)} (12/11/20)
\tenpoint\noindent
-Zillions of alphabets can be generated by the programs in this book.
-All\cutpar
+information, something special
+is needed. The program here simply assumes that suitable values appear in
+the global variables \\{sys\_time}, \\{sys\_day}, \\{sys\_month}, and
+\\{sys\_year} (which are initialized to noon on 4 July 1776,
+in case the implementor is careless).
+
+\bugonpage D85, the final six lines of \S194 {(and \S194 actually moves to page D86)} (12/11/20)
+
+\ninepoint\noindent
+{\bf procedure} \\{fix\_date\_and\_time};\par
+\noindent\quad{\bf begin}
+$\\{sys\_time}\gets12\ast60$; \
+$\\{sys\_day}\gets4$; \
+$\\{sys\_month}\gets7$; \
+$\\{sys\_year}\gets1776$;\quad
+$\{\,$self-evident truths$\,\}$\par
+\noindent\quad$\\{internal}[\\{time}]\gets\\{sys\_time}\ast\\{unity}$;\quad
+ $\{\,$minutes since midnight$\,\}$\par
+\noindent\quad$\\{internal}[\\{day}]\gets\\{sys\_day}\ast\\{unity}$;\quad$\{\,$day of the month$\,\}$\par
+\noindent\quad$\\{internal}[\\{month}]\gets\\{sys\_month}\ast\\{unity}$;\quad$\{\,$month of the year$\,\}$\par
+\noindent\quad$\\{internal}[\\{year}]\gets\\{sys\_year}\ast\\{unity}$;\quad$\{\,$Anno Domini$\,\}$\par
+\noindent\quad{\bf end};
+
+\bugonpage D86, replacement for \S196 (12/11/20)
-\bugonpage E6, lines 16--19 (12/29/04)
+\tenpoint\noindent
+{\bf 196.}\quad Of course we had better declare a few more global variables,
+if the previous routines are going to work.
+\smallskip
+\ninepoint\noindent
+$\langle\,$Global variables {\sevenrm\kern.5em13}$\,\rangle+\equiv$\par
+\noindent\\{old\_setting}: $0\dts\\{max\_selector}$;\par
+\noindent\\{sys\_time}, \\{sys\_day}, \\{sys\_month}, \\{sys\_year}: \\{integer};
+\quad$\{\,$date and time supplied by external system$\,\}$
-\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 D97, line 2 of \S221 (05/26/17)
-\bugonpage E7, line 11 (12/21/02)
+\tenpoint\noindent
+the definition of attribute nodes) that
+it is convenient to let $\\{info}(p)=0$ stand for `\.{[]}'.
-\ninepoint\indent
-\\{hair}, \\{vair}, \\{stem}, \\{curve}, \\{ess}, \\{flare}, \\{dot\_size},
- \\{bar}, \\{slab},
+\goodbreak
+\bugonpage D148, line 7 (06/12/18)
-\bugonpage E7, line 14 (12/21/02)
+\tenpoint\noindent
+but the $\log n$ factor is buried in our
+implicit restriction on the maximum raster size.) The\cutpar
-\ninepoint\indent
-\\{crisp}, \\{tiny}, \\{fine};
-\medskip\noindent
-and \\{thin\_join} should not be less than \\{fine}.
+\bugonpage D237, line 5 of \S513 (05/26/17)
-\bugonpage E19, line 19 (11/07/01)
+\ninepoint\noindent\quad
+{\bf for} $n\gets0$ {\bf to} $\\{n1}-\\{n0}-1$ {\bf do} $\\{env\_move}[n]\gets\\{mm0}$;
-\tenpoint
-\line{\\{cap\_notch\_cut}\hskip 0pt plus1.5fil46/36\hfil31/36\hfil25/36\hfil
-24/36\hfil22/36\hskip0pt plus3fil25/36}
+\bugonpage D250, line 2 of \S534 (05/26/17)
-\bugonpage E41, line 8 (12/21/02)
+\tenpoint\noindent
+direction $\bigl(\\{right\_u}(p),\\{left\_v}(q)\bigr)$;
+and there's a line of length $\ge\\{delta}$ from vertex~$q$ to vertex~$r$,\cutpar
-\ninepoint\noindent\mathchardef\AM="2026 % ampersand
-\quad$\\{extra\_endchar}\gets\\{extra\_endchar}\AM
- \.{\char`"charcode:=charcode+code\_offset;"}$;
+\bugonpage D296, line 11 (06/23/20)
-\bugonpage E53, line 7 (12/21/02)
+\tenpoint\noindent
+\\{name} points to the \\{eqtb} address of the macro
+being expanded, if the current token list\cutpar
-\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 D324, line 13 of \S713 (12/20/20)
-\bugonpage E125, line 6 from the bottom (07/10/05)
+\ninepoint\noindent\qquad\quad
+\\{help2}(\.{"After\]\char`\`exitif\]<boolean\]expr>\char`\'\]I\]expect\]to\]see\]a\]%
+semicolon."})
-\ninepoint\noindent
-$\\{top}\,y_1=\\{top}\,y_6=h$; $z_2=.5[z_3,z_1]+\\{bend}$;
+\bugonpage D326, line 5 from the bottom (06/23/20)
-\bugonpage E125, line 3 from the bottom (07/10/05)
+\ninepoint\noindent\qquad\qquad
+$\{\,$invokes a user-defined sequence of commands$\,\}$
-\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 D334, lines 1 and 2 of \S742 (10/25/20)
-\bugonpage E146, also pages 164 and 540 (02/08/03)
+\tenpoint\noindent
+{\bf 742.} \ Here is a procedure that ignores text until coming to an {\bf elseif},
+{\bf else}, or {\bf fi} at the current level of {\bf if}$\,\ldots\,${\bf fi}
+nesting. After it has acted, \\{cur\_mod} will indicate the token that
+was found.
-\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 D339, line 4 of \S757 (06/16/20)
-\bugonpage E147, line 11 from the bottom (04/23/04)
+\tenpoint\noindent\quad
+(A user who tries some shenanigan like `{\bf for} $\ldots$ {\bf let} {\bf endfor}'
+will be foiled by the \\{get\_symbol}\cutpar
+
+\bugonpage D351, lines 2--7 of \S536 become five lines (12/11/20)
+
+\ninepoint\noindent\quad
+{\bf begin} \\{wlog}(\\{banner});
+\\{slow\_print}(\\{format\_ident});
+\\{print}(\.{"\]\]"});
+\\{print\_int}(\\{sys\_day});
+\\{print\_char}(\.{"\]"});\par
+\noindent\quad
+$\\{months}\gets\.{\char`\'JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC\char`\'}$;\par
+\noindent\quad
+{\bf for} $k\gets3\ast\\{sys\_month}-2$ {\bf to} $3\ast\\{sys\_month}$
+{\bf do} \\{wlog}(\\{months}[$k$]);\par
+\noindent\quad
+\\{print\_char}(\.{"\]"});
+\\{print\_int}(\\{sys\_year});
+\\{print\_char}(\.{"\]"});
+\\{print\_two}(\\{sys\_time} {\bf div} 60);
+\\{print\_char}(\.{":"});\par
+\noindent\quad
+\\{print\_two}(\\{sys\_time} {\bf mod} 60);
+
+\bugonpage D352, line 2 of \S793 becomes two lines (10/29/20)
-\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$;
+\tenpoint\noindent
+command is being processed.
+Beware: For historic reasons, this code foolishly conserves a tiny bit
+of string pool space; but that can confuse the interactive `\.E' option.
-\bugonpage E147, line 8 from the bottom (04/23/04)
+\bugonpage D352, line 5 from the bottom (10/29/20)
\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]$;
+{\bf if} $\\{name}=\\{str\_ptr}-1$ {\bf then}
+\ $\{\,$conserve string pool space (but see note above)$\,\}$
-\bugonpage E149, line 8 from the bottom (04/23/04)
+\bugonpage D354, line 2 from the bottom (07/29/20)
-\ninepoint\noindent
-$y_5+.1\\{x\_height}=y_7=.5[y_6,y_8]$; $\\{bot}\,y_{6r}=-\\{oo}$;
+\tenpoint\noindent
+$\\{cur\_type}=\\{path\_type}$ means that \\{cur\_exp} points to the first
+node of
+a path; nobody else points\cutpar
-\bugonpage E157, line 11 (02/29/08)
+\bugonpage D469, lines 18--20 of \S1093 (09/19/19)
-\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}
+\tenpoint\noindent
+so-called boundary character of this font;
+the value of \\{next\_char} need not lie between \\{bc} and~\\{ec}.
+If the very last instruction of the \\{lig\_kern} array has $\\{skip%
+\_byte}=255$,
+there is a special ligature/kerning program for a boundary character at the
+left, beginning at location $256\ast\\{op\_byte}+$\cutpar
-\bugonpage E161, line 7 from the bottom (04/23/04)
+\bugonpage D469, line 30 of \S1093 (01/15/21)
-\ninepoint\noindent
-$\\{top}\,y_{1r}=\\{x\_height}+\\{oo}$; $y_2=y_4=.5[y_1,y_3]$;
- $\\{bot}\,y_{3r}=-\\{oo}$;
+\tenpoint\noindent
+tional halt; no ligature or kerning command is performed.
-\bugonpage E209, line 3 (12/29/04)
+\bugonpage D471, lines 20 and 21 (08/07/20)
-\ninepoint
-\rightline{\% This lowercase italic alphabet was prepared by D. E. Knuth
- in December, 1979,}
+\ninepoint\noindent
+\\{param}: {\bf array} $[1\dts\\{max\_font\_dimen}]$ {\bf of}
+\\{scaled};\quad$\{\,${\bf fontdimen} parameters$\,\}$\par\noindent
+\\{np}: $0\dts\\{max\_font\_dimen}$;\quad$\{\,$the largest {\bf fontdimen} parameter
+specified so far$\,\}$
-\bugonpage E377, lines 3 and 4 from the bottom (12/22/02)
+\bugonpage D474, line 2 from the bottom (08/07/20)
-\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}
+\ninepoint\noindent\quad\qquad
+\\{help1}(\.{"A\]colon\]should\]follow\]a\]headerbyte\]or\]fontdimen\]location."});
+\\{back\_error};
-\bugonpage E379, lines 17 and 18 become one line (01/06/14)
+\bugonpage D508, line 3 of \S1189. (10/05/20)
-\ninepoint\noindent
-{\bf else}: $\\{rt}\,x_{6r}={\rm hround}(w-1.5u)$;
-$y_{6}=y_{5l}+\\{eps};$ {\bf fi}
+\tenpoint\noindent
+to be in the range $a\le x\le b$.
+System error messages should be suppressed when undumping.
-\bugonpage E379, bottom line of the program (01/06/14)
+\bugonpage D516, line 6 (10/15/20)
-\def\SH{\raise.7ex\hbox{$\scriptstyle\#$}} % sharp sign for sharped units
-\ninepoint\noindent
-{\bf math\_fit}$(0,\\{ic}\SH-2.5u\SH)$;
-{\bf penlabels}$(0,1,2,3,4,5,6,7)$;
-{\bf endchar};
+\tenpoint\noindent\quad
+If \\{final\_cleanup} is bypassed, this program doesn't bother to
+close the input files that may still be open.
-\bugonpage E489, bottom line (06/25/04)
+\bugonpage D519, line 17 (01/15/21)
-\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.]
+\ninepoint\noindent\quad
+\\{fix\_date\_and\_time};
+$\\{init\_randoms}(\\{sys\_time}+\\{sys\_day}*\\{unity})$;
-\bugonpage E545, line 11 from the bottom (12/29/04)
+\bugonpage D520, line 18 of \S1212 becomes two lines (10/05/20)
-\parindent=36pt
-The most important general routine in |cmbase| is probably the {\it pos}\cutpar
+\ninepoint\noindent\quad
+{\bf begin} \\{clear\_terminal};\par
+\noindent\quad
+{\bf loop}
-\bugonpage E551, line 3 from the bottom (12/29/04)
+\bugonpage D520, lines 11 and 12 from the bottom of \S1212
+ become three lines (04/02/17)
-\noindent quantities needed in the |calu|
-programs are also established at this time.
+\ninepoint\noindent\qquad\qquad
+{\bf begin goto} \\{breakpoint};\par
+\noindent\qquad\qquad\quad$\{\,$go to every declared label at least once$\,\}$\par
+\noindent\qquad\quad\\{breakpoint}: $m\gets0$;
+ \.{@\char`\{\char`\'BREAKPOINT\char`\'@\char`\}}
+\bugonpage D566, the bottom five lines (05/14/19)
-\bugonpage E577, right column (12/23/02)
+\tenpoint\noindent
+they occupy in a typical production system
+(executable code size for dark blocks, global data size for light blocks).
+In this way the chart indicates a total of about
+$8\times22=176${\ninerm K} bytes of memory, plus
+$8\times15=120${\ninerm K} for the
+dynamic memory region not shown explicitly. The dynamic memory
+is often considerably larger in practice, because it is desirable to
+accommodate large macro packages and large pictures.
-\eightpoint\noindent
-\\{p\_}\kern1pt, 305, 377.\par\noindent
-{\bf padded}, 103--111, 117--121, $\underline{549}$.
-\bugonpage E578, left column (12/23/02)
+ % 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 `--'
-\eightpoint\noindent
-{\bf postcontrol}, 347, 377.\par\noindent
-{\bf precontrol}, 347, 377.
\bye
diff --git a/systems/knuth/dist/errata/errata.three b/systems/knuth/dist/errata/errata.three
index 5f00f73b22..d4a0afaccd 100644
--- a/systems/knuth/dist/errata/errata.three
+++ b/systems/knuth/dist/errata/errata.three
@@ -793,7 +793,7 @@ because it is a highly negative number.
\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`\{%
+`{\tt\char`\$\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)
diff --git a/systems/knuth/dist/errata/errata.twelve b/systems/knuth/dist/errata/errata.twelve
new file mode 100644
index 0000000000..8a7c291b49
--- /dev/null
+++ b/systems/knuth/dist/errata/errata.twelve
@@ -0,0 +1,1709 @@
+% Bugs (sigh) in Computers \& Typesetting
+
+\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\/} between the publication of the second ``Millennium Edition''
+at the close of the year 2001 and the beginning of the year 2014.
+(More precisely, it lists errors corrected
+in 16th to 19th printings of Volume~A, the 7th and 8th printings
+of Volume~B, the 6th and 7th printings of Volume~C, the 4th and 5th printings
+of Volume~D, and the 5th and 6th printings 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. All of these
+errors have supposedly been corrected in more recent printings, unless
+they were subsequently found to be wrong.
+\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 A153, line 7 (01/03/14)
+
+\ninepoint\noindent
+of three fonts: one for text size, one for
+script size, and one for scriptscript size. The\cutpar
+
+\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 A373, lines 4 and 5 from the bottom (01/02/14)
+
+\ninepoint\noindent
+And here's another solution (which may be faster, because
+token list registers can be expanded more quickly than macros
+on some implementations, using |\the|):
+
+\bugonpage A373, line 2 from the bottom (01/02/14)
+
+\ninepoint\indent
+|\loop \ifnum\m>0 \t=\expandafter{\the\t*}\advance\m-1 \repeat|
+
+\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 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 A418, line 8 from the bottom (12/13/11)
+
+\ninepoint\noindent\beginlines
+| \def\\{#3} \advance\hsize by -18mm|
+\endlines
+
+\bugonpage A418, line 3 from the bottom (12/13/11)
+
+\ninepoint\noindent\beginlines
+| \halign{\line{\titlefont\hss##}\\#4\unskip\\}|
+\endlines
+
+\bugonpage A442, lines 7 and 8 from the bottom (01/03/14)
+
+\def\rule#1.{\smallskip\textindent{\bf#1.}\ignorespaces}
+\ninepoint\textindent{\bf 3.}%
+If the current item is a style change, set $C$ to the specified
+style and move on to the next item.
+
+\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 Bv, page number change (12/27/11)
+
+\eightpoint\noindent[For consistency with Volumes A, C, and E, the
+preface now begins on page v instead of page~vii. This change was first
+made in the ninth printing.]
+
+\bugonpage Bv {(formerly Bvii)}, bottom two lines (01/06/14)
+
+\eightpoint\noindent
+all of those changes.
+I~now believe that the final bug was discovered on 14 September 2008
+and removed in version 3.14159265.
+The finder's fee has converged to \$327.68.
+
+\bugonpage Bxiii {(formerly Bxv)}, line $-7$ (12/27/11)
+
+\ninepoint\noindent
+Format specs have no effect on the corresponding Pascal program, but they
+do influence\cutpar
+
+\hsize=35pc
+
+\bugonpage B2, line 10 from the bottom (01/02/14)
+
+\ninepoint\noindent\hskip10pt
+{\bf define} $\\{banner}\equiv\hbox{\tt\char'23}$%
+{\tt This\]is\]TeX,\]Version\]3.14159265\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 B109, line 16 (01/06/14)
+
+\ninepoint\noindent
+\qquad\qquad{\bf begin} $\\{print\_esc}(\.{"csname"})$;
+$\\{print\_esc}(\.{"endcsname"})$;
+$\\{print\_char}(\.{"\ "})$;
+{\bf end}
+
+\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 B343, line 25 (01/02/13)
+
+\noindent
+should begin in the
+sequence of line numbers, in case hanging indentation or \.{\char`\\parshape}
+is in\cutpar
+
+\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 B452, line 18 (28/03/11)
+
+\noindent\\{hmode}, where the latter two are used to denote
+ \.{\char`\\vbox} and \.{\char`\\hbox}, respectively.
+
+\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 C32, line 5 from the bottom (01/04/14)
+
+\noindent
+\hbox to\parindent{\hfil\sevenrm20\ \ }%
+| penpos1(stem,15); penpos2(.9stem,12); penpos3(stem,10);|
+
+\bugonpage C36, line 5 from the bottom (01/05/14)
+
+\noindent
+line~12, where it
+says `|x1l|', not `|x11|' or~`|xll|'); be sure to distinguish between\cutpar
+
+\bugonpage C55, lines 5 and 6 (01/05/14)
+
+\ninepoint\noindent
+suffixed or subscripted.
+Thus, the syntax rule for \<variable>
+should actually be replaced by a slightly more complicated pair of rules:
+
+
+\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 C236, line 7 from the bottom (01/05/14)
+
+\ninepoint\noindent
+\hbox to\parindent{\hss\bf 7.4.\enspace}False.
+After `|newinternal x;|' you can't say `|x|\<tag>' in a \<suffix list>.
+
+\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 C346, right column (10/04/04)
+
+\eightpoint\noindent
+arccosine, arcsine, arctangent, {\sl see\/} |angle|.
+
+\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 Dv, page number change (12/27/11)
+
+\eightpoint\noindent[For consistency with Volumes A, C, and E, the
+preface now begins on page v instead of page~vii. This change was first
+made in the sixth printing.]
+
+\bugonpage Dv {(formerly Dvii)}, bottom two lines (01/06/14)
+
+\eightpoint\noindent
+corporates all of those changes.
+I~now believe that the final bug was discovered on 03~June 2008,
+and removed in version 2.7182818.
+The finder's fee has converged to \$327.68.
+
+\bugonpage Dxiii {(formerly Dxv)}, line $-7$ (12/27/11)
+
+\ninepoint\noindent
+Format specs have no effect on the corresponding Pascal program, but they
+do influence\cutpar
+
+\hsize=35pc
+\parindent=1em
+
+\bugonpage D2, line $-17$ (01/03/14)
+
+\ninepoint\noindent
+{\bf define} $\\{banner}\equiv\hbox{\tt\char'23}$%
+{\tt This\]is\]METAFONT,\]Version\]2.7182818\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 {\bf 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, lines 14 and 15 (01/06/14)
+
+\noindent
+the $x$-axis at the point
+$\bigl((a^2-b^2)\sin\theta\cos\theta/\rho\bigr)+i\rho$, where
+\vadjust{\vskip1pt}%
+$\rho=\sqrt{(a\sin\theta)^2+(b\cos\theta)^2}$. It reaches
+furthest to the right of~the $y$-axis at the point
+$\sigma+i(a^2-b^2)\sin\theta\cos\theta/\sigma$, where
+$\sigma=$\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 D251, line 1 (01/06/14)
+
+\noindent
+{\bf536.\quad}Only the coordinates need to be copied, not the class numbers
+and other stuff. At this point either $\\{link}(p)$ or
+$\\{link}(\\{link}(p))$ is \\{null}.
+
+\bugonpage D251, line 10 (01/06/14)
+
+\ninepoint\noindent
+\\{done1}: {\bf if\/} $(\\{link}(p)\ne\\{null})$ {\bf then}
+$\\{free\_node}(\\{link}(p),\\{knot\_node\_size})$;\hfil\break
+\null\quad$\\{link}(p)\gets s$;
+$\\{beta}\gets-\\{y\_coord}(h)$;
+
+\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 becomes two lines (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\char`\_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 E379, lines 17 and 18 become one line (01/06/14)
+
+\ninepoint\noindent
+{\bf else}: $\\{rt}\,x_{6r}={\rm hround}(w-1.5u)$;
+$y_{6}=y_{5l}+\\{eps};$ {\bf fi}
+
+\bugonpage E379, bottom line of the program (01/06/14)
+
+\def\SH{\raise.7ex\hbox{$\scriptstyle\#$}} % sharp sign for sharped units
+\ninepoint\noindent
+{\bf math\_fit}$(0,\\{ic}\SH-2.5u\SH)$;
+{\bf penlabels}$(0,1,2,3,4,5,6,7)$;
+{\bf endchar};
+
+\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)
+
+\parindent=36pt
+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/systems/knuth/dist/errata/errorlog.tex b/systems/knuth/dist/errata/errorlog.tex
index 49bb6c0450..dfb201b737 100644
--- a/systems/knuth/dist/errata/errorlog.tex
+++ b/systems/knuth/dist/errata/errorlog.tex
@@ -1946,7 +1946,7 @@ R567. Don't ship out incredibly huge pages; they might foul up
* 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.
+# 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
@@ -2694,7 +2694,7 @@ A848\>742. Calculate the empty-line condition properly when \\{end_line_char} is
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
+ \\{jump_out} (Klaus Guntermann). @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
@@ -2887,7 +2887,7 @@ 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
+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
@@ -2899,14 +2899,25 @@ Q938. Improve rounding of glue during output (M. F. Bridgland). @625,634
* 18 March 2008
F939. Forgot to goto the proper error recovery (DRF). @395
E940. Avoid a case of dirty Pascal and speed up inner loop. @1035
-R941. Forget reference to last_glue in format file (DRF). @1335
+R941. Forget reference to \\{last_glue} in format file (DRF). @1335
R942. Glue reference not updated after overflow error (DRF). @1236
-B943. Muglue in \leaders had wrong units; now disallowed (DRF). @1078
+B943. Muglue in |\leaders| had wrong units; now disallowed (DRF). @1078
E944. Speedup of ligatures and kerns at end of a word (DRF). @1039
-R945. Another sanity check of TFM files for security (DRF). @365
+R945. Another sanity check of TFM files for security (DRF). @565
I946. Give better size data for unmagnified insertions. @986
* 6 January 2014
-C947. Space after \csname\endcsname to match other spaces. (Oleg Bulatov) @262
+C947. Space after |\csname\endcsname| to match other spaces. (Oleg Bulatov) @262
+* 15 January 2021
+I948. Don't pause on errors when tracing paragraphs (Udo Wermuth). @826
+S949. Don't try to interact when in |\batchmode| (Xiaosa Zhang). @83
+S950. Don't try to edit when no file is active (Xiaosa Zhang). @84
+R951. Take date and time sometimes from system, not user (Udo Wermuth). @241,536
+B952. Don't allow implicit left brace after |#| (Udo Wermuth). @476
+R953. After nine parameters, must delete offending tokens (Bruno Le Floch). @476
+D954. Garbage visible in buffer after file ends prematurely (DRF). @486
+R955. Force nonexistent characters to have null specs (DRF). @722
+C956. Don't mark fraction noads as temporarily Inner (DRF). @761
+Q957. Reset |\newlinechar| before logging the stats (Udo Wermuth). @1333,1335
\relax
\bye
diff --git a/systems/knuth/dist/errata/mf84.bug b/systems/knuth/dist/errata/mf84.bug
index 0ce8ccbd74..c6349b896d 100644
--- a/systems/knuth/dist/errata/mf84.bug
+++ b/systems/knuth/dist/errata/mf84.bug
@@ -2321,10 +2321,117 @@ done1: if (link(p)<>null) then free_node(link(p),knot_node_size);
link(p):=s; beta:=-y_coord(h);
@z
+573. Don't restrict the length of the banner line, leave it system-dependent code
+(Udo Wermuth, 02 April 2017)
+@x module 61
+incorrect, but the discrepancy is not serious since we assume that the banner
+and base identifier together will occupy at most |max_print_line|
+character positions.
+@y
+incorrect, but the discrepancy is not serious since we assume that this
+part of the program is system dependent.
+@^system dependencies@>
+@z
+
+574. Defeat interactions during batch mode (Xiaosa Zhang, 27 June 2020)
+@x module 78
+@ @<Get user's advice...@>=
+loop@+begin continue: clear_for_error_prompt; prompt_input("? ");
+@y
+@ @<Get user's advice...@>=
+loop@+begin continue: if interaction<>error_stop_mode then return;
+ clear_for_error_prompt; prompt_input("? ");
+@z
+
+575. Don't exit to editor if no input file is at the bottom line
+(Xiaosa Zhang, 03 July 2020)
+@x module 79
+"E": if file_ptr>0 then
+@y
+"E": if file_ptr>0 then if input_stack[file_ptr].name_field>=256 then
+@z
+@x module 80
+if file_ptr>0 then print("E to edit your file,");
+@y
+if file_ptr>0 then if input_stack[file_ptr].name_field>=256 then
+ print("E to edit your file,");
+@z
+
+576. Keep date and time in system variables, use them in opening banner
+(Udo Wermuth, 11 December 2020)
+@x module 194
+Since standard \PASCAL\ cannot provide such information, something special
+is needed. The program here simply specifies July 4, 1776, at noon; but
+users probably want a better approximation to the truth.
+
+Note that the values are |scaled| integers. Hence \MF\ can no longer
+be used after the year 32767.
+
+@p procedure fix_date_and_time;
+begin internal[time]:=12*60*unity; {minutes since midnight}
+internal[day]:=4*unity; {fourth day of the month}
+internal[month]:=7*unity; {seventh month of the year}
+internal[year]:=1776*unity; {Anno Domini}
+end;
+@y
+Since standard \PASCAL\ cannot provide such information, something special
+is needed. The program here simply assumes that suitable values appear in
+the global variables \\{sys\_time}, \\{sys\_day}, \\{sys\_month}, and
+\\{sys\_year} (which are initialized to noon on 4 July 1776,
+in case the implementor is careless).
+
+Note that the values are |scaled| integers. Hence \MF\ can no longer
+be used after the year 32767.
+
+@p procedure fix_date_and_time;
+begin sys_time:=12*60;
+sys_day:=4; sys_month:=7; sys_year:=1776; {self-evident truths}
+internal[time]:=sys_time*unity; {minutes since midnight}
+internal[day]:=sys_day*unity; {day of the month}
+internal[month]:=sys_month*unity; {month of the year}
+internal[year]:=sys_year*unity; {Anno Domini}
+end;
+@z
+@x module 196
+@ Of course we had better declare another global variable, if the previous
+routines are going to work.
+
+@<Glob...@>=
+@!old_setting:0..max_selector;
+@y
+@ Of course we had better declare a few more global variables, if the previous
+routines are going to work.
+
+@<Glob...@>=
+@!old_setting:0..max_selector;
+@!sys_time,@!sys_day,@!sys_month,@!sys_year:integer;
+ {date and time supplied by external system}
+@z
+@x module 790
+print_int(round_unscaled(internal[day])); print_char(" ");
+months:='JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
+m:=round_unscaled(internal[month]);
+for k:=3*m-2 to 3*m do wlog(months[k]);
+print_char(" "); print_int(round_unscaled(internal[year])); print_char(" ");
+m:=round_unscaled(internal[time]);
+print_dd(m div 60); print_char(":"); print_dd(m mod 60);
+@y
+print_int(sys_day); print_char(" ");
+months:='JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
+for k:=3*sys_month-2 to 3*sys_month do wlog(months[k]);
+print_char(" "); print_int(sys_year); print_char(" ");
+print_dd(sys_time div 60); print_char(":"); print_dd(sys_time mod 60);
+@z
+@x module 1211
+fix_date_and_time; init_randoms((internal[time] div unity)+internal[day]);@/
+@y
+fix_date_and_time; init_randoms(sys_time+sys_day*unity);@/
+@z
+
-------------
999. The absolutely final change (to be made after my death)
@x module 2
-@d banner=='This is METAFONT, Version 2.7182818' {printed when \MF\ starts}
+@d banner=='This is METAFONT, Version 2.71828182' {printed when \MF\ starts}
@y
@d banner=='This is METAFONT, Version $e$' {printed when \MF\ starts}
@z
diff --git a/systems/knuth/dist/errata/tex82.bug b/systems/knuth/dist/errata/tex82.bug
index 7d7a8c34ba..12de105bae 100644
--- a/systems/knuth/dist/errata/tex82.bug
+++ b/systems/knuth/dist/errata/tex82.bug
@@ -1577,7 +1577,7 @@ but I decided later in the day to do a few more things:
231. \the to be an expandable control sequence (July 12)
Several things in the language are cleaned up:
a) \the\tenrm replaced by \fontname\tenrm [\fontname<font>]
-b) when expanding edef, etc., result of \the still expanded only only level
+b) when expanding edef, etc., result of \the still expanded only one level
c) expansion after \def not inhibited, since \noexpand is now present
d) \the\the disallowed.
@@ -9044,10 +9044,186 @@ other multiletter control sequences are (found by Oleg Bulatov, 14 Sep 2008)
begin print_esc("csname"); print_esc("endcsname"); print_char(" ");
@z
+429. Don't echo error message to terminal when tracing paragraphs
+(Udo Wermuth, 15 January 2017)
+@x module 826
+ begin no_shrink_error_yet:=false;
+@y
+ begin no_shrink_error_yet:=false;
+ @!stat if tracing_paragraphs>0 then end_diagnostic(true);@+tats@;
+@z
+@x
+ error;
+@y
+ error;
+ @!stat if tracing_paragraphs>0 then begin_diagnostic;@+tats@;
+@z
+
+430. Defeat interactions during batch mode (Xiaosa Zhang, 27 June 2020)
+@x module 83
+@ @<Get user's advice...@>=
+loop@+begin continue: clear_for_error_prompt; prompt_input("? ");
+@y
+@ @<Get user's advice...@>=
+loop@+begin continue: if interaction<>error_stop_mode then return;
+ clear_for_error_prompt; prompt_input("? ");
+@z
+
+431. Don't exit to editor if no input file is at the bottom line
+(Xiaosa Zhang, 03 July 2020)
+@x module 84
+"E": if base_ptr>0 then
+@y
+"E": if base_ptr>0 then if input_stack[base_ptr].name_field>=256 then
+@z
+@x module 85
+if base_ptr>0 then print("E to edit your file,");
+@y
+if base_ptr>0 then if input_stack[base_ptr].name_field>=256 then
+ print("E to edit your file,");
+@z
+
+432. Keep date and time in system variables, use them in opening banner
+(Udo Wermuth, 11 December 2020)
+@x module 241
+Since standard \PASCAL\ cannot provide such information, something special
+is needed. The program here simply specifies July 4, 1776, at noon; but
+users probably want a better approximation to the truth.
+
+@p procedure fix_date_and_time;
+begin time:=12*60; {minutes since midnight}
+day:=4; {fourth day of the month}
+month:=7; {seventh month of the year}
+year:=1776; {Anno Domini}
+@y
+Since standard \PASCAL\ cannot provide such information, something special
+is needed. The program here simply assumes that suitable values appear in
+the global variables \\{sys\_time}, \\{sys\_day}, \\{sys\_month}, and
+\\{sys\_year} (which are initialized to noon on 4 July 1776,
+in case the implementor is careless).
+
+@p procedure fix_date_and_time;
+begin sys_time:=12*60;
+sys_day:=4; sys_month:=7; sys_year:=1776; {self-evident truths}
+time:=sys_time; {minutes since midnight}
+day:=sys_day; {day of the month}
+month:=sys_month; {month of the year}
+year:=sys_year; {Anno Domini}
+@z
+@x module 246
+@ Of course we had better declare another global variable, if the previous
+routines are going to work.
+
+@<Glob...@>=
+@!old_setting:0..max_selector;
+@y
+@ Of course we had better declare a few more global variables, if the previous
+routines are going to work.
+
+@<Glob...@>=
+@!old_setting:0..max_selector;
+@!sys_time,@!sys_day,@!sys_month,@!sys_year:integer;
+ {date and time supplied by external system}
+@z
+@x module 536
+print_int(day); print_char(" ");
+months:='JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
+for k:=3*month-2 to 3*month do wlog(months[k]);
+print_char(" "); print_int(year); print_char(" ");
+print_two(time div 60); print_char(":"); print_two(time mod 60);
+@y
+print_int(sys_day); print_char(" ");
+months:='JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
+for k:=3*sys_month-2 to 3*sys_month do wlog(months[k]);
+print_char(" "); print_int(sys_year); print_char(" ");
+print_two(sys_time div 60); print_char(":"); print_two(sys_time mod 60);
+@z
+
+433. After nine parameters, delete both # and the token that follows
+(Bruno Le Floch, 22 October 2020)
+@x module 473
+label found,done,done1,done2;
+@y
+label found,continue,done,done1,done2;
+@z
+@x module 474
+begin loop begin get_token; {set |cur_cmd|, |cur_chr|, |cur_tok|}
+@y
+begin loop begin continue: get_token; {set |cur_cmd|, |cur_chr|, |cur_tok|}
+@z
+@x module 476
+ help1("I'm going to ignore the # sign you just used."); error;
+@y
+ help2("I'm going to ignore the # sign you just used,")@/
+ ("as well as the token that followed it."); error; goto continue;
+@z
+
+434. Don't accept an implicit left brace after # in macro head
+(Udo Wermuth, 20 May 2020)
+@x module 476
+if cur_cmd=left_brace then
+@y
+if cur_tok<left_brace_limit then
+@z
+
+435. Keep garbage out of the buffer if a |\read| end unexpectedly
+(DRF, 17 February 2018)
+@x module 486
+ align_state:=1000000; error;
+@y
+ align_state:=1000000; limit:=0; error;
+@z
+
+436. Zero out nonexistent chars, to prevent rogue TFM files
+(DRF, 06 October 2020)
+@x module 722
+ math_type(a):=empty;
+@y
+ math_type(a):=empty; cur_i:=null_character;
+@z
+
+437. Don't classify fraction noads as inner noads (DRF, 25 March 2019)
+@x module 761
+fraction_noad: begin t:=inner_noad; s:=fraction_noad_size;
+ end;
+@y
+fraction_noad: s:=fraction_noad_size;
+@z
+
+438. Properly identify tabskip glue when tracing repeated templates
+(Igor Liferenko, 10 January 2020)
+@x module 793
+link(p):=new_glue(glue_ptr(cur_loop));
+@y
+link(p):=new_glue(glue_ptr(cur_loop));
+subtype(link(p)):=tab_skip_code+1;
+@z
+
+439. Use the correct range for local variable hn (DRF, 31 October 2020)
+@x module 892
+@!hn:small_number; {the number of positions occupied in |hc|}
+@y
+@!hn:0..64; {the number of positions occupied in |hc|;
+ not always a |small_number|}
+@z
+
+440. Normalize newlinechar when printing the final stats
+(Udo Wermuth, 29 November 2020)
+@x module 1333
+begin @<Finish the extensions@>;
+@y
+begin @<Finish the extensions@>; new_line_char:=-1;
+@z
+@x module 1335
+begin c:=cur_chr;
+@y
+begin c:=cur_chr; if c<>1 then new_line_char:=-1;
+@z
+
-----------
999. The absolutely final change (to be made after my death)
@x module 2
-@d banner=='This is TeX, Version 3.14159265' {printed when \TeX\ starts}
+@d banner=='This is TeX, Version 3.141592653' {printed when \TeX\ starts}
@y
@d banner=='This is TeX, Version $\pi$' {printed when \TeX\ starts}
@z
diff --git a/systems/knuth/dist/etc/vftovp.web b/systems/knuth/dist/etc/vftovp.web
index cf0ba73326..a145709338 100644
--- a/systems/knuth/dist/etc/vftovp.web
+++ b/systems/knuth/dist/etc/vftovp.web
@@ -18,7 +18,7 @@
\def\title{VF\lowercase{to}VP}
\def\contentspagenumber{101}
\def\topofcontents{\null
- \def\titlepage{F} % include headline on the contents page
+ \titlefalse % include headline on the contents page
\def\rheader{\mainfont\hfil \contentspagenumber}
\vfill
\centerline{\titlefont The {\ttitlefont VFtoVP} processor}
@@ -1270,7 +1270,7 @@ end
@* Outputting the TFM info.
\TeX\ checks the information of a \.{TFM} file for validity as the
file is being read in, so that no further checks will be needed when
-typesetting is going on. And when it finds something wrong, it justs
+typesetting is going on. And when it finds something wrong, it just
calls the file ``bad,'' without identifying the nature of the problem,
since \.{TFM} files are supposed to be good almost all of the time.
diff --git a/systems/knuth/dist/etc/vptovf.web b/systems/knuth/dist/etc/vptovf.web
index 03b057e88b..724398e61a 100644
--- a/systems/knuth/dist/etc/vptovf.web
+++ b/systems/knuth/dist/etc/vptovf.web
@@ -22,7 +22,7 @@
\def\title{VP\lowercase{to}VF}
\def\contentspagenumber{201}
\def\topofcontents{\null
- \def\titlepage{F} % include headline on the contents page
+ \titlefalse % include headline on the contents page
\def\rheader{\mainfont\hfil \contentspagenumber}
\vfill
\centerline{\titlefont The {\ttitlefont VPtoVF} processor}
@@ -440,7 +440,7 @@ both be used within the same \.{CHARACTER} list.
\yskip\noindent
The elements of a \.{VARCHAR} property list are either \.{TOP}, \.{MID},
-\.{BOT} or \.{REP}; the values are integers, which must be zero or the number
+\.{BOT}, or \.{REP}; the values are integers, which must be zero or the number
of a character in the font. A zero value for \.{TOP}, \.{MID}, or \.{BOT} means
that the corresponding piece of the extensible character is absent. A nonzero
value, or a \.{REP} value of zero, denotes the character code used to make
@@ -475,8 +475,8 @@ The slashes specify retention of the left or right original character; the
\yskip\hang\.{KRN} (a one-byte value and a real value). The instruction
`\.{(KRN} $c$ $r$\.)' means, ``If the next character is $c$, then insert
-a blank space of width $r$ between the current character character and $c$;
-otherwise go on to the next intruction.'' The value of $r$, which is in
+a blank space of width $r$ between the current character and $c$;
+otherwise go on to the next instruction.'' The value of $r$, which is in
design units, is often negative. Character code $c$ must exist
in the font.
diff --git a/systems/knuth/dist/lib/grayf.mf b/systems/knuth/dist/lib/grayf.mf
index 1a34e18fd1..7765ebd812 100644
--- a/systems/knuth/dist/lib/grayf.mf
+++ b/systems/knuth/dist/lib/grayf.mf
@@ -10,7 +10,7 @@ forsuffixes m = mag,rep:
mg := mag; mag := 1; mode_setup;
if mg>1: hppp := hppp*mg; vppp := vppp*mg;
extra_endchar:=
- "if charcode>0:currentpicture:=currentpicture scaled mg;fi"
+ "if charcode>0:currentpicture:=currentpicture scaled mg;fi;"
& extra_endchar; fi;
if picture pix_picture: rep := 1;
diff --git a/systems/knuth/dist/lib/plain.tex b/systems/knuth/dist/lib/plain.tex
index 2b72027dff..0f363a96c0 100644
--- a/systems/knuth/dist/lib/plain.tex
+++ b/systems/knuth/dist/lib/plain.tex
@@ -225,11 +225,11 @@
\outer\def\newcount{\alloc@0\count\countdef\insc@unt}
\outer\def\newdimen{\alloc@1\dimen\dimendef\insc@unt}
\outer\def\newskip{\alloc@2\skip\skipdef\insc@unt}
-\outer\def\newmuskip{\alloc@3\muskip\muskipdef\@cclvi}
+\outer\def\newmuskip{\alloc@3\muskip\muskipdef\@cclv}
\outer\def\newbox{\alloc@4\box\chardef\insc@unt}
\let\newtoks=\relax % we do this to allow plain.tex to be read in twice
\outer\def\newhelp#1#2{\newtoks#1#1\expandafter{\csname#2\endcsname}}
-\outer\def\newtoks{\alloc@5\toks\toksdef\@cclvi}
+\outer\def\newtoks{\alloc@5\toks\toksdef\@cclv}
\outer\def\newread{\alloc@6\read\chardef\sixt@@n}
\outer\def\newwrite{\alloc@7\write\chardef\sixt@@n}
\outer\def\newfam{\alloc@8\fam\chardef\sixt@@n}
@@ -1238,4 +1238,4 @@
\nonfrenchspacing % punctuation affects the spacing
\catcode`@=12 % at signs are no longer letters
-\def\fmtname{plain}\def\fmtversion{3.141592653} % identifies the current format
+\def\fmtname{plain}\def\fmtversion{3.1415926535} % identifies the current format
diff --git a/systems/knuth/dist/lib/slant.mf b/systems/knuth/dist/lib/slant.mf
index 3763222bce..b851c3e1d8 100644
--- a/systems/knuth/dist/lib/slant.mf
+++ b/systems/knuth/dist/lib/slant.mf
@@ -19,8 +19,8 @@ pickup pencircle scaled r; ruler := savepen;
for k=1 upto n:
beginchar(k,k*u#*s,n*u#,0);
pickup ruler; draw origin--(k*u*s,k*u);
- unfill (lft-1,bot -1)--(rt 1,bot -1)
- --(rt 1,0)--(lft-1,0)--cycle;
+ unfill (lft -1,bot -1)--(rt 1,bot -1)
+ --(rt 1,0)--(lft -1,0)--cycle;
unfill ((lft -1,0)--(rt 1,0)
--(rt 1,top 1)--(lft -1,top 1)--cycle) shifted (k*u*s,k*u);
endchar; endfor
diff --git a/systems/knuth/dist/lib/webmac.tex b/systems/knuth/dist/lib/webmac.tex
index 5ca707bb9b..ec44128d45 100644
--- a/systems/knuth/dist/lib/webmac.tex
+++ b/systems/knuth/dist/lib/webmac.tex
@@ -1,5 +1,5 @@
% standard macros for WEB listings (in addition to PLAIN.TEX)
-\xdef\fmtversion{\fmtversion+WEBMAC4.1} % identifies current set of macros
+\xdef\fmtversion{\fmtversion+WEBMAC4.2} % identifies current set of macros
\parskip 0pt % no stretch between paragraphs
\parindent 1em % for paragraphs and for the first line of Pascal text
@@ -84,8 +84,10 @@
\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}}
+ {\xdef\modstar{#1}\let\*=\empty\xdef\modno{#1}}% remove \* from section name
+ \ifx\modno\modstar \onmaybe \else\ontrue \fi
+ \mark{{{\tensy x}\modno}{\rhead}}}
+ % each \mark is {section reference or null}{group title}
\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
@@ -115,10 +117,14 @@
\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\lheader{\mainfont\the\pageno\eightrm\qquad\rhead
+ \hfill\title\qquad\mainfont\topsecno} % top line on left-hand pages
+\def\rheader{\mainfont\topsecno\eightrm\qquad\title\hfill
+ \rhead\qquad\mainfont\the\pageno} % top line on right-hand pages
+\def\topsecno{\expandafter\takeone\topmark}
+\def\takeone#1#2{#1}
+\def\taketwo#1#2{#2}
+\def\nullsec{\eightrm\kern-2em} % the \kern-2em cancels \qquad in headers
\def\page{\box255 }
\def\normaloutput#1#2#3{\ifodd\pageno\hoffset=\pageshift\fi
\shipout\vbox{
@@ -129,6 +135,7 @@
\global\advance\pageno by1}
\def\rhead{\.{WEB} OUTPUT} % this running head is reset by starred sections
+\mark{\noexpand\nullsec{\rhead}}
\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
@@ -183,6 +190,7 @@
\if L\lr\else\null\vfill\eject\fi % finish the current page
\parfillskip 0pt plus 1fil
\def\rhead{NAMES OF THE SECTIONS}
+ \let\topsecno=\nullsec
\message{Section names:}
\output{\normaloutput\page\lheader\rheader}
\setpage
diff --git a/systems/knuth/dist/mf/mf.web b/systems/knuth/dist/mf/mf.web
index ca3cb2518d..065dd2f802 100644
--- a/systems/knuth/dist/mf/mf.web
+++ b/systems/knuth/dist/mf/mf.web
@@ -1,6 +1,7 @@
% This program is copyright (C) 1984 by D. E. Knuth; all rights are reserved.
-% Copying of this file is authorized only if (1) you are D. E. Knuth, or if
-% (2) you make absolutely no changes to your copy. (The WEB system provides
+% Unlimited copying and redistribution of this file are permitted as long
+% as this file is not modified. Modifications are permitted, but only if
+% the resulting file is not named mf.web. (The WEB system provides
% for alterations via an auxiliary file; the master file should stay intact.)
% In other words, METAFONT is under essentially the same ground rules as TeX.
@@ -26,6 +27,7 @@
% Version 2.71828 suppressed autorounding in dangerous cases (June 2003).
% Version 2.718281 was a general cleanup with minor fixes (February 2008).
% Version 2.7182818 was similar (January 2014).
+% Version 2.71828182 was similar (January 2021).
% A reward of $327.68 will be paid to the first finder of any remaining bug.
@@ -155,7 +157,7 @@ helping to determine whether an implementation deserves to be
known as `\MF\kern.5pt' [cf.~Stanford Computer Science report CS1095,
January 1986].
-@d banner=='This is METAFONT, Version 2.7182818' {printed when \MF\ starts}
+@d banner=='This is METAFONT, Version 2.71828182' {printed when \MF\ starts}
@ Different \PASCAL s have slightly different conventions, and the present
@!@:PASCAL H}{\ph@>
@@ -166,7 +168,7 @@ reader see how to make an appropriate interface for other systems
if necessary. (\ph\ is Charles Hedrick's modification of a compiler
@^Hedrick, Charles Locke@>
for the DECsystem-10 that was originally developed at the University of
-Hamburg; cf.\ {\sl SOFTWARE---Practice \AM\ Experience \bf6} (1976),
+Hamburg; cf.\ {\sl Software---Practice and Experience \bf6} (1976),
29--42. The \MF\ program below is intended to be adaptable, without
extensive changes, to most other versions of \PASCAL, so it does not fully
use the admirable features of \ph. Indeed, a conscious effort has been
@@ -830,7 +832,7 @@ representing the beginning and ending of a line of text.
@!max_buf_stack:0..buf_size; {largest index used in |buffer|}
@ The |input_ln| function brings the next line of input from the specified
-field into available positions of the buffer array and returns the value
+file into available positions of the buffer array and returns the value
|true|, unless the file has already been entirely read, in which case it
returns |false| and sets |last:=first|. In general, the |ASCII_code|
numbers that represent the next line of the file are input into
@@ -1218,7 +1220,7 @@ on the information that \.{WEB} has output while processing \MF.
label done,exit;
var @!k,@!l:0..255; {small indices or counters}
@!m,@!n:text_char; {characters input from |pool_file|}
-@!g:str_number; {garbage}
+@!g:str_number; {the string just created}
@!a:integer; {accumulator for check sum}
@!c:boolean; {check sum has been checked}
begin pool_ptr:=0; str_ptr:=0; max_pool_ptr:=0; max_str_ptr:=0; str_start[0]:=0;
@@ -1499,9 +1501,9 @@ end;
@ Here is the very first thing that \MF\ prints: a headline that identifies
the version number and base name. The |term_offset| variable is temporarily
-incorrect, but the discrepancy is not serious since we assume that the banner
-and base identifier together will occupy at most |max_print_line|
-character positions.
+incorrect, but the discrepancy is not serious since we assume that this
+part of the program is system dependent.
+@^system dependencies@>
@<Initialize the output...@>=
wterm(banner);
@@ -1538,7 +1540,7 @@ by all \PASCAL\ compilers.
@<Basic print...@>=
procedure print_int(@!n:integer); {prints an integer in decimal form}
-var k:0..23; {index to current digit; we assume that $|n|<10^{23}$}
+var k:0..23; {index to current digit; we assume that $\vert n\vert<10^{23}$}
@!m:integer; {used to negate |n| in possibly dangerous cases}
begin k:=0;
if n<0 then
@@ -1758,7 +1760,8 @@ if error_count=100 then
exit:end;
@ @<Get user's advice...@>=
-loop@+begin continue: clear_for_error_prompt; prompt_input("? ");
+loop@+begin continue: if interaction<>error_stop_mode then return;
+ clear_for_error_prompt; prompt_input("? ");
@.?\relax@>
if last=first then return;
c:=buffer[first];
@@ -1783,7 +1786,7 @@ case c of
"0","1","2","3","4","5","6","7","8","9": if deletions_allowed then
@<Delete |c-"0"| tokens and |goto continue|@>;
@t\4\4@>@;@+@!debug "D":begin debug_help;goto continue;@+end;@+gubed@/
-"E": if file_ptr>0 then
+"E": if file_ptr>0 then if input_stack[file_ptr].name_field>=256 then
begin print_nl("You want to edit file ");
@.You want to edit file x@>
slow_print(input_stack[file_ptr].name_field);
@@ -1804,7 +1807,8 @@ begin print("Type <return> to proceed, S to scroll future error messages,");@/
@.Type <return> to proceed...@>
print_nl("R to run without stopping, Q to run quietly,");@/
print_nl("I to insert something, ");
-if file_ptr>0 then print("E to edit your file,");
+if file_ptr>0 then if input_stack[file_ptr].name_field>=256 then
+ print("E to edit your file,");
if deletions_allowed then
print_nl("1 or ... or 9 to ignore the next 1 to 9 tokens of input,");
print_nl("H for help, X to quit.");
@@ -1999,7 +2003,7 @@ begin if OK_to_interrupt then
print_err("Interruption");
@.Interruption@>
help3("You rang?")@/
- ("Try to insert some instructions for me (e.g.,`I show x'),")@/
+ ("Try to insert an instruction for me (e.g., `I show x;'),")@/
("unless you just want to quit by typing `X'.");
deletions_allowed:=false; error; deletions_allowed:=true;
interrupt:=0;
@@ -2200,7 +2204,7 @@ sets |arith_error:=true|. Most of \MF's internal computations have
been designed to avoid this sort of error.
Notice that if 64-bit integer arithmetic were available,
-we could simply compute |(@t$(2^{29}$@>*p+q)div (2*q)|.
+we could simply compute |@t$(2^{29}$@>*p+q)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
@@ -4111,7 +4115,7 @@ fuss with. Every such parameter has an identifying code number, defined here.
@d fillin=38 {extra darkness of diagonal lines}
@d turning_check=39 {controls reorientation of clockwise paths}
@d warning_check=40 {controls error message when variable value is large}
-@d boundary_char=41 {the right boundary character for ligatures}
+@d boundary_char=41 {the boundary character for ligatures}
@d max_given_internal=41
@<Glob...@>=
@@ -4265,17 +4269,21 @@ int_name[boundary_char]:="boundarychar";
input and output, establishes the initial values of the date and time.
@^system dependencies@>
Since standard \PASCAL\ cannot provide such information, something special
-is needed. The program here simply specifies July 4, 1776, at noon; but
-users probably want a better approximation to the truth.
+is needed. The program here simply assumes that suitable values appear in
+the global variables \\{sys\_time}, \\{sys\_day}, \\{sys\_month}, and
+\\{sys\_year} (which are initialized to noon on 4 July 1776,
+in case the implementor is careless).
Note that the values are |scaled| integers. Hence \MF\ can no longer
be used after the year 32767.
@p procedure fix_date_and_time;
-begin internal[time]:=12*60*unity; {minutes since midnight}
-internal[day]:=4*unity; {fourth day of the month}
-internal[month]:=7*unity; {seventh month of the year}
-internal[year]:=1776*unity; {Anno Domini}
+begin sys_time:=12*60;
+sys_day:=4; sys_month:=7; sys_year:=1776; {self-evident truths}
+internal[time]:=sys_time*unity; {minutes since midnight}
+internal[day]:=sys_day*unity; {day of the month}
+internal[month]:=sys_month*unity; {month of the year}
+internal[year]:=sys_year*unity; {Anno Domini}
end;
@ \MF\ is occasionally supposed to print diagnostic information that
@@ -4299,11 +4307,13 @@ if blank_line then print_ln;
selector:=old_setting;
end;
-@ Of course we had better declare another global variable, if the previous
+@ Of course we had better declare a few more global variables, if the previous
routines are going to work.
@<Glob...@>=
@!old_setting:0..max_selector;
+@!sys_time,@!sys_day,@!sys_month,@!sys_year:integer;
+ {date and time supplied by external system}
@ We will occasionally use |begin_diagnostic| in connection with line-number
printing, as follows. (The parameter |s| is typically |"Path"| or
@@ -4874,7 +4884,7 @@ else begin print_scaled(v); c:=digit_class;
end
@ Strictly speaking, a genuine token will never have |info(p)=0|.
-But we will see later (in the |print_variable_name| routine) that
+But we will see later (in the definition of attribute nodes) that
it is convenient to let |info(p)=0| stand for `\.{[]}'.
@<Display a collective subscript@>=
@@ -5584,7 +5594,7 @@ The global variable |save_ptr| points to the top item on the save stack.
@ @<Set init...@>=save_ptr:=null;
@ The |save_variable| routine is given a hash address |q|; it salts this
-address in the save stack, together with its current equivalent,
+address away in the save stack, together with its current equivalent,
then makes token~|q| behave as though it were brand new.
Nothing is stacked when |save_ptr=null|, however; there's no way to remove
@@ -7036,9 +7046,9 @@ $$a_k'=a_k+\delta\k-\delta_k;\qquad
Here $a\ll b$ means that $a\L b-2$, and $a\gg b$ means that $a\G b+2$.
The smoothing operation is symmetric in the sense that, if $a_0\ldots a_n$
-smoothes to $a_0'\ldots a_n'$, then the reverse sequence $a_n\ldots a_0$
-smoothes to $a_n'\ldots a_0'$; also the complementary sequence
-$(m-a_0)\ldots(m-a_n)$ smoothes to $(m-a_0')\ldots(m-a_n')$.
+smooths to $a_0'\ldots a_n'$, then the reverse sequence $a_n\ldots a_0$
+smooths to $a_n'\ldots a_0'$; also the complementary sequence
+$(m-a_0)\ldots(m-a_n)$ smooths to $(m-a_0')\ldots(m-a_n')$.
We have $a_0'+\cdots+a_n'=a_0+\cdots+a_n$ because $\delta_0=\delta_{n+1}=0$.
@p procedure smooth_moves(@!b,@!t:integer);
@@ -7073,7 +7083,7 @@ represents only the nonzero edge weights, since most of the edges are
weightless; in this way, the data storage requirements grow only linearly
with respect to the number of pixels per point, even though two-dimensional
data is being represented. (Well, the actual dependence on the underlying
-resolution is order $n\log n$, but the the $\log n$ factor is buried in our
+resolution is order $n\log n$, but the $\log n$ factor is buried in our
implicit restriction on the maximum raster size.) The sum of all edge
weights in each row should be zero.
@@ -10870,7 +10880,7 @@ right_type(q):=endpoint
k:=0; w:=link(h); ww:=knil(w);
mm0:=floor_unscaled(x_coord(p)+x_coord(w)-xy_corr[octant]);
mm1:=floor_unscaled(x_coord(q)+x_coord(ww)-xy_corr[octant]);
-for n:=0 to n1-n0 do env_move[n]:=mm0;
+for n:=0 to n1-n0-1 do env_move[n]:=mm0;
env_move[n1-n0]:=mm1; move_ptr:=0; m:=mm0
@ At this point |n| holds the value of |move_ptr| that was current
@@ -11074,7 +11084,7 @@ the results essentially independent of where the path falls on the raster.
For example, the exact envelope with respect to a pen of diameter~1
blackens a pixel if and only if the path intersects a circle of diameter~1
inscribed in that pixel; the resulting pattern has ``blots'' when the path
-is travelling diagonally in unfortunate raster positions. A much better
+is traveling diagonally in unfortunate raster positions. A much better
result is obtained when pixels are blackened only when the path intersects
an inscribed {\sl diamond\/} of diameter~1. Such a diamond is precisely
the polygon that \MF\ uses in the special case of a circle whose diameter is~1.
@@ -11417,7 +11427,7 @@ if d<alpha then d:=alpha
@ At this point there's a line of length |<=delta| from vertex~|p|
to vertex~|q|, orthogonal to direction $\bigl($|right_u(p),left_v(q)|$\bigr)$;
-and there's a line of length |>=delta| from vertex~|q| to
+and there's a line of length |>=delta| from vertex~|q|
to vertex~|r|, orthogonal to direction $\bigl($|right_u(q),left_v(r)|$\bigr)$.
The best line to direction $(u,v)$ should replace the line from
|p| to~|q|; this new line will have the same length as the old.
@@ -12111,7 +12121,7 @@ pretending to declare a screen buffer called |screen_pixel|. This code
is actually commented out, but it does specify the intended effects.
@<Glob...@>=
-@{@!screen_pixel:array[screen_row,screen_col] of pixel_color;@+@}
+@{@+@!screen_pixel:array[screen_row,screen_col] of pixel_color@t; @>@}
@ The |blank_rectangle| routine simply whitens all pixels that lie in
columns |left_col| through |right_col-1|, inclusive, of rows
@@ -12156,7 +12166,7 @@ program (see the commented-out code below).
@!n:screen_col);
var @!k:screen_col; {an index into |a|}
@!c:screen_col; {an index into |screen_pixel|}
-begin @{ k:=0; c:=a[0];
+begin @{@+k:=0; c:=a[0];
repeat incr(k);
repeat screen_pixel[r,c]:=b; incr(c);
until c=a[k];
@@ -13384,7 +13394,7 @@ list involved.
discussion above, is a code number that explains what kind of token list
is being scanned.
-\yskip\hang|name| points to the |eqtb| address of the control sequence
+\yskip\hang|name| points to the |eqtb| address of the macro
being expanded, if the current token list is a macro not defined by
\&{vardef}. Macros defined by \&{vardef} have |name=null|; their name
can be deduced by looking at their first two parameters.
@@ -13405,7 +13415,7 @@ a \&{for} or \&{forsuffixes} loop;
\indent|parameter|, if a \&{text} or \&{suffix} parameter is being scanned;
\indent|backed_up|, if the token list being scanned has been inserted as
-`to be read again'.
+`to be read again';
\indent|inserted|, if the token list being scanned has been inserted as
part of error recovery;
@@ -14674,7 +14684,7 @@ if cur_exp=true_code then
else if cur_cmd<>semicolon then
begin missing_err(";");@/
@.Missing `;'@>
- help2("After `exitif <boolean exp>' I expect to see a semicolon.")@/
+ help2("After `exitif <boolean expr>' I expect to see a semicolon.")@/
("I shall pretend that one was there."); back_error;
end;
end
@@ -14790,7 +14800,7 @@ input stack, so that |get_next| will proceed to read it next.
@t\4@>@<Declare the procedure called |print_arg|@>@;
@t\4@>@<Declare the procedure called |scan_text_arg|@>@;
procedure macro_call(@!def_ref,@!arg_list,@!macro_name:pointer);
- {invokes a user-defined control sequence}
+ {invokes a user-defined sequence of commands}
label found;
var @!r:pointer; {current node in the macro's token list}
@!p,@!q:pointer; {for list manipulation}
@@ -15126,7 +15136,7 @@ if_test,fi_or_else: case m of
endcases;
@ Here is a procedure that ignores text until coming to an \&{elseif},
-\&{else}, or \&{fi} at level zero of $\&{if}\ldots\&{fi}$
+\&{else}, or \&{fi} at the current level of $\&{if}\ldots\&{fi}$
nesting. After it has acted, |cur_mod| will indicate the token that
was found.
@@ -15369,8 +15379,8 @@ if cur_cmd<>colon then
`\&{endfor}' at the end of the loop. This will come through \MF's scanner
at the proper time to cause the loop to be repeated.
-(If the user tries some shenanigan like `\&{for} $\ldots$ \&{let} \&{endfor}',
-he will be foiled by the |get_symbol| routine, which keeps frozen
+(A user who tries some shenanigan like `\&{for} $\ldots$ \&{let} \&{endfor}'
+will be foiled by the |get_symbol| routine, which keeps frozen
tokens unchanged. Furthermore the |frozen_repeat_loop| is an \&{outer}
token, so it won't be lost accidentally.)
@@ -15910,13 +15920,11 @@ end
@ @<Print the banner...@>=
begin wlog(banner);
slow_print(base_ident); print(" ");
-print_int(round_unscaled(internal[day])); print_char(" ");
+print_int(sys_day); print_char(" ");
months:='JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
-m:=round_unscaled(internal[month]);
-for k:=3*m-2 to 3*m do wlog(months[k]);
-print_char(" "); print_int(round_unscaled(internal[year])); print_char(" ");
-m:=round_unscaled(internal[time]);
-print_dd(m div 60); print_char(":"); print_dd(m mod 60);
+for k:=3*sys_month-2 to 3*sys_month do wlog(months[k]);
+print_char(" "); print_int(sys_year); print_char(" ");
+print_dd(sys_time div 60); print_char(":"); print_dd(sys_time mod 60);
end
@ Here's an example of how these file-name-parsing routines work in practice.
@@ -15939,6 +15947,9 @@ crank up the output file.
@ Let's turn now to the procedure that is used to initiate file reading
when an `\.{input}' command is being processed.
+Beware: For historic reasons, this code foolishly conserves a tiny bit
+of string pool space; but that can confuse the interactive `\.E' option.
+@^system dependencies@>
@p procedure start_input; {\MF\ will \.{input} something}
label done;
@@ -15962,7 +15973,7 @@ if job_name=0 then
if term_offset+length(name)>max_print_line-2 then print_ln
else if (term_offset>0)or(file_offset>0) then print_char(" ");
print_char("("); incr(open_parens); slow_print(name); update_terminal;
-if name=str_ptr-1 then {we can conserve string pool space now}
+if name=str_ptr-1 then {conserve string pool space (but see note above)}
begin flush_string(name); name:=cur_name;
end;
@<Read the first line of the new file@>;
@@ -16066,7 +16077,7 @@ knot list. The |future_pen| option occurs only as an output of |scan_primary|
and |scan_secondary|, not as an output of |scan_tertiary| or |scan_expression|.
\smallskip\hang
-|cur_type=path_type| means that |cur_exp| points to a the first node of
+|cur_type=path_type| means that |cur_exp| points to the first node of
a path; nobody else points to this particular path. The control points of
the path will have been chosen.
@@ -16106,7 +16117,7 @@ dependency list.
\smallskip\hang
|cur_type=proto_dependent| means that |cur_exp| points to a |proto_dependent|
-capsule node . The |dep_list| field in this capsule
+capsule node. The |dep_list| field in this capsule
points to the associated dependency list.
\smallskip\hang
@@ -20847,11 +20858,11 @@ deleted if $c=0$; then we pass over $a$~characters to reach the next
current character (which may have a ligature/kerning program of its own).
If the very first instruction of the |lig_kern| array has |skip_byte=255|,
-the |next_char| byte is the so-called right boundary character of this font;
+the |next_char| byte is the so-called boundary character of this font;
the value of |next_char| need not lie between |bc| and~|ec|.
If the very last instruction of the |lig_kern| array has |skip_byte=255|,
-there is a special ligature/kerning program for a left boundary character,
-beginning at location |256*op_byte+remainder|.
+there is a special ligature/kerning program for a boundary character at the
+left, beginning at location |256*op_byte+remainder|.
The interpretation is that \TeX\ puts implicit boundary characters
before and after each consecutive string of characters from the same font.
These implicit characters do not appear in the output, but they can affect
@@ -20868,7 +20879,7 @@ the condition
$$\hbox{|256*op_byte+remainder<nl|.}$$
If such an instruction is encountered during
normal program execution, it denotes an unconditional halt; no ligature
-command is performed.
+or kerning command is performed.
@d stop_flag=128+min_quarterword
{value indicating `\.{STOP}' in a lig/kern program}
@@ -20968,8 +20979,8 @@ is kept in additional arrays called |header_byte|, |lig_kern|,
@!nk:0..max_kerns; {the number of distinct kerns so far}
@!exten:array[eight_bits] of four_quarters; {extensible character recipes}
@!ne:0..256; {the number of extensible characters so far}
-@!param:array[1..max_font_dimen] of scaled; {\&{fontinfo} parameters}
-@!np:0..max_font_dimen; {the largest \&{fontinfo} parameter specified so far}
+@!param:array[1..max_font_dimen] of scaled; {\&{fontdimen} parameters}
+@!np:0..max_font_dimen; {the largest \&{fontdimen} parameter specified so far}
@!nw,@!nh,@!nd,@!ni:0..256; {sizes of \.{TFM} subtables}
@!skip_table:array[eight_bits] of 0..lig_table_size; {local label status}
@!lk_started:boolean; {has there been a lig/kern step in this command yet?}
@@ -21128,7 +21139,7 @@ header_byte_code, font_dimen_code: begin c:=cur_mod; get_x_next;
if cur_cmd<>colon then
begin missing_err(":");
@.Missing `:'@>
- help1("A colon should follow a headerbyte or fontinfo location.");
+ help1("A colon should follow a headerbyte or fontdimen location.");
back_error;
end;
if c=header_byte_code then @<Store a list of header bytes@>
@@ -22582,6 +22593,8 @@ macros to dump words of different types:
@ The inverse macros are slightly more complicated, since we need to check
the range of the values we are reading in. We say `|undump(a)(b)(x)|' to
read an integer value |x| that is supposed to be in the range |a<=x<=b|.
+System error messages should be suppressed when undumping.
+@^system dependencies@>
@d undump_wd(#)==begin get(base_file); #:=base_file^;@+end
@d undump_int(#)==begin get(base_file); #:=base_file^.int;@+end
@@ -22881,7 +22894,8 @@ cannot produce error messages. For example, it would be a mistake to call
might lead to an infinite loop.
@^system dependencies@>
-This program doesn't bother to close the input files that may still be open.
+If |final_cleanup| is bypassed, this program doesn't bother to close
+the input files that may still be open.
@<Last-minute...@>=
procedure close_files_and_terminate;
@@ -23038,7 +23052,7 @@ if (base_ident=0)or(buffer[loc]="&") then
while (loc<limit)and(buffer[loc]=" ") do incr(loc);
end;
buffer[limit]:="%";@/
-fix_date_and_time; init_randoms((internal[time] div unity)+internal[day]);@/
+fix_date_and_time; init_randoms(sys_time+sys_day*unity);@/
@<Initialize the print |selector|...@>;
if loc<limit then if buffer[loc]<>"\" then start_input; {\&{input} assumed}
end
@@ -23070,14 +23084,15 @@ program below. (If |m=13|, there is an additional argument, |l|.)
@!debug procedure debug_help; {routine to display various things}
label breakpoint,exit;
var @!k,@!l,@!m,@!n:integer;
-begin loop begin wake_up_terminal;
+begin clear_terminal;
+ loop begin wake_up_terminal;
print_nl("debug # (-1 to exit):"); update_terminal;
@.debug \#@>
read(term_in,m);
if m<0 then return
else if m=0 then
- begin goto breakpoint;@\ {go to every label at least once}
- breakpoint: m:=0; @{'BREAKPOINT'@}@\
+ begin goto breakpoint;@/ {go to every declared label at least once}
+ breakpoint: m:=0; @{'BREAKPOINT'@}@/
end
else begin read(term_in,n);
case m of
diff --git a/systems/knuth/dist/mf/mfbook.tex b/systems/knuth/dist/mf/mfbook.tex
index c1692a6f52..3c5cb4db07 100644
--- a/systems/knuth/dist/mf/mfbook.tex
+++ b/systems/knuth/dist/mf/mfbook.tex
@@ -112,7 +112,7 @@ ISBN 0-201-13444-6 (soft)\cr}}
\noindent
%{\sl \kern-1pt Incorporates the final corrections made in 1995,
% and a few dozen more.}
-{\sl \kern-1pt Incorporates all corrections known in 2013.}
+{\sl \kern-1pt Incorporates all corrections known in 2020.}
\smallskip
\noindent
Internet page {\tt http://www-cs-faculty.stanford.edu/\char`\~
@@ -125,11 +125,20 @@ Copyright $\copyright$ 1986 by the American Mathematical Society
\noindent
This book is published jointly by the American Mathematical Society
and Addison\kern.1em--Wesley Publishing Company.
-All rights reserved. No part of this publication may be reproduced, stored in
-a retrieval system, or transmitted, in any form or by any means,
-electronic, mechanical, photocopying, recording, or otherwise, without
-the prior written permission of the publishers. Printed in the United
-States of America. % Published simultaneously in Canada.
+All rights reserved.
+%No part of this publication may be reproduced, stored in
+%a retrieval system, or transmitted, in any form or by any means,
+%electronic, mechanical, photocopying, recording, or otherwise, without
+%the prior written permission of the publishers. Printed in the United
+%States of America.
+This publication is protected by copyright, and permission must be
+obtained from the publisher prior to any prohibited reproduction, storage in
+a~retrieval system, or transmission in any form or by any means, electronic,
+mechanical, photocopying, recording, or likewise. For information regarding
+permissions, request forms, and the appropriate contacts with the
+Pearson Education Global Rights \& Permissions Department, please visit
+ {\tt www.pearson.com/permissions/}.
+Printed in the United States of America. % Published simultaneously in Canada.
\medskip
\noindent
%ISBN 0-201-13444-6\par % paperback
@@ -141,11 +150,21 @@ ISBN-10 \enspace\phantom{978-}0-201-13444-6 (soft)\par
%11 12 13 14 15 16--CRS--07 06 05 04 03 02 % paperback
%7 8 9 10 11 12 13--CRS--07 06 05 04 03 02 01 % hardcover
\smallskip\noindent
-Text printed in the United States
- at Courier Westford in Westford, Massachusetts.\par\noindent
-Eighth Printing, February 2012\par\noindent
-Twelfth Printing, February 2012 (soft)
+%Text printed in the United States
+%% at Courier Westford in Westford, Massachusetts.\par\noindent
+%%at LSC Communications in Crawfordsville, Indiana.\par\noindent
+%at LSC Communications\par\noindent
+%%Eighth Printing, February 2012\par\noindent
+%Fourteenth Softcover Printing, May 2017\par\noindent
+%14\quad17
+%Ninth Printing, November 2017\par\noindent
+%9\quad17
+Tenth Printing, February 2021\par\noindent
+\smallskip
+\font\pearsonkluj=arial at 9pt
+\leftline{\pearsonkluj ScoutAutomatedPrintCode}
^^{Knuth, Donald Ervin}
+^^|\copyright|
\eject
% dedication
\titlepage
@@ -421,7 +440,7 @@ comparable to the choice books they have in their cabinets?
\\17. Grouping. 155.
\\18. Definitions (also called Macros). 159.
\\19. Conditions and Loops. 169.
-\\20. More about Macros. 175.
+\\20. More About Macros. 175.
\\21. Random Numbers. 183.
\\22. Strings. 187.
\\23. Online Displays. 191.
@@ -483,7 +502,7 @@ describing languages). Similarly, a ^{meta-font} is a schematic description
of the shapes in a family of related fonts; the letterforms change
appropriately as their underlying parameters change.
-Meta-design is much more difficult than design; it's easier to draw something
+Meta-design is much more difficult than design. It's easier to draw something
than to explain how to draw it. One of the problems is that different sets
of potential specifications can't easily be envisioned all at once.
Another is that a computer has to be told absolutely everything.
@@ -1432,7 +1451,7 @@ one pixel tall before rotation.
used with two or more points. What do you think \MF\ will do
if you ask it to perform the following commands?
\begindisplay
-@draw@ $z_1$;\ @draw@ $z_2$; \ @draw@ $z_3$; \ @draw@ $z_4$;
+@draw@ $z_1$; \ @draw@ $z_2$; \ @draw@ $z_3$; \ @draw@ $z_4$;
\ @draw@ $z_5$; \ @draw@ $z_6$.
\enddisplay
\answer Six individual points will be drawn, instead of lines or curves.
@@ -1548,9 +1567,9 @@ downward; i.e., $t$~might be unequal to~$b$ in the equations for
\begingroup\decreasehsize 165pt
\dangerexercise An enlarged \strut\vadjust{\box0}%
picture of \MF's `{\manual h}' shows that it has five key points. Assuming ^^{M}
-that special values $ss$ and~"ygap" have been precomputed and that the equations
+that special values "ss" and~"ygap" have been precomputed and that the equations
\begindisplay
-$x_1=ss=w-x_5$;\quad$y_3-y_1="ygap"$\cr
+$x_1="ss"=w-x_5$;\quad$y_3-y_1="ygap"$\cr
\enddisplay
have already been given, what further equations and `@draw@' ^^{METAFONT
logo} commands will complete the specification of this letter? \ (The
@@ -1672,7 +1691,7 @@ by $z_1\ldots z_6$.
\begindisplay
@fill@ $z_5\to z_4\to z_1\to z_3\to z_6\to\cycle$;\cr
$z_0=(.8[x_1,x_2],.5[y_1,y_4])$;\cr
-@for@ $k=1$ @upto@ 6: $z_k'=.2[z_k,z_0]$; @endfor@\cr
+@for@ $k=1$ @upto@ 6: $z[k]'=.2[z[k],z_0]$; @endfor@\cr
@unfill@ $z_5'\to z_4'\to z_1'\to z_3'\to z_6'\to\cycle$.\cr
\enddisplay
@@ -1771,7 +1790,7 @@ It's a nuisance to write long-winded @fill@ commands when broad-edge
pens are being simulated in this way, so \MF\ provides a convenient
abbreviation: You can write simply
\begindisplay
-^@penstroke@ $z_{1e}\to z_{2e}\{"right"\}\to\{"right"\}z_{3e}$
+^@penstroke@ $z_{1e}\to z_{2e}\{"right"\}\to\{"right"\}\,z_{3e}$
\enddisplay
instead of the command `\thinspace@fill@ $z_{1l}\to
z_{2l}\{"right"\}\to\{"right"\}\,z_{3l} \dashto
@@ -1825,7 +1844,7 @@ $\penpos1("stem",15)$; \ $\penpos2(.9"stem",12)$;\cr
$\penpos3("stem",10)$; \ $x_1=x_2=x_3=.5w$;\cr
$y_1=h$; \ $y_2=.55h$; \ $y_3=0$;\cr
$x_{2l}:={1\over6}[x_{2l},x_2]$;\cr
-@penstroke@ $z_{1e}\to z_{2e}\{down\}\to z_{3e}$.\cr
+@penstroke@ $z_{1e}\to z_{2e}\{"down"\}\to z_{3e}$.\cr
\enddisplay
Setting $x_1=x_2=x_3=.5w$ centers the stroke; setting $y_1=h$ and $y_3=0$
makes it sit in the type box, protruding just slightly at the top and bottom.
@@ -1927,17 +1946,17 @@ $x_{3r}=x_{6r}=w$;\cr
$y_{1r}=y_2=y_{3l}=h$;\cr
$y_{4r}=y_5=y_{6l}=0$;\cr
$z_{1'}=.25[z_1,z_6]$; \ $z_{6'}=.75[z_1,z_6]$;\cr
-$theta_1:=\angle(w,-h)+90$;\cr
-$\penpos1(b,theta_1)$; \ $\penpos6(b,theta_1)$;\cr
-$z_7=.5[z_1,z_6]$; \ $\penpos7(.6b,theta_1)$;\cr
-$\penpos{1'}(b,theta_1)$; \ $\penpos{6'}(b,theta_1)$;\cr
+$"theta"_1:=\angle(w,-h)+90$;\cr
+$\penpos1(b,"theta"_1)$; \ $\penpos6(b,"theta"_1)$;\cr
+$z_7=.5[z_1,z_6]$; \ $\penpos7(.6b,"theta"_1)$;\cr
+$\penpos{1'}(b,"theta"_1)$; \ $\penpos{6'}(b,"theta"_1)$;\cr
@penstroke@ $z_{1e}\to z_{1'e}\{z_{6'}-z_{1'}\}\to z_{7e}\to
\{z_{6'}-z_{1'}\}z_{6'e}\to z_{6e}$;\cr
$z_{3'}=.25[z_3,z_4]$; \ $z_{4'}=.75[z_3,z_4]$;\cr
-$theta_3:=\angle(-w,-h)+90$;\cr
-$\penpos3(b,theta_3)$; \ $\penpos4(b,theta_3)$;\cr
-$z_8=.5[z_1,z_6]$; \ $\penpos8(.6b,theta_3)$;\cr
-$\penpos{3'}(b,theta_3)$; \ $\penpos{4'}(b,theta_3)$;\cr
+$"theta"_3:=\angle(-w,-h)+90$;\cr
+$\penpos3(b,"theta"_3)$; \ $\penpos4(b,"theta"_3)$;\cr
+$z_8=.5[z_1,z_6]$; \ $\penpos8(.6b,"theta"_3)$;\cr
+$\penpos{3'}(b,"theta"_3)$; \ $\penpos{4'}(b,"theta"_3)$;\cr
@penstroke@ $z_{3e}\to z_{3'e}\{z_{4'}-z_{3'}\}\to z_{8e}\to
\{z_{4'}-z_{3'}\}z_{4'e}\to z_{4e}$;\cr
$\penpos2(b,0)$; \ $\penpos5(b,0)$; \ @penstroke@ $z_{2e}\to z_{5e}$.\cr
@@ -2152,7 +2171,7 @@ true, ``sharped'' forms of these parameters need to be converted to
``unsharped'' pixel-oriented quantities, and best results are obtained when
such conversions are done carefully. After \MF\ has obeyed line~7 of the
example, the pixel-oriented parameters "em", "cap", "thin", "thick",
-and~"o" are ready to be used as we draw letters of the font.
+and~$o$ are ready to be used as we draw letters of the font.
Line 8 defines a quantity called "curve\_sidebar" ^^{sidebar} that will
measure the distance of the left and right edges of the `O' from the
@@ -2164,7 +2183,7 @@ when we work at this particular resolution.
Before we go any further, we ought to discuss the strange collection
of words and pseudo-words in the file |io.mf|. Which of the terms
-`|mode_setup|', `|em|', `|curve_sidebar|' and so forth are part of
+`|mode_setup|', `|em|', `|curve_sidebar|', and so forth are part of
the \MF\ language, and which of them are made up specifically for
the Io example? Well, it turns out that almost {\sl nothing\/} in this
example is written in the pure \MF\ language that the computer understands!
@@ -2216,7 +2235,7 @@ with `|&plain \relax|' instead of just `|\relax|'. These conventions are
exactly the same as those of \TeX.
Our Ionian example uses the following words that are not part of plain
-\MF: "em", "cap", "thin", "thick", "o", "curve\_sidebar", "test\_I", "code",
+\MF: "em", "cap", "thin", "thick", $o$, "curve\_sidebar", "test\_I", "code",
"trial\_stem", "trial\_width", and "stem". If you change these to some other
words or symbols---for example, if you replace `|thin|' and `|thick|' by
`|t|' and `|T|' respectively, in lines 3, 6, 10, and~11---the results will
@@ -2437,8 +2456,10 @@ produce a font that is magnified fourfold; i.e., the results will be
The computer will read |io.mf| as before, but this time it won't display an~`O';
characters are normally not displayed in fontmaking modes, because we usually
want the computer to run as fast as possible when it's generating a font
-that has already been designed. All you'll see is `|(io.mf| |[79])|',
-followed by~`^|*|'. Now the fun starts: You should type
+that has already been designed. All you'll see is
+`|(io.mf| |The| |letter| |O| |[79])|' or possibly only `|(io.mf| |[79])|',
+followed by~`^|*|'. Now the fun starts: You should type\par
+\noindent
\begintt
code=100;
for s=7 upto 10:
@@ -2630,7 +2651,7 @@ transcripts were called |io.log|.) \ At the end of Experiment~5 you'll
have a file |badio.log| that will serve as a helpful reminder of
what errors need to be fixed up.
-The `^|?|' that appears after the context display means that \MF\ wants
+The `^|?|'\ that appears after the context display means that \MF\ wants
advice about what to do next. If you've never seen an error message before,
or if you've forgotten what sort of response is expected, you can type
`|?|' now (go ahead and try it!); \MF\ will respond as follows:
@@ -2853,7 +2874,7 @@ you want to correct mistakes. \ (Why not look at
|badio.log| now, and |io.log| too, in order to get familiar with log files?)
\dangerexercise Suppose you were doing Experiment 3 with |badio| instead
-of~|io|, so you began by saying `|\mode=smoke|; |input| |badio|'. Then you
+of~|io|, so you began by saying `|\mode=smoke;| |input| |badio|'. Then you
would want to recover from the error on line~1 by inserting a correct
@mode\_setup@ command, instead of by simply \<return>ing, because
@mode\_setup@ is what really establishes "smoke" mode. Unfortunately if you
@@ -2985,7 +3006,7 @@ slightly greater than $1\over10$). It turns out that the tokens
\dangerexercise Are the following pairs of numeric tokens equivalent
to each other, when they appear in \MF\ programs?
\ (a)~|0| and |0.00001|; \ (b)~|0.00001| and |0.00002|;
-\ (c)~|0.00002| and |0.00003|; \ (d)~|04095.999999| and |10000|?
+\ (c)~|0.00002| and |0.00003|; \ (d)~|04095.999999| and |10000|.
\answer (a) No, the second token represents $1\over65536$. \ (A token has
the same meaning as~`|0|' ^^{zero} if and only if its decimal value
is strictly less than $2^{-17}=.00000\,76293\,94531\,25$.) \ (b)~Yes; both
@@ -3001,7 +3022,7 @@ which is too big.)
the following rules until no more characters remain on the line:
\smallskip
\hang\textindent{1)}If the next character is a ^{space}, or if it's a ^{period}
-(\thinspace`|.|'\thinspace) that isn't ^^{decimal point} followed by a
+(\thinspace`|.|'\thinspace)\ that isn't ^^{decimal point} followed by a
decimal digit or a period, ignore it and move on.
\hang\textindent{2)}If the next character is a ^{percent sign}
@@ -3060,7 +3081,7 @@ computer does.
\enddisplay
\answer \cstok{xx}, \cstok{3.1} (a numeric token), \cstok{.6} (another
numeric token), \cstok{..}, \cstok{[[}, \cstok{a}, \cstok{+-},
-\cstok{bc\_d}, \cstok{e}, \cstok{]}, \cstok{]}, {\chardef\"=`\"\cstok{\"a
+\cstok{bc\char`\_d}, \cstok{e}, \cstok{]}, \cstok{]}, {\chardef\"=`\"\cstok{\"a
\%\"} (a string token), \cstok{<\|>}, \cstok{(} (see rule~5), \cstok{(},
\cstok{\$}, \cstok{1} (a numeric token), \cstok{5} (likewise numeric),
\cstok{\"+-\"} (a string token), and \cstok{\"\"}} (a string token that
@@ -3738,13 +3759,13 @@ The expression `|known|~|a|' ^^{known} is true if and only if the value
of~|a| is fully known.
\dangerexercise What causes the error messages in `|0>1|~|or|~|a<a|'\thinspace?
-\answer Since `^@or@' has stronger precedence than `$<$' or `$>$', ^^|<| ^^|>|
+\answer Since `^{or}' has stronger precedence than `$<$' or `$>$', ^^|<| ^^|>|
\MF\thinspace\ tries to evaluate this expression by putting things in
-parentheses as follows: `$(0>(1\mathbin{\bf or}a))<a$'. Now
-`$1\mathbin{\bf or}a$' makes no sense, because `@or@' operates only on
+parentheses as follows: `$(0>(1\mathbin{\rm or}a))<a$'. Now
+`$1\mathbin{\rm or}a$' makes no sense, because `or' operates only on
booleans; in such cases \MF\ uses the right operand~`$a$' as the result. Then
`$\mkern1mu0>a$' is indeterminate because $a$~is unknown; \MF\ treats this as
-false. Finally `${\rm false}<a$' is another illegal combination of types.
+@false@. Finally `$@false@<a$' is another illegal combination of types.
\danger The rest of this chapter is entirely preceded by ``dangerous bend''
signs, so you can safely omit it on first reading (unless you're hooked
@@ -3900,7 +3921,7 @@ out different each time the computer is asked for a new random number
\noalign{\vskip2pt}
uniformdeviate 100&47.4241\cr
uniformdeviate 100&97.28148\cr
-uniformdeviate -100&-36.16279\cr
+uniformdeviate -100&-36.1628\cr
(normaldeviate,normaldeviate)&(0.46236,-1.87648)\cr
\enddemo
The value of `uniformdeviate\thinspace100' is a random number between 0 and~100;
@@ -3924,17 +3945,17 @@ z scaled 3&(3x,3y)\cr
z xscaled 2 yscaled 1/2&(2x,0.5y)\cr
z shifted (2,3)&(x+2,y+3)\cr
z shifted 3right&(x+3,y)\cr
-z slanted 1/6&(x+0.16667y,y)\cr
+z slanted 1/6&(0.16667y+x,y)\cr
z rotated 90&(-y,x)\cr
z rotated 30&(-0.5y+0.86603x,0.86603y+0.5x)\cr
xpart(z rotated 30)&-0.5y+0.86603x\cr
ypart(z rotated 30)&0.86603y+0.5x\cr
(1,2)*(3,4)&(3,4)\werror\cr
(1,2)zscaled(3,4)&(-5,10)\cr
-(a,b)zscaled(3,4)&(3a-4b,4a+3b)\cr
-(a,b)zscaled dir 30&(0.86603a-0.5b,0.5a+0.86603b)\cr
+(a,b)zscaled(3,4)&(-4b+3a,3b+4a)\cr
+(a,b)zscaled dir 30&(-0.5b+0.86603a,0.86603b+0.5a)\cr
(1,2)dotprod(3,4)&11\cr
-(a,b)dotprod(3,4)&3a+4b\cr
+(a,b)dotprod(3,4)&4b+3a\cr
dir 21 dotprod dir 51&0.86603\cr
(3,4)dotprod((30,40)rotated 90)&0\cr
\enddemo
@@ -4125,9 +4146,10 @@ expressions. We shall consider only a portion of the numeric and pair
cases here, in order to have a foretaste of the complete menu:
\def\\#1{\thinspace{\tt#1}\thinspace}
\beginsyntax
-<numeric primary>\is<numeric atom>
- \alt<numeric atom>[\char'133]<numeric expression>%
- [,]<numeric expression>[\char'135]
+<numeric atom>\is<numeric variable>
+ \alt<numeric token primary>
+ \alt[(]<numeric expression>[)]
+ \alt[normaldeviate]
\alt[length]<string primary>
\alt[length]<path primary>
\alt[length]<pair primary>
@@ -4135,13 +4157,12 @@ cases here, in order to have a foretaste of the complete menu:
\alt[xpart]<pair primary>
\alt[ypart]<pair primary>
\alt<numeric operator><numeric primary>
-<numeric atom>\is<numeric variable>
- \alt<numeric token primary>
- \alt[(]<numeric expression>[)]
- \alt[normaldeviate]
<numeric token primary>\is<numeric token>[/]<numeric token>
\alt<numeric token not followed by %
`{\tt/}$\thinspace\langle$numeric token$\rangle$'\thinspace>
+<numeric primary>\is<numeric atom not followed by {[\char'133]<expression>[,]}>
+ \alt<numeric atom>[\char'133]<numeric expression>%
+ [,]<numeric expression>[\char'135]
<numeric operator>\is[sqrt]\alt[sind]\alt[cosd]\alt[mlog]\alt[mexp]
\alt[floor]\alt[uniformdeviate]\alt<scalar multiplication operator>
<scalar multiplication operator>\is<plus or minus>
@@ -4242,11 +4263,11 @@ as `|..|'.]
\endchapter
A maiden was sitting there who was lovely as any picture,
-% ein bildsch\"one Jungfrau,
+% eine bildsch\"one Jungfrau,
nay, so beautiful that no words can express it.
-% nein so sch\"on, dass es nicht so sagen ist.
+% nein so sch\"on, da\ss\ es nicht zu sagen ist,
\author JAKOB and WILHELM ^{GRIMM}, {\sl Fairy Tales\/} (1815)
- % Kinder- und hausm\"archen, vol 2, #166; translated by Margaret Hunt
+ % Kinder- und Hausm\"archen, vol 2, #166; translated by Margaret Hunt
% in Strong Hans (Der starke Hans), about 4/5 of the way through
% This quote and the next were found by online computer search at SAIL
% in the files GRIMM[lib,doc] and WUTHER[lib,doc]
@@ -4335,23 +4356,24 @@ millimeter, based on the resolution determined by "mode" and "mag".)
\\$x_4=w-.01"in"$\\
Point 4 should be one-hundredth of an inch inside the right edge of
-the type. \ (Plain \MF's ^@beginchar@ routine sets variable~^"w" equal
+the type. \ (Plain \MF's ^@beginchar@ routine sets variable~^{$w$} equal
to the width of whatever character is currently being drawn, expressed in
pixels.)
\\$y_4=.5h$\\
Point 4 should be halfway between the baseline and the top of the type.
-\ (Plain \MF's @beginchar@ sets ^"h" to the height of the
+\ (Plain \MF's @beginchar@ sets ^{$h$} to the height of the
current character, in pixels.)
\\$y_6=-d$\\
Point 6 should be below the baseline, at the bottom edge of the type.
-\ (Each character has a ``^{bounding box}'' that runs from $(0,h)$
+\ (With plain \MF's @beginchar@ each
+character has a ``^{bounding box}'' that runs from $(0,h)$
at the upper left and $(w,h)$ at the upper right to $(0,-d)$ and~$(w,-d)$
-at the lower left and lower right; variable~^"d" represents the depth of
+at the lower left and lower right; variable~^{$d$} represents the depth of
the type. The values of $w$, $h$, and~$d$ might change from character to
-character, since the individual pieces of type in a computer-produced
-font need not have the same size.)
+character, since the individual pieces of type need not have the same size
+in a computer-produced font.)
\\$y_8=.5[h,-d]$\\
Point 8 should be halfway between the top and bottom edges of the type.
@@ -4555,7 +4577,7 @@ with unknown quantities. For example, it's possible to say
^"top"\thinspace\<unknown>, ^"bot"\thinspace\<unknown>,
^"lft"\thinspace\<unknown>, ^"rt"\thinspace\<unknown>, and even
\begindisplay
-@penpos@\<suffix>(\<unknown>,\thinspace\<known>).
+"penpos"\<suffix>(\<unknown>,\thinspace\<known>).
\enddisplay
\danger A \MF\ program can say `\<unknown>$[a,b\mkern1mu]$' when $a-b$ is
@@ -4740,12 +4762,12 @@ old value of variable~$a$ should be discarded. \MF\ can't simply delete
an independent variable that has things depending on it, so it
chooses a dependent variable to take $a$'s place; the computer prints out
\begintt
-### 0.5a=-0.5b-c+1.5
+### 0.5a=-c-0.5b+1.5
\endtt
^^{hash hash hash} meaning that $0.5a$ will be replaced by $-c-{1\over2}b
+{3\over2}$ in all dependencies, before $a$ is discarded. Variable $c$ is
now independent again; `^@showdependencies@' will reveal that the only
-dependent variable is now $d$, which equals $0.75b+0.5c+0.75$. \ (This
+dependent variable is now $d$, which equals $0.5c+0.75b+0.75$. \ (This
is correct, for if the variable~$a$ is eliminated from the two given
equations we obtain $4d=3b+2c+3$.) \ The variable chosen for independence
is one that has the greatest coefficient of dependency with respect
@@ -5291,13 +5313,13 @@ end of Appendix~B.
talking about could be defined by saying
\begindisplay
@mode\_def@ "luxo" $=$\cr
-\quad$"pixels\_per\_inch":=2000$;&|%| high res, almost 30 per point\cr
-\quad$"blacker":=.1$;&|%| make pens a teeny bit blacker\cr
-\quad$"o\_correction":=1$;&|%| keep the full overshoot\cr
-\quad$"fillin":=0.1$;&|%| compensate for darkened corners\cr
-\quad$"proofing":=0$;&|%| no, we're not making proofs\cr
-\quad$"fontmaking":=1$;&|%| yes, we are making a font\cr
-\quad$"tracingtitles":=1$; \ @enddef@;&|%| yes, show titles online\cr
+\quad$"pixels\_per\_inch":=2000$;&\% high res, almost 30 per point\cr
+\quad$"blacker":=.1$;&\% make pens a teeny bit blacker\cr
+\quad$"o\_correction":=1$;&\% keep the full overshoot\cr
+\quad$"fillin":=0.1$;&\% compensate for darkened corners\cr
+\quad$"proofing":=0$;&\% no, we're not making proofs\cr
+\quad$"fontmaking":=1$;&\% yes, we are making a font\cr
+\quad$"tracingtitles":=1$; \ @enddef@;&\% yes, show titles online\cr
\enddisplay
The name of the mode should be a single symbolic token. The resolution
should be specified by assigning a value to "pixels\_per\_inch"; all other
@@ -5370,7 +5392,7 @@ end % and stop.
Similar files |logo9.mf| and |logo8.mf| will produce 9-point
`\thinspace{\manual hijklmnj}\thinspace' and \hbox{8-point}
`\thinspace{\manual opqrstuq}\thinspace'; the letters get a little
-wider in relation to their height, and the inter-character spacing
+wider in relation to their height, and the intercharacter spacing
gets significantly wider, as the size gets smaller:
\begintt
% 9-point METAFONT logo % 8-point METAFONT logo|smallskip
@@ -5409,7 +5431,7 @@ dimensions will be used in several of the programs for individual letters.
Then |logo.mf| makes the conversion to pixel units:
\begintt
% Routines for the METAFONT logo
-% (logo10.mf is a typical parameter file)
+% (logo10.mf is a typical parameter file)|smallskip
mode_setup;
ygap#:=(ht#/13.5u#)*xgap#; % vertical adjustment
leftstemloc#:=2.5u#+s#; % position of left stems
@@ -5428,8 +5450,8 @@ After the initial definitions just shown, |logo.mf| continues with
programs for each of the seven letters. For example,
here is the program for `{\manual ^{E}}', which illustrates the
\rightfig 11a ({224\apspix} x {216\apspix}) ^-11pt
-use of $u\0$, $s\0$, $"ht"\0$, "leftstemloc", "barheight", "xgap",
-and "logo\_pen":
+use of $u\0$, $s\0$, $"ht"\0$, "logo\_pen", "leftstemloc", $o$,
+"xgap", and "barheight":
\begintt
beginchar("E",14u#+2s#,ht#,0);
pickup logo_pen;
@@ -5463,7 +5485,7 @@ edge of the lower bar, and the center of the middle bar and the stem).
almost the same as `{\manual i}'\thinspace).
\answer The only possible surprise is the position of $y_1$,
which should match similar details in the `{\manual h}'
-and the~`\kern1pt{\manual j}\kern1pt' of Chapter~4:
+and the~`\kern.5pt{\manual j}\kern.5pt' of Chapter~4:
\begintt
beginchar("F",14*u#+2s#,ht#,0); pickup logo_pen;
x1=x2=x3=leftstemloc; x4=w-x1+o; x5=x4-xgap;
@@ -5473,8 +5495,8 @@ labels(1,2,3,4,5); endchar;
\endtt
\dangerexercise Write the complete programs for `{\manual h}' ^^{M} ^^{T}
-and `\kern1pt{\manual j}\kern1pt', based on the information in Chapter~4,
-but using the style of the program for `{\manual E}' above. The character
+and `\kern.5pt{\manual j}\kern.5pt', based on the information in Chapter~4,
+but using the style of the program for `{\manual i}' above. The character
widths should be $18u\0+2s\0$ and $13u\0+2s\0$, respectively.
\checkequals\metaT\exno
\answer The quantity called "ss" in Chapter~4 is now "leftstemloc".
@@ -5492,11 +5514,11 @@ labels(1,2,3,4); endchar;
\endtt
\danger The file |logo.mf| also contains the following cryptic instructions,
-which cause the letter pairs `\kern1pt{\manual jk}' and `{\manual lm}' to
+which cause the letter pairs `\kern.5pt{\manual jk}' and `{\manual lm}' to
be typeset closer together than their bounding boxes would imply:
\begintt
ligtable "T": "A" kern -.5u#;
-ligtable "F": "O" kern -u#;|smallskip
+ligtable "F": "O" kern -u#;
\endtt
Without these corrections `\MF\kern1pt' would be ^^{kerning} ^^@kern@
`{\manual hij\/kl\/mnj}\kern1pt'. Uppercase letters are often subject to
@@ -5637,7 +5659,7 @@ if known pixmag: hppp:=pixmag*hppp; vppp:=pixmag*vppp; fi
\endtt
at the very end of that file. Then run \MF\ with
\begintt
-\mode="cheapo"; input cheaplogo10
+\mode=cheapo; input cheaplogo10
\endtt
where the file `|cheaplogo10.mf|' says simply `|pixmag=10;| |input| |logo10|'.
\ (The interim "hppp" setting and the ^@special@ command are
@@ -5685,7 +5707,7 @@ typeset by putting such boxes snugly next to each other.
The main difference
between the old conventions and the new~ones is that type boxes are now
allowed to vary in height as well as in width. For example, when \TeX\
-typesets `A~line~of~type.' it puts boxes together that essentially look
+typesets `A~line~of~type.'\ it puts boxes together that essentially look
like this: `\thinspace\demobox{A line of type.}\thinspace'. \ (The `A'
appears in a box `\thinspace\setbox0\hbox{A}\maketypebox\thinspace' that
sits on a given baseline, while the `y' appears in a box
@@ -5781,7 +5803,7 @@ new equipment.
The three dimensions in a @beginchar@ command are given in reverse
alphabetical order: First comes the width, then the height, then the depth.
The @beginchar@ routine converts these quantities into pixel units
-and assigns them to the three variables ^"w", ^"h", and~^"d". In fact,
+and assigns them to the three variables ^{$w$}, ^{$h$}, and~^{$d$}. In fact,
@beginchar@ rounds these dimensions to the nearest whole number of
pixels; hence $w$, $h$, and~$d$ will always be integers.
@@ -6044,15 +6066,15 @@ much larger fonts.)
\smallskip\textindent\bull^"chardx" and "chardy" represent horizontal and
vertical {\sl escapement\/} in units of pixels. \ (Some typesetting
-systems use both of these device-dependent amounts to change their current
+systems use both of these device-dependent amounts to alter their current
position on a page, just after typesetting each character. Other systems,
-like the ^|dvi| software associated with \TeX, assume that $"chardy"=0$
+like typical ^|dvi| software associated with \TeX, assume that $"chardy"=0$
but use "chardx" as the horizontal escapement whenever a horizontal
movement by "chardx" does not cause the subsequent position to ^{drift}
too far from the device-independent position defined by accumulated
"charwd" values. Plain \MF's @endchar@ routine keeps $"chardy"=0$, but
sets $"chardx":=w$ just before shipping a character to the output. This
-explains why a change to~^"w" will affect the spacing between adjacent
+explains why a change to~^{$w$} will affect the spacing between adjacent
letters, as discussed earlier.) \looseness=-1
\ddanger Two characters with the same $c$ code
@@ -6069,7 +6091,7 @@ exactly $11\pt$ apart. Therefore it extends below its baseline by $11\pt$;
but it is put into a box of depth zero, because \TeX\ would otherwise
think that the first line of the paragraph contains an extremely deep
character, and such depth would cause the second line to be moved down.
-$$\def\comment{\hfill{\tt\%} }
+$$\def\comment{\hfill{\%} }
\halign{\hbox to\hsize{\indent#\hfil}\cr
$"baselinedistance"\0:=11"pt"\0$; \ ^@define\_pixels@("baselinedistance");\cr
$"heavyline"\0:=50/36"pt"\0$; \ ^@define\_blacker\_pixels@("heavyline");\cr
@@ -6496,16 +6518,16 @@ the ``back'' square is drawn; then two lines of the ``front'' square are
erased, using a somewhat thicker pen; finally the remaining lines are
drawn with the ordinary pen:
\begindisplay
-$s\0:=5"pt"\0$; \ @define\_pixels@$(s)$; \ |%| side of the square\cr
-$z_1=(0,0)$; \ $z_2=(s,0)$; \ $z_3=(0,s)$; $z_4=(s,s)$;\cr
-^@for@ $k=1$ @upto@ 4: $z_{k+4}=z_k+({2\over3}s,{1\over3}s)$; \ @endfor@\cr
+$s\0:=5"pt"\0$; \ @define\_pixels@$(s)$; \ \% side of the square\cr
+$z_1=(0,0)$; \ $z_2=(s,0)$; \ $z_3=(0,s)$; \ $z_4=(s,s)$;\cr
+^@for@ $k=1$ @upto@ 4: $z[k+4]=z[k]+({2\over3}s,{1\over3}s)$; \ @endfor@\cr
\pickup @pencircle@ scaled $.4"pt"$; \
@draw@ $z_5\dashto z_6\dashto z_8\dashto z_7\dashto \cycle$;\cr
\pickup @pencircle@ scaled $1.6"pt"$; \
@erase@ @draw@ $z_2\dashto z_4\dashto z_3$;\cr
\pickup @pencircle@ scaled $.4"pt"$; \
@draw@ $z_1\dashto z_2\dashto z_4\dashto z_3\dashto \cycle$;\cr
-@for@ $k=1$ @upto@ 4: @draw@ $z_k\dashto z_{k+4}$; \ @endfor@.\cr
+@for@ $k=1$ @upto@ 4: @draw@ $z[k]\dashto z[k+4]$; \ @endfor@.\cr
\enddisplay
At its true size the resulting ^{cube} looks like this:
`\thinspace{\manual\cubea}\thinspace'.\par}
@@ -6527,7 +6549,7 @@ points and picking up the pen as before:
@cullit@; \ \pickup @pencircle@ scaled $.4"pt"$;\cr
@draw@ $z_3\dashto z_1\dashto z_2\dashto z_4$; \
@draw@ $z_5\dashto z_7\dashto z_8\dashto z_6$;\cr
-@for@ $k=1$ @upto@ 4: \ @draw@ $z_k\dashto z_{k+4}$; \ @endfor@.\cr
+@for@ $k=1$ @upto@ 4: \ @draw@ $z[k]\dashto z[k+4]$; \ @endfor@.\cr
\enddisplay
(Note that it would not be quite enough to erase only from $z_7$ to
${1\over3}[z_7,z_5]$!)\par
@@ -6569,7 +6591,7 @@ five points connected by ``tense'' lines as follows:
\begindisplay
@pair@ "center"; \ $"center"=(.5w,2"pt")$;\cr
@numeric@ "radius"; \ $"radius"=5"pt"$;\cr
-@for@ $k=0$ @upto@ 4: \ $z_k="center"+("radius",0)$
+@for@ $k=0$ @upto@ 4: \ $z[k]="center"+("radius",0)$
^{rotated}$(90+{360\over5}k)$; \ @endfor@\cr
@def@ :: = ^^{tension} $\to\tension 5\to$ @enddef@;\cr
@path@ "star"; \ $"star"=z_0::z_2::z_4::z_1::z_3::\cycle$;\cr
@@ -6585,10 +6607,10 @@ exercise:
\pickup @pencircle@ scaled $.4"pt"$; \ @draw@ "star";\cr
@cullit@; \ \pickup @pencircle@ scaled $1.6"pt"$;\cr
@for@ $k=0$ @upto@ 4:
- \ @undraw@ subpath$(k+.55,k+.7)$ @of@ "star"; \ @endfor@\cr
+ \ @undraw@ subpath$(k+.55,k+.7)$ of "star"; \ @endfor@\cr
@cullit@; \ \pickup @pencircle@ scaled $.4"pt"$;\cr
-@for@ $k=0$ @upto@ 4: \ @draw@ subpath$(k+.47,k+.8)$ @of@ "star"; \ @endfor@\cr
-@labels@(0,1,2,3,4); \ @endchar@.\cr
+@for@ $k=0$ @upto@ 4: \ @draw@ subpath$(k+.47,k+.8)$ of "star"; \ @endfor@\cr
+@labels@$(0,1,2,3,4)$; \ @endchar@.\cr
\enddisplay
However, as in the previous case, there's an Alternate Solution~1
by Bruce ^{Leban} that is preferable because it doesn't depend
@@ -6598,10 +6620,10 @@ on magic constants like .55 and~.47:
@picture@ "savedpicture"; \ $"savedpicture"=@nullpicture@$;\cr
@pen@ "eraser"; \ $"eraser":=@pencircle@$ scaled $1.6"pt"$;\cr
@for@ $k=0$ @upto@ 4:\cr
-\indent @draw@ subpath$(k,k+1)$ @of@ "star"; @cullit@;\cr
-\indent @undraw@ subpath$(k+3,k+4)$ @of@ "star" @withpen@ "eraser"; @cullit@;\cr
+\indent @draw@ subpath$(k,k+1)$ of "star"; @cullit@;\cr
+\indent @undraw@ subpath$(k+2,k+3)$ of "star" @withpen@ "eraser"; @cullit@;\cr
\indent @addto@ "savedpicture" @also@ "currentpicture"; @clearit@; @endfor@\cr
-$"currentpicture":="savedpicture"$; \ @labels@(0,1,2,3,4); \ @endchar@.\cr
+$"currentpicture":="savedpicture"$; \ @labels@$(0,1,2,3,4)$; \ @endchar@.\cr
\enddisplay
\dangerexercise What does the command `@fill@ "star"' do, if "star" is the
@@ -6620,7 +6642,7 @@ example, in the program
@path@ $S$; \ $S=((0,1)\to(2,0)\to(4,2)\to$\cr
\indent$(2,5.5)\to(0,8)\to(2,10)\to(3.5,9))$ scaled $9"pt"$;\cr
@for@ $k=0$ @upto@ 35: @overdraw@ ^"fullcircle" scaled 3"mm"\cr
-\indent shifted ^{point} $k/35\ast \mathop{\rm length} S$ @of@ $S$;
+\indent shifted ^{point} $k/35\ast \mathop{\rm length} S$ of $S$;
@endfor@\cr
\enddisplay
to create the curious ^{S} shown here.)
@@ -6635,7 +6657,7 @@ Explain how to produce it (or something very similar) with \MF\!.
exercise so that it applies to arbitrary cycles~$c$, even those that are
self-intersecting:
\begindisplay
-@def@ @overdraw@ @expr@ $c$ = ^@begingroup@\cr
+@def@ @overdraw@ @expr@ $c$ = ^@begingroup@ @save@ "region";\cr
\indent@picture@ "region"; $"region":=@nullpicture@$;\cr
\indent^@interim@ $"turningcheck":=0$; ^@addto@ "region" @contour@ $c$;\cr
\indent^@cull@ "region" @dropping@ $(0,0)$;\cr
@@ -6647,12 +6669,12 @@ self-intersecting:
\ The watchband is now formed by overdrawing its links, one at a time,
doing first the ones that are underneath:
\begindisplay
-@beginchar@$("M",1.25"in"\0,.5"in"\0,0)$; \
+@beginchar@$(|"M"|,1.25"in"\0,.5"in"\0,0)$; \
\pickup @pencircle@ scaled .4"pt";\cr
-$z_1=(20,-13)$; \ $z_2=(30,-6)$; \ $z_3=(20,1)$; $z_4=(4,-7)$;\cr
+$z_1=(20,-13)$; \ $z_2=(30,-6)$; \ $z_3=(20,1)$; \ $z_4=(4,-7)$;\cr
\indent $z_5=(-12,-13)$; \ $z_6=(-24,-4)$; \ $z_7=(-15,6)$;\cr
-@path@ $M$; $M=("origin"\to z1\to z2\to z3\to z4\to z5\to z6\to z7\to$\cr
-\indent$"origin"\to -z7\to -z6\to -z5\to -z4\to -z3\to -z2\to -z1\to\cycle)$\cr
+@path@ $M$; $M=("origin"\to z_1\to z_2\to z_3\to z_4\to z_5\to z_6\to z_7\to$\cr
+\indent$"origin"\to -z_7\to -z_6\to -z_5\to -z_4\to -z_3\to -z_2\to -z_1\to\cycle)$\cr
^^"origin" \indent\indent scaled $(h/26)$ shifted $(.5w,.5h)$;\cr
@def@ @link@(@expr@ $n$) =\cr
\indent @overdraw@ subpath ${1\over3}(n,n+1)$ of $M\;\dashto$\cr
@@ -6685,11 +6707,11 @@ heads this paragraph was made by substituting the following code for
the `@endchar@' in the program at the end of Chapter~12:
\begindisplay
@picture@ "dbend"; \ $"dbend"="currentpicture"$;\cr
-@endchar@; \ |%| end of the normal dangerous bend sign\cr
+@endchar@; \ \% end of the normal dangerous bend sign\cr
@beginchar@$(0,25u\0,"h\_height"\0+"border"\0,0)$;\cr
@fill@ $(0,-11"pt")\dashto(w,-11"pt")\dashto(w,h)\dashto(0,h)\dashto\cycle$;\cr
$"currentpicture":="currentpicture"-"dbend"$;\cr
-@endchar@;\ |%| end of the reversed dangerous bend sign\cr
+@endchar@;\ \% end of the reversed dangerous bend sign\cr
\enddisplay
^^{black/white reversal} The pixel values in "dbend" are all zero or more;
thus the pixels with a positive value, after "dbend" has been subtracted from
@@ -6706,7 +6728,7 @@ shifts the entire current picture three pixels to the right.
\danger There's a ``constant'' picture called ^@nullpicture@, whose pixel
values are all zero;
plain \MF\ defines `^@clearit@' to be an abbreviation for the
-assignment `"currentpicture":=@nullpicture@'. The current picture is
+assignment `$"currentpicture":=@nullpicture@$'. The current picture is
cleared automatically by every ^@beginchar@ and ^@mode\_setup@ command,
so you usually don't have to say `@clearit@' in your own programs.
@@ -6966,7 +6988,7 @@ and the pen is simple, the weight~$w$ is changed to~$-w$. If the turning
number is negative and the pen is complex, you get an error message about
a ``^{backwards path}.'' Finally, if the turning number is zero, you get
an error message about a ``^{strange path},'' unless the pen is simple and
-$"turningcheck"<=1$. Plain \MF\ sets $"turningcheck":=2$; the ^@filldraw@
+$"turningcheck"\le1$. Plain \MF\ sets $"turningcheck":=2$; the ^@filldraw@
macro in Appendix~B avoids the ``backwards path'' error by explicitly
reversing a path whose turning number is negative.
@@ -7098,7 +7120,7 @@ never stops with a ``^{strange path}'' error; furthermore, it never increases
a pixel value by more than~1, nor does it decrease any pixel values, even
when the cycle~$c$ is quite wild.)
\answer @vardef@ @safefill@ @expr@ $c$ $=$ ^@save@ "region";\parbreak
-\quad@picture@ "region"; "region"=@nullpicture@;\parbreak
+\quad@picture@ "region"; $"region"=@nullpicture@$;\parbreak
\quad^@interim@ ^"turningcheck"$\null:=0$;\parbreak
\quad @addto@ "region" @contour@ $c$; \
@cull@ "region" @dropping@ $(0,0)$;\parbreak
@@ -7128,10 +7150,10 @@ generations on your screen.
\answer (We assume that "currentpicture" initially has some configuration
in which all pixel values are zero or one; one means ``alive.'')
\begindisplay
-@picture@ $v$; @def@ "c" $=$ "currentpicture" @enddef@;\cr
+@picture@ $v$; @def@ $c$ $=$ "currentpicture" @enddef@;\cr
@forever@: \ $v:=c$; \ @showit@;\cr
-\quad @addto@ $c$ @also@ $c$ shifted "left" $+$ "c" shifted "right";\cr
-\quad @addto@ $c$ @also@ $c$ shifted "up" $+$ "c" shifted "down";\cr
+\quad @addto@ $c$ @also@ $c$ shifted "left" $+$ $c$ shifted "right";\cr
+\quad @addto@ $c$ @also@ $c$ shifted "up" $+$ $c$ shifted "down";\cr
\quad @addto@ $c$ @also@ $c-v$; \ @cull@ $c$ @keeping@ $(5,7)$; \ @endfor@.\cr
\enddisplay
(It is wise not to waste too much computer time watching this program.)
@@ -7178,13 +7200,13 @@ therefore produces the character `\kern1pt{\manual\circa}' in position
\exercise
Write a program that puts a {\sl filled\/} quarter-circle
-`\kern1pt{\manual\circb}' into font position~`{\tt b}'.
+`\kern1pt{\manual\circb}'\ into font position~`{\tt b}'.
\answer @beginchar@\kern1pt(|"b"|$,5"pt"\0,5"pt"\0,0)$;\parbreak
@fill@ $((0,0)\dashto"quartercircle"\dashto{\rm cycle})$
scaled 10"pt"; \ @endchar@.
\exercise
-Why are the `\kern1pt{\manual\circa}' and `\kern1pt{\manual\circb}'
+Why are the `\kern1pt{\manual\circa}' and `\kern1pt{\manual\circb}'\
characters of these examples only $5\,$pt wide and $5\,$pt high, although
they are made with the path `"quartercircle" scaled 10"pt"'?
\answer A "quartercircle" corresponds to a circle whose diameter
@@ -7498,8 +7520,8 @@ than to repeat points of a path.
\ddanger Sometimes it's desirable to take a path and change all its
connecting links to `$\ddashto$', regardless of what they were originally;
-the key points are left unchanged. Plain \MF\ has a ^"tensepath" operation
-that does this. For example, "tensepath"~"unitsquare"~$=$
+the key points are left unchanged. Plain \MF\ has a ^@tensepath@ operation
+that does this. For example, @tensepath@~"unitsquare"~$=$
$(0,0)\ddashto(1,0)\ddashto(1,1)\ddashto(0,1)\ddashto\cycle$.
When \MF\ is deciding what curves should be drawn in place of `$\to$' or
@@ -7632,7 +7654,8 @@ An empty direction specifier at the beginning or end of a path, or just next
to the `\&' operator, is effectively replaced by `$\{\curl1\}$'.
This rule should be interpreted properly with respect to cyclic paths, which
have no beginning or end; for example, `$z_0\to z_1\,\&\,z_1\to z_2\to\cycle$'
-is equivalent to `$z_0\to z_1\{\curl1\}\&\{\curl1\}z_1\to z_2\to\cycle$'.
+is equivalent to
+`$z_0\to z_1\{\curl1\}\thinspace\&\thinspace\{\curl1\}z_1\to z_2\to\cycle$'.
\danger If there's a nonempty direction specifier after a point but not
before it, the nonempty one is copied into both places. Thus, for example,
@@ -7860,7 +7883,7 @@ in the range $0\le t<n$.
\ddangerexercise True or false:\quad point $t$ of $(z_0\dashto z_1)$ $=$
$t[z_0,z_1]$.
\answer True if $0\le t\le1$, except perhaps for rounding errors;
-otherwise false. The path $z_0\dashto z_1$ expands into `$z_0\to
+otherwise false. The path $z_0\dashto z_1$ is equivalent to `$z_0\to
\controls1/3[z_0,z_1]\and2/3[z_0,z_1]\to z_1$', and the ^{Bernshte\u\i n}
polynomial simplifies because $t[w,w+\delta,w+2\delta,w+3\delta]=w+3t\delta$.
Incidentally, `point~$t$ of $(z_0\ddashto z_1)$' is usually quite
@@ -7945,7 +7968,7 @@ given any paths $p$ and~$q$ of length~$n$. It can be defined by a
fairly simple program:
\begindisplay
@vardef@ "interpath"(@expr@ $a,p,q) =$\cr
-\quad @for@ $t=0$ @upto@ length$\,p\;-1$: $a$[point $t$ of $p,\,$
+\quad @for@ $t=0$ @upto@ length$\,p-1$: $a$[point $t$ of $p,\,$
point $t$ of $q$]\cr
\qquad$\to\controls$ $a$[postcontrol $t$ of $p,\,$
postcontrol $t$ of $q$]\cr
@@ -7979,7 +8002,7 @@ $p=(100,0)\dashto(300,0)\dashto(200,0)\dashto(100,0)\dashto(0,0)
\enddisplay
notice that "interpath" doesn't necessarily preserve smoothness at the key
points. The right illustration was obtained by duplicating point
-$(100,0)$ in~$heart$ (thereby making it a path of length~7) and taking
+$(100,0)$ in~"heart" (thereby making it a path of length~7) and taking
\begindisplay
$p=(100,200)\dashto(200,200)\dashto(200,100)$\cr
\qquad$\dashto(200,0)\dashto(0,0)\dashto(0,100)\dashto(0,200)\dashto(100,200)$.
@@ -8070,7 +8093,7 @@ $p$~never turns to the right. Paths with cusps are numerically unstable,
and they might become ``^{strange}'' after transformations are applied,
because rounding errors might change their ^{turning numbers}. The path~$p$
in this example has control points that correspond to tensions of only
-0.28 with respect to the initial and final directions; since \MF\ insists
+about 0.28 with respect to the initial and final directions; since \MF\ insists
that ^{tension}s be at least~0.75, this anomalous path could never have arisen
if the control points hadn't been given explicitly.
@@ -8200,7 +8223,7 @@ $$\halign{\hbox to\parindent{\hfil\sevenrm#\ \ \ }&#\hfil\cr
(z_{5e},z_{6e},z_{7e},z_{8e},.72)$; \ @endfor@\cr
11&$\penpos{a1}("thin",0)$; \ $\penpos{a5}("whatever",-90)$; \
$\penpos{a9}("thin",180)$;\cr
-12&$x_{a1l}-x_{a9l}=1/3(x_{5l}-x_{7l})$;\ $x_{a5}=.5w$; \
+12&$x_{a1l}-x_{a9l}=1/3(x_{5l}-x_{7l})$; \ $x_{a5}=.5w$; \
$y_{a1}=y_{a9}$; \ $y_{a5r}=4/7h$;\cr
13&$x_{a3l}=x_{a1l}$; \ $x_{a3r}=x_{a1r}$; \ $x_{a4r}=1/6[x_{a3r},x_{1l}]$; \
$x_0=.5w$; \ $y_0=.52h$;\cr
@@ -8415,7 +8438,7 @@ call \MF's transformers ``^{affine transformations},'' and the special case in
which the xpart and ypart are zero is called ``^{homogeneous}.'')
\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:
+to ``^{hide}'' some declarations and commands before giving the next |expr|s:
\begindemo{175pt}
\demohead
hide(transform t[]) t1&(xpart t1,ypart t1,xxpart...)\cr
@@ -8458,7 +8481,7 @@ transform. What can you legally say instead?
a normal dangerous bend sign, as in the ``reverse-video'' example
of Chapter~13. Explain how to transform it into the ^{left-handed
dangerous bend} that heads this paragraph.
-\answer @beginchar@$(126,25u\0,"hheight"\0+"border"\0,0)$;
+\answer @beginchar@$(126,25u\0,"h\_height"\0+"border"\0,0)$; \
|"Dangerous left bend"|;\parbreak
$"currentpicture":="dbend"$ reflectedabout $\bigl((.5w,0),(.5w,h)\bigr)$; \
@endchar@;\medskip\noindent
@@ -8537,14 +8560,14 @@ instead of $p$ itself. We haven't mentioned this before, because
"currenttransform" is usually equal to "identity"; but nonstandard
settings of "currenttransform" can be used for special effects that
are occasionally desired. For example, it's possible to change
-`\MF\kern1pt' to `{\manual 89:;<=>:}\kern3pt' by simply saying
+`\MF\kern1pt' to `{\manual 89:;<=>:}\kern2pt'\ by simply saying
\begindisplay
$"currenttransform":="identity"$ slanted 1/4
\enddisplay
and executing the programs of |logo.mf| that are described in Chapter~11;
no other changes to those programs are necessary.
-It's worth noting that the pen nib used to draw `{\manual 89:;<=>:}\kern3pt'
+It's worth noting that the pen nib used to draw `{\manual 89:;<=>:}\kern2pt'\
was not slanted when "currenttransform" was changed; only the ``tracks'' of
the pen, the paths in @draw@ commands, were modified. Thus the slanted image
was not simply obtained by slanting the unslanted image.
@@ -8553,7 +8576,7 @@ was not simply obtained by slanting the unslanted image.
plain \MF\ will set "currenttransform" to `"identity" yscaled
^"aspect\_ratio"', and ^@pickup@ will similarly yscale the pen nibs
that are used for drawing. In this case the slanted
-`{\manual 89:;<=>:}\kern3pt' letters should be drawn with
+`{\manual 89:;<=>:}\kern2pt'\ letters should be drawn with
\begindisplay
$"currenttransform":="identity"$ slanted 1/4 yscaled "aspect\_ratio".
\enddisplay
@@ -8561,10 +8584,12 @@ $"currenttransform":="identity"$ slanted 1/4 yscaled "aspect\_ratio".
\ddangerexercise Our program for
`\kern1pt\lower2.5pt\hbox{\manual\fouru}\kern1pt' doesn't work when pixels
aren't square. Fix it so that it handles a general "aspect\_ratio".
-\answer Replace line 10 by
+\answer Replace lines 10 and 11 by
\begindisplay
@pickup@ @pencircle@ scaled 3/4"pt" yscaled 1/3 rotated $-60$;\cr
@draw@ ($z_1\ldots p$) transformed $t$;\cr
+@addto@ "currentpicture" @also@ "currentpicture"\cr
+\qquad rotatedaround$\bigl((.5w,.5h)$ yscaled "aspect\_ratio"$,-180\bigr)$;\cr
\enddisplay
\endchapter
@@ -8786,7 +8811,7 @@ offsets of a pen.
in Chapter~15, it changes into an ellipse of some sort, since all of
\MF's transformations preserve ellipse-hood. The diameter of the
ellipse in each direction~$\theta$ is decreased by $2\min\bigl(
-\vert\sin\theta\vert,\vert\cos\theta\vert\bigr)$ times the current
+\vert{\sin\theta}\vert,\vert{\cos\theta}\vert\bigr)$ times the current
value of~^"fillin", before converting to a polygon; this helps to
compensate for the variation in thickness of diagonal strokes with
respect to horizontal or vertical strokes, on certain output devices.
@@ -8965,7 +8990,7 @@ how to put programs together effectively.
A \MF\ program is a sequence of statements separated by semicolons and
followed by `^@end@'. More precisely, the syntax rules
\beginsyntax
-<program>\is<statement list>[end]
+<program>\is<statement list><statement>[end]
<statement list>\is<empty>\alt<statement>[;]<statement list>
\endsyntax
define a \<program> in terms of a \<statement>.
@@ -9076,7 +9101,7 @@ complicated things while in the middle of other calculations, thereby
greatly increasing the power of macro definitions (which we shall study
in the next chapter). A {\sl^{group expression}\/} has the general form
\begindisplay
-{\tt begingroup}\thinspace\<statement list>\thinspace\<expression>
+{\tt begingroup}\thinspace\<statement list>\thinspace\<expression>%
\thinspace{\tt endgroup}
\enddisplay
and it fits into the syntax of expressions at the primary level. The
@@ -9115,9 +9140,9 @@ right, performing the statements within groups as they appear.
\dangerexercise Appendix B defines ^"whatever" to be an abbreviation for
the group expression `@begingroup@ @save@ ?; ? @endgroup@'. Why
does this work? \checkequals\Xwhat\exno
-\answer The save instruction gives `?' a fresh meaning, hence `?' is
+\answer The save instruction gives `?'\ a fresh meaning, hence `?'\ is
a numeric variable unconnected to any other variables. When the group
-ends and `?' is restored to its old meaning, the value of the group
+ends and `?'\ is restored to its old meaning, the value of the group
expression no longer has a name. \ (It's called a ``^{capsule}'' if
you try to @show@ it.) \ Therefore the value of the group expression
is a new, nameless variable, as desired.
@@ -9220,11 +9245,11 @@ diagnose the reasons for unexpected behavior. If you say
`^"tracingmacros"$\null:=1$', the transcript file of your run will record
every macro that is subsequently expanded, followed by the values of its
arguments as soon as they have been computed.
-For example, `rotatedaround$\,("up",30)$' might produce the
-^^|EXPR0| following lines of diagnostic information:
+For example, `rotatedaround$\,("up",30)$' might produce a transcript
+^^|EXPR0| that includes the following diagnostic information:
\begintt
-rotatedaround(EXPR0)(EXPR1)->shifted-(EXPR0)rotated(EXPR1)sh
-ifted(EXPR0)
+rotatedaround(EXPR0)(EXPR1)->
+ shifted-(EXPR0)rotated(EXPR1)shifted(EXPR0)
(EXPR0)<-(0,1)
(EXPR1)<-30
\endtt
@@ -9253,7 +9278,7 @@ Chapter~11 starts with
\begintt
beginchar("E",14u#+2s#,ht#,0); pickup logo_pen;
\endtt
-and the programs for `{\manual M}', `\kern1pt{\manual T}\kern1pt',
+and the programs for `{\manual M}', `\kern.5pt{\manual T}\kern.5pt',
etc., all have almost the same beginning. Therefore we might as
well put the following definition near the top of the file |logo.mf|:
\begintt
@@ -9400,7 +9425,7 @@ regions $(z_{\$a},z_{\$l},z_{\$b})$ and $(z_{\$\mkern-1muf},z_{\$r},z_{\$e})$
\quad $z_{\$a}-z_{\$l}=z_{\$\mkern-1muf}-z_{\$r}=
("bracket"/{\rm abs\,sind}\,"theta")\ast {\rm dir}\,"theta"$;\cr
\quad $y_{\$c}=y_{\$d}$; \ $y_{\$b}=y_{\$e}=y_\$$; \
- $y_{\$b}-y_{\$c}=@if@\;"theta"<0:\;{-}\;@fi@\;"slab"$;\cr
+ $y_{\$b}-y_{\$c}=@if@\;"theta"<0\colon\;{-}\;@fi@\;"slab"$;\cr
\quad $x_{\$b}=x_{\$c}=x_{\$l}-"left\_jut"$; \
$x_{\$d}=x_{\$e}=x_{\$r}+"right\_jut"$;\cr
\quad @labels@$(\$a,\$b,\$c,\$d,\$e,\$\mkern-1muf)$ @enddef@;\cr
@@ -9446,7 +9471,7 @@ by which serifs protrude on a ``normal'' letter like `H'.
\displayfig 18c (252\apspix)
$$\halign to\hsize\bgroup\indent#\hfil\tabskip1em plus1fil minus1fil
&\tabskip0pt\hfil\%\ #\cr
-@beginchar@\kern1pt(|"A"|$,13u\0,ht\0,0)$;\cr
+@beginchar@\kern1pt(|"A"|$,13u\0,"ht"\0,0)$;\cr
$z_1=(.5w,1.05h)$;&top point\cr
$x_{4l}=w-x_{5r}=u$; \ $y_{4l}=y_{5r}="slab"$;&bottom points\cr
@numeric@ $"theta"[\,]$;\cr
@@ -9468,11 +9493,11 @@ $z_3="whatever"[z_1,z_{5l}]$;\cr
@penstroke@ $z_{2e}\dashto z_{3e}$;&the crossbar\cr
@penlabels@$(0,1,2,3,4,5)$; \ @endchar@;\cr
\noalign{\medskip}
-@beginchar@\kern1pt(|"I"|$,6u\0,ht\0,0)$;\cr
+@beginchar@\kern1pt(|"I"|$,6u\0,"ht"\0,0)$;\cr
$x_1=x_2=.5w$;\cr
$y_1=h-y_2$; \ $y_2="slab"$;\cr
-"serif"$(1,"thick",-90,1.1jut,1.1jut)$;&upper serifs\cr
-"serif"$(2,"thick",90,1.1jut,1.1jut)$;&lower serifs\cr
+"serif"$(1,"thick",-90,1.1jut,1.1"jut")$;&upper serifs\cr
+"serif"$(2,"thick",90,1.1jut,1.1"jut")$;&lower serifs\cr
@fill@ $"serif\_edge"_2\dashto{\rm reverse}\,"serif\_edge"_1\dashto\cycle$;
&the stroke\cr
@penlabels@$(1,2)$; \ @endchar@;\cr
@@ -9606,7 +9631,7 @@ idea to embed these details in another macro.)
\ddangerexercise Write the program for an |"H"| to go with these letters.
\answer \rightfig A18c (48mm x 45mm) ^10pt
-@beginchar@\kern1pt(|"H"|$,13u\0,"ht"\0,0)$;\parbreak
+@beginchar@\kern1pt(|"H"|$,13u\0,"ht"\0,0)$; \ @pickup@ "broad\_pen";\parbreak
$x_1=x_2=x_5=3u$;\parbreak
$x_3=x_4=x_6=w-x_1$;\parbreak
$y_1=y_3=h$; \ $y_2=y_4=0$;\parbreak
@@ -9616,7 +9641,7 @@ $"top\_serif"(3,"xx",-90,"jut","jut")$;\parbreak
$"bot\_serif"(4,"xx",90,"jut","jut")$;\parbreak
@filldraw@ $"bot\_serif\_edge"_2$\parbreak
\quad$\dashto{\rm reverse}\,"top\_serif\_edge"_1\dashto\cycle$;\parbreak
-@fill@ $"bot\_serif\_edge"_4$\parbreak
+@filldraw@ $"bot\_serif\_edge"_4$\parbreak
\quad$\dashto{\rm reverse}\,"top\_serif\_edge"_3\dashto\cycle$;\parbreak
$y_5=y_6=.52h$; \ @draw@ $z_5\dashto z_6$;\parbreak
@penlabels@$(1,2,3,4,5,6)$; \ @endchar@.
@@ -9657,7 +9682,8 @@ set of rules for macro definitions. Here is the syntax:
(We'll discuss ^\<vardef heading> and ^\<leveldef heading> in Chapter~20.)
\ The basic idea is that we name the macro to be defined, then we name
zero or more delimited parameters (i.e., parameters in parentheses),
-then we name zero or more undelimited parameters. Then comes an `$=$'~sign,
+then we name zero or one or two undelimited parameters.
+Then comes an `$=$'~sign,
followed by the replacement text, and @enddef@. The `$=$'~sign might also
be~`$:=$'\thinspace; both mean the same thing.
@@ -9768,7 +9794,7 @@ undelimited @primary@, @secondary@, @tertiary@, or @expr@ is the
longest syntactically correct ^\<primary>, ^\<secondary>, ^\<tertiary>,
or ^\<expression> that immediately follows the delimited arguments.
An undelimited `@expr@~$x$~^{of}~$y$' specifies two arguments, found
-by taking the longest syntactically correct \<expression>~of~\<primary>.
+by taking the longest syntactically correct `\<expression>~of~\<primary>'.
In each of these cases, the expression might also be preceded by an
optional `^{=}' or~`^{:=}'. An undelimited @suffix@ is the longest
\<suffix> that immediately follows the delimited arguments; \MF\ also
@@ -9809,7 +9835,7 @@ to start executing statements. When that has been done, the final
statement turns out to be \<empty>, so the argument to "gobble"
turns out to be a ^{vacuous} expression (cf.\ Chapter~25). Finally,
"gobble"'s replacement text is empty, so the hidden text has indeed
-disappeared. \ (The "hide" macro in Appendix~B is actually a bit
+disappeared. \ (The @hide@ macro in Appendix~B is actually a bit
more efficient, but a bit trickier.)
\endchapter
@@ -9878,13 +9904,13 @@ includes the conditional~command
whose effect is to set "mag" equal to 1 if it hasn't already received
a value; in this case there's only one alternative.
-\exercise Would it be wrong to put the `;' after the `@fi@' in the example
+\exercise Would it be wrong to put the `;'\ after the `@fi@' in the example
just given?
-\answer Then \MF's ``stomach'' would see `;' if "mag" is known, but there
+\answer Then \MF's ``stomach'' would see `;'\ if "mag" is known, but there
would be no change if "mag" is unknown. An extra semicolon is harmless,
since \MF\ statements can be \<empty>. But it's wise to get in the habit
-of putting `;' before @fi@, because it saves a wee bit of time and because
-`;' definitely belongs before ^@endfor@.
+of putting `;'\ before @fi@, because it saves a wee bit of time and because
+`;'\ often belongs before ^@endfor@.
\danger The informal rules just stated can, of course, be expressed more
formally as rules of syntax:
@@ -9948,7 +9974,7 @@ or strings are decided by the first unequal component from left to right.
\answer No; that would be shocking.
\dangerexercise Could `(odd $n$) and not (odd $-n$)' possibly be true?
-\answer Yes, if and only if $n-{1\over2}$ is a nonnegative even integer.
+\answer Yes, if and only if $n-{1\over2}$ is an even integer.
\ (Because ambiguous values are rounded upwards.)
\dangerexercise Could `(cycle $p$) and not (known $p$)' possibly be true?
@@ -9977,10 +10003,9 @@ to be the beginning of a \<boolean primary>. \ (Cf.\ Chapter~14.)
\ddanger The boolean expression `^@path@ $((0,0))$' is false, even
though `$((0,0))$' meets Chapter~14's syntax rules for
-\<path primary>, via (\<path expression>) and
-(\<path tertiary>) and
-(\<pair tertiary>). A ^{pair expression} is not considered to be
-of type @path@ unless the path interpretation is mandatory.
+\<path primary>, via \<pair primary>.
+A ^{pair expression} is not considered to be
+of type @path@ unless the path interpretation is the only~possibility.
\ddangerexercise Evaluate `length $((3,4))$' and `length $((3,4)\{0,0\})$'
and `length reverse~$(3,4)$'.
@@ -10055,7 +10080,7 @@ the same process is repeated with the new value of $\nu_1$.
\dangerexercise Read the rules in the previous paragraph carefully, then
explain for what values of~$x$ the loop is performed if you say
-(a)~`\thinspace@for@~$x=1$ @step@~2 @until@~0'\thinspace. \
+(a)~`\thinspace@for@~$x=1$ @step@~2 @until@~0\thinspace'. \
(b)~`\thinspace@for@~$x=1$ @step@~$-2$ @until@~0\thinspace'. \
(c)~`\thinspace@for@~$x=1$ @step@~0 @until@~0\thinspace'. \
(d)~`\thinspace@for@~$x=0$ @step@~.1 @until@~1\thinspace'.
@@ -10093,7 +10118,7 @@ example of how loops can be used inside of macros inside of expressions:
@pair@ $"z\_"\,[\,]$, $"dz\_"$; \ @numeric@ "n\_"\thinspace;
&\% private variables\cr
@def@ "flex"(@text@ $t$) $=$&\% $t$ is a list of pairs\cr
-\quad^"hide"$\bigl(\,"n\_":=0$;\cr
+\quad^@hide@$\bigl(\,"n\_":=0$;\cr
\qquad @for@ $z=t$: $"z\_"\,[{\rm incr}\,"n\_"]:=z$; @endfor@\cr
\qquad $"dz\_":="z\_"\,["n\_"]-"z\_"\,[1]\,\bigr)$\cr
\quad $"z\_"\,[1]$ @for@ $k=2$ @upto@ $"n\_"-1$:
@@ -10113,7 +10138,7 @@ expression is true, the (innermost) loop being iterated is terminated
abruptly. Otherwise, nothing special happens.
\dangerexercise Define an `^@exitunless@' macro such that
-`@exitunless@ \<boolean expression>;' will exit the current loop
+`@exitunless@ \<boolean expression>;'\ will exit the current loop
if the boolean expression is false.
\answer @def@ @exitunless@ @expr@ $b$ $=$ @exitif@ not $b$ @enddef@.
\ (The simpler alternative `@def@ @exitunless@ $=$ @exitif@ not
@@ -10280,8 +10305,8 @@ given ^"tolerance" of values for which $f$ yields both outcomes.
\quad $"tx\_":="true\_x"$; \ $"fx\_":="false\_x"$;\cr
\quad^@forever@: $"x\_":=.5["tx\_","fx\_"]$; \
^@exitif@ abs$("tx\_"-"fx\_")\le"tolerance"$;\cr
-\quad @if@ |@#|$("x\_"):\ "tx\_" \ @else@:\ "fx\_"\ @fi@$
- :=\ "x\_"\thinspace; @endfor@;\cr
+\quad @if@ |@#|$("x\_")\colon\ "tx\_" \ @else@\colon\ "fx\_"\ @fi@$
+ :=\ "x\_"\thinspace; @endfor@\cr
\quad "x\_" @enddef@;\cr
\enddisplay
@@ -10580,7 +10605,7 @@ When \MF\ is reading the symbolic tokens to be saved by ^@save@.
\smallskip\item\bull
When \MF\ is reading the token after ^@expandafter@, ^@everyjob@,
-or the `$=$' following @let@.
+or the `$=$' or `$:=$' following @let@.
\medskip\noindent
The expansion process is not suppressed while reading the suffix that
@@ -10655,7 +10680,7 @@ behavior, we can actually see the results graphically by letting \MF\
draw some ``^{scatter plots}.'' Consider the following program, which
draws a $10\pt\times10\pt$ square and puts 100 little dots inside it:
\begindisplay
-@beginchar@$\,(@incr@ "code",10"pt"\0,10"pt"\0,0)$;\cr
+@beginchar@$\,($incr $"code",10"pt"\0,10"pt"\0,0)$;\cr
@pickup@ @pencircle@ scaled .3"pt"; \ @draw@ "unitsquare" scaled $w$;\cr
@pickup@ @pencircle@ scaled 1"pt";\cr
@for@ $k=1$ @upto@ 100:\cr
@@ -10732,10 +10757,10 @@ $x_1="leftstemloc"+"noise"$;\cr
$x_2="leftstemloc"+"noise"$;\cr
$w-x_4="leftstemloc"+"noise"$;\cr
$w-x_5="leftstemloc"+"noise"$;\cr
-$"bot"\,y_1="noise"-"o"$;\cr
+$"bot"\,y_1="noise"-o$;\cr
$"top"\,y_2=h+o+"noise"$;\cr
$y_3=y_4+"ygap"+"noise"$;\cr
-$"bot"\,y_4="noise"-"o"$;\cr
+$"bot"\,y_4="noise"-o$;\cr
$"top"\,y_5=h+o+"noise"$;\cr
$z_3="whatever"[z_4,z_5]$;\cr
@draw@ $z_1\dashto z_2\dashto z_3$; \
@@ -10864,7 +10889,7 @@ place at the primary level:
\alt[str]<suffix>
\alt[char]<numeric primary>
\alt[decimal]<numeric primary>
- \alt[substring]<pair primary>[of]<string primary>
+ \alt[substring]<pair expression>[of]<string primary>
<string secondary>\is<string primary>
<string tertiary>\is<string secondary>
<string expression>\is<string tertiary>
@@ -10950,8 +10975,8 @@ Thus, `oct~|"7777"|' and `hex~|"FFF"|' are the maximum legal values.
\ddangerexercise Under what circumstances is (a) ASCII @char@ $n=n$?
\ (b)~@char@~ASCII~$s=s$?
-\answer (a) Iff $n$ is an integer between 0 and 255.
-(b) Iff $s$ is a string of length~1.
+\answer (a) If and only if $n$ is an integer between 0 and 255.
+(b) If and only if $s$ is a string of length~1.
\ddangerexercise Why are there primitive operations to convert from
strings to numbers assuming octal notation and hexadecimal notation,
@@ -10976,8 +11001,8 @@ or indirectly with the user. It has the general syntax
\endsyntax
If you say `@message@~$s$', the characters of $s$ will be typed on the
terminal, at the beginning of a new line; `@errmessage@~$s$' is
-similar, but the string will be preceded by |"! "| and followed
-by~|"."|, followed by lines of context as in \MF's normal error messages.
+similar, but the string will be preceded by `|! |' and followed
+by~`|.|', followed by lines of context as in \MF's normal error messages.
If the user asks for ^{help} after an @errmessage@ error,
the most recent @errhelp@ string will be typed (unless it was empty).
@@ -11414,7 +11439,7 @@ be a "good.y" value. Therefore we say
these commands, provided by plain \MF\!, will do the right thing.
\ (The "logo\_pen" should be picked up before the last two commands are
given.) \ These few changes, and a change to the `{\manual m}', suffice to
-fix all the letters except `\kern1pt{\manual j}\kern1pt'.
+fix all the letters except `\kern.5pt{\manual j}\kern.5pt'.
\dangerexercise The program for \MF's `{\manual m}' ^^{O}
appears in Chapter~18. What changes would you suggest to make
@@ -11429,7 +11454,7 @@ so that vertical tangents will occur in good places. Since $w$~is an
integer, and since the "logo\_pen" has left-right symmetry,
$w-x_3$ will be good if and only if $x_3$ is.
-\danger The `\kern1pt{\manual j}\kern1pt' ^^{T} presents a new problem,
+\danger The `\kern.5pt{\manual j}\kern.5pt' ^^{T} presents a new problem,
because we want it to be symmetric between left and right. If the pen
breadth is odd, we want the character width~$w$ to be odd, so that there
will be as many pixels to the left of the stem as there are to the right.
@@ -11438,7 +11463,7 @@ If the pen breadth is even, we want $w$ to be even. Therefore we have a
^@beginchar@.
\dangerexercise Prove that the value of $w$ is satisfactory for
-`\kern1pt{\manual j}\kern1pt' with respect to the "logo\_pen" if and
+`\kern.5pt{\manual j}\kern.5pt' with respect to the "logo\_pen" if and
only if $.5w$ is a good $x$~value for vertical strokes.
\answer Let $b$ be the pen breadth. Then $.5w$ is a good $x$ value if and only
if $"lft"\,.5w$ is an integer; but $"lft"\,.5w=.5w-.5b$, and this is an
@@ -11449,7 +11474,7 @@ $w+1$ or~$w-1$, whichever is closer to the device-independent width
from which $w$ was rounded. For example, if $w$ was rounded to 22 from
the ideal width~21.7, we want to change it to 21 rather than~23.
Plain \MF's ^@change\_width@ routine does this. Hence we have the
-following program for `\kern1pt{\manual j}\kern1pt', in place of the
+following program for `\kern.5pt{\manual j}\kern.5pt', in place of the
\rightfig 4b ({208\apspix} x {216\apspix}) ^-18pt
simpler version found in exercise 11.\metaT:
\begindisplay
@@ -11463,7 +11488,7 @@ $y_1=y_2=y_3$; \ $"top"\,y_1=h$; \ $"bot"\,y_4=-o$;\cr
@labels@$(1,2,3,4)$; \ @endchar@.\cr
\enddisplay
\decreasehsize 44mm
-Chapter 4 said that `\kern1pt{\manual j}\kern1pt' was the simplest of the
+Chapter 4 said that `\kern.5pt{\manual j}\kern.5pt' was the simplest of the
seven logo letters, but it has turned out to be the trickiest.
\restorehsize
@@ -11474,7 +11499,7 @@ are highly likely to pass through ambiguous points when the center of
the pen has integer or half-integer coordinates. \MF\ shifts paths slightly
to the right and up, in order to resolve ambiguities; therefore if
ambiguous points occur at the left and right edges of the
-`\kern1pt{\manual j}\kern1pt', some pixels will be lost at the left but
+`\kern.5pt{\manual j}\kern.5pt', some pixels will be lost at the left but
gained at the right. The constant ^"eps" is 0.00049, which is small but
positive enough that \MF\ will surely notice it. Subtracting "eps"
from~$x_1$ and adding "eps" to~$x_2$ avoids ambiguous edge points and
@@ -11485,7 +11510,7 @@ integer, it is unnecessary to do anything similar at point~$z_4$;
the equation `$"bot"\,y_4=-o$' is sufficient.
\ddanger Point $z_3$ in the middle of the `{\manual h}' ^^{M} is in
-a satisfactory position because $"bot"\,y_3="ygap"-"o"$.
+a satisfactory position because $"bot"\,y_3="ygap"-o$.
If $"bot"\,y_3$ were exactly an integer, the~`{\manual h}' would often turn
out to be unsymmetric, because of ambiguous points on the boundary
at~$z_3$.
@@ -11493,12 +11518,12 @@ at~$z_3$.
\ddangerexercise True or false: If "currentpen" is @pencircle@ xscaled "px"
yscaled~"py", the command `@draw@ $(-"epsilon",0)\to(+"epsilon",0)$'
will produce an image that has both left-right and top-bottom symmetry.
-\ (Assume that "autorounding"="smoothing"=0.)
+\ (Assume that $"autorounding"="smoothing"=0$.)
\answer There are no ambiguous points on the outlines of this stroke,
except perhaps on the top and bottom edges; the latter can occur only if
$\round"py"$ is odd. Hence there is always left-right symmetry, but
top-bottom symmetry might fail because of a missing row at the bottom
-(e.g., when $"px"="py"=3$). In a case like the `\kern1pt{\manual j}\kern1pt'
+(e.g., when $"px"="py"=3$). In a case like the `\kern.5pt{\manual j}\kern.5pt'
we do have both symmetries, because $y_1$ and $x_4$ are in good positions.
\ddangerexercise The polygon for `^@pencircle@ scaled 3' is an octagon
@@ -11531,7 +11556,7 @@ $u\0:={10\over18}"pt"\0$; \ @define\_pixels@$(u)$;\cr
$"lft"\,x_1=\round u-"eps"$;\cr
$x_3=x_1$;\cr
$x_2=x_4=w-x_1$;\cr
-$y_1=y_2="good.y"(.5[-d,h]+"pt")$;\cr
+$y_1=y_2="good.y"(.5[-d,h]+1.1"pt")$;\cr
$y_3=y_4=h-d-y_1$;\cr
@draw@ $z_1\dashto z_2$; \ @draw@ $z_3\dashto z_4$;\cr
$"lft"\,x_6=\round 3u$;\cr
@@ -11911,7 +11936,7 @@ The proper way to do this is generally to say
\enddisplay
this command computes "stem" from $"stem"\0$ by the formula
\begindisplay
-$"stem":=max\bigl(1,\,\round("stem"\0\ast"hppp"+"blacker")\bigr)$.
+$"stem":=\max\bigl(1,\,\round("stem"\0\ast"hppp"+"blacker")\bigr)$.
\enddisplay
(Notice that this rounding operation is not allowed to reduce "stem"
to zero at low resolutions.)
@@ -11940,7 +11965,7 @@ $x_{2l}=\round(\alpha-.5"stem")$,
or equivalently, `$x_{2r}=\round(\alpha+.5"stem")$'. This does the
job all right, but it isn't completely satisfying. It requires
knowledge of the breadth that was specified in the $\penpos2$ command,
-and it works only when the penpos angle is~0. If the penpos command
+and it works only when the "penpos" angle is~0. If the "penpos" command
is changed, the corresponding equation for rounding must be
changed too. There's another solution that's more general and more
attractive once you get used to it:
@@ -12104,7 +12129,7 @@ to the nearest integer, just like `round'; but if, say,
$"aspect\_ratio"=4/3$, then "vround" will round to the nearest
multiple of~$3/4$. Plain \MF\ uses "vround" instead of `round'
when it computes an ^{overshoot} correction, and also when ^@beginchar@
-computes the values of ^"h" and~^"d". The ^"good.y" function produces
+computes the values of ^{$h$} and~^{$d$}. The ^"good.y" function produces
a good $y$~value that takes "aspect\_ratio" properly into account.
\ddangerexercise Without looking at Appendix B\null, try to guess how
@@ -12128,9 +12153,9 @@ instead of rounded, so we initialize it by saying
\enddisplay
Furthermore we should say
\begindisplay
-$"ho"\0:="o"\0$; \ ^@define\_horizontal\_corrected\_pixels@("ho");
+$"ho"\0:=o\0$; \ ^@define\_horizontal\_corrected\_pixels@("ho");
\enddisplay
-and "ho" should replace ^"o" in the equations for $x_4$ in the programs
+and "ho" should replace ^{$o$} in the equations for $x_4$ in the programs
for `{\manual i}' and~`{\manual l}'. ^^{E} ^^{F}
Everything else should work satisfactorily as it stands.
@@ -12610,11 +12635,6 @@ nucleus of the entire \MF\ language:
\alt[normaldeviate]
\alt[(]<numeric expression>[)]
\alt[begingroup]<statement list><numeric expression>[endgroup]
-<numeric token primary>\is<numeric token>[/]<numeric token>
- \alt<numeric token not followed by `{\tt/}$\langle$numeric token$\rangle$'>
-<numeric primary>\is<numeric atom>
- \alt<numeric atom>[\char'133]<numeric expression>%
- [,]<numeric expression>[\char'135]
\alt[length]<numeric primary>\alt[length]<pair primary>
\alt[length]<path primary>\alt[length]<string primary>
\alt[ASCII]<string primary>\alt[oct]<string primary>\alt[hex]<string primary>
@@ -12623,6 +12643,12 @@ nucleus of the entire \MF\ language:
\alt[turningnumber]<path primary>\alt[totalweight]<picture primary>
\alt<numeric operator><numeric primary>
\alt[directiontime]<pair expression>[of]<path primary>
+<numeric token primary>\is<numeric token>[/]<numeric token>
+ \alt<numeric token not followed by %
+ `{\tt/}$\thinspace\langle$numeric token$\rangle$'\thinspace>
+<numeric primary>\is<numeric atom not followed by {[\char'133]<expression>[,]}>
+ \alt<numeric atom>[\char'133]<numeric expression>%
+ [,]<numeric expression>[\char'135]
<pair part>\is[xpart]\alt[ypart]
<transform part>\is<pair part>\alt[xxpart]\alt[xypart]\alt[yxpart]\alt[yypart]
<numeric operator>\is[sqrt]\alt[sind]\alt[cosd]\alt[mlog]\alt[mexp]
@@ -12777,7 +12803,8 @@ Pens and future pens coexist as follows:
\alt[nullpen]
\alt[(]<pen expression>[)]
\alt[begingroup]<statement list><pen expression>[endgroup]
-<future pen primary>\is[pencircle]
+<future pen primary>\is<future pen argument>
+ \alt[pencircle]
\alt[makepen]<path primary>
<pen secondary>\is<pen primary>
<future pen secondary>\is<future pen primary>
@@ -12820,7 +12847,7 @@ repeat the syntax again for completeness here.
\alt[str]<suffix>
\alt[char]<numeric primary>
\alt[decimal]<numeric primary>
- \alt[substring]<pair primary>[of]<string primary>
+ \alt[substring]<pair expression>[of]<string primary>
<string secondary>\is<string primary>
<string tertiary>\is<string secondary>
<string expression>\is<string tertiary>
@@ -12828,6 +12855,7 @@ repeat the syntax again for completeness here.
\endsyntax
There's nothing more to say about strings.
+\goodbreak
\medbreak
\textindent\bull
Chapter 15 explains transforms, but gives no formal syntax. The rules are:
@@ -12937,12 +12965,12 @@ primitive operations that actually draw pictures and produce output.
Let's start by looking at the full syntax for \<program> and for
\<statement>:
\beginsyntax
-<program>\is<statement list>[end]\alt<statement list>[dump]
+<program>\is<statement list><non-title statement>[end]
+ \alt<statement list><non-title statement>[dump]
<statement list>\is<empty>\alt<statement>[;]<statement list>
<statement>\is<empty>\alt<title>
- \alt<equation>\alt<assignment>
- \alt<declaration>\alt<definition>
- \alt<compound>\alt<command>
+ \alt<equation>\alt<assignment>\alt<declaration>
+ \alt<definition>\alt<compound>\alt<command>
<title>\is<string expression>
<compound>\is[begingroup]<statement list><non-title statement>[endgroup]
<command>\is<save command>
@@ -12976,7 +13004,7 @@ We shall concentrate in this chapter on the various types of {\sl
<symbolic token list>\is<symbolic token>
\alt<symbolic token list>[,]<symbolic token>
<interim command>\is\kern-1.5pt[interim]%
- <internal quantity>[:=]<right-hand side>\kern-1pt
+ <internal quantity>[:=]\kern1pt<right-hand side>\kern-1pt
\endsyntax
The @save@ and @interim@ commands cause values to be restored at the end
of the current group, as discussed in Chapter~17.
@@ -12989,7 +13017,7 @@ Thus, they can be used in @interim@ commands; they are ^{tags} but not
^{external tags} (see Chapter~7). Since \MF\ can access internal
quantities quickly, you can use them to gain efficiency.
\beginsyntax
-<randomseed command>\is[randomseed][:=]<numeric expression>
+<randomseed command>\is[randomseed][:=]\kern1pt<numeric expression>
\endsyntax
The @randomseed@ command specifies a ``seed'' value that defines
the pseudo-random numbers to be delivered by
@@ -13060,7 +13088,7 @@ Paths, pens, and pictures are shown only in the transcript file, unless
^"tracingonline" is positive. The @showvariable@ command gives the
structure of all variables that begin with a given external tag,
together with their values in an abbreviated form; this allows you to see
-which of its subscripts and attributes have occurred. For example, if you're
+which of its subscripts and suffixes have occurred. For example, if you're
using plain \MF\ conventions, `@showvariable@~$x,y$' will show all
coordinates that have been defined since the last @beginchar@. The @showtoken@
command gives the current meaning of a token, so that you can tell whether
@@ -13248,7 +13276,7 @@ normal for a mature \MF er to think ``Shucks, I meant to type
any harm; \MF\ just found an ^{isolated expression}, `"mode.setup"', which
it will ignore. So let me now insert the correct command, `@mode\_setup@'.''
-Good thinking; so you type `|I| |mode_setup|', right? Wrong~$\ldots$~sorry.
+Good thinking; so you type `|I mode_setup|', right? Wrong~$\ldots$~sorry.
Lots of error messages occur before \MF\ has read a ^{semicolon} in
preparation for another ^{statement}; the important clue in this case
comes from the two lines
@@ -13265,7 +13293,7 @@ the semicolon, you get what appears at first to be a horrible mess:
warningcheck
mode_setup->warningcheck
:=0;if.unknown.mode:mode=proof;fi...
-<insert> mode_setup
+<insert> mode_setup
|quad
<to be read again>
;
@@ -13299,10 +13327,10 @@ you might want to type `I ???' now.)
\endtt
Chapter 27? That's us! What happens if we do type `|I ???|' now? We get
\begintt
-x4l=0.08682thinn+144
-y4=-0.4924thinn+259.0005
+y4r=-0.9848thinn+259.00049
x4r=-0.08682thinn+144
-y4r=-0.9848thinn+259.0005
+y4=-0.4924thinn+259.00049
+x4l=0.08682thinn+144
! OK.
\endtt
It is now abundantly clear that `|thin|' was misspelled. Plain \MF\
@@ -13357,9 +13385,10 @@ delete 2~tokens, then `|I(|'. This would produce another error stop,
]
<*> show round[1 + sqrt43]
;
-? h
+? H
I found no right delimiter to match a left one. So I've
put one in, behind the scenes; this may fix the problem.
+|null
?
\endtt
after which it's easy to delete the `|]|' and continue successfully.
@@ -13411,7 +13440,7 @@ Here are some of the messages you might get just before
Fatal base file error; I'm stymied.
^^|Fatal base file error|
This means that the preloaded base you have specified cannot be used,
-because it was prepared for a different version of \MF\!.
+because it is corrupted or was prepared for a different version of \MF\!.
\fatal
That makes 100 errors; please try again.
\MF\ has scrolled past 100 errors since the last statement ended, so
@@ -13552,7 +13581,7 @@ If the number |450| in the third ^{flex} had been |452| instead,
;
<for(4)> ...]shifted(150,50)scaled(w/300);
ENDFOR
-p.4,l.94 endfor
+l.94 endfor
endchar;
?
\endtt
@@ -13562,7 +13591,7 @@ but the ^{octant} codes like `^|SSW|' are your only clues about why
|branch4| is considered strange. \ (A simpler example appeared
in Chapter~13, which you might want to review now.) \
^^{compass directions} ^^|SSE|^^|ESE|^^|WSW|^^|WNW|^^|NNE|^^|NNW|^^|ENE|
-You probably also have a proofmode diagram:
+You probably also have a |proof| mode diagram:
\displayfig 27a (34mm)
Starting at time~0, and at the point $(0,509)$, the path goes South by
Southwest, then West by Southwest until time~2 (the end of the first flex).
@@ -13660,7 +13689,7 @@ consciousness'' information about everything \MF\ is doing.
\begingroup\ninepoint
\danger ^{Digitized output} can be monitored by setting ^"tracingedges"%
-$\null=1$. For example, if we ask \MF\ to draw the Ionian `{\manual\IOO}'
+$\null:=1$. For example, if we ask \MF\ to draw the Ionian `{\manual\IOO}'
of Chapter~5 at a resolution of 100~pixels per inch (^"lowres" mode
with ^"mag"$\null=.5$), "tracingedges" will report as follows:\enddanger
\beginlines
@@ -13854,7 +13883,7 @@ with an informal ^{inventory} of all the features that are available.
\bb|+|\cr\noalign{\kern-2pt}|-|\cr\noalign{\kern-2pt}\<constant>\ee\<pair>; \
\<pair>\bb|+|\cr|-|\ee\<pair>; \
\<numeric>|[|\<pair>|,|\<pair>|]|;\\
-\<numeric>|*|\<pair>; \
+\<numeric>\thinspace|*|\thinspace\<pair>; \
\<pair>\bb|*|\cr|/|\ee\<numeric>; \
\<pair>\<transformer>;\\
\<path>\bb|intersectionpoint|\cr|intersectiontimes|\ee\<path>; \
@@ -13943,7 +13972,7 @@ with an informal ^{inventory} of all the features that are available.
|loggingall|, |tracingall|, |tracingnone|.
\textindent\bull {\it ^{Starting a job}:\/} \
-|\mode=|\<modename>; \ |mag=|\bb\<numeric>\cr|magstep|\<numeric>\ee;\\
+|\mode=|\<mode name>; \ |mag=|\bb\<numeric>\cr|magstep|\<numeric>\ee;\\
|screenchars|; \ |screenstrokes|; \ |imagerules|; \ |gfcorners|; \
|nodisplays|;\\
|notransforms|; \ |input| \<filename>.
@@ -13979,7 +14008,7 @@ with an informal ^{inventory} of all the features that are available.
\bb|=|\cr\noalign{\kern-2pt}|:=|\cr\noalign{\kern-2pt}\<empty>\ee
\<numeric$\0$>; \
\bb|ligtable|\<ligs/kerns>\cr|charlist|\<codes>\cr|extensible|\<codes>\cr
- |fontdimen|\<info>\cr|headerbytes|\<info>\ee;\\
+ |fontdimen|\<info>\cr|headerbyte|\<info>\ee;\\
\bb|font_identifier|\cr|font_coding_scheme|\ee
\smash{\bb\tt=\cr\noalign{\kern-2pt}\tt:=\cr\noalign{\kern-2pt}\<empty>\ee}%
\<string>.
@@ -14050,8 +14079,8 @@ $\hbox{\bb\bb|=|\cr|:=|\ee
|(|\<string>|,|\<pair>|)|; \
\bb|titlefont|\cr|labelfont|\cr|grayfont|\cr|slantfont|\ee \<name>;\\
\bb|proofrule|\cr|screenrule|\ee|(|\<pair>|,|\<pair>|)|; \
-|makegrid(|\<pairs>|)(|\<pairs>|)|;\\
-|proofrulethickness| \<numeric>; \ |proofoffset| \<pair>.
+|makegrid(|\<numerics>|)(|\<numerics>|)|;\\
+|proofrulethickness| \<numeric$\0$>; \ |proofoffset| \<pair>.
\medbreak\textindent\bull {\it Hacks:\/} \ |gobble|, |gobbled|, |killtext|; \
|capsule_def|; \ |numtok|.
@@ -14313,7 +14342,7 @@ The private token `|a_|' will be declared as an ^{internal quantity}.
Internal quantities are more ^{efficient} than ordinary numeric variables.
Plain \MF's `^{softjoin}' operation provides a way to hook paths together
-without the abrupt change of direction implied by~`|&|'. Assuming that
+without the abrupt change of direction implied by~`\&'. Assuming that
the final point of~$p$ is the first point of~$q$, the path `$p$~softjoin~$q$'
begins on~$p$ until coming within "join\_radius" of this common point;
then it curves over and finishes~$q$ in essentially the same way.
@@ -14338,7 +14367,7 @@ only to variables; they have the side effect of changing the variable's value.
|vardef |^|decr|| suffix $ = $:=$-1; $ enddef;|
\weakendlines
You can say either `|incr|~|x|' or `|incr|~|(x)|', within
-an expression; but `|incr|~|x|' by itself is not a valid statement.
+an expression; but neither of them are valid statements by themselves.
To reflect about a line, we compute a ^{transform} on the fly:
\beginlines
@@ -14384,7 +14413,7 @@ enclosed in parentheses.
|newinternal n_; pair z_[],dz_;|
\endlines
-The five parameters to `superellipse' are the right, the top, the left,
+The five parameters to "superellipse" are the right, the top, the left,
the bottom, and the superness.
\beginlines
|def |^|superellipse||(expr r,t,l,b,s)=|
@@ -14394,7 +14423,7 @@ the bottom, and the superness.
| b{right}...(s[xpart b,xpart r],s[ypart r,ypart b]){r-b}...cycle enddef;|
\endlines
-Chapter~14 illustrates the `interpath' routine, which interpolates
+Chapter~14 illustrates the "interpath" routine, which interpolates
between paths to find a path that would be written `$a[p,q]$' if
\MF's macro notation were more general.
\beginlines
@@ -14510,7 +14539,8 @@ If, however, you need a special mode that isn't in the base, you can put
its commands into a file (e.g., `|specmode.mf|') and invoke it
by saying
\begindisplay
-^|\smode||="specmode"; mag=|$\,\cdots$
+^|\smode||="specmode"; mag=|\<magnification>|; input |%
+ \<font file name>
\enddisplay
instead of giving a predeclared mode name.
@@ -14885,7 +14915,7 @@ a group, which should end at the next ^@endchar@. Then @beginchar@
stores the given character code and device-independent
box dimensions in \MF's internal variables ^"charcode", ^"charwd",
^"charht", and ^"chardp". Then it computes the device-dependent box
-dimensions ^"w", ^"h", and~^"d". Finally it
+dimensions ^{$w$}, ^{$h$}, and~^{$d$}. Finally it
clears the $z$ variables, the current picture, and the
current pen.
\beginlines
@@ -14986,12 +15016,12 @@ Then we need to do something rudimentary about \MF's ``windows.''
|screen_rows:=400; % these values should be corrected,|
|screen_cols:=500; % by reading in a separate file after plain.mf|
\smallskip
-|def |^|openit|| = openwindow currentwindow|
-| from origin to (screen_rows,screen_cols) at (-50,300) enddef;|
-|def |^|showit|| = openit; let showit=showit_; showit enddef; % first time only|
+|def |^|openit|| = openwindow currentwindow from origen % and please correct|
+| to (screen_rows,screen_cols) at (-50,300) enddef; % "(-50,300)" too|
|def showit_ = display currentpicture inwindow currentwindow enddef;|
+|def |^|showit|| = openit; let showit=showit_; showit enddef; % first time only|
\endlines
-Plain \MF\ has several other terse commands like `@openit@' and `@showit@':
+Plain \MF\ has several other terse commands similar to `@openit@' and `@showit@':
\beginlines
|def |^|clearxy|| = save x,y enddef;|
|def |^|clearit|| = currentpicture:=nullpicture enddef;|
@@ -15092,7 +15122,7 @@ than normal, not heavier). The terminal screens are assumed to be
| fontmaking:=1; % yes, we are making a font|
| tracingtitles:=1; % yes, show titles online|
| pixels_per_inch:=2000; % almost 30 pixels per pt|
-| blacker:=.2; % make pens a teeny bit blacker|
+| blacker:=.1; % make pens a teeny bit blacker|
| fillin:=.1; % but compensate for heavy diagonals|
| o_correction:=1; % and keep the full overshoot|
| enddef;|
@@ -15463,7 +15493,7 @@ let INPUT = input; let input = enddef; let logo = endinput;
expandafter def expandafter ten expandafter = INPUT logo10;
showtoken ten.
\endtt
-It works! By the way, the line with three expandafters can be replaced by
+It works! By the way, the line with three @expandafter@s can be replaced by
a more elegant construction that uses @scantokens@ as follows:
\begintt
scantokens "def ten=" INPUT logo10;
@@ -15505,10 +15535,10 @@ show exactly how \MF\ proceeds. We have assumed that the unknown file
name can be parsed as a suffix; this solves the problem that a file cannot
end inside of a @text@ parameter or a false condition. \ (If we knew that
`@end@' were present, we could have replaced `|endinput|~|flushfilename|' by
-`|if|~|false:|' and redefined `|end|' to be `|fi|'.)
+`|if|~|false:|'\ and redefined `|end|' to be `|fi|'.)
Let's turn now to a simpler problem. \MF\ allows you to consider the
-`^{and}' of two Boolean expressions, but it always evaluates both
+`^{and}' of two boolean expressions, but it always evaluates both
expressions. This is problematical in situations like
\begintt
if pair x and (x>(0,0)): A else: B fi
@@ -15519,7 +15549,7 @@ unless $x$ is of type @pair@. The obvious way to avoid this error,
if pair x: if x>(0,0): A else: B fi else: B fi
\endtt
is cumbersome and requires |B| to appear twice. What we want is a
-``^{conditional and}'' operation in which the second Boolean expression is
+``^{conditional and}'' operation in which the second boolean expression is
evaluated only if the first one turns out to be true; then we can safely write
\begintt
if pair x cand (x>(0,0)): A else: B fi.
@@ -15558,7 +15588,7 @@ def cand text q = startif true q else: false fi enddef
\endtt
we could write things like
\begintt
-if {{pair x cand x>(0,0)}}: A else: B fi.
+if {{(pair x) cand x>(0,0)}}: A else: B fi.
\endtt
(Not that this buys us anything; it just illustrates a property of
undelimited text arguments.) \ Group delimiters
@@ -15606,7 +15636,7 @@ Of course, a person isn't supposed to say `max$(a)(b)(c)$'.
Here are two more applications of the idea: We want `^{inorder}$(a,b,c)$'
to be true if and only if $a\le b\le c$; and we want
`^@equally\_spaced@$(x_1,x_2,x_3)\,"dx"$' to produce the equations
-`$x_2-x_1=x_3-x_2=dx$'.
+`$x_2-x_1=x_3-x_2="dx"$'.
\begintt
def inorder(expr x)(text t) =
((x for u=t: <= u)
@@ -15677,7 +15707,7 @@ vardef min(text t) =
for u=t: switch_ u<u_: u_ := u ;fi endfor
u_ enddef;
def firstset_ primary u =
- setu_ u; let switch_ = if; if false: enddef.
+ save u_; setu_ u; let switch_ = if; if false: enddef.
\endtt
Incidentally, the author's ^^{Knuth} first programs for max and min
contained an interesting bug. They started with `@save@ "u\_"', and they
@@ -15758,7 +15788,7 @@ vardef piceq expr p of q =
(totalweight t=0) enddef;
\endtt
If $p$ and $q$ are numeric or pair expressions, we could relax the condition
-that they both be known by saying `@if@ known $p-q$: $p=q$ @else@:~@false@ @fi@';
+that they both be known by saying `@if@ known $(p-q)$: $p=q$ @else@:~@false@ @fi@';
transforms could be handled similarly by testing each of their six parts.
But there's no way to tell if booleans, paths, etc., have been equated
when they're both unknown, without the risk of irrevocably changing the
@@ -15800,7 +15830,7 @@ pixels. \ (Increasing the tolerance saves time because it
decreases the number of iterations within "solve"; you have to
balance time versus necessary accuracy.)
-The only tricky thing about this use of solve was the choice of the
+The only tricky thing about this use of "solve" was the choice of the
numbers 1 and~7 in `$f(1,7)$'. In typical applications we'll usually have
obvious values of the unknown where $f$ will be true and false,
but a bit of experimentation was necessary for the problem considered
@@ -15811,8 +15841,8 @@ another solution: $a=7.51442$, $b=-7.48274$, $c=-2.3097$. Furthermore,
it's interesting to observe that this system has no solution with
$c$ between $-1$ and~$+1$, even though $f(+1)$ is true and
$f(-1)$ is false! When $c\rightarrow0$, the quantity $a^3+b^3$
-approaches $-\infty$ when $c$~is negative, $+\infty$ when $c$~is
-positive. An attempt to `"solve" $f(1,-1)$' will divide by zero and
+approaches $-\infty$ when $c$~is positive, $+\infty$ when $c$~is
+negative. An attempt to `"solve" $f(1,-1)$' will divide by zero and
come up with several arithmetic overflows.
\hangindent=-42mm \hangafter=-7
@@ -15898,7 +15928,8 @@ vardef verticalline primary x =
(x,-infinity)--(x,infinity) enddef;
\endtt
For example, if $f(1)=1$, $f(3)=2$, and $f(15)=4$, this interpolation
-scheme gives `interpolate $(1,1)\to(3,2)\to(15,4)$ of~7' the value 3.37.
+scheme gives `interpolate $(1,1)\to(3,2)\to(15,4)$ of~7' the
+approximate value 3.37.
\subsection Drawing with ^{overlays}. Let's leave numerical computations
now and go back into the realm of pictures. Bruce ^{Leban} has suggested
@@ -15942,7 +15973,7 @@ when possible.
and read it in to some other \MF\ job, you face two problems:
(1)~\MF's @shipout@ command implicitly culls the picture, so that only
binary data is left. Pixel values $>0$ are distinguished from pixel
-values $<=0$, but no other information about those values will survive.
+values $\le0$, but no other information about those values will survive.
\ (2)~The result of ^@shipout@ can be used in another \MF\ job only if
you have an auxiliary program that converts from binary ^|gf| format
to a \MF\ source program; \MF\ can write |gf| files, but it can't
@@ -16088,7 +16119,7 @@ vardef taller primary p =
T = round directiontime down of r;
if t>T: t := t-n; fi
makepen(subpath(T-n,t) of r shifted .5down
- --subpath(t,T) of r shifted .5up -- cycle) enddef;
+ -- subpath(t,T) of r shifted .5up -- cycle) enddef;
\endtt
The result of @makepath@ has control points equal to their adjacent
vertices, so it could not be used with directiontime.
@@ -16119,7 +16150,7 @@ vardef taller primary p =
T = round xpart(r intersectiontimes penoffset down of q);
if t>T: t := t-n; fi
makepen(subpath(T-n,t) of r shifted .5down
- --subpath(t,T) of r shifted .5up -- cycle) enddef;
+ -- subpath(t,T) of r shifted .5up -- cycle) enddef;
\endtt
^^{intersectiontimes} ^^{subpath}
(The argument $p$ is copied into $q$, in case it's a ^{future pen};
@@ -16167,10 +16198,11 @@ def first_ primary u =
elseif pair u: pair u_[[[]]]; store_ u fi;
let switch_ = store_ enddef;
def store_ primary u = u_[[[incr n_]]] := u enddef;
-primarydef t Bernshtein nn =
+primarydef t Bernshtein nn = begingroup save r; r =
begingroup for n=nn downto 2:
for k=1 upto n-1: u_[[[k]]]:=t[[[u_[[[k]]],u_[[[k+1]]] ]]];
- endfor endfor u_[[[1]]] endgroup enddef;
+ endfor endfor u_[[[1]]] endgroup; numeric u_[[[]]];
+ r endgroup enddef;
\endtt
The most subtle thing about this code is the way it uses the `empty'
option of a ^\<for list> to dispense with ^{empty text arguments}.
@@ -16178,6 +16210,8 @@ Since \MF\ evaluates all the expressions of a ^@for@ loop before
reading the loop text, and since `|n_|' and `|u_|' are used here
only when no recursion is taking place, it is unnecessary to ^{save}
their values even when brackets are nested inside of brackets.
+However, the auxiliary variables `|u_[[[|$k$|]]]|' must not remain
+independent at the end.
Of course this trick slows \MF\ down tremendously, whenever brackets
appear, so it is just of academic interest. But it seems to work
@@ -16231,7 +16265,7 @@ in Chapter~11. For example, the |logo10| font that produces `\MF' in
\mode=lowres; input logo10
\endtt
where the ^{parameter file} |logo10.mf| appears in that chapter. Furthermore
-the slanted version `{\manual 89:;<=>:}\kern3pt' can be created by
+the slanted version `{\manual 89:;<=>:}\kern2pt'\ can be created by
inputting the parameter file |logosl10.mf|, which says simply
\begintt
% 10-point slanted METAFONT logo
@@ -16461,15 +16495,15 @@ opening and closing lines of ^|cmr10.mf|:
\smallskip
|font_identifier "CMR"; font_size 10pt#;|
\smallskip
-|u#:=20/36pt#; % unit width|
-|serif_fit:=0pt#; % extra sidebar near serifs|
-|letter_fit:=0pt#; % extra space added to all sidebars|
+|u#:=20/36pt#; % unit width|
+|width_adj#:=0pt#; % width adjustment for certain characters|
+|serif_fit#:=0pt#; % extra sidebar near lowercase serifs|
\vskip-3pt
\qquad\vdots
-|serifs:=true; % should serifs and bulbs be attached?|
-|monospace:=false; % should all characters have the same width?|
+|low_asterisk:=false; % should the asterisk be centered at the axis?|
+|math_fitting:=false; % should math-mode spacing be used?|
\smallskip
-|generate roman % switch to the driver file|
+|generate roman % switch to the driver file|
\endlines
The main differences are: \ (1) There's special code at the beginning, to
make sure that |cmbase.mf| has been loaded. The base file includes
@@ -16561,8 +16595,8 @@ The base file |cmbase.mf| begins as follows:
|let cmchar = relax; % `cmchar' should precede each character|
|let generate = input; % `generate' should follow the parameters|
\smallskip
-|newinternal slant, superness,| $\cdots$ | % purely numeric parameters|
-|boolean serifs, monospace,| $\cdots$ | % boolean parameters|
+|newinternal slant, superness,| $\ldots$ | % purely numeric parameters|
+|boolean serifs, monospace,| $\ldots$ | % boolean parameters|
\endlines
These few lines are straightforward enough. Although |cmchar| is defined
to be the same as ^|relax|, which does nothing, the definition of
@@ -16602,7 +16636,7 @@ Modern character program is supposed to say
\enddisplay
sidebearing adjustments are given in true, ``sharped'' units.
The ^@adjust\_fit@ routine essentially adds extra space at the left
-and right, corresponding to the sidebearing adjustments. An ad-hoc
+and right, corresponding to the sidebearing adjustments. An ad hoc
dimension called ``^"letter\_fit"$\0$'' is also added to all sidebearings,
behind the scenes.
@@ -16645,7 +16679,7 @@ Variables ^"l" and ^"r" are set to the actual pixel boundaries of the
character; thus, plain \MF's bounding box has $0\le x\le w$, but
Computer Modern's has $l\le x\le r$. ^{Rounding} has been done
very carefully so that the sidebearings will have consistent
-relationships across an entire font. Notice that ^"w"~has been
+relationships across an entire font. Notice that ^{$w$}~has been
recalculated; this means that @adjust\_fit@ can affect the digitization,
but---we hope---in a beneficial way.
@@ -16660,7 +16694,7 @@ characters will be $"mono\_charic"\0$.
|def mono_adjust_fit(expr left_adjustment,right_adjustment) =|
| numeric expansion_factor; mono_charwd# = 2letter_fit#|
| + expansion_factor*(charwd+left_adjustment+right_adjustment);|
-| forsuffixes $=u,jut,| $\cdots$ |:|
+| forsuffixes $=u,jut,| $\ldots$ |:|
| $ := $.#*expansion_factor*hppp; endfor|
| l := -hround(left_adjustment*expansion_factor*hppp)-letter_fit;|
| interim xoffset := -l;|
@@ -16723,12 +16757,12 @@ each driver file. This is what converts sharped units to pixels;
font as a whole. It's a long macro, but here are its important features:
\beginlines
|def font_setup =|
-| define_pixels(u,jut,| $\cdots$ |);|
-| define_whole_pixels(letter_fit,fine,crisp,| $\cdots$ |);|
-| define_whole_vertical_pixels(body_height,cap_height,| $\cdots$ |);|
-| define_whole_blacker_pixels(hair,stem,curve,| $\cdots$ |);|
-| define_whole_vertical_blacker_pixels(vair,slab,| $\cdots$ |);|
-| define_corrected_pixels(o,| $\cdots$ |);|
+| define_pixels(u,jut,| $\ldots$ |);|
+| define_whole_pixels(letter_fit,fine,crisp,| $\ldots$ |);|
+| define_whole_vertical_pixels(body_height,cap_height,| $\ldots$ |);|
+| define_whole_blacker_pixels(hair,stem,curve,| $\ldots$ |);|
+| define_whole_vertical_blacker_pixels(vair,slab,| $\ldots$ |);|
+| define_corrected_pixels(o,| $\ldots$ |);|
\smallbreak
| if monospace: mono_charwd# := 9u#; define_whole_pixels(mono_charwd);|
| mono_charic# := max(0,body_height#*slant);|
@@ -16746,7 +16780,7 @@ font as a whole. It's a long macro, but here are its important features:
\endlines
If $"letter\_fit"\0=0$, the `^"shrink\_fit"' is set to~1; otherwise
"shrink\_fit" is 0, 1, or~2, depending on how "letter\_fit" has
-rounded to an integer. This amount is essentially subtracted from~^"w"
+rounded to an integer. This amount is essentially subtracted from~^{$w$}
before each character in the font has been drawn. Experience shows that
this trick greatly improves the readability of fonts at ^{medium}
and ^{low resolutions}.
@@ -16787,7 +16821,7 @@ The example programs for period and em-dash say `@pickup@ "fine.nib"' and
the following way:
\beginlines
| clear_pen_memory;|
-| forsuffixes $ = fine,crisp,| $\cdots$ |:|
+| forsuffixes $ = fine,crisp,| $\ldots$ |:|
| $.breadth := $;|
| pickup if $=0: nullpen else: pencircle scaled $; $ := $-eps fi;|
| $.nib := |^|savepen||; breadth_[$.nib] := $;|
@@ -17107,7 +17141,7 @@ 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.
+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
@@ -17130,23 +17164,24 @@ 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>
+<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[\\\\:]
+<label>\is<code label>\alt<code>[::]\alt[\\\\:]
+<code label>\is\<code>[:]
<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 `|=:|'
+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
+instead of doing any further @ligtable@ operations at the current
character position.
{\sl Caution:\/} Novices often go overboard on kerning. Things usually
@@ -17211,15 +17246,15 @@ Here is the formal syntax:
\beginsyntax
<charlist command>\is[charlist]<labeled code>
<labeled code>\is<code>
- \alt<label><labeled code>
-<extensible command>\is[extensible]<label><four codes>
+ \alt<code label><labeled code>
+<extensible command>\is[extensible]<code label><four codes>
<four codes>\is<code>[,]<code>[,]<code>[,]<code>
\endsyntax
-Notice that a \<label> can appear in a ligtable, charlist, or extensible
-command. These appearances are mutually exclusive: No code may be used
-more than once as a label. Thus, for example, a character with a
-ligature/kerning program cannot also be extensible, nor can it be
-in a charlist (except as the final item).
+Notice that a \<code label> can appear in a @ligtable@, @charlist@, or
+@extensible@ command. These appearances are mutually exclusive: No code may be
+used more than once as a label. Thus, for example, a character with a
+ligature/kerning program cannot also be @extensible@, nor can it be
+in a @charlist@ (except as the final item).
\medbreak
The last type of information that appears in a |tfm| file applies to
@@ -17269,7 +17304,7 @@ and this value. The ^{x-height} is also the unit of height that
\TeX\ calls one `|em|'.
\item\bull^@font\_extra\_space@ (|\fontdimen7|) is the additional amount
added to the normal interword space between sentences, depending
-on the ``spacefactor'' as defined in {\sl The \TeX book}.
+on the ``space factor'' as defined in {\sl The \TeX book}.
\smallskip\noindent
Parameters are zero unless otherwise specified.
@@ -17490,9 +17525,9 @@ proofsheets in the experiments of Chapter~5.) \ (2)~Just before a
character image is shipped out, \MF\ implicitly executes the following
sequence of instructions:
\begindisplay
-@if@ round $"xoffset"\ne0$: \ @special@ |"xoffset"|; \
+@if@ round $"xoffset"<>0$: \ @special@ |"xoffset"|; \
@numspecial@ round ^"xoffset"; @fi@\cr
-@if@ round $"yoffset"\ne0$: \ @special@ |"yoffset"|; \
+@if@ round $"yoffset"<>0$: \ @special@ |"yoffset"|; \
@numspecial@ round ^"yoffset"; @fi@\cr
\enddisplay
@@ -17513,8 +17548,8 @@ that doubling the resolution approximately doubles the length of the
when character code~$c$ is being shipped out. \ (The `^|[|' is typed
before output conversion begins, and the `^|]|' is typed after; hence you
can see how much time output takes.) \ If "charext" is nonzero, after
-being rounded to an integer, the typed message is `|[|$c.x$|]|' instead;
-for example, `[65.3]' refers to character~65 with extension code~3.
+being rounded to an integer, the typed message is `|[|$c$|.|$x$|]|' instead;
+for example, `|[65.3]|' refers to character~65 with extension code~3.
\TeX\ allows only 256 characters per font, but extensions of \TeX\
intended for ^{oriental} languages will presumably use the "charext"
@@ -17786,7 +17821,7 @@ or directory name for the gray font. Furthermore the |gf| file might
^^{grayfontarea} ^^{labelfontat}
say, e.g.,
\begindisplay
-@special@ |"labelfontat"|; @numspecial@ 20
+@special@ |"labelfontat"|; \ @numspecial@ 20
\enddisplay
if you want the label font to be loaded at $20\pt$ instead of its ^{design
size}. The area name and the at size must be given after the font name
@@ -18072,7 +18107,7 @@ magnification in a nonstandard way:
|mg := mag; mag := 1; mode_setup;|
|if mg>1: hppp := hppp*mg; vppp := vppp*mg;|
| extra_endchar:=|
-| "if charcode>0:currentpicture:=currentpicture scaled mg;fi"|
+| "if charcode>0:currentpicture:=currentpicture scaled mg;fi;"|
| & extra_endchar; fi;|
\endlines
This circumlocution is the easiest way to guarantee that the ^|tfm| file
@@ -18088,7 +18123,7 @@ The next part of |grayf| computes the pixel representation, "pix\_picture".
| addto currentpicture also|
| currentpicture rotated 90 xscaled -1; fi|
| if unknown scale: scale := max(1,round(pixels_per_inch/300)); fi|
-| pix_wd := pix_ht := 4scale;|
+\goodbreak
| if rep>1: picture pix;|
| currentpicture := currentpicture shifted-(1,1); pix := currentpicture;|
| for r=1 upto rep-1: addto currentpicture also pix shifted(4r,0); endfor|
@@ -18238,8 +18273,8 @@ The corresponding program file `|slant.mf|' looks like this:
|for k=1 upto n:|
| beginchar(k,k*u#*s,n*u#,0);|
| pickup ruler; draw origin--(k*u*s,k*u); % draw the line|
-| unfill (lft-1,bot -1)--(rt 1,bot -1)|
-| --(rt 1,0)--(lft-1,0)--cycle; % clip the ends|
+| unfill (lft -1,bot -1)--(rt 1,bot -1)|
+| --(rt 1,0)--(lft -1,0)--cycle; % clip the ends|
| unfill ((lft -1,0)--(rt 1,0)|
| --(rt 1,top 1)--(lft -1,top 1)--cycle) shifted (k*u*s,k*u);|
| endchar; endfor|
@@ -18391,7 +18426,7 @@ the ^|\alternation| operation will typeset `|opopopopopopopopo|' and
The |\series| operation puts the background character between all the
others (e.g., `|opoqo|'). Special series containing the lowercase
letters of \TeX\ text fonts (including `\char'31', `\char'32',
-`\char'33', and ~\char'34') and the uppercase letters (including
+`\char'33', and~`\char'34') and the uppercase letters (including
`\char'35', `\char'36', and~`\char'37') are provided.
Although |\mixture| and |\alternation| show you the effects of
ligatures and kerning, |\series| does not.
@@ -18533,7 +18568,7 @@ would use this feature.)
\endlines
Two of the most important combinations of tests are treated now:
-^|\sample| prints the |\table| and the |text|; ^|\bigtest| gives
+^|\sample| prints the |\table| and the |\text|; ^|\bigtest| gives
you the works, plus a mysterious word that is traditional in type
specimens: ^^{hamburgefonstiv}
\beginlines
@@ -18783,7 +18818,7 @@ redefine them.
|**|, as command-line prompt, 31--32, 35--40, 187, 269, 279.
\sub as exponentiation sign, @59, @64, 72, @237, @251, +265.
|/| (slash), 328, 329.
-\sub \llap{\char`\*}as divided-by sign, @59, @62, @63, +72, 80, 82, 210--211.
+\sub \llap{\char`\*}as divided-by sign, @59, @62, @63, +72, 80, 82, 211.
\| (vertical line), 117, 297.
*|\| (backslash), +179, @236, @262.
\sub at beginning of command line, @31, @38, 40.
@@ -18808,7 +18843,7 @@ redefine them.
*|>| (greater than sign), @64, +170, 210, 237.
|>>| (shown value), 41, 62.
*|>=| (greater than or equal to), @64, 65, +170, 210, 282.
-*|,| (comma), 57, 72, 73, 129, 155, 165--167, 171, 317, 318.
+*|,| (comma), 57, 72, 73, 129, 155, 165--167, 171, 211--213, 218, 317, 318.
|,,|\thinspace, 51.
|.|~(period), 43, +50, 51.
`\char`\.', 306.
@@ -18829,7 +18864,7 @@ redefine them.
*|@#| (suffix of at point), @176, +177, +178, 251, @273--@274.
\newletter
`a', 192.
-`A', 163, 164, 248, 302--303.
+`A', 10--11, 163, 164, 248, 302--303.
|abort|, 312--313.
|abs| (absolute value), @66, 82, @238, +264.
accents, 315, 317.
@@ -18839,7 +18874,7 @@ Adams, John, 359.
addition of pictures, 115, @117, @245.
addition of vectors, 9, @68.
*|addto|, +118--+119, @144, @151, @242--@245.
-\<addto command>, +220.
+\<addto command>, 118, +220.
|adjust_fit|, 306--308.
{\AE}schylus, 47.
{\AE}sopus, 340.
@@ -18895,7 +18930,7 @@ Beethoven, Ludwig van, 185.
*|begingroup|, +155--+157, 175, 178, 210--215, 217, @236, @243, @275, @289.
|beginlogochar|, 160, 302.
Bell, Eric Temple, 11.
-bell-shaped distribution, 251.
+bell-shaped distribution, +183, 251.
Bernshte{\u\i}n, Serge{\u\i} \thinspace Natanovich, 14.
\sub polynomials, 14, 133, 152, 246, 298--299.
B\'ezier, Pierre Etienne, 14.
@@ -18904,7 +18939,7 @@ Bierce, Ambrose Gwinnett, ix.
|\bigtest|, +341.
Billawala, Nazneen Noorudin, 266, 294.
binary search, 176--177, @293--@294.
-black, 270, 332--333.
+|black|, 270, 332--333.
black-letter, 294.
black/white reversal, 115.
|blacker|, 93--94, 268, +270--+271.
@@ -18912,7 +18947,7 @@ black/white reversal, 115.
Boole, George, 170.
*|boolean|, 55, +56.
\<boolean expression>, 170, +210.
-Boolean expressions, 170, 257.
+boolean expressions, 170, 257.
\<boolean primary>, 170, +210.
\<boolean secondary>, 170, +210.
\<boolean tertiary>, 170, +210.
@@ -18956,7 +18991,7 @@ chance, 183--185.
*|charcode|, 106, 210, 212, +220, @275, 324.
*|chardp|, 106, 212, 220, @275, +315--+316, 324.
*|chardx|, 106, 212, 220, @276, +324, @334.
-*|chardy|, 212, +324.
+*|chardy|, 106, 212, 220, +324.
*|charexists|, +106, 210, 316, 324.
*|charext|, 106, 212, +220, 316, 324.
*|charht|, 106, 212, 220, @275, +315--+316, 324, @334, @335.
@@ -18982,7 +19017,7 @@ circles, 123--124, 148.
|cmr10.mf|, 305.
|cmsl10|, 101.
|cmtt10|, 306.
-\<code>, +317.
+\<code> and \<code label>, +317.
codes, 281--283.
Colburn, Dorothy, 107.
collective subscripts, 56, 177.
@@ -18991,14 +19026,14 @@ command line, 38, 187, 269, 277, 301.
commands, 155, 217--220, 230, 321.
comments, 43, 50--51.
commutativity, 247.
-comparison, @65--@66, 80, 170.
+comparison, @65, 80, 170.
compass directions, 26, 119, 206--207, 228--229.
complex numbers, 69.
\<compound>, +217.
compound statement, +155, 217.
Computer Modern, 35, 103--105, 203, 206, 279, 304--313.
-concatenation, of paths, @70--@71, @123, 127, 129, +130, @245.
-\sub of strings, @69, 84--85, +187, @278, @286, @312.
+concatenation, of paths, @70--@71, @123, 127--129, +130, 137, @245, @266.
+\sub of strings, @69, 73, 84--85, +187, @278, @286, @312.
\<condition>, +169.
conditional and/or, 288--289.
conditions, 169--171, 179, 219, 259.
@@ -19039,7 +19074,7 @@ Cundall, Frank, 299.
curves, 13--19, \see paths.
cusps, 136.
|cutdraw|, @151, +271--+272.
-|cutoff|, @150, +272.
+|cutoff|, @150--@151, +272.
*|cycle|, @15, @16, @24--@28, @69, +129--+131, 170, 171, 210, 213.
\newletter
|d|, 35, @76, 102, 204, +275.
@@ -19057,7 +19092,7 @@ debugging tricks, 229--231, 286.
\<decimal digit>, +50.
decimal point, 50--51.
decimal representation, 188.
-\<declaration>, 56, +171.
+\<declaration>, +56, 171.
\<declaration list>, +57.
declarations, 56--57.
declarative versus imperative, 87.
@@ -19104,12 +19139,12 @@ dimensions, 92, +267.
|direction|, @69, 70, @135, @235, +265.
\<direction specifier>, 129, +213.
|directionpoint|, @135, +265.
-*|directiontime|, @135, @+136, 211, 245, 265, @295.
+*|directiontime|, @135, @+136, 211, 245, 265, @298.
|dishing|, 152, 164.
*|display|, +191--+192, 220.
\<display command>, +220.
|displaying|, 269, 276, 278.
-distance, 76, 84.
+distance, 76, 84, \also |length|.
|ditto|, @187, +263.
|div|, +265.
division, @59, @62, @63, 80, 82.
@@ -19117,7 +19152,7 @@ division, @59, @62, @63, 80, 82.
Dopping, Olle, 181.
|dot|, 306, 311.
dot product, 69.
-|dotprod|, @69, 178, @238, 265.
+|dotprod|, @68--@69, 178, @238, 265.
|dotsize|, 332, 334.
double-quote mark, 50--51, 187.
*|doublepath|, 118, +119, @151, 220.
@@ -19131,8 +19166,8 @@ Drayton, Michael, 279.
drift, 102, 106.
driver files, 304--306.
*|dropping|, 118, +120, 220.
-D\"urer, Albrecht, 13, 19.
*|dump|, 217, +221, 262, @279, @311.
+D\"urer, Albrecht, 13, 19.
|.dvi|, 32, 40, 103, 106, 323, 327, 328.
\newletter
|e|, 27--29, 273.
@@ -19140,7 +19175,7 @@ D\"urer, Albrecht, 13, 19.
edge structure, 116--117, 296--297.
edges, 116.
editing, 46.
-efficiency, 39, 99, 141, 144, 147, 228, 230, 234, 244, 264, 265, 277,
+efficiency, 39, 99, 116, 141, 144, 147, 228, 230, 234, 244, 264, 265, 277,
291, 297, 298.
El Palo Alto, 124--126, 139, 228--229.
ellipses, 123, 126.
@@ -19149,7 +19184,7 @@ Ellis, Henry Havelock, 11.
*|elseif|, +169--+170, 179.
em dash, 306.
emergency stops, 226.
-empty option in {\bf for\/} list, 171, @299.
+empty option in {\bf for\/} list, 171, +172, @299.
empty statement, 155, 217.
empty text argument, 299.
*|end|, @31, @37, 155, 167, 217, 221, 226, 278, 287, 305, @321.
@@ -19246,7 +19281,7 @@ font metric information, 39, 220, 315--321.
|\fontname|, 342.
*|for|, @18, @39, @113, +171--+173, 179, 228, @285--@291, @299.
\<for list>, +171, 299.
-forbidden tokens, +173, 218--219, 286.
+forbidden tokens, 173, +218--+219, 286.
*|forever|, @61, +171--+173, @176, 179.
*|forsuffixes|, +171--+172.
{\sevenrm FORTRAN} language, 237.
@@ -19254,7 +19289,7 @@ forbidden tokens, +173, 218--219, 286.
four-point method for curves, 13--14, 133.
Fournier, Simon Pierre, 321. % Harry Carter says S.P. is right, not P.S.!
fractions, 61, @62--@63, +72, 73.
-*|from| 191, 220, @252, @277, @312.
+*|from|, +191, 220, @252, @277, @312.
|fullcircle|, @114, 123--124, 126, @135--@137, +263, @266.
Fulton, A\period\ G\period, 157.
function values by interpolation, 294--295.
@@ -19269,7 +19304,7 @@ Gardner, Martin, 126.
|gfcorners|, 277, +278, 327.
|GFtoDVI|, 32, 37, 187, 327--336.
|gimme|, 61--62.
-Giotto de Bondone, 139.
+Giotto di Bondone, 139.
|gobble|, @167, +262, @289.
|gobbled|, +262, @289--@290.
golden ratio, 11.
@@ -19290,7 +19325,7 @@ gray fonts, 327, 330--335.
|grayfontarea|, 329.
|grayfontat|, 329.
greater than or equal to, 65.
-greatest integer function, \see floor.
+greatest integer function, \see |floor|.
grid, 5, 109, 275.
Grimm, Jakob Ludwig Karl, 73.
Grimm, Wilhelm Karl, 73.
@@ -19343,12 +19378,12 @@ inaccessible token, 286.
incomplete string, 50--51.
inconsistent equations, 82, 313.
|incr|, @39, 176--177, +266.
-independent variables, +81--+83, 88, 224, 226.
+independent variables, +81--+83, 88, 224, 226, 299.
infinite loops, 172, 226--227.
|infinity|, @62--@69, +263, @266.
inflection points, 18--19.
|INIMF|, 221, 262, 279.
-|\init|, 342.
+|\init|, +337, 342.
\<initial value>, +171.
*|inner|, 180, +218--+219, 286--287, @307, @321.
|inorder|, 290.
@@ -19360,9 +19395,9 @@ integers, 65--66.
interacting with \MF, 42--45, 61, 188--189, 191--193, 219, 223--225.
*|interim|, +155--+156, 230, @243, @244, @271, @272.
\<interim command>, 155, +218.
-internal quantities, 54--55, 88, 218, 262.
+internal quantities, 54--55, 88, 218, 262, 265--266.
\sub table, 211--212.
-\<internal quantity>, 156, 218, 265.
+\<internal quantity>, 156, 218.
|interpath|, 134, +267.
interpolation, 2, 134, 294--295.
interrupting \MF, 219, 227--228, 313.
@@ -19373,7 +19408,7 @@ intersection, of lines, 84.
*|intersectiontimes|, +136, @178, 213, @265, @294, @298.
|inverse|, @143, +264.
inverse video, 115, 118.
-*|inwindow|, +191, @277.
+*|inwindow|, +191, 220, @277.
Io, 33, 40, 47.
\<is>, 165, 171, +218.
Isis, 40.
@@ -19389,12 +19424,12 @@ Johnson, Samuel, 167.
Johnston, Edward, 29.
|join_radius|, 266.
jokes, viii, 231.
-Journal of Algorithms, 137--139.
+{\sl Journal of Algorithms}, 137--139.
|jut|, 162, 308.
\newletter
Kafka, Franz, 340.
Kandinski\u\i, Vasili\u\i\ Vasil'evich, 3.
-\<keep or drop>, +118, 120.
+\<keep or drop>, +118, 220.
*|keeping|, 118, +120, 220.
|keepit|, 295.
*|kern|, @97, @316, +317.
@@ -19408,38 +19443,37 @@ Knuth, Nancy Jill Carter, ix, 134, 137.
\newletter
|l|, 308--309.
La Rochefoucauld, Fran\c cois VI, 313.
-\<label>, +317.
+\<label>, +317--+318.
\<labeled code>, +318.
|labelfont|, +275, 329.
|labelfontarea|, 329.
|labelfontat|, 329.
-|labels|, @107, +274--+275, 327--328.
+|labels|, @107, +274, 327--328.
labels in font metric information, 317--318.
-labels on "proofmode" output, 37, 187, 274--275.
+labels on |proof| mode output, 37, 187, 274--275.
|labels.top|, 328.
Lam\'e, Gabriel, 126.
|large_pixels|, 332.
|lcode_|, 274, 328.
le B\'e, Pierre, 207.
-least integer function, \see ceiling.
+least integer function, \see |ceiling|.
Leban, Bruce Philip, 242, 243, 270, 295.
|left|, @16, +263.
left-handed dangerous bend, 143.
|leftstemloc|, 96, 199, 302.
-*|length|, @66, @69, 72, 211, 238.
+*|length|, @66, @69, 72, 210, 238.
less than or equal to, 65.
*|let|, 53, 180, +218, @287--@289, @299, @311.
\<let command>, +218.
|letter_fit|, 307--308.
-\<leveldef>, +178.
-\<leveldef heading>, 165, +178.
+\<leveldef> and \<leveldef heading>, 165, +178.
|lft|, @23, @77, 80, 147, 151, +273.
lies, viii, 231.
Life, 121.
\<ligature op>, +317.
ligatures, 305--306, 315--317.
|lightweight|, 332.
-*|ligtable|, @97, @305, +316--+317.
+*|ligtable|, @97, @305--@306, +316--+317.
\<ligtable command>, +317.
\<ligtable program>, +317.
\<ligtable step>, +317.
@@ -19459,10 +19493,9 @@ logo of \MF, ii, 22--23, 95--99, 160--161, 184--185, 199--200, 204, 301--304.
|logo.mf|, 95--98, 199, 302--303.
logos, {\it i}, 97, @114, @137--@139.
|logo10.mf|, 95, 287, 301, 304.
-\<loop>, +171.
-\<loop header>, +171.
+\<loop> and \<loop header>, +171.
loop text, 171--172, 219, 286.
-loops, 169, 179, 226--227, 259, 290--291, 299.
+loops, 169, 171--173, 179, 226--227, 259, 290--291, 299.
low-resolution proofs, 99, 327.
|\lowers|, 339.
|lowres|, 196, 201, 230, +270.
@@ -19536,7 +19569,7 @@ multiplication, @59, @62--@64, 69, 79--80, 82.
music, 183, 185.
\newletter
`n', 201--203.
-`N', 184--185, 303.
+`N', 184--185, 302--303.
|\names|, 339.
National Science Foundation, ix.
Naur, Peter, 49, 89.
@@ -19568,7 +19601,7 @@ numeric expressions, 72--73, 257.
\<numeric secondary>, 72, 178, +211.
\<numeric tertiary>, 72, +211.
\<numeric token>, +50, 236.
-\<numeric token primary>, 72, +210.
+\<numeric token primary>, 72, +211.
numeric tokens, 49--50, 166.
\sub maximum value, 50.
\sub rounded fractional values, 50.
@@ -19576,9 +19609,9 @@ numeric tokens, 49--50, 166.
*|numspecial|, 220, @274, +323--+324, @327--@329.
|numtok|, @+274.
\newletter
-|o|, @23, @34, +93, 197, 200, 204, 302.
+|o|, @23, @34, +93, 197, 200, 204, 240, 302.
`o', 203.
-`O', 32--37, 199, 303.
+`O', 32--37, 161, 199, 302--303.
|o_correction|, 93--94, 268.
*|oct|, +188, 211, 281.
octal notation, 188.
@@ -19588,13 +19621,13 @@ octants, 119, 206--207, 228--230.
of-the-way function, \see mediation.
off by $x$, 82.
Office of Naval Research, ix.
-|offset|, 275, 379.
+|offset|, 275, 329.
|!| |OK|, 219, 224.
|\omitaccents|, 340.
one-point {\bf draw}, 22, 150, 200, 253.
online interaction, 42--45, 61, 188--189, 191--193, 219, 223--225.
|openit|, +277, 312.
-*|openwindow|, +191--+193, 220, @277, @312--@313.
+*|openwindow|, +191--+193, 220, @277, @312.
\<openwindow command>, 191, +220.
operands, 59.
operators, 59, 230.
@@ -19611,7 +19644,7 @@ output of \MF, 39, 42, 315--325.
|overdraw|, 114, 243.
overflow labels, 37, 328.
overlays, 295.
-overshoot, 23, 34, 93, 197, 200, 204.
+overshoot, 23, 34, 93, 197, 200, 204, 302.
\newletter
`P', 207.
Paget, Francis Edward, 279.
@@ -19659,9 +19692,9 @@ pen expressions, 147--148, 258, 298.
*|pencircle|, @21--@23, @28, @29, +147--+149, @150--@152, 198, 200, 214.
|penlabels|, 36, +274.
*|penoffset|, +150, 212, 230, @298.
-|penpos|, @26--@29, 37, @103, @162, +273, 310.
+|penpos|, @26--@29, 37, 80, @103, @162, +273, 310.
|penrazor|, @107, @112, 147, 150, +264, 297.
-pens, 21--39, 147--152, 297--298.
+pens, 21--29, 147--152, 297--298.
|penspeck|, +264, @271.
|pensquare|, 147, 152, +264, 275.
|penstroke|, 27--29, @138, +273.
@@ -19755,14 +19788,14 @@ reverse video, 115, 118.
Reynolds, Lloyd Jay, 153.
|right|, @26, @68, +263.
\<right-hand side>, +88, 171.
-*|rotated|, @21--@22, @25, 27, 44, @68, 73, @107, @114, @117, +141, 212, @238.
+*|rotated|, @21--@22, @25, 27, 44, @68, 73, @107, @114, @117, +141, 213, @238.
|rotatedabout|, +266.
|rotatedaround|, @138, 141, @142, @144, 159--160, +266.
|round|, @66, 196, 202, +264, @273.
rounding, 34--35, 50, 195--207, 308.
|rt|, @23, @77, 80, @103, 147, 151, +273.
|rtest.mf|, 311.
-|rule|, 234, 328.
+|rule|, 274, 328.
|rulepen|, +274, 275.
rules on proofsheets, 328--329.
|rulethickness|, 275, 329.
@@ -19778,7 +19811,7 @@ sans-serif, 105, 305, 308.
\<save command>, 155, +218.
|savepen|, @96, 147, +272, @310.
\<scalar multiplication operator>, 72, +211.
-*|scaled|, @21--@23, @68, 73, +141, 212, 244, 291.
+*|scaled|, @21--@23, @68, 73, +141, 213, 244, 291.
*|scantokens|, @61, +179, @180, 189, 251, @269, @270, @286--@288, @313.
scatter plots, 183.
\<screen coordinates>, 191, +220.
@@ -19811,7 +19844,7 @@ sharped dimensions, @32--@35, 91--99, 102--103, 268, 315.
*|showdependencies|, 81, 83, +219, @262.
|showit|, @31, 191, @276, +277, 295.
*|showstats|, +219.
-*|showstopping|, 211, @227, 230, @262.
+*|showstopping|, 211, 219, @227, 230, @262.
*|showtoken|, 180, +219, @221.
*|showvariable|, 175, 177, 180, +219.
|shrink_fit|, 308--310.
@@ -19835,7 +19868,7 @@ slant fonts, 329, 335--336.
|solve|, 176--177, +267, @292--@294.
|(some| |charht| |values...)|, 316.
Southall, Richard Francis, 176.
-spaces, 43, 50, 236.
+spaces, 43, 50, 236, 319.
sparks, +53--+55, 156, 175, 215, 219, 289.
*|special|, 220, @240--@241, @274, +323--+324, @327--@329.
\<special command>, +220.
@@ -19867,9 +19900,9 @@ strange paths, 110--111, 119, 121, 136, 152, 228--229.
Stravinski{\u\i}, Igor' F\"edorovich, 193.
stretchability, 319.
Strindberg, Johan August, 185.
-*|string|, 55, +56, 69.
+*|string|, 55, +56.
\<string expression>, 73, 187, +214.
-string expressions, 187--189, 258, 286.
+string expressions, @69, 187--189, 258, 286.
\<string primary>, 187, +214.
\<string secondary>, 187, +214.
\<string tertiary>, 187, +214.
@@ -19889,7 +19922,7 @@ Suetonius Tranquillus, Gaius, 181.
|(SUFFIX|$_n$|)|, 44, 251.
sum, of pictures, 115, @117, @245.
\sub of transforms, 178.
-\sub of vectors, 9.
+\sub of vectors, 9, @68.
|superellipse|, @126, @138, +267.
superellipses, 126, 161.
|superness|, 126.
@@ -19923,14 +19956,14 @@ tapered stroke, 28.
*|tertiary|, 165, 167.
\<tertiary>, 71, @137, +209.
*|tertiarydef|, 166, +178, @266.
-|test.mf|, 311--312.
+|test.mf|, 311--313.
|testfont.tex|, 40, 336--342.
-\TeX, 1, 34, 40, 91, 96, 98, 101--102, 315, 336--343, 361.
+\TeX, 1, 34, 40, 91, 96, 98, 101--103, 315, 336--343, 361.
*|text|, @161, +165--+167.
|\text|, 340.
|(TEXT|$_n$|)|, 45, 249, 251.
-text arguments, 219, 288--290, 299.
-|.tfm|, 39, 315--317, 333, 335.
+text arguments, 219, 288--291, 299.
+|.tfm|, 39, 315--321, 333, 335.
|!| |This| |can't| |happen|, 226.
Thomson, James, 189.
Thoreau, Henry David, 221.
@@ -19945,7 +19978,7 @@ Tinguely, Jean, 3.
|titlefont|, +275, 329.
|titlefontarea|, 329.
|titlefontat|, 329.
-*|to|, 191, 220, @252, @277, @312.
+*|to|, +191, 220, @252, @277, @312.
|<to| |be| |read| |again>|, 223.
Tobin, Georgia Kay Mase, ii, 240.
tokens, 42--43, +49--+51, 210.
@@ -20004,9 +20037,9 @@ typographic errors, 45, 224.
|!| |Undefined| |coordinate|, 224.
undelimited arguments, +167.
\<undelimited parameters>, +165.
-undelimited suffix parameters, +167, 176, 265, 270.
+undelimited suffix parameters, +167, 176, 266, 270.
underline characters, 49, +51, 173, 265, 270.
-|undraw|, 113, 118, 120, 242, +271.
+|undraw|, 113, 118, 120, @242, +271.
|undrawdot|, 113, +271.
unequal to, 65.
|unfill|, @25, 27, 109--110, 118, @126, +271.
@@ -20017,10 +20050,10 @@ Union Jack, 7.
|unitpixel|, +263, @333.
units of measure, 33, 91--99, 267--268.
\sub table, 92.
-|unitsquare|, @116, 128, 132, 136, +263.
+|unitsquare|, @116, 123--124, 128, 132, 136, +263.
|unitvector|, @238, +264.
-*|unknown|, 79--82, 143, +170, 210.
-unknown quantities, nonnumeric, 84--85.
+*|unknown|, +170, 210.
+unknown quantities, nonnumeric, 84--85, 143.
\sub numeric, 79--83.
*|until|, @18, 171.
|up|, @32, @129, +263.
@@ -20034,9 +20067,9 @@ vacuous expressions, 209, +215, 250, 262, 289, 292.
\<vacuous secondary>, +215.
\<vacuous tertiary>, +215.
valentine, 134.
-values, disappearance of, 56, 88, 156--157.
+values, disappearance of, 56, 83, 88, 156--157, 177--178, 218, 239, 299.
*|vardef|, 166, @175--@178, 289.
-\<vardef heading>, +178.
+\<vardef heading>, 165, +178.
\<variable>, 54, +55, 210.
variables, 53--57, 59.
\sub reinitializing, 88, 157.
@@ -20059,7 +20092,7 @@ Wilkins, John, ii, 283.
Willis, Ellen Jane, 157.
\<window>, 191, +220.
\<window spec>, 191, +220.
-\<with clause>, +118, 120.
+\<with clause>, +118, 220.
*|withpen|, 118, 220, @242.
*|withweight|, 118, 220, @242, @297.
|WNW|, 119, 228--229.
@@ -20072,7 +20105,7 @@ Xerox Corporation, 320.
*|xoffset|, 212, +220, @309, 315, 324.
xor, 120.
*|xpart|, @68, 72, @138, 142, 211.
-*|xscaled|, @21--@23, @68, 73, +141, 213, 244, 291.
+*|xscaled|, @21--@22, @68, 73, +141, 213, 244, 291.
*|xxpart|, 72, 142, @160, 211.
|xy_swap|, 297.
*|xypart|, 142, @160, 211.
diff --git a/systems/knuth/dist/mf/trap.72270gf b/systems/knuth/dist/mf/trap.72270gf
new file mode 100644
index 0000000000..5ef0e4f660
--- /dev/null
+++ b/systems/knuth/dist/mf/trap.72270gf
Binary files differ
diff --git a/systems/knuth/dist/mf/trap.fot b/systems/knuth/dist/mf/trap.fot
index 6bceb9f67e..b5551c805c 100644
--- a/systems/knuth/dist/mf/trap.fot
+++ b/systems/knuth/dist/mf/trap.fot
@@ -1,4 +1,4 @@
-This is METAFONT, Version 2.7182818 (INIMF)
+This is METAFONT, Version 2.71828182 (INIMF)
** &trap trap
(trap.mf
\*//*\trap\pass2!
@@ -36,7 +36,7 @@ xpart '=-ypart '-0.66667
{qq:=pen}
{showstats}
Memory usage 1462&588 (104 still untouched)
-String usage 41&161 (815&7634 still untouched)
+String usage 41&161 (816&7678 still untouched)
{[repeat the loop]}
! A group begun on line 163 never ended.
<to be read again>
diff --git a/systems/knuth/dist/mf/trap.log b/systems/knuth/dist/mf/trap.log
index 611ce589e2..1861267898 100644
--- a/systems/knuth/dist/mf/trap.log
+++ b/systems/knuth/dist/mf/trap.log
@@ -1,4 +1,4 @@
-This is METAFONT, Version 2.7182818 (preloaded base=trap 2014.1.7) 7 JAN 2014 18:11
+This is METAFONT, Version 2.71828182 (preloaded base=trap 1776.7.4) 4 JUL 1776 12:00
** &trap trap
(trap.mf
{if}
@@ -161,7 +161,7 @@ true-or-false value. I'm changing it to `false'.
path
l.25 path
p[][]p,w,qw; qw=(1,-2)..(2,-1)..(2.5,0.5)..(1,2)..(...
-After `exitif <boolean exp>' I expect to see a semicolon.
+After `exitif <boolean expr>' I expect to see a semicolon.
I shall pretend that one was there.
{pair}
@@ -1822,7 +1822,7 @@ row -2: | -4+ -3- -2+ -1-
{showstats}
Memory usage 1084&202 (749 still untouched)
-String usage 24&92 (858&11309 still untouched)
+String usage 24&92 (859&11353 still untouched)
{addto}
{(path)yscaled(0.01666)}
Path at line 82, before subdivision into octants:
@@ -3046,7 +3046,7 @@ For safety's sake I'll ignore the present command.
substring
l.124 ...aderbyte(48.5)substring
(-9,9)of"long"; for\=0:\
-A colon should follow a headerbyte or fontinfo location.
+A colon should follow a headerbyte or fontdimen location.
{-(9)}
{((-9,9))substring("long")}
@@ -3690,9 +3690,9 @@ XPR1)+2)-(1,(EXPR1)+2)rotated90
alpha=0.45p3~+7
{tracingcapsules:=1}
{showdependencies}
-xpart %CAPSULE1359=xx
-%CAPSULE1367=2yy-2
-%CAPSULE1375 = 3.3333xx+3.3333
+xpart %CAPSULE1370=xx
+%CAPSULE1378=2yy-2
+%CAPSULE1386 = 3.3333xx+3.3333
alpha=0.45p3~+7
{show}
{(1/3)*((3,6))}
@@ -3752,62 +3752,62 @@ o4=0.44444o2+0.88889o1
o5=0.44444o2+0.88889o1
oo=1.7o2+1.6o1-18
%CAPSULE382 = 3ooo-0.01o3
-xpart %CAPSULE1049 = 8000o2-4000o1+1000o3+9
-xpart %CAPSULE1383=xpart '
-ypart %CAPSULE1383=ypart '
+xpart %CAPSULE604 = 8000o2-4000o1+1000o3+9
+xpart %CAPSULE1394=xpart '
+ypart %CAPSULE1394=ypart '
alpha=0.45p3~+7
{numeric}
-### 4000o1 = -xpart %CAPSULE1049+8000o2+1000o3+9
-### -4.87383o2 = -oo-0.0004xpart %CAPSULE1049+0.39673o3-17.99643
+### 4000o1 = -xpart %CAPSULE604+8000o2+1000o3+9
+### -4.87383o2 = -oo-0.0004xpart %CAPSULE604+0.39673o3-17.99643
#### o6=-0.00027
### -0.04366o3 = -o4+0.46689oo+8.40439
### -o4 = -o5
### 0.22894o5 = -%CAPSULE382+0.10689oo+3ooo+1.92412
{begingroup}
{pair}
-### -alfa=-xpart %CAPSULE1494
+### -alfa=-xpart %CAPSULE368
{endgroup}
-{xpart((xpart %CAPSULE1494,0))}
-### -xpart %CAPSULE17=-%CAPSULE1176
+{xpart((xpart %CAPSULE368,0))}
+### -xpart %CAPSULE17=-%CAPSULE1376
{endgroup}
-{(%CAPSULE382)+(%CAPSULE1176)}
-### -%CAPSULE382=-%CAPSULE1893+%CAPSULE1176
-### -%CAPSULE1893=-ypart %CAPSULE1049
+{(%CAPSULE382)+(%CAPSULE1376)}
+### -%CAPSULE382=-%CAPSULE1364+%CAPSULE1376
+### -%CAPSULE1364=-ypart %CAPSULE604
{begingroup}
{save}
{(1)-(p$)}
{restoring p}
-### p$=-ypart %CAPSULE604+1
+### p$=-ypart %CAPSULE1360+1
{endgroup}
-{(2/3)*((-ypart %CAPSULE604+1,ypart %CAPSULE604))}
-### ypart %CAPSULE604=-xpart %CAPSULE604+1
-### -0.66667xpart %CAPSULE604=-xpart %CAPSULE1889
-{-((xpart %CAPSULE1889,-xpart %CAPSULE1889+0.66667))}
-### xpart %CAPSULE1889=-xpart %CAPSULE1172
-{((xpart %CAPSULE1049,ypart %CAPSULE1049))=((xpart %CAPSULE1172,-xpart %
-CAPSULE1172-0.66667))}
-## xpart %CAPSULE1172=-ypart %CAPSULE1049-0.66667
-## ypart %CAPSULE1049=-xpart %CAPSULE1049-0.66667
-### -xpart %CAPSULE1049=-xpart %CAPSULE1172
-{((xpart ',ypart '))=((xpart %CAPSULE1172,-xpart %CAPSULE1172-0.66667))}
-## xpart %CAPSULE1172=-ypart '-0.66667
+{(2/3)*((-ypart %CAPSULE1360+1,ypart %CAPSULE1360))}
+### ypart %CAPSULE1360=-xpart %CAPSULE1360+1
+### -0.66667xpart %CAPSULE1360=-xpart %CAPSULE1744
+{-((xpart %CAPSULE1744,-xpart %CAPSULE1744+0.66667))}
+### xpart %CAPSULE1744=-xpart %CAPSULE1675
+{((xpart %CAPSULE604,ypart %CAPSULE604))=((xpart %CAPSULE1675,-xpart %CA
+PSULE1675-0.66667))}
+## xpart %CAPSULE1675=-ypart %CAPSULE604-0.66667
+## ypart %CAPSULE604=-xpart %CAPSULE604-0.66667
+### -xpart %CAPSULE604=-xpart %CAPSULE1675
+{((xpart ',ypart '))=((xpart %CAPSULE1675,-xpart %CAPSULE1675-0.66667))}
+## xpart %CAPSULE1675=-ypart '-0.66667
## xpart '=-ypart '-0.66667
{begingroup}
{(0.5)*(ooo)}
{begingroup}
{numeric}
-### -ooo=-%CAPSULE1494
+### -ooo=-%CAPSULE1051
{endgroup}
-{(%CAPSULE1494)+(1)}
-### -%CAPSULE1494=-%CAPSULE1350+1
-{(1/2)*(%CAPSULE1350)}
-### -0.5%CAPSULE1350=-%CAPSULE1367
-{-(%CAPSULE1367)}
-### %CAPSULE1367=-%CAPSULE1893
-{(2)*(%CAPSULE1893)}
-### -2%CAPSULE1893=-%CAPSULE1885
-{(-0.5%CAPSULE1885-0.5)=(%CAPSULE1885)}
-## %CAPSULE1885=-0.33333
+{(%CAPSULE1051)+(1)}
+### -%CAPSULE1051=-%CAPSULE1378+1
+{(1/2)*(%CAPSULE1378)}
+### -0.5%CAPSULE1378=-%CAPSULE1370
+{-(%CAPSULE1370)}
+### %CAPSULE1370=-%CAPSULE1362
+{(2)*(%CAPSULE1362)}
+### -2%CAPSULE1362=-%CAPSULE1354
+{(-0.5%CAPSULE1354-0.5)=(%CAPSULE1354)}
+## %CAPSULE1354=-0.33333
{(oo)=(-0.33333)}
## oo=-0.33333
{endgroup}
@@ -4232,7 +4232,7 @@ xpart '=-ypart '-0.66667
{qq:=pen}
{showstats}
Memory usage 1462&588 (104 still untouched)
-String usage 41&161 (815&7634 still untouched)
+String usage 41&161 (816&7678 still untouched)
{[repeat the loop]}
! A group begun on line 163 never ended.
<to be read again>
@@ -4248,8 +4248,8 @@ by `endgroup'. So I've inserted `endgroup' now.
(end occurred when if on line 36 was incomplete)
(end occurred when elseif on line 21 was incomplete)
Here is how much of METAFONT's memory you used:
- 68 strings out of 883
- 3752 string characters out of 11386
+ 68 strings out of 884
+ 3752 string characters out of 11430
2897 words of memory out of 3001
289 symbolic tokens out of 2100
8i,43n,14r,8p,167b stack positions out of 30i,100n,300r,150p,500b
diff --git a/systems/knuth/dist/mf/trap.pl b/systems/knuth/dist/mf/trap.pl
index bae32a41fb..bae32a41fb 100644..100755
--- a/systems/knuth/dist/mf/trap.pl
+++ b/systems/knuth/dist/mf/trap.pl
diff --git a/systems/knuth/dist/mf/trap.typ b/systems/knuth/dist/mf/trap.typ
index 159c5ce7fc..9994dcc000 100644
--- a/systems/knuth/dist/mf/trap.typ
+++ b/systems/knuth/dist/mf/trap.typ
@@ -1,6 +1,6 @@
This is GFtype, Version 3.1
Options selected: Mnemonic output = true; pixel output = true.
-' METAFONT output 2014.01.07:1811'
+' METAFONT output 1776.07.04:1200'
35: beginning of char 5: -4096<=m<=4094 -2<=n<=1
(initially n=1) paint (4095)1
diff --git a/systems/knuth/dist/mf/trapin.fot b/systems/knuth/dist/mf/trapin.fot
new file mode 100644
index 0000000000..c1dc047847
--- /dev/null
+++ b/systems/knuth/dist/mf/trapin.fot
@@ -0,0 +1,78 @@
+This is METAFONT, Version 2.71828182 (INIMF)
+**
+Please type the name of your input file.
+**\input trap
+(trap.mf
+>> << == >> ::: ||`` ''--!! ??## && @@ $$[[]]{{ }}((5.5 0.5))
+>> ".."
+! Not implemented: (unknown numeric)++(string).
+<to be read again>
+ ;
+l.4 ...}} . (( 5.5.5 )) ++ "..";
+
+..
+! Missing `=' has been inserted.
+<to be read again>
+ ,
+l.5 begingroup save =; let=,
+ ; save,; newinternal $=,; let )...
+> errorstopmode=errorstopmode
+> readstring=readstring
+> 2
+> "2"
+> ,=,
+> (=tag
+> )=,
+<< == >> ::: ||`` ''--!! ??## && @@ $$[[]]{{ }}(([][]))=numeric
+<< == >> ::: ||`` ''--!! ??## && @@ $$[[]]{{ }}((5.5 0.5))=<< == >> :::
+||`` ''--!! ??## && @@ $$[[]]{{ }}((5.5 0.5))
+> year=month
+! OK.
+l.6 ...ring,2,"2",,,(,),<<,year;
+
+! Missing `:' has been inserted.
+<to be read again>
+ ;
+l.8 ...not cycle "":1.1 forever;
+ fi;
+> |=:|>=|=:|>
+! OK.
+l.9 ... endfor; showtoken |=:|>;
+
+! Arithmetic overflow.
+l.10 tracingedges:=1/.00001
+ ; tracingequations:=$+1; p~=trac...
+! Arithmetic overflow.
+l.10 ... p~=tracingedges+.00001;
+
+>> x
+! Internal quantity `$' must receive a known value.
+<to be read again>
+ ;
+l.12 ...os:=1; $:=ASCII""; $:=x;
+ p~:=p~;
+! Value is too large (32767.99998).
+l.12 ...:=ASCII""; $:=x; p~:=p~;
+
+! Missing `)' has been inserted.
+<to be read again>
+ ;
+<argument> ...m.proofing:=(-0.5;
+ shipout.nullpicture;special"3"
+foo->begingroup(TEXT2)
+ endgroup
+l.16 ...ture; special"3" endtext
+ ;
+Memory usage 291&41 (1922 still untouched)
+String usage 26&83 (892&11481 still untouched)
+! OK.
+l.17 ...ing:fi endfor showstats;
+ let!!=skipto;
+ )
+(see the transcript file for additional information)
+Beginning to dump on file trap.base
+ (preloaded base=trap 1776.7.4)
+1116 strings of total length 20570
+395 memory locations dumped; current usage is 317&67
+265 symbolic tokens
+Transcript written on trap.log.
diff --git a/systems/knuth/dist/mf/trapin.log b/systems/knuth/dist/mf/trapin.log
index 2fbafd0e6b..c07ae62774 100644
--- a/systems/knuth/dist/mf/trapin.log
+++ b/systems/knuth/dist/mf/trapin.log
@@ -1,4 +1,4 @@
-This is METAFONT, Version 2.7182818 (INIMF) 7 JAN 2014 17:51
+This is METAFONT, Version 2.71828182 (INIMF) 4 JUL 1776 12:00
**\input trap
(trap.mf
>> << == >> ::: ||`` ''--!! ??## && @@ $$[[]]{{ }}((5.5 0.5))
@@ -147,7 +147,7 @@ put one in, behind the scenes; this may fix the problem.
{for}
{showstats}
Memory usage 291&41 (1922 still untouched)
-String usage 26&83 (891&11438 still untouched)
+String usage 26&83 (892&11481 still untouched)
! OK.
l.17 ...ing:fi endfor showstats;
let!!=skipto;
@@ -173,7 +173,7 @@ Path at line 18, after choices:
{elseif}
)
Beginning to dump on file trap.base
- (preloaded base=trap 2014.1.7)
-1117 strings of total length 20614
+ (preloaded base=trap 1776.7.4)
+1116 strings of total length 20570
395 memory locations dumped; current usage is 317&67
265 symbolic tokens
diff --git a/systems/knuth/dist/mfware/gftodvi.web b/systems/knuth/dist/mfware/gftodvi.web
index 3540b500f1..9fb263a7e3 100644
--- a/systems/knuth/dist/mfware/gftodvi.web
+++ b/systems/knuth/dist/mfware/gftodvi.web
@@ -32,7 +32,7 @@
\def\title{GF$\,$\lowercase{to}$\,$DVI}
\def\contentspagenumber{301}
\def\topofcontents{\null
- \def\titlepage{F} % include headline on the contents page
+ \titlefalse % include headline on the contents page
\def\rheader{\mainfont\hfil \contentspagenumber}
\vfill
\centerline{\titlefont The {\ttitlefont GFtoDVI} processor}
@@ -1128,7 +1128,7 @@ should be zero, but other document file formats allow nonzero vertical
escapement.
The character width~|w| duplicates the information in the \.{TFM} file; it
-is $2^{24}$ times the ratio of the true width to the font's design size.
+is $2^{20}$ times the ratio of the true width to the font's design size.
The backpointer |p| points to the character's |boc|, or to the first of
a sequence of consecutive \\{xxx} or |yyy| or |no_op| commands that
diff --git a/systems/knuth/dist/mfware/gftopk.web b/systems/knuth/dist/mfware/gftopk.web
index ab9ba10465..d7012a277a 100644
--- a/systems/knuth/dist/mfware/gftopk.web
+++ b/systems/knuth/dist/mfware/gftopk.web
@@ -44,7 +44,7 @@
\def\title{GFtoPK}
\def\contentspagenumber{201}
\def\topofcontents{\null
- \def\titlepage{F} % include headline on the contents page
+ \titlefalse % include headline on the contents page
\def\rheader{\mainfont\hfil \contentspagenumber}
\vfill
\centerline{\titlefont The {\ttitlefont GFtoPK} processor}
@@ -681,7 +681,7 @@ definitions are called flag bytes, and various fields within the byte indicate
various things about how the character definition is encoded. Command bytes
have zero or more parameters, and can never appear within a character
definition or between parameters of another command, where they would be
-interpeted as data.
+interpreted as data.
A \.{PK} file consists of a preamble, followed by a sequence of one or more
character definitions, followed by a postamble. The preamble command must
@@ -722,7 +722,7 @@ of a keyword followed by possible parameters relevant to that keyword.
length exceeds~255.
\yskip\hang\\{pk\_xxx4} 243 |k[4]| |x[k]|. Like |pk_xxx1|, but |k| can be
-ridiculously large; |k| musn't be negative.
+ridiculously large; |k| mustn't be negative.
\yskip\hang|pk_yyy| 244 |y[4]|. This command is undefined in general; it
functions as a five-byte \\{no\_op} unless special \.{PK} reading programs
@@ -1281,7 +1281,7 @@ end ;
@* Plan of attack.
It would seem at first that converting a \.{GF} file to \.{PK} format should
be relatively easy, since they both use a form of run-encoding. Unfortunately,
-several idiosyncracies of the \.{GF} format make this conversion slightly
+several idiosyncrasies of the \.{GF} format make this conversion slightly
cumbersome.
The \.{GF} format separates the raster information from the escapement values
and \.{TFM} widths; the \.{PK} format combines all information about a single
@@ -1458,7 +1458,7 @@ end
@<Glob...@>=
@!gf_ch : integer ; {the character we are working with}
-@!gf_ch_mod_256 : integer ; {locater pointer}
+@!gf_ch_mod_256 : integer ; {locator pointer}
@!pred_pk_loc : integer ; {where we predict the end of the character to be.}
@!max_n, @!min_n : integer ; {the maximum and minimum horizontal rows}
@!max_m, @!min_m : integer ; {the maximum and minimum vertical rows}
@@ -1705,7 +1705,7 @@ end else begin
end
@ We must convert the run-count array from a row orientation to a glyph
-orientation, with repeat counts for repeated rows. We seperate this task
+orientation, with repeat counts for repeated rows. We separate this task
into two smaller tasks, on a per row basis. But first, we define a new
macro to help us fill up this new array. Here, we have no fear that we will
run out of space, as the glyph representation is provably smaller than the
@@ -2152,10 +2152,10 @@ pk_byte(pk_post) ;
while (pk_loc mod 4 <> 0) do pk_byte(pk_no_op)
@ Once we are finished with the \.{GF} file, we check the status of each
-character to insure that each character that had a locater also had raster
+character to insure that each character that had a locator also had raster
information.
-@<Check for un-rasterized locaters@>=
+@<Check for unrasterized locators@>=
for i := 0 to 255 do
if status[i] = located then
print_ln('Character ',i:1,' missing raster information!')
@@ -2166,7 +2166,7 @@ for i := 0 to 255 do
@p begin
initialize ;
convert_gf_file ;
- @<Check for un-rasterized locaters@> ;
+ @<Check for unrasterized locators@> ;
print_ln(gf_len:1,' bytes packed to ',pk_loc:1,' bytes.') ;
final_end : end .
diff --git a/systems/knuth/dist/mfware/gftype.web b/systems/knuth/dist/mfware/gftype.web
index ef6feeefef..df530672b0 100644
--- a/systems/knuth/dist/mfware/gftype.web
+++ b/systems/knuth/dist/mfware/gftype.web
@@ -30,7 +30,7 @@
\def\title{GFtype}
\def\contentspagenumber{101}
\def\topofcontents{\null
- \def\titlepage{F} % include headline on the contents page
+ \titlefalse % include headline on the contents page
\def\rheader{\mainfont\hfil \contentspagenumber}
\vfill
\centerline{\titlefont The {\ttitlefont GFtype} processor}
@@ -572,7 +572,7 @@ should be zero, but other document file formats allow nonzero vertical
escapement.
The character width~|w| duplicates the information in the \.{TFM} file; it
-is $2^{24}$ times the ratio of the true width to the font's design size.
+is $2^{20}$ times the ratio of the true width to the font's design size.
The backpointer |p| points to the character's |boc|, or to the first of
a sequence of consecutive \\{xxx} or |yyy| or |no_op| commands that
diff --git a/systems/knuth/dist/mfware/mft.web b/systems/knuth/dist/mfware/mft.web
index 18a949b1e9..617369f878 100644
--- a/systems/knuth/dist/mfware/mft.web
+++ b/systems/knuth/dist/mfware/mft.web
@@ -7,6 +7,7 @@
% Version 1.0 was tuned up for the METAFONTware report (April 16, 1989).
% Version 1.1 ditto, with input handled by Hosek's idea (April 27, 1989).
% Version 2 has the new primitives of METAFONT 2.0 (October 16, 1989).
+% Version 2.1 corrects two of those primitives (January 20, 2021).
% Here is TeX material that gets inserted after \input webmac
\def\hang{\hangindent 3em\indent\ignorespaces}
@@ -21,17 +22,16 @@
\mathchardef\RA="3221 % right arrow
\mathchardef\BA="3224 % double arrow
\def\({} % kludge for alphabetizing certain module names
-\chardef\V=`\| % vertical line in a string
\def\title{MFT}
\def\contentspagenumber{401}
\def\topofcontents{\null
- \def\titlepage{F} % include headline on the contents page
+ \titlefalse % include headline on the contents page
\def\rheader{\mainfont\hfil \contentspagenumber}
\vfill
\centerline{\titlefont The {\ttitlefont MFT} processor}
\vskip 15pt
- \centerline{(Version 2.0, October 1989)}
+ \centerline{(Version 2.1, January 2021)}
\vfill}
\def\botofcontents{\vfill
\centerline{\hsize 5in\baselineskip9pt
@@ -83,7 +83,7 @@ a reformatting command even to get parentheses to act like delimiters!)
\MF\ comments, which follow a single \.\% sign, should be valid \TeX\
input. But \MF\ material can be included in \pb\ within a comment; this
will be translated by \.{MFT} as if it were not in a comment. For example,
-a phrase like `\.{make} \.{\V x2r\V} \.{zero}' will be translated into
+a phrase like `\.{make} \.{\v x2r\v} \.{zero}' will be translated into
`\.{make \$x\_\{2r\}\$ zero}'.
The rules just stated apply to lines that contain one, two, or three \.\% signs
@@ -128,7 +128,7 @@ dependencies' in the index below.
The ``banner line'' defined here should be changed whenever \.{MFT}
is modified.
-@d banner=='This is MFT, Version 2.0'
+@d banner=='This is MFT, Version 2.1'
@ The program begins with a fairly normal header, made up of pieces that
@^system dependencies@>
@@ -802,9 +802,7 @@ end;
@ @<Read from |mf_file|...@>=
begin incr(line);
if not input_ln(mf_file) then input_has_ended:=true
-else if limit=change_limit then
- if buffer[0]=change_buffer[0] then
- if change_limit>0 then check_change;
+else if change_limit>0 then check_change;
end
@ @<Read from |style_file|...@>=
@@ -840,7 +838,7 @@ had a line that didn't match any relevant line in |mf_file|.
@<Check that all changes have been read@>=
if change_limit<>0 then {|changing| is false}
- begin for loc:=0 to change_limit do buffer[loc]:=change_buffer[loc];
+ begin for loc:=0 to change_limit-1 do buffer[loc]:=change_buffer[loc];
limit:=change_limit; changing:=true; line:=other_line; loc:=change_limit;
err_print('! Change file entry did not match');
@.Change file entry did not match@>
@@ -936,7 +934,7 @@ 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
+ASCII codes is $c_1c_2\ldots c_n$, its hash value will be
$$(2^{n-1}c_1+2^{n-2}c_2+\cdots+c_n)\,\bmod\,|hash_size|.$$
@<Compute the hash...@>=
@@ -1226,6 +1224,8 @@ pr12("t")("r")("a")("c")("i")("n")("g")
("s")("t")("a")("t")("s")(internal);@/
pr13("t")("r")("a")("c")("i")("n")("g")
("o")("n")("l")("i")("n")("e")(internal);@/
+pr15("t")("r")("a")("c")("i")("n")("g")
+ ("r")("e")("s")("t")("o")("r")("e")("s")(internal);@/
@ @<Store all the primitives@>=
pr4("y")("e")("a")("r")(internal);@/
@@ -1233,7 +1233,7 @@ pr5("m")("o")("n")("t")("h")(internal);@/
pr3("d")("a")("y")(internal);@/
pr4("t")("i")("m")("e")(internal);@/
pr8("c")("h")("a")("r")("c")("o")("d")("e")(internal);@/
-pr7("c")("h")("a")("r")("f")("a")("m")(internal);@/
+pr7("c")("h")("a")("r")("e")("x")("t")(internal);@/
pr6("c")("h")("a")("r")("w")("d")(internal);@/
pr6("c")("h")("a")("r")("h")("t")(internal);@/
pr6("c")("h")("a")("r")("d")("p")(internal);@/
diff --git a/systems/knuth/dist/tex/glue.web b/systems/knuth/dist/tex/glue.web
index 38a6d667c8..add1903b50 100644
--- a/systems/knuth/dist/tex/glue.web
+++ b/systems/knuth/dist/tex/glue.web
@@ -7,7 +7,7 @@
\def\title{GLUE}
\def\topofcontents{\null
- \def\titlepage{F} % include headline on the contents page
+ \titlefalse % include headline on the contents page
\def\rheader{\mainfont\hfil \contentspagenumber}
\vfill
\centerline{\titlefont Fixed-Point Glue Setting}
diff --git a/systems/knuth/dist/tex/tex.web b/systems/knuth/dist/tex/tex.web
index e22c46b509..62374028b2 100644
--- a/systems/knuth/dist/tex/tex.web
+++ b/systems/knuth/dist/tex/tex.web
@@ -1,6 +1,7 @@
% This program is copyright (C) 1982 by D. E. Knuth; all rights are reserved.
-% Copying of this file is authorized only if (1) you are D. E. Knuth, or if
-% (2) you make absolutely no changes to your copy. (The WEB system provides
+% Unlimited copying and redistribution of this file are permitted as long
+% as this file is not modified. Modifications are permitted, but only if
+% the resulting file is not named tex.web. (The WEB system provides
% for alterations via an auxiliary file; the master file should stay intact.)
% See Appendix H of the WEB manual for hints on how to install this program.
% And see Appendix A of the TRIP manual for details about how to validate it.
@@ -46,6 +47,7 @@
% Version 3.141592 fixed \xleaders, glueset, weird alignments (December 2002).
% Version 3.1415926 was a general cleanup with minor fixes (February 2008).
% Version 3.14159265 was similar (January 2014).
+% Version 3.141592653 was similar but more extensive (January 2021).
% A reward of $327.68 will be paid to the first finder of any remaining bug.
@@ -188,7 +190,7 @@ helping to determine whether a particular implementation deserves to be
known as `\TeX' [cf.~Stanford Computer Science report CS1027,
November 1984].
-@d banner=='This is TeX, Version 3.14159265' {printed when \TeX\ starts}
+@d banner=='This is TeX, Version 3.141592653' {printed when \TeX\ starts}
@ Different \PASCAL s have slightly different conventions, and the present
@!@:PASCAL H}{\ph@>
@@ -199,7 +201,7 @@ reader see how to make an appropriate interface for other systems
if necessary. (\ph\ is Charles Hedrick's modification of a compiler
@^Hedrick, Charles Locke@>
for the DECsystem-10 that was originally developed at the University of
-Hamburg; cf.\ {\sl SOFTWARE---Practice \AM\ Experience \bf6} (1976),
+Hamburg; cf.\ {\sl Software---Practice and Experience \bf6} (1976),
29--42. The \TeX\ program below is intended to be adaptable, without
extensive changes, to most other versions of \PASCAL, so it does not fully
use the admirable features of \ph. Indeed, a conscious effort has been
@@ -295,8 +297,8 @@ to people who wish to preserve the purity of English.
Similarly, there is some conditional code delimited by
`$|stat|\ldots|tats|$' that is intended for use when statistics are to be
kept about \TeX's memory usage. The |stat| $\ldots$ |tats| code also
-implements diagnostic information for \.{\\tracingparagraphs} and
-\.{\\tracingpages}.
+implements diagnostic information for \.{\\tracingparagraphs},
+\.{\\tracingpages}, and \.{\\tracingrestores}.
@^debugging@>
@d debug==@{ {change this to `$\\{debug}\equiv\null$' when debugging}
@@ -1303,7 +1305,7 @@ example, be `|k in [0,@'10..@'12,@'14,@'15,@'33,@'177..@'377]|'.
If character |k| cannot be printed, and |k<@'200|, then character |k+@'100| or
|k-@'100| must be printable; moreover, ASCII codes |[@'41..@'46,
@'60..@'71, @'136, @'141..@'146, @'160..@'171]| must be printable.
-Thus, at least 81 printable characters are needed.
+Thus, at least 80 printable characters are needed.
@:TeXbook}{\sl The \TeX book@>
@^character set dependencies@>
@^system dependencies@>
@@ -1564,9 +1566,9 @@ end;
@ Here is the very first thing that \TeX\ prints: a headline that identifies
the version number and format package. The |term_offset| variable is temporarily
-incorrect, but the discrepancy is not serious since we assume that the banner
-and format identifier together will occupy at most |max_print_line|
-character positions.
+incorrect, but the discrepancy is not serious since we assume that this
+part of the program is system dependent.
+@^system dependencies@>
@<Initialize the output...@>=
wterm(banner);
@@ -1616,7 +1618,7 @@ by all \PASCAL\ compilers.
@<Basic print...@>=
procedure print_int(@!n:integer); {prints an integer in decimal form}
-var k:0..23; {index to current digit; we assume that $|n|<10^{23}$}
+var k:0..23; {index to current digit; we assume that $\vert n\vert<10^{23}$}
@!m:integer; {used to negate |n| in possibly dangerous cases}
begin k:=0;
if n<0 then
@@ -1880,7 +1882,8 @@ var c:ASCII_code; {what the user types}
{used to save global variables when deleting tokens}
begin if history<error_message_issued then history:=error_message_issued;
print_char("."); show_context;
-if interaction=error_stop_mode then @<Get user's advice and |return|@>;
+if interaction=error_stop_mode then
+ @<Get user's advice and |return|@>;
incr(error_count);
if error_count=100 then
begin print_nl("(That makes 100 errors; please try again.)");
@@ -1891,7 +1894,8 @@ if error_count=100 then
exit:end;
@ @<Get user's advice...@>=
-loop@+begin continue: clear_for_error_prompt; prompt_input("? ");
+loop@+begin continue: if interaction<>error_stop_mode then return;
+ clear_for_error_prompt; prompt_input("? ");
@.?\relax@>
if last=first then return;
c:=buffer[first];
@@ -1916,7 +1920,7 @@ case c of
"0","1","2","3","4","5","6","7","8","9": if deletions_allowed then
@<Delete \(c)|c-"0"| tokens and |goto continue|@>;
@t\4\4@>@;@+@!debug "D": begin debug_help; goto continue;@+end;@+gubed@/
-"E": if base_ptr>0 then
+"E": if base_ptr>0 then if input_stack[base_ptr].name_field>=256 then
begin print_nl("You want to edit file ");
@.You want to edit file x@>
slow_print(input_stack[base_ptr].name_field);
@@ -1937,7 +1941,8 @@ begin print("Type <return> to proceed, S to scroll future error messages,");@/
@.Type <return> to proceed...@>
print_nl("R to run without stopping, Q to run quietly,");@/
print_nl("I to insert something, ");
-if base_ptr>0 then print("E to edit your file,");
+if base_ptr>0 then if input_stack[base_ptr].name_field>=256 then
+ print("E to edit your file,");
if deletions_allowed then
print_nl("1 or ... or 9 to ignore the next 1 to 9 tokens of input,");
print_nl("H for help, X to quit.");
@@ -2129,7 +2134,7 @@ begin if OK_to_interrupt then
print_err("Interruption");
@.Interruption@>
help3("You rang?")@/
- ("Try to insert some instructions for me (e.g.,`I\showlists'),")@/
+ ("Try to insert an instruction for me (e.g., `I\showlists'),")@/
("unless you just want to quit by typing `X'.");
deletions_allowed:=false; error; deletions_allowed:=true;
interrupt:=0;
@@ -2917,8 +2922,8 @@ specifies the order of infinity to which glue setting applies (|normal|,
@ The |new_null_box| function returns a pointer to an |hlist_node| in
which all subfields have the values corresponding to `\.{\\hbox\{\}}'.
-The |subtype| field is set to |min_quarterword|, since that's the desired
-|span_count| value if this |hlist_node| is changed to an |unset_node|.
+(The |subtype| field is set to |min_quarterword|, for historic reasons
+that are no longer relevant.)
@p function new_null_box:pointer; {creates a new box node}
var p:pointer; {the new node}
@@ -4100,7 +4105,7 @@ expanded by `\.{\\the}'.
@d hskip=26 {horizontal glue ( \.{\\hskip}, \.{\\hfil}, etc.~)}
@d vskip=27 {vertical glue ( \.{\\vskip}, \.{\\vfil}, etc.~)}
@d mskip=28 {math glue ( \.{\\mskip} )}
-@d kern=29 {fixed space ( \.{\\kern})}
+@d kern=29 {fixed space ( \.{\\kern} )}
@d mkern=30 {math kern ( \.{\\mkern} )}
@d leader_ship=31 {use a box ( \.{\\shipout}, \.{\\leaders}, etc.~)}
@d halign=32 {horizontal table alignment ( \.{\\halign} )}
@@ -4239,7 +4244,7 @@ At each level of processing we are in one of six modes:
\hang|-mmode| stands for math formula mode (not displayed).
\yskip\noindent The mode is temporarily set to zero while processing \.{\\write}
-texts in the |ship_out| routine.
+texts.
Numeric values are assigned to |vmode|, |hmode|, and |mmode| so that
\TeX's ``big semantic switch'' can select the appropriate thing to
@@ -4432,7 +4437,7 @@ case abs(m) div (max_command+1) of
end;
end;
2: if a.int<>null then
- begin print("this will be denominator of:"); show_box(a.int);@+
+ begin print("this will begin denominator of:"); show_box(a.int);@+
end;
end {there are no other cases}
@@ -4954,7 +4959,7 @@ that will be defined later.
@d output_penalty_code=39 {penalty found at current page break}
@d max_dead_cycles_code=40 {bound on consecutive dead cycles of output}
@d hang_after_code=41 {hanging indentation changes after this many lines}
-@d floating_penalty_code=42 {penalty for insertions heldover after a split}
+@d floating_penalty_code=42 {penalty for insertions held over after a split}
@d global_defs_code=43 {override \.{\\global} specifications}
@d cur_fam_code=44 {current family}
@d escape_char_code=45 {escape character for token output}
@@ -5236,14 +5241,18 @@ del_code("."):=0; {this null delimiter is used in error recovery}
input and output, establishes the initial values of the date and time.
@^system dependencies@>
Since standard \PASCAL\ cannot provide such information, something special
-is needed. The program here simply specifies July 4, 1776, at noon; but
-users probably want a better approximation to the truth.
+is needed. The program here simply assumes that suitable values appear in
+the global variables \\{sys\_time}, \\{sys\_day}, \\{sys\_month}, and
+\\{sys\_year} (which are initialized to noon on 4 July 1776,
+in case the implementor is careless).
@p procedure fix_date_and_time;
-begin time:=12*60; {minutes since midnight}
-day:=4; {fourth day of the month}
-month:=7; {seventh month of the year}
-year:=1776; {Anno Domini}
+begin sys_time:=12*60;
+sys_day:=4; sys_month:=7; sys_year:=1776; {self-evident truths}
+time:=sys_time; {minutes since midnight}
+day:=sys_day; {day of the month}
+month:=sys_month; {month of the year}
+year:=sys_year; {Anno Domini}
end;
@ @<Show equivalent |n|, in region 5@>=
@@ -5279,11 +5288,13 @@ if blank_line then print_ln;
selector:=old_setting;
end;
-@ Of course we had better declare another global variable, if the previous
+@ Of course we had better declare a few more global variables, if the previous
routines are going to work.
@<Glob...@>=
@!old_setting:0..max_selector;
+@!sys_time,@!sys_day,@!sys_month,@!sys_year:integer;
+ {date and time supplied by external system}
@ The final region of |eqtb| contains the dimension parameters defined
here, and the 256 \.{\\dimen} registers.
@@ -5824,7 +5835,7 @@ should replace the corresponding entry in |xeq_level|.
\yskip\hangg 2) If |save_type(p)=restore_zero|, then |save_index(p)|
is a location in |eqtb| whose current value should be destroyed at the end
of the current group, when it should be
-replaced by the current value of |eqtb[undefined_control_sequence]|.
+replaced by the value of |eqtb[undefined_control_sequence]|.
\yskip\hangg 3) If |save_type(p)=insert_token|, then |save_index(p)|
is a token that should be inserted into \TeX's input when the current
@@ -6189,8 +6200,8 @@ when |m=out_param|, it means that \TeX\ should insert parameter
number |c| into the text at this point.
The enclosing \.{\char'173} and \.{\char'175} characters of a macro
-definition are omitted, but the final right brace of an output routine
-is included at the end of its token list.
+definition are omitted, but an output routine
+will be enclosed in braces.
Here is an example macro definition that illustrates these conventions.
After \TeX\ processes the text
@@ -6654,7 +6665,7 @@ template is being scanned;
template is being scanned;
\hang|backed_up|, if the token list being scanned has been inserted as
-`to be read again'.
+`to be read again';
\hang|inserted|, if the token list being scanned has been inserted as
the text expansion of a \.{\\count} or similar variable;
@@ -7190,7 +7201,8 @@ end
@ The recovery procedure can't be fully understood without knowing more
about the \TeX\ routines that should be aborted, but we can sketch the
-ideas here: For a runaway definition we will insert a right brace; for a
+ideas here: For a runaway definition or a runaway balanced text
+we will insert a right brace; for a
runaway preamble, we will insert a special \.{\\cr} token and a right
brace; and for a runaway argument, we will set |long_state| to
|outer_call| and insert \.{\\par}.
@@ -7827,7 +7839,7 @@ done: if cur_cs=0 then cur_tok:=(cur_cmd*@'400)+cur_chr
else cur_tok:=cs_token_flag+cur_cs;
end;
-@ The |get_x_token| procedure is equivalent to two consecutive
+@ The |get_x_token| procedure is essentially equivalent to two consecutive
procedure calls: |get_next; x_token|.
@p procedure x_token; {|get_x_token| without the initial |get_next|}
@@ -8148,7 +8160,7 @@ end
strip off the enclosing braces. That's why |rbrace_ptr| was introduced.
@<Tidy up the parameter just scanned, and tuck it away@>=
-begin if (m=1)and(info(p)<right_brace_limit)and(p<>temp_head) then
+begin if (m=1)and(info(p)<right_brace_limit) then
begin link(rbrace_ptr):=null; free_avail(p);
p:=link(temp_head); pstack[n]:=link(p); free_avail(p);
end
@@ -9140,7 +9152,7 @@ The token list created by |str_toks| begins at |link(temp_head)| and ends
at the value |p| that is returned. (If |p=temp_head|, the list is empty.)
@p function str_toks(@!b:pool_pointer):pointer;
- {changes the string |str_pool[b..pool_ptr]| to a token list}
+ {converts |str_pool[b..pool_ptr-1]| to a token list}
var p:pointer; {tail of the token list}
@!q:pointer; {new node being added to the token list via |store_new_token|}
@!t:halfword; {token being appended}
@@ -9302,7 +9314,7 @@ address of the control sequence to display in ``runaway'' error
messages.
@p function scan_toks(@!macro_def,@!xpand:boolean):pointer;
-label found,done,done1,done2;
+label found,continue,done,done1,done2;
var t:halfword; {token representing the highest parameter number}
@!s:halfword; {saved token}
@!p:pointer; {tail of the token list being built}
@@ -9322,7 +9334,7 @@ scan_toks:=p;
end;
@ @<Scan and build the parameter part...@>=
-begin loop begin get_token; {set |cur_cmd|, |cur_chr|, |cur_tok|}
+begin loop begin continue: get_token; {set |cur_cmd|, |cur_chr|, |cur_tok|}
if cur_tok<right_brace_limit then goto done1;
if cur_cmd=mac_param then
@<If the next character is a parameter number, make |cur_tok|
@@ -9344,7 +9356,7 @@ end
@ @<If the next character is a parameter number...@>=
begin s:=match_token+cur_chr; get_token;
-if cur_cmd=left_brace then
+if cur_tok<left_brace_limit then
begin hash_brace:=cur_tok;
store_new_token(cur_tok); store_new_token(end_match_token);
goto done;
@@ -9352,7 +9364,8 @@ if cur_cmd=left_brace then
if t=zero_token+9 then
begin print_err("You already have nine parameters");
@.You already have nine...@>
- help1("I'm going to ignore the # sign you just used."); error;
+ help2("I'm going to ignore the # sign you just used,")@/
+ ("as well as the token that followed it."); error; goto continue;
end
else begin incr(t);
if cur_tok<>t then
@@ -9502,7 +9515,7 @@ begin if not input_ln(read_file[m],true) then
print_err("File ended within "); print_esc("read");
@.File ended within \\read@>
help1("This \read has unbalanced braces.");
- align_state:=1000000; error;
+ align_state:=1000000; limit:=0; error;
end;
end;
end
@@ -9638,7 +9651,7 @@ where skipping began, for use in error messages.
@!skip_line:integer; {skipping began here}
@ Here is a procedure that ignores text until coming to an \.{\\or},
-\.{\\else}, or \.{\\fi} at level zero of $\.{\\if}\ldots\.{\\fi}$
+\.{\\else}, or \.{\\fi} at the current level of $\.{\\if}\ldots\.{\\fi}$
nesting. After it has acted, |cur_chr| will indicate the token that
was found, but |cur_tok| will not be set (because this makes the
procedure run faster).
@@ -10342,15 +10355,18 @@ end
@ @<Print the banner...@>=
begin wlog(banner);
slow_print(format_ident); print(" ");
-print_int(day); print_char(" ");
+print_int(sys_day); print_char(" ");
months:='JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
-for k:=3*month-2 to 3*month do wlog(months[k]);
-print_char(" "); print_int(year); print_char(" ");
-print_two(time div 60); print_char(":"); print_two(time mod 60);
+for k:=3*sys_month-2 to 3*sys_month do wlog(months[k]);
+print_char(" "); print_int(sys_year); print_char(" ");
+print_two(sys_time div 60); print_char(":"); print_two(sys_time mod 60);
end
@ Let's turn now to the procedure that is used to initiate file reading
when an `\.{\\input}' command is being processed.
+Beware: For historic reasons, this code foolishly conserves a tiny bit
+of string pool space; but that can confuse the interactive `\.E' option.
+@^system dependencies@>
@p procedure start_input; {\TeX\ will \.{\\input} something}
label done;
@@ -10375,7 +10391,7 @@ if term_offset+length(name)>max_print_line-2 then print_ln
else if (term_offset>0)or(file_offset>0) then print_char(" ");
print_char("("); incr(open_parens); slow_print(name); update_terminal;
state:=new_line;
-if name=str_ptr-1 then {we can conserve string pool space now}
+if name=str_ptr-1 then {conserve string pool space (but see note above)}
begin flush_string; name:=cur_name;
end;
@<Read the first line of the new file@>;
@@ -10589,11 +10605,11 @@ deleted if $c=0$; then we pass over $a$~characters to reach the next
current character (which may have a ligature/kerning program of its own).
If the very first instruction of the |lig_kern| array has |skip_byte=255|,
-the |next_char| byte is the so-called right boundary character of this font;
+the |next_char| byte is the so-called boundary character of this font;
the value of |next_char| need not lie between |bc| and~|ec|.
If the very last instruction of the |lig_kern| array has |skip_byte=255|,
-there is a special ligature/kerning program for a left boundary character,
-beginning at location |256*op_byte+remainder|.
+there is a special ligature/kerning program for a boundary character at the
+left, beginning at location |256*op_byte+remainder|.
The interpretation is that \TeX\ puts implicit boundary characters
before and after each consecutive string of characters from the same font.
These implicit characters do not appear in the output, but they can affect
@@ -10725,7 +10741,7 @@ the font.
{start of |lig_kern| program for left boundary character,
|non_address| if there is none}
@!font_bchar:array[internal_font_number] of min_quarterword..non_char;
- {right boundary character, |non_char| if there is none}
+ {boundary character, |non_char| if there is none}
@!font_false_bchar:array[internal_font_number] of min_quarterword..non_char;
{|font_bchar| if it doesn't exist in the font, otherwise |non_char|}
@@ -10904,7 +10920,7 @@ var k:font_index; {index into |font_info|}
@!a,@!b,@!c,@!d:eight_bits; {byte variables}
@!qw:four_quarters;@!sw:scaled; {accumulators}
@!bch_label:integer; {left boundary start location, or infinity}
-@!bchar:0..256; {right boundary character, or 256}
+@!bchar:0..256; {boundary character, or 256}
@!z:scaled; {the design size or the ``at'' size}
@!alpha:integer;@!beta:1..16;
{auxiliary quantities used in fixed-point multiplication}
@@ -11472,13 +11488,13 @@ stack were empty at the time of a |pop| command.
The parameter is a signed number in two's complement notation, |-128<=b<128|;
if |b<0|, the reference point moves left.
-\yskip\hang|right2| 144 |b[2]|. Same as |right1|, except that |b| is a
+\yskip\hang|@!right2| 144 |b[2]|. Same as |right1|, except that |b| is a
two-byte quantity in the range |-32768<=b<32768|.
-\yskip\hang|right3| 145 |b[3]|. Same as |right1|, except that |b| is a
+\yskip\hang|@!right3| 145 |b[3]|. Same as |right1|, except that |b| is a
three-byte quantity in the range |@t$-2^{23}$@><=b<@t$2^{23}$@>|.
-\yskip\hang|right4| 146 |b[4]|. Same as |right1|, except that |b| is a
+\yskip\hang|@!right4| 146 |b[4]|. Same as |right1|, except that |b| is a
four-byte quantity in the range |@t$-2^{31}$@><=b<@t$2^{31}$@>|.
\yskip\hang|w0| 147. Set |h:=h+w|; i.e., move right |w| units. With luck,
@@ -12886,7 +12902,7 @@ also removes all occurrences of |ins_node|, |mark_node|, and |adjust_node|
items and appends the resulting material onto the list that ends at
location |adjust_tail|.
-@< Glob...@>=
+@<Glob...@>=
@!adjust_tail:pointer; {tail of adjustment list}
@ @<Set init...@>=adjust_tail:=null; last_badness:=0;
@@ -13408,8 +13424,8 @@ programming.
@d sub_mlist=3 {|math_type| when the attribute is a formula}
@d math_text_char=4 {|math_type| when italic correction is dubious}
-@ Each portion of a formula is classified as Ord, Op, Bin, Rel, Ope,
-Clo, Pun, or Inn, for purposes of spacing and line breaking. An
+@ Each portion of a formula is classified as Ord, Op, Bin, Rel, Open,
+Close, Punct, or Inner, for purposes of spacing and line breaking. An
|ord_noad|, |op_noad|, |bin_noad|, |rel_noad|, |open_noad|, |close_noad|,
|punct_noad|, or |inner_noad| is used to represent portions of the various
types. For example, an `\.=' sign in a formula leads to the creation of a
@@ -13431,10 +13447,10 @@ limits has been overridden for this operator.
@d op_noad=ord_noad+1 {|type| of a noad classified Op}
@d bin_noad=ord_noad+2 {|type| of a noad classified Bin}
@d rel_noad=ord_noad+3 {|type| of a noad classified Rel}
-@d open_noad=ord_noad+4 {|type| of a noad classified Ope}
-@d close_noad=ord_noad+5 {|type| of a noad classified Clo}
-@d punct_noad=ord_noad+6 {|type| of a noad classified Pun}
-@d inner_noad=ord_noad+7 {|type| of a noad classified Inn}
+@d open_noad=ord_noad+4 {|type| of a noad classified Open}
+@d close_noad=ord_noad+5 {|type| of a noad classified Close}
+@d punct_noad=ord_noad+6 {|type| of a noad classified Punct}
+@d inner_noad=ord_noad+7 {|type| of a noad classified Inner}
@d limits=1 {|subtype| of |op_noad| whose scripts are to be above, below}
@d no_limits=2 {|subtype| of |op_noad| whose scripts are to be normal}
@@ -14209,7 +14225,7 @@ else begin if (qo(cur_c)>=font_bc[cur_f])and(qo(cur_c)<=font_ec[cur_f]) then
else cur_i:=null_character;
if not(char_exists(cur_i)) then
begin char_warning(cur_f,qo(cur_c));
- math_type(a):=empty;
+ math_type(a):=empty; cur_i:=null_character;
end;
end;
end;
@@ -14596,7 +14612,7 @@ else begin shift_down:=denom2(cur_size);
@ The numerator and denominator must be separated by a certain minimum
clearance, called |clr| in the following program. The difference between
-|clr| and the actual clearance is |2delta|.
+|clr| and the actual clearance is twice |delta|.
@<Adjust \(s)|shift_up| and |shift_down| for the case of no fraction line@>=
begin if cur_style<text_style then clr:=7*default_rule_thickness
@@ -14979,8 +14995,7 @@ rel_noad: begin t:=rel_noad; pen:=rel_penalty;
ord_noad,vcenter_noad,over_noad,under_noad: do_nothing;
radical_noad: s:=radical_noad_size;
accent_noad: s:=accent_noad_size;
-fraction_noad: begin t:=inner_noad; s:=fraction_noad_size;
- end;
+fraction_noad: s:=fraction_noad_size;
left_noad,right_noad: t:=make_left_right(q,style,max_d,max_h);
style_node: @<Change the current style and |goto delete_q|@>;
whatsit_node,penalty_node,rule_node,disc_node,adjust_node,ins_node,mark_node,
@@ -15020,7 +15035,7 @@ begin cur_style:=subtype(q); s:=style_node_size;
goto delete_q;
end
-@ The inter-element spacing in math formulas depends on a $8\times8$ table that
+@ The inter-element spacing in math formulas depends on an $8\times8$ table that
\TeX\ preloads as a 64-digit string. The elements of this string have the
following significance:
$$\vbox{\halign{#\hfil\cr
@@ -15400,6 +15415,7 @@ text(frozen_cr):="cr"; eqtb[frozen_cr]:=eqtb[cur_val];@/
primitive("crcr",car_ret,cr_cr_code);
@!@:cr_cr_}{\.{\\crcr} primitive@>
text(frozen_end_template):="endtemplate"; text(frozen_endv):="endtemplate";
+@.endtemplate@>
eq_type(frozen_endv):=endv; equiv(frozen_endv):=null_list;
eq_level(frozen_endv):=level_one;@/
eqtb[frozen_end_template]:=eqtb[frozen_endv];
@@ -15627,6 +15643,7 @@ info(p):=end_span; width(p):=null_flag; cur_loop:=link(cur_loop);
@<Copy the templates from node |cur_loop| into node |p|@>;
cur_loop:=link(cur_loop);
link(p):=new_glue(glue_ptr(cur_loop));
+subtype(link(p)):=tab_skip_code+1;
end
@ @<Copy the templates from node |cur_loop| into node |p|@>=
@@ -15992,8 +16009,8 @@ The method used here is based on an approach devised by Michael F. Plass and
@^Plass, Michael Frederick@>
@^Knuth, Donald Ervin@>
the author in 1977, subsequently generalized and improved by the same two
-people in 1980. A detailed discussion appears in {\sl SOFTWARE---Practice
-\AM\ Experience \bf11} (1981), 1119--1184, where it is shown that the
+people in 1980. A detailed discussion appears in {\sl Software---Practice
+and Experience \bf11} (1981), 1119--1184, where it is shown that the
line-breaking problem can be regarded as a special case of the problem of
computing the shortest path in an acyclic network. The cited paper includes
numerous examples and describes the history of line breaking as it has been
@@ -16272,6 +16289,7 @@ function finite_shrink(@!p:pointer):pointer; {recovers from infinite shrinkage}
var q:pointer; {new glue specification}
begin if no_shrink_error_yet then
begin no_shrink_error_yet:=false;
+ @!stat if tracing_paragraphs>0 then end_diagnostic(true);@+tats@;
print_err("Infinite glue shrinkage found in a paragraph");
@.Infinite glue shrinkage...@>
help5("The paragraph just ended includes some glue that has")@/
@@ -16280,6 +16298,7 @@ begin if no_shrink_error_yet then
("of any length to fit on one line. But it's safe to proceed,")@/
("since the offensive shrinkability has been made finite.");
error;
+ @!stat if tracing_paragraphs>0 then begin_diagnostic;@+tats@;
end;
q:=new_spec(p); shrink_order(q):=normal;
delete_glue_ref(p); finite_shrink:=q;
@@ -17291,7 +17310,7 @@ loop@+ begin q:=link(r);
if is_char_node(q) then goto done1;
if non_discardable(q) then goto done1;
if type(q)=kern_node then if subtype(q)<>explicit then goto done1;
- r:=q; {now |type(q)=glue_node|, |kern_node|, |math_node| or |penalty_node|}
+ r:=q; {now |type(q)=glue_node|, |kern_node|, |math_node|, or |penalty_node|}
end;
done1: if r<>temp_head then
begin link(r):=null; flush_node_list(link(temp_head));
@@ -17502,7 +17521,8 @@ nodes $p_{a-1}$ and~$p_b$ in the description above are placed into variables
@<Glob...@>=
@!hc:array[0..65] of 0..256; {word to be hyphenated}
-@!hn:small_number; {the number of positions occupied in |hc|}
+@!hn:0..64; {the number of positions occupied in |hc|;
+ not always a |small_number|}
@!ha,@!hb:pointer; {nodes |ha..hb| should be replaced by the hyphenated result}
@!hf:internal_font_number; {font number of the letters in |hc|}
@!hu:array[0..63] of 0..256; {like |hc|, before conversion to lowercase}
@@ -17644,7 +17664,7 @@ forgetting what |ha| and |hb|, etc., are all about.
@ @<Local variables for hyphenation@>=
@!i,@!j,@!l:0..65; {indices into |hc| or |hu|}
@!q,@!r,@!s:pointer; {temporary registers for list manipulation}
-@!bchar:halfword; {right boundary character of hyphenated word, or |non_char|}
+@!bchar:halfword; {boundary character of hyphenated word, or |non_char|}
@ \TeX\ will never insert a hyphen that has fewer than
\.{\\lefthyphenmin} letters before it or fewer than
@@ -18378,7 +18398,7 @@ The hash table is called |trie_op_hash|, and the number of entries it contains
is |trie_op_ptr|.
@<Glob...@>=
-@!init@! trie_op_hash:array[-trie_op_size..trie_op_size] of 0..trie_op_size;
+@!init @!trie_op_hash:array[-trie_op_size..trie_op_size] of 0..trie_op_size;
{trie op codes for quadruples}
@!trie_used:array[ASCII_code] of quarterword;
{largest opcode used so far for this language}
@@ -18556,7 +18576,7 @@ entries.
@d trie_back(#)==trie[#].lh {backward links in |trie| holes}
@<Glob...@>=
-@!init@!trie_taken:packed array[1..trie_size] of boolean;
+@!init @!trie_taken:packed array[1..trie_size] of boolean;
{does a family start here?}
@t\hskip10pt@>@!trie_min:array[ASCII_code] of trie_pointer;
{the first possible slot for each character}
@@ -19213,7 +19233,8 @@ all split and floating insertions.
@!last_glue:pointer; {used to implement \.{\\lastskip}}
@!last_penalty:integer; {used to implement \.{\\lastpenalty}}
@!last_kern:scaled; {used to implement \.{\\lastkern}}
-@!insert_penalties:integer; {sum of the penalties for held-over insertions}
+@!insert_penalties:integer; {sum of the penalties for insertions
+ that were held over}
@ @<Put each...@>=
primitive("pagegoal",set_page_dimen,0);
@@ -20077,7 +20098,7 @@ Several additional global variables are needed.
@!main_k:font_index; {index into |font_info|}
@!main_p:pointer; {temporary register for list manipulation}
@!main_s:integer; {space factor value}
-@!bchar:halfword; {right boundary character of current font, or |non_char|}
+@!bchar:halfword; {boundary character of current font, or |non_char|}
@!false_bchar:halfword; {nonexistent character matching |bchar|, or |non_char|}
@!cancel_boundary:boolean; {should the left boundary be ignored?}
@!ins_disc:boolean; {should we insert a discretionary node?}
@@ -20599,7 +20620,7 @@ end;
@ Many of the actions related to box-making are triggered by the appearance
of braces in the input. For example, when the user says `\.{\\hbox}
-\.{to} \.{100pt\{$\langle\,\hbox{hlist}\,\rangle$\}}' in vertical mode,
+\.{to} \.{100pt\{$\langle\,\hbox{\rm hlist}\,\rangle$\}}' in vertical mode,
the information about the box size (100pt, |exactly|) is put onto |save_stack|
with a level boundary word just above it, and |cur_group:=adjusted_hbox_group|;
\TeX\ enters restricted horizontal mode to process the hlist. The right
@@ -22785,6 +22806,7 @@ end;
@ @<Initialize table entries...@>=
text(frozen_protection):="inaccessible";
+@.inaccessible@>
@ Here's an example of the way many of the following routines operate.
(Unfortunately, they aren't all as simple as this.)
@@ -23618,7 +23640,7 @@ any_mode(xray): show_whatever;
@ @d show_code=0 { \.{\\show} }
@d show_box_code=1 { \.{\\showbox} }
@d show_the_code=2 { \.{\\showthe} }
-@d show_lists=3 { \.{\\showlists} }
+@d show_lists_code=3 { \.{\\showlists} }
@<Put each...@>=
primitive("show",xray,show_code);
@@ -23627,14 +23649,14 @@ primitive("showbox",xray,show_box_code);
@!@:show_box_}{\.{\\showbox} primitive@>
primitive("showthe",xray,show_the_code);
@!@:show_the_}{\.{\\showthe} primitive@>
-primitive("showlists",xray,show_lists);
-@!@:show_lists_}{\.{\\showlists} primitive@>
+primitive("showlists",xray,show_lists_code);
+@!@:show_lists_code_}{\.{\\showlists} primitive@>
@ @<Cases of |print_cmd_chr|...@>=
xray: case chr_code of
show_box_code:print_esc("showbox");
show_the_code:print_esc("showthe");
- show_lists:print_esc("showlists");
+ show_lists_code:print_esc("showlists");
othercases print_esc("show")
endcases;
@@ -23643,7 +23665,7 @@ procedure show_whatever;
label common_ending;
var p:pointer; {tail of a token list to show}
begin case cur_chr of
-show_lists: begin begin_diagnostic; show_activities;
+show_lists_code: begin begin_diagnostic; show_activities;
end;
show_box_code: @<Show the current contents of a box@>;
show_code: @<Show the current meaning of a token, then |goto common_ending|@>;
@@ -23723,8 +23745,8 @@ so that the inverse relation between them is clear.
The global variable |format_ident| is a string that is printed right
after the |banner| line when \TeX\ is ready to start. For \.{INITEX} this
-string says simply `\.{(INITEX)}'; for other versions of \TeX\ it says,
-for example, `\.{(preloaded format=plain 1982.11.19)}', showing the year,
+string says simply `\.{ (INITEX)}'; for other versions of \TeX\ it says,
+for example, `\.{ (preloaded format=plain 1982.11.19)}', showing the year,
month, and day that the format file was created. We have |format_ident=0|
before \TeX's tables are loaded.
@@ -23815,6 +23837,8 @@ macros to dump words of different types:
@ The inverse macros are slightly more complicated, since we need to check
the range of the values we are reading in. We say `|undump(a)(b)(x)|' to
read an integer value |x| that is supposed to be in the range |a<=x<=b|.
+System error messages should be suppressed when undumping.
+@^system dependencies@>
@d undump_wd(#)==begin get(fmt_file); #:=fmt_file^;@+end
@d undump_int(#)==begin get(fmt_file); #:=fmt_file^.int;@+end
@@ -24289,17 +24313,17 @@ cannot produce error messages. For example, it would be a mistake to call
|str_room| or |make_string| at this time, because a call on |overflow|
might lead to an infinite loop.
@^system dependencies@>
-
-Actually there's one way to get error messages, via |prepare_mag|;
-but that can't cause infinite recursion.
+(Actually there's one way to get error messages, via |prepare_mag|;
+but that can't cause infinite recursion.)
@^recursion@>
-This program doesn't bother to close the input files that may still be open.
+If |final_cleanup| is bypassed, this program doesn't bother to close
+the input files that may still be open.
@<Last-minute...@>=
procedure close_files_and_terminate;
var k:integer; {all-purpose index}
-begin @<Finish the extensions@>;
+begin @<Finish the extensions@>; new_line_char:=-1;
@!stat if tracing_stats>0 then @<Output statistics about this job@>;@;@+tats@/
wake_up_terminal; @<Finish the \.{DVI} file@>;
if log_opened then
@@ -24355,7 +24379,7 @@ been scanned and |its_all_over|\kern-2pt.
procedure final_cleanup;
label exit;
var c:small_number; {0 for \.{\\end}, 1 for \.{\\dump}}
-begin c:=cur_chr;
+begin c:=cur_chr; if c<>1 then new_line_char:=-1;
if job_name=0 then open_log_file;
while input_ptr>0 do
if state=token_list then end_token_list@+else end_file_reading;
@@ -24459,14 +24483,15 @@ program below. (If |m=13|, there is an additional argument, |l|.)
@!debug procedure debug_help; {routine to display various things}
label breakpoint,exit;
var k,@!l,@!m,@!n:integer;
-begin loop begin wake_up_terminal;
+begin clear_terminal;
+ loop begin wake_up_terminal;
print_nl("debug # (-1 to exit):"); update_terminal;
@.debug \#@>
read(term_in,m);
if m<0 then return
else if m=0 then
- begin goto breakpoint;@\ {go to every label at least once}
- breakpoint: m:=0; @{'BREAKPOINT'@}@\
+ begin goto breakpoint;@/ {go to every declared label at least once}
+ breakpoint: m:=0; @{'BREAKPOINT'@}@/
end
else begin read(term_in,n);
case m of
diff --git a/systems/knuth/dist/tex/texbook.tex b/systems/knuth/dist/tex/texbook.tex
index 23d626ed6d..a1e50786ea 100644
--- a/systems/knuth/dist/tex/texbook.tex
+++ b/systems/knuth/dist/tex/texbook.tex
@@ -102,7 +102,8 @@ ISBN 0-201-13448-9 (soft)\cr}}
\noindent
%{\sl \kern-1pt First hardcover edition, January 1986}
%{\sl \kern-1pt Incorporates the final corrections made in 1996, and a few dozen more.}
-{\sl \kern-1pt Incorporates all corrections known in 2013.}
+%{\sl \kern-1pt Incorporates all corrections known in 2013.}
+{\sl \kern-1pt Incorporates all corrections known in 2020.}
\smallskip
\noindent
Internet page {\tt http://www-cs-faculty.stanford.edu/\char`\~
@@ -115,11 +116,19 @@ Copyright $\copyright$ 1984, 1986 by the American Mathematical Society
\noindent
This book is published jointly by the American Mathematical Society
and Addison\kern.1em--Wesley Publishing Company.
-All rights reserved. No part of this publication may be reproduced, stored in
-a retrieval system, or transmitted, in any form or by any means,
-electronic, mechanical, photocopying, recording, or otherwise, without
-the prior written permission of the publishers. Printed in the United
-States of America. % Published simultaneously in Canada.
+All rights reserved.
+%No part of this publication may be reproduced, stored in
+%a retrieval system, or transmitted, in any form or by any means,
+%electronic, mechanical, photocopying, recording, or otherwise, without
+%the prior written permission of the publishers.
+This publication is protected by copyright, and permission must be
+obtained from the publisher prior to any prohibited reproduction, storage in
+a~retrieval system, or transmission in any form or by any means, electronic,
+mechanical, photocopying, recording, or likewise. For information regarding
+permissions, request forms, and the appropriate contacts with the
+Pearson Education Global Rights \& Permissions Department, please visit
+ {\tt www.pearson.com/permissions/}.
+Printed in the United States of America. % Published simultaneously in Canada.
\medskip
\noindent
%ISBN 0-201-13448-9\par % paperback
@@ -129,9 +138,19 @@ ISBN-10 \enspace\phantom{978-}0-201-13447-0\par
%33 34 35 36 37 38 39 DOC 09 08 07 06 % paperback
%18 19 20 21 22 23 24 DOC 10 09 08 07 06 % hardcover
\smallskip\noindent
-Text printed in the United States
- at Courier Westford in Westford, Massachusetts.\par\noindent
-Nineteenth Printing, February 2012
+%Text printed in the United States
+%% at Courier Westford in Westford, Massachusetts.\par\noindent
+%at LSC Communications in Crawfordsville, Indiana.\par\noindent
+%%Nineteenth Printing, February 2012
+%% [The printer deleted "Text printed ... Crawfordsville..." in 2017!]
+%Thirty-fifth Softcover Printing, April 2017\par\noindent
+%35\quad17
+%Twenty-second Printing, January 2021\par\noindent
+Twenty-third Printing, February 2021\par\noindent
+%20\quad17
+\smallskip
+\font\pearsonkluj=arial at 9pt
+\leftline{\pearsonkluj ScoutAutomatedPrintCode}
^^{Knuth, Donald Ervin}
^^|\copyright|
\eject
@@ -720,7 +739,7 @@ There's a special control word
\TeX
\endtt
that produces the half-dozen or so instructions necessary to typeset `\TeX'.
-When a phrase like `\TeX\ ignores spaces after control words.' is
+When a phrase like `\TeX\ ignores spaces after control words.'\ is
desired, the manuscript renders it as follows:
\begintt
\TeX\ ignores spaces after control words.
@@ -1025,7 +1044,7 @@ you should say |a| |bold| \hbox{|`{\bf f\/}'|}, lest you get a bold `{\bf f}'.
\ddangerexercise Define a control sequence |\ic| such that `|\ic c|' puts the
italic correction of character $c$ into \TeX's register |\dimen0|.
\answer |\def\ic#1{\setbox0=\hbox{#1\/}\dimen0=\wd0|\parbreak
-|\setbox0=\hbox{#1}\advance\dimen0 by -\wd0}|.
+|\setbox0=\hbox{#1}\advance\dimen0 by -\wd0 }|.
\ddanger The primitive control sequence ^|\nullfont| stands for a font that
has no characters. This font is always present, in case you haven't
@@ -1336,7 +1355,7 @@ change fonts or to control spacing or anything. \TeX\ doesn't mind if you
want to waste your time making groups for no particular reason.
But in the second case, the necessary braces were forgotten. You get the
letter `S' centered on a line by itself, followed by a paragraph that
-begins with `o should this.' on the next line.
+begins with `o should this.'\ on the next line.
\exercise And how about this one?
\begintt
@@ -2162,7 +2181,7 @@ 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
+`|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|.
@@ -2566,7 +2585,7 @@ characters that you {\sl can\/} type on your ^{keyboard} are reserved for
special purposes like escaping and grouping. Yet when we studied fonts it
was pointed out that there are 256 characters per font. So how can you
refer to the characters that aren't on your keyboard, or that have been
-pre-empted for formatting?
+pre\"empted for formatting?
One answer is to use control sequences. For example, the plain format
of Appendix B\null, which defines |%| to be a special kind of symbol so that you
@@ -2722,9 +2741,10 @@ way, from |^^00| to |^^ff|. Character 127 is |^^7f|.
\danger Most of the |^^| codes are unimportant except in unusual applications.
But |^^M| is particularly noteworthy because it is code 13, the ASCII
-^\<return> that \TeX\ normally places at the right end of every line of
+^\<return> that \TeX\ normally assumes to be present
+at the right end of every line of ^^{hat hat M}
your input file. By changing the category of~|^^M| you can obtain useful
-special effects, as we shall see later. ^^{hat hat M}
+special effects, as we shall see later.\looseness=-1
\danger The control code |^^I| is also of potential interest, since it's
the ASCII ^\<tab>. Plain \TeX\ makes \<tab> act like a blank space.
@@ -2903,6 +2923,7 @@ you would have seen the space. Incidentally, when \TeX\ prints
the ^{context of an error message}, the bottom pair of lines comes from
a text file, but the other pairs of lines are portions of token lists
that \TeX\ is reading (unless they begin with `|<*>|', when they
+represent text entered from the user's terminal, or with `|<insert>|', when they
represent text inserted during ^{error recovery}).
\ddangerexercise Given the category codes of plain \TeX\ format,
@@ -2985,7 +3006,7 @@ it a character token!) ^^|\let| ^^{implicit character}
for life's not a paragraph
\quad
% he left a blank line here, really
-And death i think is no parenthesis.
+And death i think is no parenthesis
\author e.~e.~^{cummings}, {\sl since feeling is first\/} (1926)
\bigskip
@@ -3000,7 +3021,7 @@ but the need for more than 128 codes
in general applications was not yet evident.
\author ASA SUBCOMMITTEE X3.2, {\sl American Standard\break %
Code for Information Interchange\/^^{ASCII}} (1963)
-% in {\sl Communications of the ACM\/}
+% in Communications of the ACM
\eject
\beginchapter Chapter 9. \TeX's\\Roman Fonts
@@ -3030,7 +3051,7 @@ $$\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;\qquad
|!||`| yields !`\thinspace;\qquad |?||`| yields ?`\thinspace;\cr
|--| yields --\thinspace;\qquad |---| yields ---\thinspace.\cr}$$
^^{Spanish ligatures}
@@ -3888,7 +3909,7 @@ the depth of the larger box).
\answer This |E| is inside a box that's inside a box.
\danger Such displays of box contents will be discussed further in
-Chapters 12 and~17.
+Chapters 12 and~27.
They are used primarily for diagnostic purposes, when you are trying to figure
out exactly what \TeX\ thinks it's doing. The main reason for bringing them
up in the present chapter is simply to provide a glimpse of how \TeX\ represents
@@ -4195,8 +4216,8 @@ plain \TeX, which creates an hbox whose width is the current |\hsize|:
\line{\hfil\hfil What happens now?\hfil}
\line{\hfill\hfil and now?\hfil}
\endtt
-\answer `What happens now?' is placed in a line of width |\hsize|, with
-twice as much space at the left as at the right; `and now?' is put flush right
+\answer `What happens now?'\ is placed in a line of width |\hsize|, with
+twice as much space at the left as at the right; `and now?'\ is put flush right
on the following line.
\ddangerexercise How do the following three macros behave differently?
@@ -4267,7 +4288,7 @@ this line to its minimum width, the result would be
\hbox to 0pt{``Oh, oh!'' cried Baby Sally. Dick and Jane laughed.}
\enddisplay
The glue after a ^{comma} shrinks only 80 percent as much as ordinary
-inter-word glue, and after a ^{period} or ^{exclamation point} or
+interword glue, and after a ^{period} or ^{exclamation point} or
^{question mark} it shrinks by only one third as much.
This all makes for nice-looking output, but it unfortunately adds a bit
@@ -4290,7 +4311,7 @@ Chapter 18 has more to say about |\ldots| and related topics.
^{Abbreviations} present problems too. For example, the short story in
Chapter~6 referred to `Mr.~^{Drofnats}'; \TeX\ must be told somehow that the
-period after `Mr.'\ or `Mrs.'\ or `Ms.' or `Prof.'\ or `Dr.' or `Rt.~Hon.',
+period after `Mr.'\ or `Mrs.'\ or `Ms.'\ or `Prof.'\ or `Dr.'\ or `Rt.~Hon.',
etc., doesn't count as a sentence-ending ^{full stop}.
We avoided that embarrassment in Chapter~6 by typing `|Mr.~Drofnats|';
@@ -4359,7 +4380,7 @@ the~`|I.|' in `|Dr.~Livingstone~I.\ Presume|'; that particular period is
not assumed to be a full stop. ^^{Presume}
\dangerexercise What can you do to make \TeX\ recognize the ends of sentences
-that do end with uppercase letters (e.g., `$\ldots$ launched by NASA.\null' or
+that do end with uppercase letters (e.g., `$\ldots$ launched by NASA.' or
`Did I?' or `$\ldots$ see Appendix~A.')?
\answer There are several ways; perhaps the easiest are to type
`|\hbox{NASA}.|'\ or `|NASA\null.|' \ (The ^|\null| macro is an abbreviation
@@ -4948,8 +4969,8 @@ but mainly he told the truth.
Every shape exists only because of the space around it.
% Jeder Formwert lebt nur dank seiner Umgebung.
$\ldots$ Hence there is a `right' position for every shape in every situation.
-% ... Daraus geht hervor, ein bestimmter Formvert in einer bestimmten Situation
-% einen bestimmten Platz verlangt, der ihm gem\"a\ss\ ist.
+% ... Daraus geht hervor, da\ss\ ein bestimmter Formwert in einer bestimmten
+% Situation einen bestimmten Platz verlangt, der ihm gem\"a\ss\ ist.
If we succeed in finding that position, we have done our job.
% Gelingt es uns, diese Pl\"atze zu finden,
% so nennen wir die Arbeit vollendet.
@@ -6354,14 +6375,15 @@ lines end with hyphens. What penalties does plain \TeX\ put between the lines?
\answer |\interlinepenalty| plus |\clubpenalty| plus |\widowpenalty| (and
also plus |\brokenpenalty|, if the first line ends with a discretionary break).
-\ddanger If you say ^|\vadjust||{|\<vertical list>|}| within a paragraph,
-\TeX\ will insert the specified internal vertical list into the vertical
+\ddanger If you say ^|\vadjust||{|\<vertical mode material>|}| within a
+paragraph, \TeX\ will use internal vertical mode to insert the specified
+material into the vertical
list that encloses the paragraph, immediately after whatever line
contained the position of the |\vadjust|. For example, you can say
`|\vadjust{\kern1pt}|' to increase the amount of space between lines of a
paragraph if those lines would otherwise come out too close together. \ (The
-\vadjust{\vskip1pt}author
-did it in the previous line, just to illustrate what happens.) \ Also,
+\vadjust{\kern1pt}author
+did that in the current line, just to illustrate what happens.) \ Also,
if you want to make sure that a page break will occur immediately after a
certain line, you can say `|\vadjust{\eject}|' ^^|\eject| anywhere in that line.
@@ -6392,6 +6414,7 @@ depth of a ^|\strut|.
\def\strutdepth{\dp\strutbox}
\def\marginalstar{\strut\vadjust{\kern-\strutdepth\specialstar}}
\endtt
+(The next line must also not be too tall.)
Here |\specialstar| is a box of height zero and depth |\strutdepth|,
and it puts an asterisk in the left margin:
\begintt
@@ -7442,7 +7465,8 @@ the footnotes here\note{Second note.} if ...
\danger Sometimes, however, you want to use a register just for temporary
storage, and you know that it won't conflict with anybody else's macros.
-Registers |\count255|, |\dimen255|, |\skip255|, and |\muskip255| are
+Registers |\count255|, |\dimen255|, |\skip255|, |\muskip255|, and
+|\toks255| are
traditionally kept available for such purposes. Furthermore, plain \TeX\
reserves |\dimen0| to |\dimen9|, |\skip0| to |\skip9|, |\muskip0| to
|\muskip9|, and |\box0| to |\box9| for ``scratchwork''; these registers
@@ -7967,7 +7991,8 @@ boxes, as explained in Chapter~11. If you have a formula in which there is
only one |\sqrt|, or only one |\overline| or |\underline|, the normal
positioning rules work fine; but sometimes you want to have uniformity
between different members of a complex formula. For example, you might want to
-typeset `$\sqrt{\mathstrut a}+\sqrt{\mathstrut d}+\sqrt{\mathstrut y}$',
+typeset `$\mskip-1mu\sqrt{\mathstrut a}+
+ \sqrt{\mathstrut d}+\sqrt{\mathstrut y}\mskip+2mu$',
putting all square roots in the same vertical position. There's an easy way
to do this, using the control sequence ^|\mathstrut| as follows:
\begintt
@@ -9416,11 +9441,11 @@ because |\mathopen| forces class~4 (opening). In the formula
`|$G\mathbin:H$|', the ^{colon} is~treated as a binary operation.
And Appendix~B constructs large opening symbols by
defining ^|\bigl||#1| to be an abbreviation for
-\begintt
-\mathopen{\hbox{$\left#1 ...\right.$}}
+\begintt|let|0|rm
+\mathopen{\hbox{$\left#1|<|0strut>\right.$}}
\endtt
There's also an eighth classification, ^|\mathinner|, which is not
-normally used for individual symbols; fractions and ^|\left||...|^|\right|
+normally used for individual symbols; ^|\left|$\,\ldots\,$^|\right|
constructions are treated as ``inner'' subformulas, which means that
they will be surrounded by additional space in certain circumstances.
All other subformulas are generally treated as ordinary symbols,
@@ -9479,11 +9504,11 @@ are~$-1$ until they are changed by a |\delcode| command.
\ddangerexercise Appendix~B defines |\delcode`<| so that there is a
shorthand notation for ^{angle brackets}. Why do you think Appendix~B
doesn't go further and define |\delcode`{|?
-\answer If\/ |\delcode`{| were set to some nonnegative delimiter code, you
-would get no error message when you wrote something like `|\left{|'.
-This would be bad because strange effects would happen when certain
-subformulas were given as arguments to macros, or when they appeared
-in alignments. But it has an even worse defect, because a user who
+\answer Assigning |\delcode`{| would not work to allow `|\left{|', because
+the brace has category~1 and isn't a legal \<delim>.
+Allowing brace delimiters would be a bad idea because it would
+mess up other constructions, such as arguments to macros, and
+components of alignments. Moreover, a user who
gets away with `|\left{|' is likely to try also `|\bigl{|', which
fails miserably.
@@ -9602,7 +9627,7 @@ Rel&is a relation atom like `$=$'\thinspace;\cr
Open&is an opening atom like `$($'\thinspace;\cr
Close&is a closing atom like `$)$'\thinspace;\cr
Punct&is a punctuation atom like `$,$'\thinspace;\cr
-Inner&is an inner atom like `$1\over2$'\thinspace;\cr
+Inner&is an inner atom produced by `|\left|$\,\ldots\,$|\right|';\cr
Over&is an overline atom like `$\overline x$'\thinspace;\cr
Under&is an underline atom like `$\underline x$'\thinspace;\cr
Acc&is an accented atom like `$\hat x$'\thinspace;\cr
@@ -9697,7 +9722,7 @@ The learning time is short. A few minutes gives the general flavor, and
typing a page or two of a paper generally uncovers most of the misconceptions.
\author ^{KERNIGHAN} and ^{CHERRY}, {\sl A System for %
Typesetting Mathematics\/} (1975)
- % in {\sl Communications of the ACM\/} p152
+ % in Communications of the ACM p152
\bigskip
@@ -9706,7 +9731,7 @@ a typist with no math or typesetting experience
can be taught to input even the most complex equations.
\author PETER J. ^{BOEHM}, {\sl Software and Hardware Considerations %
for a\break Technical Typesetting System\/} (1976)
-% in {\sl IEEE Transactions on Professional Communication\/} PC-19, pp15--19
+% in IEEE Transactions on Professional Communication PC-19, pp15--19
\eject
\beginchapter Chapter 18. Fine Points of\\Mathematics\\Typing
@@ -9950,7 +9975,7 @@ was current outside the formula.
\ddanger The bold fonts available in plain \TeX\ are ``bold roman,'' rather
than ``bold italic,'' because the latter are rarely needed. However, \TeX\
could readily be set up to make use of bold math italics, if desired
-(see Exercise 17.\bmiexno). A more extensive set of math fonts would also
+(see exercise 17.\bmiexno). A more extensive set of math fonts would also
include ^{script}, ^{Fraktur}, and ``^{blackboard bold}'' styles; plain
\TeX\ doesn't have these, but other formats like \AmSTeX\ do. ^^{AMS-TeX}
^^{German black letters}
@@ -10157,7 +10182,7 @@ almost true. But occasionally you must give \TeX\ some help. The number of
possible math formulas is vast, and \TeX's spacing rules are rather
simple, so it is natural that exceptions should arise. Of course, it is
desirable to have fine units of spacing for this purpose, instead of the
-big chunks that arise from |\|\], |\quad| and |\qquad|.
+big chunks that arise from |\|\], |\quad|, and |\qquad|.
The basic elements of space that \TeX\
puts into formulas are called {\sl ^{thin spaces}}, {\sl ^{medium
@@ -10315,7 +10340,8 @@ and the math list consists chiefly of ``^{atoms}'' of eight basic types:
^{Punct}~(punctuation), ^^{punctuation} and ^{Inner}~(a delimited
subformula). Other kinds of atoms, which arise from commands like
^|\overline| or ^|\mathaccent| or ^|\vcenter|, etc., are all treated as
-type~Ord; ^{fractions} are treated as type~Inner. The following table is
+type~Ord; subformulas delimited by ^|\left| and ^|\right|
+are treated as type~Inner. The following table is
used to determine the spacing between pairs of adjacent atoms:
$$\baselineskip0pt\lineskip0pt
\halign to\hsize
@@ -10331,7 +10357,6 @@ $$\baselineskip0pt\lineskip0pt
\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
@@ -10360,7 +10385,7 @@ never arise, because Bin atoms must be preceded and followed by atoms
compatible with the nature of binary operations. Appendix~G contains
precise details about how math lists are converted to horizontal lists;
this conversion is done whenever \TeX\ is about to leave math mode, and the
-inter-atomic spacing is inserted at that time.
+interatomic spacing is inserted at that time.
\ddanger For example, the displayed formula specification
\begintt
@@ -10417,7 +10442,7 @@ if that subformula were enclosed by |\bigl| and~|\bigr|. For example, Ord
followed by Inner (from |\left|) gets a thin space, but Ord followed by
Open (from |\bigl|) does not. The rules in Chapter~17 imply that the
construction `^|\mathinner||{\bigl({|\<subformula>|}\bigr)}|' within any
-formula produces a result exactly equivalent to
+formula produces a result essentially 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.
@@ -11192,7 +11217,7 @@ shown here haven't been explained yet, but Chapter~22 will reveal all.
enormous and still growing, so you will probably continue to find
new challenges as you continue to type mathematical papers. It's a
good idea to keep a personal notebook in which you record all of
-the non-obvious formulas that you have handled successfully,
+the nonobvious formulas that you have handled successfully,
showing both the final output and what you typed to get it.
Then you'll be able to refer back to those solutions when you
discover that you need to do something similar, a few months later.
@@ -11359,7 +11384,8 @@ And even if you do type `|$$\hbox{$\displaystyle{|\<formula>|}$}$$|', the
results are not quite the same, as we will see later: \TeX\ will compress
the glue in `|$$|\<formula>|$$|' if the formula is too wide to fit on
a line at its natural width, but the glue inside |\hbox{...}| is frozen
-at its natural width. The |\hbox| version also invokes |\everymath|.
+at its natural width. The |\hbox| version also invokes
+|\everyhbox| and |\everymath|.
\dangerexercise You may have noticed that most of the displays in this
manual are not centered; displayed material is usually aligned at the
@@ -11821,7 +11847,7 @@ $$\eqalignno{...&\raise6pt\hbox{(5)}\cr}$$
What was his oversight, and what could he have done instead?
\answer By raising the equation number, he increased the line height,
so \TeX\ put extra space between that line and the previous line
-when it calculated the inter-line glue. If he had said
+when it calculated the interline glue. If he had said
`^|\smash||{\raise...}|', he wouldn't have had that problem.
\danger For other types of displays, plain \TeX\ provides ^|\displaylines|,
@@ -12548,12 +12574,12 @@ what the following definition means:
What token list will result when `|\! x{[y]][z}|' is expanded?
\answer Let's go slowly on this one, so that the answer will give enough
background to answer all similar questions. The \<parameter text> of the
-definition consists of the three tokens |#1|, |#2|, |[|$_1$; the
+definition consists of the three tokens |!1|, |#2|, |[|$_1$; the
\<replacement text> consists of the six tokens |{|$_1$, |#|$_6$, |]|$_2$,
|!|$_6$, |#2|, |[|$_1$. \ (When two tokens of category~6 occur in the
replacement text, the character code of the second one survives; the
character code of a category-6 character is otherwise irrelevant. Thus,
-`|\def\!#1!2#[{##]!!#2]|' would produce an essentially identical
+`|\def\!!1#2#[{##]!!#2]|' would produce an essentially identical
definition.) \ When expanding the given token list, argument~|#1| is
|x|$_{11}$, since it is undelimited. Argument~|#2| is delimited by~|[|$_1$,
which is different from~|{|$_1$, so it is set provisionally to |{[y]]|;
@@ -12567,13 +12593,14 @@ is therefore
Incidentally, if you display this with ^|\tracingmacros||=1|, \TeX\ says
\begintt
\!!1#2[->{##]!!#2[
-#1<-x
+!1<-x
#2<-[y]
\endtt
Category codes are not shown, but a character of category~6 always
appears twice in succession. A parameter token in the replacement text
-uses the character code of the final parameter in the parameter text.
+uses the character code of the final parameter in the parameter text;
^^{token lists, as displayed by TeX}
+`|!1|' would have been rendered `|#1|'.
\ddanger In practice, we all make mistakes. And one of the most common
typographic errors is to forget a~`|}|', or to insert an extra~`|{|',
@@ -12856,7 +12883,7 @@ True if \TeX\ is in math mode or display math mode (see Chapter~13).
\item\bull^|\ifinner|\quad(test for an internal mode)
\nobreak\smallskip\noindent
True if \TeX\ is in internal vertical mode, or restricted
-horizontal mode, or (nondisplay) math mode (see Chapter~13).
+horizontal mode, or (non-display) math mode (see Chapter~13).
\medbreak
\item\bull^|\if|\<token$_1$>\<token$_2$>\quad(test if character codes agree)
@@ -13176,7 +13203,7 @@ The expansion is the token list in the corresponding ``^{mark}'' register
(see Chapter~23).
\smallbreak
-\textindent\bull ^|\input|\<file name>. The expansion is null; but \TeX\
+\textindent\bull ^|\input|\<filename>. The expansion is null; but \TeX\
prepares to read from the specified file before looking at any more
tokens from its current source.
@@ -13316,8 +13343,8 @@ a token for the primitive command |\span| or when reading the \<glue>
after ^|\tabskip|.
\smallskip
-\item\bull Just after a |$|$_3$ token that begins math mode, to see if
-another~|$|$_3$ follows.
+\item\bull Just after a token such as |$|$_3$ that begins math mode, to see if
+another token of category 3 follows.
\smallskip
\item\bull Just after a |`|$_{12}$ token that begins an ^{alphabetic constant}.
@@ -13430,7 +13457,7 @@ other ^{brace tricks}.
to~16 files at once, in addition to the files that are being |\input|.
To initiate reading such an auxiliary file, you should say
\begindisplay
-^|\openin|\<number>|=|\<file name>
+^|\openin|\<number>|=|\<filename>
\enddisplay
where the \<number> is between 0 and 15. \ (Plain \TeX\ allocates
input stream numbers 0~through~15 with the ^|\newread| command, which
@@ -13715,7 +13742,7 @@ But he found that this produced more space above and below the rule
than when he had simply said `|\hrule width 4in|' with no |\vbox|.
Why did \TeX\ insert more space, and what should he have done to
avoid it?
-\answer The interline skip is added for vboxes, but not for rules; he
+\answer The interline glue is added for vboxes, but not for rules; he
forgot to say ^|\nointerlineskip|, before and after the |\moveright|
construction.
@@ -13749,9 +13776,9 @@ horizontal mode; this character is taken from the current font. \
\ (3)~Otherwise you can make hboxes and vboxes, which fall under the
generic term ^\<box>. A \<box> has one of the following seven forms:
$$\halign{\indent#\hfil&\quad(see Chapter #)\hfil\cr
-^|\hbox|\<box specification>|{|\<horizontal material>|}|&12\cr
-^|\vbox|\<box specification>|{|\<vertical material>|}|&12\cr
-^|\vtop|\<box specification>|{|\<vertical material>|}|&12\cr
+^|\hbox|\<box specification>|{|\<horizontal mode material>|}|&12\cr
+^|\vbox|\<box specification>|{|\<vertical mode material>|}|&12\cr
+^|\vtop|\<box specification>|{|\<vertical mode material>|}|&12\cr
^|\box|\<register number>&15\cr
^|\copy|\<register number>&15\cr
^|\vsplit|\<register number>|to|\<dimen>&15\cr
@@ -13764,7 +13791,7 @@ Chapter~12. A \<register number> is between 0 and 255; after you say
is unchanged, as explained in Chapter~15. The |\vsplit| operation
is also explained in Chapter~15. In math modes an additional
type of box is available:
-^|\vcenter|\<box specification>|{|\<vertical material>|}| (see Chapter~17).
+^|\vcenter|\<box specification>|{|\<vertical mode material>|}| (see Chapter~17).
\ddanger The bottom line of the table above refers to ^|\lastbox|,
a primitive operation that hasn't been mentioned before. If the last item
@@ -13937,7 +13964,7 @@ case vertical glue (e.g., |\vskip|\<glue> or |\vfill|) is used instead of
horizontal glue, and |\leaders| produces boxes that are aligned so that the
top of each repeated box has the same vertical position as the top
of the smallest enclosing box, plus a multiple of the height-plus-depth
-of the repeated box. No interlineskip glue is placed between boxes in
+of the repeated box. No interline glue is placed between boxes in
vertical leaders; the boxes are just stacked right on top of each other.
\ddanger If you specify horizontal leaders with a box whose width isn't
@@ -13949,7 +13976,7 @@ and produces ordinary glue instead.
is at least $10\pt$ long and extends all the way to the right
margin, like this:
\null\nobreak\leaders\hrule\hskip10pt plus1filll\ \par
-\answer For example, say
+\answer For example, say this:
\begintt
\null\nobreak\leaders\hrule\hskip10pt plus1filll\ \par
\endtt
@@ -14043,9 +14070,9 @@ printing devices, via \TeX's ^|\special| command.
\ddanger The ability to write text files that can later be input by other
programs (including \TeX) makes it possible to take care of tables of
contents, indexes, and many other things. You can say
-`|\openout|\<number>|=|\<file name>' and `|\closeout|\<number>' by analogy
+`|\openout|\<number>|=|\<filename>' and `|\closeout|\<number>' by analogy
with the |\openin| and |\closein| commands of Chapter~20; the
-\<number> must be between 0 and~15. The filename is usually extended with
+\<number> must be between 0 and~15. The file name is usually extended with
`^|.tex|' if it has no extension. There is a |\write| command that writes
one line to a file, analogous to the |\read| command that reads one line;
you say
@@ -14154,9 +14181,9 @@ involves a macro |\chapno|, containing the current chapter number, as well as
be expanded immediately, because it might change before the token list
is written; but you want |\the\count0| to be expanded at the time of
|\shipout|. How can you manage this?
-\answer |{\let|\stretch|\the=0\edef|\stretch|\next|\stretch
-|{\write|\stretch|\cont|\stretch|{|\<token list>|}}\next|\stretch|}| will
-expand everything but |\the| when the |\write| command is given.
+\answer If you say `|{\let|\stretch|\the=0\edef|\stretch|\next|\stretch
+|{\write|\stretch|\cont|\stretch|{|\<token list>|}}\next|\stretch|}|',
+the |\write| will be exercuted after |\edef| expands everything except |\the|.
\ddanger Now let's wrap up our study of boxes by considering one more feature.
The command `^|\special||{|\<token list>|}|' can be given in any
@@ -14297,7 +14324,8 @@ implicitly inserts braces around each individual entry of an alignment.
\danger Once you have issued a |\settabs| command, the tabs remain set until you
reset them, even though you go ahead and type ordinary paragraphs as usual.
But if you enclose |\settabs| in |{...}|, the tabs defined inside a group
-don't affect the tabs outside; `^|\global||\settabs|' is not permitted.
+don't affect the tabs outside; `^|\global||\settabs|' will not do what
+you might think it should.
\danger Tabbed lines usually are used between paragraphs, in the same
places where you would type ^|\line| or ^|\centerline| to get lines with
@@ -14344,8 +14372,9 @@ The |\settabs| command in this example makes column~1 as wide as a paragraph
^^{indention, see indentation}
indentation; and column~2 is as wide as `Horizontal lists' plus one quad of
space. ^^|\quad| Only two tabs are set in this case, because only two |&|'s
-appear in the sample line. \ (A sample line might as well end with~|&|,
-because the text following the last tab isn't used for anything.)
+appear in the sample line. \ (A sample line usually ends with~|&\cr|, as it
+does here, because text material between the last tab and |\cr|
+isn't used for anything.)
The first line of a table can't always be used as a sample line, because it
won't necessarily give the correct tab positions. In a large table you have
@@ -14481,7 +14510,7 @@ Thus, the following is recommended:
\+\bf while $p>0$ do\cr
\+\quad\cleartabs&{\bf begin} $q:={\it link}(p)$;
${\it free\_node}(p)$; $p:=q$;\cr
- \+&{\bf end};\cr
+ \+&{\bf end};\cr % note that the semicolon isn't bold
\endtt
\danger Although |\+| lines can be used in vertical boxes, you must never
@@ -15474,7 +15503,8 @@ put |\bigstrut| into some column of the title line, for some appropriate
invisible box |\bigstrut| of width zero. Either way makes the table
look better.
-\ddangerexercise Typeset the following chart, making it exactly 36em wide:
+\ddangerexercise Typeset the following chart, making it exactly
+36\thinspace em wide:
^^{family tree}
^^{Bohning [Knuth], Louise Marie}
^^{Ehlert [Bohning], Pauline Anna Marie}
@@ -15731,7 +15761,7 @@ output routine puts out a special line of text called the {\sl^{headline}\/}
at the top of each page, and another special line of text called the
{\sl^{footline}\/} at the bottom. The headline is normally blank, and
the footline is normally a centered page number, but you can specify any
-headline and footline that you want by redefining the control sequences
+headline and footline that you want by changing the token lists
^|\headline| and ^|\footline|. For example, ^^|\hrulefill|
\begintt
\headline={\hrulefill}
@@ -15839,8 +15869,8 @@ on the broken-off page can be removed and carried forward to the next page.
\ddanger The current ^|\output| routine is defined as a token list
parameter, just like ^|\everypar| or ^|\errhelp|, except that \TeX\
-automatically inserts a begin-group symbol~`|{|' at the beginning
-and an end-group symbol~`|}|' at the end. These ^{grouping characters}
+retains the begin-group symbol~`|{|' at the beginning
+and the end-group symbol~`|}|' at the end. These ^{grouping characters}
help to keep the output routine from interfering with what
\TeX\ was doing when the page break was chosen; for example, an output
routine often changes the ^|\baselineskip| when it puts a headline
@@ -15881,7 +15911,7 @@ even though \TeX\ might no longer be making ^{spaces active} at that time.
certain internal registers and parameters, in addition to |\box255|,
just before the output routine begins. Insertions are put into their
own vboxes, and ^|\insertpenalties| is set equal to the total number of
-heldover insertions; furthermore the ^|\outputpenalty| parameter is
+held-over insertions; furthermore the ^|\outputpenalty| parameter is
set to the value of the penalty at the current breakpoint. An output
routine can be made to do special things when these quantities have
special values. For example, the output routine of plain \TeX\ recognizes
@@ -15999,7 +16029,7 @@ the vertical list. ^{Ragged-bottom setting} is achieved by inserting ^^|\vfil|
\textindent{4)} The ^|\makefootline| macro puts ^|\footline| into
its proper position:
\begintt
-\baselineskip=24pt
+\baselineskip=24pt \lineskiplimit=0pt
\line{\the\footline}
\endtt
@@ -17132,7 +17162,7 @@ comparatively few patterns, as indicated by the following syntax rules:
\alt<fontdef token>\alt<family assignment>\alt<shape assignment>
\alt^|\read|<number>[to]<optional spaces><control sequence>
\alt^|\setbox|<8-bit number><equals><filler><box>
- \alt^|\font|<control sequence><equals><file name><at clause>
+ \alt^|\font|<control sequence><equals><filename><at clause>
\alt<global assignment>
<variable assignment>\is<integer variable><equals><number>
\alt<dimen variable><equals><dimen>
@@ -17206,8 +17236,8 @@ effect.
<font assignment>\is^|\fontdimen|<number><font><equals><dimen>
\alt^|\hyphenchar|<font><equals><number>
\alt^|\skewchar|<font><equals><number>
-<hyphenation assignment>\is^|\hyphenation|<general text>
- \alt^|\patterns|<general text>
+<hyphenation assignment>\is^|\hyphenation|<filler>|{|<hyphenations>|}|
+ \alt^|\patterns|<filler>|{|<patterns>|}|
<box size assignment>\is<box dimension><8-bit number><equals><dimen>
<interaction mode assignment>\is^|\errorstopmode|\alt^|\scrollmode|
\alt^|\nonstopmode|\alt^|\batchmode|
@@ -17223,11 +17253,11 @@ dimen> quantities were listed above when we discussed internal integers
and dimensions. When |\prevgraf| is set to a \<number>, the number must
not be negative.
-The syntax for ^\<file name> is not standard in \TeX, because different
+The syntax for ^\<filename> is not standard in \TeX, because different
operating systems have different conventions. You should ask your local
system wizards for details on just how they have decided to implement file
names. However, the following principles should hold universally:
-A~\<file name> should consist of \<optional spaces> followed by explicit
+A~\<filename> should consist of \<optional spaces> followed by explicit
character tokens (after expansion). A sequence of six or fewer ordinary
letters and/or digits followed by a space should be a file name that works
in essentially the same way on all installations of\/ \TeX\null. Uppercase
@@ -17790,7 +17820,7 @@ that ends with such a character. ^^|\discretionary|
\\^|\accent|\<8-bit number>\<optional assignments>.
Here ^\<optional assignments> stands for zero or more \<assignment>
-commands other than ^|\setbox|.
+commands other than ^|\setbox|, possibly with \<filler>.
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
@@ -17808,11 +17838,12 @@ Finally, \TeX\ sets |\spacefactor=1000|.
If the last item on the current list is a character or ligature, an
explicit kern for its ^{italic correction} is appended.
-\\^|\discretionary|\<general text>\<general text>\<general text>.\enskip
-The three general texts are processed in restricted horizontal mode. They
-should contain only fixed-width things; hence they aren't really very
-general in this case. More precisely, the horizontal list formed by each
-discretionary general text must consist only of characters, ligatures,
+\\^|\discretionary|\<disc text>\<disc text>\<disc text>.\enskip
+A \<disc text> has the form `\<filler>|{|\<horizontal mode material>|}|',
+where the material is processed in restricted horizontal mode and
+should contain only fixed-width things.
+More precisely, the horizontal list formed by each
+^{\<disc text>} must consist only of characters, ligatures,
kerns, boxes, and rules; there should be no glue or penalty items, etc.
This command appends a discretionary item to the current list; see
Chapter~14 for the meaning of a discretionary item. The space factor is
@@ -18100,9 +18131,9 @@ A kern of width zero is appended to the current list. \ (This will have the
effect of adding the italic correction to the previous character, if the
italic correction wouldn't normally have been added.)
-\\^|\discretionary|\<general text>\<general text>\<general text>.
-This command is treated just as in horizontal mode (see Chapter~25), but the
-third \<general text> must produce an empty list.
+\\^|\discretionary|\<disc text>\<disc text>\<disc text>.
+This command has the same effect as in horizontal mode (see Chapter~25), but the
+third ^{\<disc text>} must produce an empty list.
\\^|\-|.\enskip
This command is usually equivalent to `|\discretionary{-}{}{}|';
@@ -18569,7 +18600,7 @@ document. Here are some of the messages you might get just before
Fatal format file error; I'm stymied.
^^|Fatal format file error|
This means that the preloaded format you have specified cannot be used,
-because it was prepared for a different version of \TeX.
+because it is corrupted or was prepared for a different version of \TeX.
\fatal
That makes 100 errors; please try again.
\TeX\ has scrolled past 100 errors since the last paragraph ended, so
@@ -19059,8 +19090,8 @@ The main purpose of the example is to serve as a reminder of the
repertoire of possibilities.
Most of the control sequences used in the example are defined by
-macros of plain \TeX\ format, but three of them are ^{primitive}, i.e.,
-built~in: `|\par|' (end of paragraph), `|\noindent|' (beginning of
+macros of plain \TeX\ format; but some of them are ^{primitive} (built in),
+such as `|\par|' (end of paragraph), `|\noindent|' (beginning of
non-indented paragraph), and `|\/|' (italic correction). The example
also assigns values to two of \TeX's primitive parameters, namely
|\hsize| and |\vsize|. \TeX\ has scores of parameters, all of which
@@ -19277,12 +19308,13 @@ based on the delimiters available in Computer Modern:
|\delcode`\<="26830A \delcode`\\="26E30F \delcode`\>="26930B|
\endlines
It's important to note that |\delcode`\{| and |\delcode`\}| have been left
-equal to~$-1$. If those codes were set to certain values, a user would
-^^{left brace} ^^{right brace} be able to type, e.g.,
-`|\big{|' to get a big left brace; but it would be a big mistake.
-The reason is that ^{braces} are used for grouping, when supplying
-arguments to macros; all sorts of strange things can happen if you try
-to use them both as math delimiters and group delimiters.
+equal to~$-1$.
+^^{left brace} ^^{right brace}
+^{Braces} are used for grouping, when supplying
+arguments to macros; so they cannot also be used as math delimiters, or as
+arguments to macros such as |\big|. (One could change their catcodes
+to~12, and use some other pair of characters for grouping; but that
+would not be plain \TeX.)
At this point the |plain.tex| file contains several definitions
\beginlines
@@ -19310,8 +19342,8 @@ temporary ``^{scratch}'' use, but their values are always assumed to be
clobbered whenever any other macro might get into control. \ (This applies
to registers like |\dimen0|, |\toks0|, |\skip1|, |\box3|, etc.; but \TeX\
has already reserved |\count0| through |\count9| for page number
-identification.) \ (2)~The registers |\count255|, |\dimen255|, and
-|\skip255| are freely available in the same way.
+identification.) \ (2)~The registers |\count255|, |\dimen255|, |\skip255|,
+|\muskip255|, and |\toks255| are freely available in the same way.
\ (3)~All assignments to the scratch registers whose numbers are
1,~3, 5, 7, and~9 should be ^|\global|; all assignments to the
other scratch registers (0,~2, 4, 6, 8,~255) should be non-|\global|.
@@ -19328,7 +19360,7 @@ apply to ^{input/output 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).
+same number).\looseness=-1
Some handy abbreviations are introduced at this point so that the macros
below will have easy access to scratch registers:
@@ -19366,16 +19398,16 @@ particular way.
|\countdef\insc@unt=20 % nickname for the insertion counter|
|\countdef\allocationnumber=21 % the most recent allocation|
|\countdef|^|\m@ne||=22 \m@ne=-1 % a handy constant|
-|\def|^|\wlog||{\immediate\write-1} % this will write on log file (only)|
+|\def|^|\wlog||{\immediate\write-1 } % this will write on log file (only)|
\smallbreak
|\outer\def|^|\newcount||{\alloc@0\count\countdef\insc@unt}|
|\outer\def|^|\newdimen||{\alloc@1\dimen\dimendef\insc@unt}|
|\outer\def|^|\newskip||{\alloc@2\skip\skipdef\insc@unt}|
-|\outer\def|^|\newmuskip||{\alloc@3\muskip\muskipdef\@cclvi}|
+|\outer\def|^|\newmuskip||{\alloc@3\muskip\muskipdef\@cclv}|
|\outer\def|^|\newbox||{\alloc@4\box\chardef\insc@unt}|
|\let\newtoks=\relax % this allows plain.tex to be read in twice|
|\outer\def\newhelp#1#2{\newtoks#1#1=\expandafter{\csname#2\endcsname}}|
-|\outer\def|^|\newtoks||{\alloc@5\toks\toksdef\@cclvi}|
+|\outer\def|^|\newtoks||{\alloc@5\toks\toksdef\@cclv}|
|\outer\def|^|\newread||{\alloc@6\read\chardef\sixt@@n}|
|\outer\def|^|\newwrite||{\alloc@7\write\chardef\sixt@@n}|
|\outer\def|^|\newfam||{\alloc@8\fam\chardef\sixt@@n}|
@@ -19594,8 +19626,8 @@ control sequence |\preloaded| is made undefined at the very end, so those
fonts cannot be used directly. There are two reasons for this strange
approach: First, it is desirable to keep the total number of fonts
of plain \TeX\ relatively small, because plain \TeX\ is a sort of
-standard format; it shouldn't cost much for someone to acquire all the
-fonts of plain \TeX\ in addition to those he really wants. Second, it
+standard format; it shouldn't cost much for people to acquire all the
+fonts of plain \TeX\ in addition to the ones that they really want. Second, it
is desirable on many computer systems to preload the information for
most of the fonts that people will actually be using, since this saves
a lot of machine time. The |\preloaded| font
@@ -20469,7 +20501,7 @@ up ^|\rm| type, and that's all!
|\catcode`@=12 % at signs are no longer letters|
\nobreak\smallskip
|\def|^|\fmtname||{plain}|
-|\def\fmtversion{3.141592653} % identifies the current format|
+|\def\fmtversion{3.1415926535} % identifies the current format|
\endlines
The format name and version number are recorded in control sequences,
in order to help the people who might have to explain why something
@@ -20666,7 +20698,7 @@ A person who implements \TeX\ on computer systems that do not have
95~externally representable symbols should adhere to the following
guidelines: \ (a)~Stay as 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
+\oct{136}, \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.
@@ -20761,14 +20793,14 @@ need to be familiar with the fine points in Chapter~20. \TeX's control
sequences are divided into two main categories, ``expandable'' and
``unexpandable''; the former category includes all macros and |\if...\fi|
tests, as well as special operations like |\the| and |\input|, while the
-latter category includes the primitive commands listed in Chapter~24.
+latter category includes the primitive commands listed in Chapters~24--26.
The expansion of expandable tokens takes place in \TeX's ``^{mouth},''
but primitive commands (including assignments) are done in \TeX's
``^{stomach}.'' One important consequence of this structure is that
it is impossible to redefine a control sequence or to advance a register
while \TeX\ is expanding the token list of, say, a |\message| or |\write|
command; assignment operations are done only when \TeX\ is building a
-vertical or horizontal or math list.
+vertical or horizontal or math list.\looseness=-1
For example, it's possible to put |\n| asterisks into a paragraph,
by saying simply `|{|^|\loop||\ifnum\n>0 *\advance\n-1 \repeat}|'.
@@ -20867,7 +20899,7 @@ where the characters `|pt|' are of category~12. After the macro definitions
\begintt
{\catcode`p=12 \catcode`t=12 \gdef\\#1pt{#1}}
\let\getfactor=\\
-\def\kslant#1{\kern\expandafter\getfactor\the\fontdimen1#1\ht0}
+\def\kslant#1{\kern\expandafter\getfactor\the\fontdimen1#1\ht0 }
\endtt
one can write, e.g., `|\kslant\tenit|' and this will expand to
`|\kern0.25\ht0|'. If the boundary of\/ |\box0| is considered to be
@@ -20921,11 +20953,11 @@ The goal is to set \TeX\ up so that the respective constructions
`\thinspace|$$|$\,\alpha\,$|$$|\thinspace', ^^{dollar dollar}
`\thinspace|$$|$\,\alpha\,$^|\eqno|$\,\beta\,$|$$|\thinspace', and
`\thinspace|$$|$\,\alpha\,$^|\leqno|$\,\beta\,$|$$|\thinspace' will cause
-a macro |$$\generaldisplay$$| to be invoked, with |\eq| defined to be $\alpha$;
+a macro |$$\generaldisplay$$| to be invoked, with |\eq| defined to be $\alpha$.
^^{communication between macros}
-furthermore, the test |\ifeqno| should be true when an equation
-number~$\beta$ is present, and |\ifleqno| should be true in the case
-of\/ |\leqno|. When $\beta$ is present, it should be stored in~|\eqn|.
+Furthermore, when an equation number~$\beta$ is present, it should be stored
+in |\eqn|, and the test |\ifeqno| should be true.
+In such cases |\ifleqno| should distinguish |\leqno| from |\eqno|.
Here $\alpha$~and~$\beta$ are arbitrary balanced token lists that don't
contain either |\eqno| or |\leqno| at nesting level zero. The
following macros do the required maneuvers:
@@ -21328,7 +21360,8 @@ to an almost-verbatim transcript:
\endtt
Tokens are stripped off in this construction since, for example,
^|\meaning||\next| might be `\def\next{$this$ is {\it!}}%
-\expandafter|\meaning\next|'. Notice that a space will be inserted after
+\hbox{\kern1pt\expandafter|\meaning\next|}'.
+Notice that a space will be inserted after
the control word |\it|, but no space might actually have occurred there in
the argument to |\verbatim|; such information has been irretrievably lost.
@@ -22469,7 +22502,7 @@ How should the output routine break such a box up into three roughly
equal pieces? Notice that the contents of the box are completely rigid;
i.e., there is no glue that can stretch or shrink. Furthermore, we can
assume that the contents of the box are regular, i.e., that the
-inter-baseline distances are all the same. In such circumstances
+interbaseline distances are all the same. In such circumstances
a fairly simple ^{balancing} routine can be used to trisect the box.
Let's consider a more general problem: Suppose that a rigid vbox is given,
@@ -22538,9 +22571,9 @@ In our application to footnotes, the |\output| routine can reformat
the contents of\/ |\box\footins| by saying, for example,
\begintt
\rigidbalance\footins 3 7pt
-\setbox\footins=\lastbox
+\setbox2=\lastbox \setbox\footins=\vbox{\box2}
\endtt
-since ^|\lastbox| will be the result of\/ |\rigidbalance|.
+since ^|\lastbox| will be the result of\/ |\rigidbalance|, which is an hbox.
This solution to the problem of short footnotes might result in
^{club lines} or ^{widow lines}, since the balancing routine we have
@@ -22994,7 +23027,7 @@ end of the ^|\body| and the beginning of a ^|\ps|.
| {|^|\endgraf||\nobreak}}}|
|\def\annotations{\beginlinemode\def\par{\endgraf\nobreak}\obeylines\par}|
|\def\ps{\beginparmode\nobreak|
-| \interlinepenalty5000\def\par{\endgraf\penalty5000}}|
+| \interlinepenalty5000\def\par{\endgraf\penalty5000 }}|
\endlines
The remaining portion of |letterformat.tex| deals with ^{letterheads} and
@@ -23371,7 +23404,7 @@ should be ascribed to Herb Caswell; if it has any blemishes, they should be
ascribed to Don Knuth, who wrote the formatting
macros that we are now about to discuss.
-The computer file |manual.tex| that generated {\sl The \TeX book\/} begins
+The computer file |texbook.tex| that generated {\sl The \TeX book\/} begins
with a copyright notice, and then it says `|\input| |manmac|'. The auxiliary
file ^|manmac.tex| contains the formatting macros, and it begins by
loading 9-point, 8-point, and 6-point~fonts:
@@ -23620,7 +23653,7 @@ The next macros are concerned with chapter formatting. Each chapter in the
manuscript file starts out with the macro ^|\beginchapter|; it ends
with ^|\endchapter| and two ^{quotations}, ^^{epigraphs} followed
by ^|\eject|. For example, Chapter~15 was generated by \TeX\ commands
-that look like this in the file |manual.tex|:
+that look like this in the file |texbook.tex|:
\beginlines
|\beginchapter Chapter 15. How \TeX\ Makes\\Lines into Pages|
\medskip
@@ -23755,7 +23788,7 @@ using the macros |\pt|, |\<|, |\oct|, |\hex|, and |\cstok|.
|\def\MF{{\manual META}\-{\manual FONT}}|
|\def\AmSTeX{$\cal A\kern-.1667em\lower.5ex\hbox{$\cal M$}\kern-.075em|
| S$-\TeX}|
-|\def\bull{\vrule height .9ex width .8ex depth -.1ex } % square bullet|
+|\def\bull{\vrule height.9ex width.8ex depth-.1ex \relax} % square bullet|
|\def\SS{{\it SS}} % scriptscript style|
|\def\dn{\leavevmode\hbox{\tt\char'14}} % downward arrow|
|\def\up{|^|\leavevmode||\hbox{\tt\char'13}} % upward arrow|
@@ -23931,7 +23964,7 @@ in the text as well as in the index. ^^{strut}
^|\newwrite||\inx|
^|\immediate|^|\openout||\inx=index % file for index reminders|
|\def\marginstyle{\sevenrm % marginal notes are in 7-point type|
-| \vrule height6pt depth2pt width0pt } % a strut for \insert\margin|
+| \vrule height6pt depth2pt width0pt \relax} % a strut for \insert\margin|
\endlines
Sometimes it is desirable to index words that don't actually appear on the
@@ -24127,7 +24160,7 @@ showing |cmr10| (^|\rm|, |\textfont0|).
\noindent Plain \TeX\ makes use of sixteen basic fonts:
$$\halign{\indent$\nulldelimiterspace=0pt
\left.\ninepoint\vcenter{#}\,\hfil\right\}$ &#\hfil\cr
-\halign{\strut\tt cm# \ \hfil&(Computer Modern #)\hfil&\hidebrace{#}\hfil\cr
+\halign{\strut\tt cm# \ \hfil&(Computer Modern #)\hfil\cr
r10&Roman 10 point\cr
r7&Roman 7 point\cr
r5&Roman 5 point\cr
@@ -24136,7 +24169,7 @@ bx7&Bold Extended 7 point\cr
bx5&Bold Extended 5 point\cr
sl10&Slanted Roman 10 point\cr
ti10&Text Italic 10 point\cr}&text\cr
-\halign{\strut\tt cm# \ \hfil&(Computer Modern #)\hfil&\hidebrace{#}\hfil\cr
+\halign{\strut\tt cm# \ \hfil&(Computer Modern #)\hfil\cr
tt10&Typewriter Type 10 point\cr
mi10&Math Italic 10 point\cr
mi7&Math Italic 7 point\cr
@@ -24659,7 +24692,7 @@ relation, as in `$x:=y$' and `$a:b::c:d$', which you type by saying
\hbox to 115pt{$L(a,b;c\colon x,y;z)$\hfil}\enspace
|$L(a,b;c\colon x,y;z)$|\cr
\enddisplay
-Plain \TeX\ also defines ^|\ldotp| and ^|\cdotp| to be `.' and `$\cdot$'
+Plain \TeX\ also defines ^|\ldotp| and ^|\cdotp| to be `.'\ and `$\cdot$'
with the spacing of commas and semicolons. These symbols don't
occur directly in formulas, but they are useful in the definition of\/
^|\ldots| and ^|\cdots|.
@@ -25026,11 +25059,12 @@ so that the bottom of the hrule occurs at $a-{1\over2}\theta$ above the
baseline.
\rule 15e. Enclose the vbox that was constructed in Rule 15c or 15d by
-delimiters whose height plus depth is at least $\sigma_{20}$, if $C>T$, and at
+delimiters $(\lambda,\rho)$
+whose height plus depth is at least $\sigma_{20}$, if $C>T$, and at
least $\sigma_{21}$ otherwise. Shift the delimiters up or down so that they are
vertically centered with respect to the axis. Replace the generalized
-fraction by an Inner atom whose nucleus is the resulting sequence of three boxes
-(left delimiter, vbox, right delimiter).
+fraction by an Ord atom whose nucleus is the resulting sequence of three boxes
+($\lambda$, vbox, $\rho$). Go to rule~19.
\bigbreak\noindent
Rules 1--15 account for the preliminary processing of math list items;
@@ -25122,7 +25156,8 @@ f,2\delta-l)$, where $f$ is the ^|\delimiterfactor|
and $l$ is the ^|\delimitershortfall|. Shift the delimiters up or down so
that they are vertically centered with respect to the axis. Change the left
boundary item to an Open atom and the right boundary item to
-a Close atom. \ (All of the calculations in this step are done with
+a Close atom. The entire resulting list now becomes the nucleus of an
+Inner atom. \ (All of the calculations in this step are done with
$C$ equal to the starting style of the math list; style items in the
middle of the list do not affect the style of the right boundary item.)
@@ -25590,7 +25625,7 @@ until coming to something that's not one of the following three
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$.
+items, up to a maximum of~63. Notice that all of these letters are in font~$f$.
\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
@@ -25675,7 +25710,7 @@ when according to legend, an RCA Marketing Manager received
a phone call from a disturbed customer. His 301 had just hyphenated ``God.''
\author PAUL E. ^{JUSTUS}, {\sl There's More to Typesetting Than %
Setting Type\/} (1972)
-% in {\sl IEEE Transactions on Professional Commun. vol PC-15, pp. 13-15
+% in IEEE Transactions on Professional Commun. vol PC-15, pp. 13-15
\bigskip
@@ -25777,7 +25812,7 @@ redefine them.
|\'| (acute accent), @7--9, 52--53, @305, @335, +356, @420.
|''| ( '' ), @3--5, @24, 394--395.
|`| (reverse apostrophe or left quote), 3--5, 51, 132, 134, @305, 391, 394--395;
- \also alphabetic constant.
+ \also alphabetic constants.
|\`| (grave accent), 8, 52--53, @305, +356.
|``| ( `` ), @3--5, @24, 394--395.
|"| (double quote or ditto mark), 52, 53, 134; \also hexadecimal.
@@ -25787,7 +25822,7 @@ redefine them.
|)| (right parenthesis), 51, 134, @140, @145--150, 345.
|[| (left bracket), 51, 134, @146--148, 171, @408, @437.
|[]|, +28, @+79, @302.
-|[1]|, 23, +119.
+|[1]| (progress report), 23, +119.
|]| (right bracket), 51, 134, @146--147, 171, 345, @408, @437.
|{| (left brace), @13--14, @19--21, 38, 51, @200--202, +203--+204, @205--206,
216, +269, 275--276, +283, +286, +291, @330.
@@ -25840,7 +25875,7 @@ $:=$, 133.
|?`|\hbox{ }(open question), 51.
|!|\hbox{ }(exclamation point), 51, @72, 73, 75, @169.
|!`|\hbox{ }(open exclamation), 51.
-|\!|\ (negative thin space), +167, @169, +357.
+|\!|\ (negative thin space), 167, @169, +357.
|_| (underscore), 38, 51, @128--130, 134.
|\_| ( \_ ), 38, @165, +356.
|^| (hat), 38, 51, @128--130, 134, 369, @423.
@@ -25856,8 +25891,8 @@ $:=$, 133.
|@@|, 98--99.
|\@ne|, +345.
\newletter
-|\aa| ( \aa\ ), +356.
-|\AA| ( \AA\ ), +356.
+|\aa| ( \aa\ ), @52, +356.
+|\AA| ( \AA\ ), @52, +356.
abbreviations, @73--74, @340; \also macros.
*|\above| (general fraction), @143, 152, +292, 444--445.
*|\abovedisplayshortskip|, +189, 274, @348, @415.
@@ -25890,7 +25925,7 @@ al-Khw\^arizm\^\i, abu `Abd All\^ah Mu\d{h}ammad ibn M\^us\^a, 53.
|\aleph| ( $\aleph$ ), 9, +358, 435.
Alice, 4, 387, 394.
alignment displays, 190, 193, +291.
-\<alignment material>, 282, 285.
+\<alignment material>, 282, 285, 291.
alignments, 231--249, +282, 302--303, 385--386, 392; \also tabbing.
Alka-Seltzer, 404--405.
all caps, \see |\uppercase|.
@@ -26067,7 +26102,7 @@ Bourbaki, Nicolas, 106.
|\bowtie| ( $\bowtie$ ), +358, 436.
\<box>, 120, 222, +278, 282, 285, 290.
*|\box| (use box register), 120--122, 151, 222, +278, 346, @354, @386, @387.
-|\box255|, 125, 253--258.
+\sub |\box255|, 125, 253--258.
\<box dimension>, +271, 277.
box displays, 66, 75, 79, 158--159, 302, 455.
box memory, 300, 394.
@@ -26135,7 +26170,7 @@ Caswell, Herbert Ernest, 413.
@421, @424.
category codes, 37--40, +47, 48, 203--205, 209--210, 214, 381.
\sub table, 37.
-|cc| (cicero), 57, 270.
+|cc| (cicero), +57, 270.
|\cdot| ( $\cdot$ ), @133, @172, 319, 436.
|\cdotp|, 358, +359, 438.
|\cdots| ( $\cdots$ ), @172, @176, @180--181, +359, 438.
@@ -26178,12 +26213,12 @@ classes of math characters, table, 154.
*|\cleaders|, +224, 225--226, @357, @374.
|\cleartabs|, @234, +354.
Close atom, 158, 170--171, 289, 443--444, 446.
-*|\closein|, 217, 280.
+*|\closein|, +217, 280.
*|\closeout|, 226--228, 254, +280, @422.
|\closing|, @403--404, +407.
closings, 134, 147, 154--155, 359, +437; \also Close atom.
club lines, 104, 272, 398.
-*|\clubpenalty|, 104, 113, 272, 317, @348, @419.
+*|\clubpenalty|, +104, 113, 272, 317, @348, @419.
|\clubsuit| ( $\clubsuit$ ), 435.
|cm| (centimeter), @24, +57, 270.
|cmbx| fonts, 60, 350, 413, 428, 433.
@@ -26356,6 +26391,7 @@ dimensions, 57--61.
Dionysius I of Syracuse, 239.
diphthongs, \see |\ae|, |\oe|.
direct sum, \see |\oplus|.
+\<disc text>, +287, 292.
discardable items, 95, 110--112, 124, @393.
*|\discretionary|, 95--96, 283, 286, +287, +292.
discretionary hyphens, 28, 95--96, 453, +455.
@@ -26370,7 +26406,7 @@ displays, 87, 103, @139--145, @166--167, 185--197, @232, @241, 315.
\sub non-centered, 186, 326, 375--376, 420--421.
\sub positioning of, +188--+190.
*|\displaystyle|, 141--142, +292, @362.
-*|\displaywidowpenalty|, 104, 272, @348.
+*|\displaywidowpenalty|, +104, 105, 272, @348.
*|\displaywidth|, 188, 190, 274, 349.
Disraeli [Beaconsfield], Benjamin, earl, 219.
ditto mark, 53, 441.
@@ -26541,10 +26577,10 @@ fields of atoms, 158--159, 289--291.
\<fil dimen>, +271.
\<fil unit>, +271.
|\filbreak|, 111, +353.
-\<file name>, 214, 216, 226, 277, +278.
file names, 25, 214, 216--217, 226, 278.
file pages, 343.
file types, \see |.dvi|, |.fmt|, |.tfm|, |.tex|, log file, terminal.
+\<filename>, 214, 216, 226, 277, +278.
|fill|, 72, 118--119, +271, @347.
fill page with blank space, \see |\vfill|.
\<filler>, +276, 278, 280--282, 289.
@@ -26613,7 +26649,7 @@ Gamble, James, 38.
|\gcd| ( $\gcd$ ), 162, @192, 361.
*|\gdef|, +206, 215, 275, @352, @407.
|\ge| ( $\ge$ ), 9, 45, @175, 318, +361, 438.
-\<general text>, +276, 277, 279, 280, 287, 292.
+\<general text>, +276, 279, 280.
generalized fraction, 152, 157, +292, +444--+445.
generic coding, 194, 203.
generic matrix, 177, 245.
@@ -26715,7 +26751,7 @@ horizontal braces, @176, 225--226, @339.
\<horizontal command>, +283.
horizontal lists, 64, +94--+95.
horizontal mode, 85--89, 105, +285--+287.
-\<horizontal mode material>, 278.
+\<horizontal mode material>, 278, 285, 287.
\<horizontal rule>, 281.
horizontal rules, 24, 64, 221--226, 246, +282.
\<horizontal skip>, 285, 290.
@@ -26793,7 +26829,7 @@ infinite penalty, 97, 111, 254--256, 264, 286, 400.
|\infty| ( $\infty$ ), 9, 318, 435.
inhibiting expansion, 216, 262--263, 377.
|INITEX|, 39, 41, 76, 157, 283, 336, 343--345, 453.
-Inner atom, 158, 170, 289, 443, 445--446.
+Inner atom, 158, 170, 289, 292, 443, 446.
*|\input|, 7, 9, @25--27, 47, 199, +214, 217, @380, 382--383, @403, @422.
input/output commands, \see |\input|, |\read|, |\write|, |\message|, |\dump|.
input/output streams, 346, \see |\openin|, |\openout|.
@@ -26803,11 +26839,11 @@ input stack, 300, 374.
inserting text online, 31.
insertions, 110, 115--117, 122--125, 256, 335.
*|\insertpenalties|, 111, 114, +123--+125, 214, 254, @256, 271.
-|\int| (large $\smallint$), 144, @168--169, @192, 358, 435.
+|\int| (large $\smallint$), 144, @168--169, @192, +358, 435.
\<integer constant>, +269--+270.
\<integer parameter>, 271, +272--+273, 276.
\<integer variable>, +276.
-integral signs, \see |\int|, |\smallint|.
+integral signs, \see |\int|, |\oint|, |\smallint|.
\sub multiple, @169, @180.
inter-column spacing, 237--239, 247, 392.
interacting with \TeX, 31--34, 217--218, 228, 295--299.
@@ -26815,7 +26851,7 @@ interacting with \TeX, 31--34, 217--218, 228, 295--299.
|\interdisplaylinepenalty|, @193, 349, 362.
|\interfootnotelinepenalty|, 349, 363.
interline glue, 78--79, +80, 104, 105, 125, 221, 245, 263, 281--282, 335, 352, 399, 409.
-*|\interlinepenalty|, +104, 272, @363, @406, @419.
+*|\interlinepenalty|, +104, 105, 272, @363, @406, @419.
internal box-and-glue representation, 66, 75, 79, 158--159, 302, 455.
internal character codes, 43--46, 367--370.
\<internal dimen>, +271.
@@ -26901,7 +26937,7 @@ leaders, 222, 223--226, 228, 280--282, 285, 290, @357, @392--394.
leading, \see |\baselineskip|, |\vskip|.
|\leavevmode|, 313, @333, @+356, @408, @420.
Lee, Marshall, 17.
-*|\left|, @148--150, 155--157, @171, 196, +292, 437.
+*|\left|, @148--150, 155--157, 170, @171, 196, +292, 437.
left brace, @13--14, @19--21, 38, 51, @200--202, +203--+204, @205--206,
216, +269, 275--276, +283, +286, +291, @330.
\<left brace>, +275.
@@ -26909,7 +26945,7 @@ left bracket, 51, 134, @146--148, 171, @408, @437.
left delimiters, \see openings.
left-hand pages, 252--253, @416.
left parenthesis, 51, 134, @140, @145--150, 345.
-left quote, 3--5, 132, 134, @305, 394--395; \also alphabetic constant.
+left quote, 3--5, 132, 134, @305, 394--395; \also alphabetic constants.
|\leftarrow| ( $\leftarrow$ ), 226, 437.
|\Leftarrow| ( $\Leftarrow$ ), 226, 437.
|\leftarrowfill| (\hbox to4em{\leftarrowfill}), +357.
@@ -26921,7 +26957,7 @@ left quote, 3--5, 132, 134, @305, 394--395; \also alphabetic constant.
|\Leftrightarrow| ( $\Leftrightarrow$ ), 437.
*|\leftskip|, 100, 274, @317, @407, @419.
Legendre symbol, 152.
-Leontief, Wassily Wassily, 265.
+Leontief, Wassily Wassily, 265. % acc to his postcard to me, 25 Feb 1983
|\leq| ( $\leq$ ), 318, +358, 436.
|\leqalignno|, 192, 194, +362.
*|\leqno|, @187, 189, +293, 375--376.
@@ -27037,6 +27073,7 @@ math formulas, how to type, 127--197.
math italic, 164--165, 409, 430, 433.
math lists, 157--159, 441--446.
math mode, 85--89, 127, 157, +289--+293.
+\<math mode material>, 287, 289--293.
math spacing table, 170--171.
\<math symbol>, +289.
math symbols, 127--128.
@@ -27198,8 +27235,8 @@ Norwegian characters, 45--46, 52--53, 370.
$n$th, 323.
|\nu| ( $\nu$ ), @128, @163, 434.
nucleus, 158--159, 289--292, 441--446.
-|\null|, 311, @332, +351.
\<null> (ASCII code 0), 37, 39, 48, 343, 369.
+|\null|, 311, @312, @316, @332, @335, +351, @354, @360--@362, @419.
null control sequence, 46, 308.
null delimiter, 149--150, 152, 156, 345, @360, @362.
null set, \see |\emptyset|.
@@ -27216,8 +27253,8 @@ numerical tables, 240--241.
|\nwarrow| ( $\nwarrow$ ), 437.
\newletter
|O| versus |0|, 132.
-|\o| ( \o\ ), +356.
-|\O| ( \O\ ), +356.
+|\o| ( \o\ ), @52, +356.
+|\O| ( \O\ ), @52, +356.
|\oalign|, +356.
obelisk {\sl or\/} obelus, 53.
|\obeylines|, @94, @249, @262, 342, +352, @380--382, @407, @419.
@@ -27278,7 +27315,7 @@ other character, 37.
output routines, 21, 112, 251--264, 417.
\sub when invoked, 122, 125, 281.
*|\outputpenalty|, +125, @254--255, 273, 349, 400, @417.
-*|\over|, @139--141, @148, 152, 292, 437, 444--445.
+*|\over|, @139--141, @148, 152, +292, 437, 444--445.
Over atom, 158, 289, 443.
|\overbrace|, @176, 225, +359.
overfull boxes, 27--30, 94, 229, 238, 302--303, 307, 400.
@@ -27289,7 +27326,7 @@ overlaps, 82--83, 386.
*|\overline|, @130--131, @136, 141, 170, 291, 443.
overloading, 54, 243.
|\overrightarrow|, 226, +359.
-*|\overwithdelims|, @152, 292, 444--445.
+*|\overwithdelims|, @152, +292, 444--445.
|\owns| ( $\owns$ ), +361, 438.
\newletter
|\P| ( \P\ ), 53, 117, +356, 438--439.
@@ -27332,7 +27369,7 @@ parentheses, 51, 129, 134, @140, @145--150, 345, 437.
*|\parfillskip|, 100, 188, 274, +286, 307, @315, 332, @348, @394, @419.
*|\parindent|, 86, 100, 101--102, 105, @262, 274, 282, 286, 291, @342, @348,
@355, @394, @406, @415.
-*|\parshape|, 101--102, 214, 271, 272, 277, 283, @315, 349, 374.
+*|\parshape|, 101--103, 214, 271, 272, 277, 283, @315, 349, 374.
*|\parskip|, 79, 104--105, 262, 274, 282, @342, @348, @355, @406, @417.
|\partial| ( $\partial$ ), @147, 435.
Pascal, Blaise, 101--102.
@@ -27416,7 +27453,7 @@ private control sequences, 344, 364, 414.
Procter, William Alexander, 38.
|\prod| (large $\Pi$), @180--181, 435.
programming with \TeX, 217--219, 387--388.
-programs, for computers, 38, 165, 234.
+programs, for computers, 38, 165, @234.
\sub for music, 408--412.
proofreading, 59, 303.
proper names, 73, 92.
@@ -27483,6 +27520,8 @@ relations, @133--134, 147, 154--155, 358, +436, +437; \also Rel atom.
|\removelastskip|, +353.
|\repeat|, @217--219, +352.
repeating commands, \see |\loop|.
+repeating templates, \see periodic preambles.
+replacement text, @200--@204, 212, 280, 300, 329.
reserved characters, 37--38, 51--52, 134.
reserved words, +61, 71, +268, 337, 370.
restricted horizontal mode, 85, 87--89, +285--+287.
@@ -27490,19 +27529,19 @@ r\'esum\'e, 253.
\<return> (ASCII code 13), 23, 39, 43, 45, 46, 48, 249, 331, 343, 345, 369, 380.
|\|\<return>, 8, @305, +351.
reverse apostrophe, 3--5, 51, 132, 134, 391, 394--395;
- \also alphabetic constant.
+ \also alphabetic constants.
reverse slash, \see backslash.
Reviewer, Ann Arbor, 106.
|\rfloor| ( $\rfloor$ ), @146--147, +359, 437.
|\rgroup|, 150, @176, +359, 437.
|\rho| ( $\rho$ ), 128, @325, 434.
|\rhook|, +358.
-*|\right|, @148--150, 155--157, @171, 196, +292, 437.
+*|\right|, @148--150, 155--157, @170--@171, 196, +292, 437.
right brace, @13--14, @19--21, 38, 51, @200--202, +203--+204, @205--206,
+269, 275--276, +279, 301, @330.
\<right brace>, +275.
right bracket, 51, 134, @146--147, 171, 345, @408, @437.
-right delimiters, \see openings.
+right delimiters, \see closings.
right-hand pages, 252--253, @416.
right justification, 71.
right parenthesis, 51, 134, @140, @145--150, 345.
@@ -27713,7 +27752,7 @@ stretchability, 69--71, @75, 409.
|\strut|, 82, @142, 178, 240, @246--247, @316, @329, @333, +353, @396, @400,
@421.
|\strutbox|, @316, +353, @396, @414--415.
-struts, +82, 125, 131, 142, 178, 245--247, 255, 329, 416, 422, 423.
+struts, +82, 125, 131, 142, 155, 178, 245--247, 255, 329, 416, 422, 423.
style change items, 157, 442.
style-independent documents, 194, 203.
styles of math formatting, 140--141, 441--447.
@@ -27955,7 +27994,7 @@ variables in formulas, 132, 358, 434--435; \also Ord atom.
vbox (box with vertical list inside), 65.
*|\vbox|, 65, 80--82, 103, 151, 193, 222, 278, 388--389.
Vcent atom, 158, 290, 443.
-*|\vcenter|, 150--151, 159, 170, 193, 222, 242, +290, @361, +443.
+*|\vcenter|, 150--151, 159, 170, 193, 222, 242, +290, @326, @361, +443.
|\vdash| ( $\vdash$ ), 436.
|\vdots| ( $\vdots$ ), @177, +359.
|\vec| (math accent: $\vec x\,$), 135; \also |\overrightarrow|.
@@ -27970,7 +28009,7 @@ vertical line (the character `\|'), 52, 53, 132, @146--147, @171, @174, 438;
\also vertical rules.
vertical lists, 64, +110.
vertical mode, 85--89, +267--+283.
-\<vertical mode material>, 278.
+\<vertical mode material>, 278, 280--282, 290.
\<vertical rule>, +281.
vertical rules, 64, 151, 221--226, +285, +291, 392.
\<vertical skip>, +281.
@@ -28013,7 +28052,7 @@ whatsits, 95, 110, 157, 226--229, 455.
|\widetilde| (math accent: $\widetilde x\,$), @136, +359.
widow lines, 104, 272, 398.
widow words, 104.
-*|\widowpenalty|, 104, 113, 272, @348.
+*|\widowpenalty|, +104, 105, 113, 272, @348.
|width|, 221, 224, +282, 337.
width of a box, 63--67, 77, 80--82, 225.
wiggle, \see |\sim|.
diff --git a/systems/knuth/dist/tex/trip.dvi b/systems/knuth/dist/tex/trip.dvi
new file mode 100644
index 0000000000..d951a496c2
--- /dev/null
+++ b/systems/knuth/dist/tex/trip.dvi
Binary files differ
diff --git a/systems/knuth/dist/tex/trip.fot b/systems/knuth/dist/tex/trip.fot
index 7ae8e89d87..a6b3800563 100644
--- a/systems/knuth/dist/tex/trip.fot
+++ b/systems/knuth/dist/tex/trip.fot
@@ -1,4 +1,4 @@
-This is TeX, Version 3.14159265 (INITEX)
+This is TeX, Version 3.141592653 (INITEX)
** &trip trip
(trip.tex ##
! Bad number (-7).
diff --git a/systems/knuth/dist/tex/trip.log b/systems/knuth/dist/tex/trip.log
index 585bf9b1fa..37d7c29d07 100644
--- a/systems/knuth/dist/tex/trip.log
+++ b/systems/knuth/dist/tex/trip.log
@@ -1,4 +1,4 @@
-This is TeX, Version 3.14159265 (preloaded format=trip 2014.1.7) 7 JAN 2014 09:59
+This is TeX, Version 3.141592653 (preloaded format=trip 1776.7.4) 4 JUL 1776 12:00
** &trip trip
(trip.tex ##
{vertical mode: \tracingrestores}
@@ -1836,6 +1836,7 @@ the \fontdimen values needed in math symbol fonts.
{restoring \mathsurround=0.0pt}
{restoring \fam=0}
{horizontal mode: \par}
+
! Infinite glue shrinkage found in a paragraph.
l.210 ...round60pt\hbox{$$}$\par
}
@@ -2428,7 +2429,7 @@ deleted material, e.g., by typing `I$}'.
### display math mode entered at line 249
\mathord
.{}
-this will be denominator of:
+this will begin denominator of:
\fraction, thickness = default
\\mathord []
\\mathord []
@@ -3021,7 +3022,7 @@ oxbreadth 9999 \showboxdepth 9999 \showlists \pagegoal =10000pt}
./.\.\fam1 q
././\rule(9.0+*)x0.4
\mathord
-this will be denominator of:
+this will begin denominator of:
\fraction, thickness 9.0
\{}
### math mode entered at line 280
@@ -5015,14 +5016,15 @@ you'd better type `E' or `X' now and fix your file.
<to be read again>
8
l.356 ...ef\lo#1#2U3#4#5#6#7#8#8
- #9#{\relax}
+ #99#{\relax}
I've inserted the digit you should have used after the #.
Type `1' to delete what you did use.
! You already have nine parameters.
l.356 ...\lo#1#2U3#4#5#6#7#8#8#9
- #{\relax}
-I'm going to ignore the # sign you just used.
+ 9#{\relax}
+I'm going to ignore the # sign you just used,
+as well as the token that followed it.
{blank space }
{\ifcase}
@@ -7294,7 +7296,7 @@ Memory usage before: 334&431; after: 292&418; still untouched: 175
(end occurred when iftrue on line 413 was incomplete)
Here is how much of TeX's memory you used:
47 strings out of 1674
- 253 string characters out of 8354
+ 253 string characters out of 8367
2825 words of memory out of 3000
372 multiletter control sequences out of 2100
3041 words of font info for 4 fonts, out of 20000 for 75
diff --git a/systems/knuth/dist/tex/trip.tex b/systems/knuth/dist/tex/trip.tex
index a9205e52d5..0bcfe5c1a8 100644
--- a/systems/knuth/dist/tex/trip.tex
+++ b/systems/knuth/dist/tex/trip.tex
@@ -353,7 +353,7 @@ A \char'202$$\global\count8=\predisplaysize\leqno\kern1009pt$\par
\def\b#1\par{}
\outer\gdef\a^^@^^@a#1\par#2{}\tokens{\a^^@^^@a\par!
\long\gdef\l#1{}
-\outer\global\long\edef\lo#1#2U3#4#5#6#7#8#8#9#{\relax}
+\outer\global\long\edef\lo#1#2U3#4#5#6#7#8#8#99#{\relax}
\ifcase 1 \undefined\or\l\par\b{\par % occurrence of \par aborts \b
\b{\l\undefined}\par\else\b{\par}\fi % but not there!
\ifcase\iftrue-1a\else\fi \ifcase0\fi\else\ifcase5\fi\fi
diff --git a/systems/knuth/dist/tex/trip.typ b/systems/knuth/dist/tex/trip.typ
index 2ef2781289..8bc03e15f7 100644
--- a/systems/knuth/dist/tex/trip.typ
+++ b/systems/knuth/dist/tex/trip.typ
@@ -6,7 +6,7 @@ Options selected:
Resolution = 72.27000000 pixels per inch
numerator/denominator=25400000/473628672
magnification=2000; 0.00003052 pixels per DVI unit
-' TeX output 2014.01.07:0959'
+' TeX output 1776.07.04:1200'
42: beginning of page 0.0.0.0.11.0.0.0.0.0
87: down4 129105920
diff --git a/systems/knuth/dist/tex/tripin.fot b/systems/knuth/dist/tex/tripin.fot
new file mode 100644
index 0000000000..c1b004b9d1
--- /dev/null
+++ b/systems/knuth/dist/tex/tripin.fot
@@ -0,0 +1,89 @@
+This is TeX, Version 3.141592653 (INITEX)
+**
+Please type the name of your input file.
+**\input trip
+(trip.tex
+! Bad character code (256).
+<to be read again>
+ -
+l.26 \nonstopmode\lccode256-
+ 0\mathchardef\a="8000\def\a{ SC...
+! Bad mathchar (32768).
+<to be read again>
+ \def
+l.26 ...\mathchardef\a="8000\def
+ \a{ SCALED 3~2769}
+! Illegal magnification has been changed to 1000 (32769).
+<to be read again>
+ \skewchar
+l.28 \skewchar
+ \rip=`B \countdef\countz % \countz will be \c...
+! Missing number, treated as zero.
+<to be read again>
+ \def
+l.29 \def
+ \on{1} \toksdef\tokens=256 \show\errorstopmode
+! Bad register code (256).
+l.29 ...{1} \toksdef\tokens=256
+ \show\errorstopmode
+> \errorstopmode=\errorstopmode.
+l.29 ...=256 \show\errorstopmode
+
+> \rip .
+<recently read> \font
+
+l.30 \showthe\font
+ \showthe\pageshrink \showthe\pagegoal
+> 0.0pt.
+l.30 ...font \showthe\pageshrink
+ \showthe\pagegoal
+> 16383.99998pt.
+l.30 ...shrink \showthe\pagegoal
+
+! Illegal unit of measure (replaced by filll).
+l.32 ...fdim\hsize<\hsize\fi lll
+ minus 0 fill
+\one \csname on line 60
+! You can't use `\badness' in vertical mode.
+l.61 ...yphenpenalty 89 \badness
+
+! Bad \patterns.
+l.75 ...uage256\patterns{0111 \?
+ 50AA1b3 *1AcA. bb bb1 0B2B0 b...
+! Nonletter.
+l.75 ...ge256\patterns{0111 \?50
+ AA1b3 *1AcA. bb bb1 0B2B0 b1c...
+! Duplicate pattern.
+l.75 ...1b3 *1AcA. bb bb1 0B2B0
+ b1c}} % *==space
+! OK (see the transcript file).
+l.78 ...ns{q9q} -\0qq \showlists
+ {\language\?\noboundary111}%
+! Too late for \patterns.
+l.79 ...har\rip=`-\cr}}\patterns
+ {toolate}\showbox0}
+! OK (see the transcript file).
+<to be read again>
+ }
+l.79 ...terns{toolate}\showbox0}
+
+ )
+(see the transcript file for additional information)
+Beginning to dump on file trip.fmt
+ (preloaded format=trip 1776.7.4)
+1326 strings of total length 23633
+471 memory locations dumped; current usage is 96&278
+341 multiletter control sequences
+\font\nullfont=nullfont
+\font\rip=trip
+\font\smalltrip=trip at 5.0pt
+\font\bigtr
+p=trip at 20.0pt
+2279 words of font info for 3 preloaded fonts
+1 hyphenation exception
+Hyphenation trie of length 273 has 9 ops out of 500
+ 2 for language 255
+ 1 for language 98
+ 6 for language 0
+No pages of output.
+Transcript written on trip.log.
diff --git a/systems/knuth/dist/tex/tripin.log b/systems/knuth/dist/tex/tripin.log
index 1d98379456..b74d9ca61a 100644
--- a/systems/knuth/dist/tex/tripin.log
+++ b/systems/knuth/dist/tex/tripin.log
@@ -1,4 +1,4 @@
-This is TeX, Version 3.14159265 (INITEX) 7 JAN 2014 09:09
+This is TeX, Version 3.141592653 (INITEX) 4 JUL 1776 12:00
**\input trip
(trip.tex
! Bad character code (256).
@@ -447,8 +447,8 @@ l.79 ...terns{toolate}\showbox0}
)
Beginning to dump on file trip.fmt
- (preloaded format=trip 2014.1.7)
-1326 strings of total length 23646
+ (preloaded format=trip 1776.7.4)
+1326 strings of total length 23633
471 memory locations dumped; current usage is 96&278
341 multiletter control sequences
\font\nullfont=nullfont
diff --git a/systems/knuth/dist/texware/dvitype.web b/systems/knuth/dist/texware/dvitype.web
index a0c5dba2c7..687736dc87 100644
--- a/systems/knuth/dist/texware/dvitype.web
+++ b/systems/knuth/dist/texware/dvitype.web
@@ -32,7 +32,7 @@
\def\title{DVI$\,$\lowercase{type}}
\def\contentspagenumber{401}
\def\topofcontents{\null
- \def\titlepage{F} % include headline on the contents page
+ \titlefalse % include headline on the contents page
\def\rheader{\mainfont\hfil \contentspagenumber}
\vfill
\centerline{\titlefont The {\ttitlefont DVItype} processor}
@@ -1245,7 +1245,7 @@ if wp>0 then for k:=width_ptr to wp-1 do
options that the user must specify: The |out_mode| level is set to one of
five values (|errors_only|, |terse|, |mnemonics_only|,
|verbose|, |the_works|), giving
-different degrees of output; and the typeout can be confined to a
+different degrees of output; and the listing can be confined to a
restricted subset of the pages by specifying the desired starting page and
the maximum number of pages. Furthermore there is an option to specify the
resolution of an assumed discrete output device, so that pixel-oriented
@@ -2266,7 +2266,7 @@ if k<>post then bad_dvi('byte ',q:1,' is not post');
post_loc:=q; first_backpointer:=signed_quad
@ Note that the last steps of the above code save the locations of the
-the |post| byte and the final |bop|. We had better declare these global
+|post| byte and the final |bop|. We had better declare these global
variables, together with two more that we will need shortly.
@<Glob...@>=
diff --git a/systems/knuth/dist/texware/pltotf.web b/systems/knuth/dist/texware/pltotf.web
index d68e1e1b23..74f0e2073e 100644
--- a/systems/knuth/dist/texware/pltotf.web
+++ b/systems/knuth/dist/texware/pltotf.web
@@ -34,7 +34,7 @@
\def\title{PL\lowercase{to}TF}
\def\contentspagenumber{301}
\def\topofcontents{\null
- \def\titlepage{F} % include headline on the contents page
+ \titlefalse % include headline on the contents page
\def\rheader{\mainfont\hfil \contentspagenumber}
\vfill
\centerline{\titlefont The {\ttitlefont PLtoTF} processor}
@@ -393,7 +393,7 @@ both be used within the same \.{CHARACTER} list.
\yskip\noindent
The elements of a \.{VARCHAR} property list are either \.{TOP}, \.{MID},
-\.{BOT} or \.{REP}; the values are integers, which must be zero or the number
+\.{BOT}, or \.{REP}; the values are integers, which must be zero or the number
of a character in the font. A zero value for \.{TOP}, \.{MID}, or \.{BOT} means
that the corresponding piece of the extensible character is absent. A nonzero
value, or a \.{REP} value of zero, denotes the character code used to make
@@ -428,8 +428,8 @@ The slashes specify retention of the left or right original character; the
\yskip\hang\.{KRN} (a one-byte value and a real value). The instruction
`\.{(KRN} $c$ $r$\.)' means, ``If the next character is $c$, then insert
-a blank space of width $r$ between the current character character and $c$;
-otherwise go on to the next intruction.'' The value of $r$, which is in
+a blank space of width $r$ between the current character and $c$;
+otherwise go on to the next instruction.'' The value of $r$, which is in
design units, is often negative. Character code $c$ must exist
in the font.
@@ -2013,7 +2013,7 @@ where it is explained further.
@!lig_z:array[0..hash_size] of 0..257;
@!hash_ptr:0..hash_size; {the number of nonzero entries in |hash|}
@!hash_list:array[0..hash_size] of 0..hash_size; {list of those nonzero entries}
-@!h,@!hh:0..hash_size; {indices into the hash table}
+@!h:0..hash_size; {index into the hash table}
@!tt:indx; {temporary register}
@!x_lig_cycle,@!y_lig_cycle:0..256; {problematic ligature pair}
diff --git a/systems/knuth/dist/texware/pooltype.web b/systems/knuth/dist/texware/pooltype.web
index a7f7617abf..605063459c 100644
--- a/systems/knuth/dist/texware/pooltype.web
+++ b/systems/knuth/dist/texware/pooltype.web
@@ -16,7 +16,7 @@
\def\title{POOL\lowercase{type}}
\def\contentspagenumber{101}
\def\topofcontents{\null
- \def\titlepage{F} % include headline on the contents page
+ \titlefalse % include headline on the contents page
\def\rheader{\mainfont\hfil \contentspagenumber}
\vfill
\centerline{\titlefont The {\ttitlefont POOLtype} processor}
@@ -69,7 +69,7 @@ procedure initialize; {this procedure gets things started properly}
(The following material is copied verbatim from \TeX82.
Thus, the same system-dependent changes should be made to both programs.)
-In order to make \TeX\ readily portable between a wide variety of
+In order to make \TeX\ readily portable to a wide variety of
computers, all of its input text is converted to an internal eight-bit
code that includes standard ASCII, the ``American Standard Code for
Information Interchange.'' This conversion is done immediately when each
@@ -87,7 +87,7 @@ know what the real position is; the program that does the actual printing from
a particular font encoding.
@^ASCII code@>
-\TeX's internal code is relevant also with respect to constants
+\TeX's internal code also defines the value of constants
that begin with a reverse apostrophe; and it provides an index to the
\.{\\catcode}, \.{\\mathcode}, \.{\\uccode}, \.{\\lccode}, and \.{\\delcode}
tables.
@@ -367,7 +367,7 @@ extended character set recommended in {\sl The \TeX book\/} would, for
example, be `|k in [0,@'10..@'12,@'14,@'15,@'33,@'177..@'377]|'.
If character |k| cannot be printed, and |k<@'200|, then character |k+@'100| or
|k-@'100| must be printable; moreover, ASCII codes |[@'41..@'46,
-@'60..@'71, @'141..@'146, @'160..@'171]| must be printable.
+@'60..@'71, @'136, @'141..@'146, @'160..@'171]| must be printable.
Thus, at least 80 printable characters are needed.
@:TeXbook}{\sl The \TeX book@>
@^character set dependencies@>
diff --git a/systems/knuth/dist/texware/tftopl.web b/systems/knuth/dist/texware/tftopl.web
index 65095d4327..8496ede751 100644
--- a/systems/knuth/dist/texware/tftopl.web
+++ b/systems/knuth/dist/texware/tftopl.web
@@ -28,7 +28,7 @@
\def\title{TF\lowercase{to}PL}
\def\contentspagenumber{201}
\def\topofcontents{\null
- \def\titlepage{F} % include headline on the contents page
+ \titlefalse % include headline on the contents page
\def\rheader{\mainfont\hfil \contentspagenumber}
\vfill
\centerline{\titlefont The {\ttitlefont TFtoPL} processor}
@@ -782,7 +782,7 @@ end
@* Doing it.
\TeX\ checks the information of a \.{TFM} file for validity as the
file is being read in, so that no further checks will be needed when
-typesetting is going on. And when it finds something wrong, it justs
+typesetting is going on. And when it finds something wrong, it just
calls the file ``bad,'' without identifying the nature of the problem,
since \.{TFM} files are supposed to be good almost all of the time.
diff --git a/systems/knuth/dist/web/tangle.web b/systems/knuth/dist/web/tangle.web
index 8fa1c395f0..d20bbd8592 100644
--- a/systems/knuth/dist/web/tangle.web
+++ b/systems/knuth/dist/web/tangle.web
@@ -19,6 +19,7 @@
% Version 4.3 fixes @@ bug in verbatim, catches extra } (September, 1991).
% Version 4.4 activates debug_help on errors as advertised (February, 1993).
% Version 4.5 prevents modno-comments from being split across lines (Dec 2002).
+% Version 4.6 fixes archaic @@z logic; is again big enough for TeX (Jan 2021).
% Here is TeX material that gets inserted after \input webmac
\def\hang{\hangindent 3em\indent\ignorespaces}
@@ -31,13 +32,13 @@
\def\({} % kludge for alphabetizing certain module names
\def\title{TANGLE}
-\def\contentspagenumber{123} % should be odd
+\def\contentspagenumber{125} % should be odd
\def\topofcontents{\null\vfill
\titlefalse % include headline on the contents page
\def\rheader{\mainfont Appendix E\hfil \contentspagenumber}
\centerline{\titlefont The {\ttitlefont TANGLE} processor}
\vskip 15pt
- \centerline{(Version 4.5)}
+ \centerline{(Version 4.6)}
\vfill}
\pageno=\contentspagenumber \advance\pageno by 1
@@ -66,7 +67,7 @@ dependencies' in the index below.
The ``banner line'' defined here should be changed whenever \.{TANGLE}
is modified.
-@d banner=='This is TANGLE, Version 4.5'
+@d banner=='This is TANGLE, Version 4.6'
@ The program begins with a fairly normal header, made up of pieces that
@^system dependencies@>
@@ -182,7 +183,7 @@ should be sufficient for most applications of \.{TANGLE}.
@!buf_size=100; {maximum length of input line}
@!max_bytes=45000; {|1/ww| times the number of bytes in identifiers,
strings, and module names; must be less than 65536}
-@!max_toks=50000; {|1/zz| times the number of bytes in compressed \PASCAL\ code;
+@!max_toks=65000; {|1/zz| times the number of bytes in compressed \PASCAL\ code;
must be less than 65536}
@!max_names=4000; {number of identifiers, strings, module names;
must be less than 10240}
@@ -732,7 +733,7 @@ there are programs that need more than 65536 tokens, and some programs
even need more than 65536 bytes; \TeX\ is one of these. To get around
this problem, a slight complication has been added to the data structures:
|byte_mem| and |tok_mem| are two-dimensional arrays, whose first index is
-either 0 or 1. (For generality, the first index is actually allowed to run
+either 0 or 1 or 2. (For generality, the first index is actually allowed to run
between 0 and |ww-1| in |byte_mem|, or between 0 and |zz-1| in |tok_mem|,
where |ww| and |zz| are set to 2 and~3; the program will work for any
positive values of |ww| and |zz|, and it can be simplified in obvious ways
@@ -875,7 +876,7 @@ like simple identifiers, their |equiv| value points to the replacement text.
@ The names of modules are stored in |byte_mem| together
with the identifier names, but a hash table is not used for them because
\.{TANGLE} needs to be able to recognize a module name when given a prefix of
-that name. A conventional binary seach tree is used to retrieve module names,
+that name. A conventional binary search tree is used to retrieve module names,
with fields called |llink| and |rlink| in place of |link| and |ilk|. The
root of this tree is |rlink[0]|. If |p| is a pointer to a module name,
|equiv[p]| points to its replacement text, just as in simple and parametric
@@ -977,7 +978,7 @@ 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
+ASCII codes is $c_1c_2\ldots c_n$, its hash value will be
$$(2^{n-1}c_1+2^{n-2}c_2+\cdots+c_n)\,\bmod\,|hash_size|.$$
@<Compute the hash...@>=
@@ -1311,7 +1312,7 @@ space or line breaks allowed between them (the \.{@@\&} operation of \.{WEB}).
\hang |double_dot| denotes `\.{..}' in \PASCAL.
\hang |verbatim| denotes the \.{@@=} that begins a verbatim \PASCAL\ string.
-It is also used for the end of the string.
+The \.{@@>} at the end of such a string is also denoted by |verbatim|.
\hang |force_line| denotes the \.{@@\\} that forces a new line in the
\PASCAL\ output.
@@ -1758,11 +1759,11 @@ output&|out_buf|&|out_state|&|out_sign|&|out_val|&|out_app|&|last_sign|\cr
(&\.(&|misc|\cr
x&\.{(x}&|num_or_id|\cr
-&\.{(x}&|sign|&&&$-1$&$-1$\cr
-15&\.{(x}&|sign_val|&\.{"+"}&$-15$&&$-15$\cr
+15&\.{(x}&|sign_val|&\.{"+"}&$-15$&&$-1$\cr
+&\.{(x}&|sign_val_sign|&\.{"+"}&$-15$&$+1$&$+1$\cr
19&\.{(x}&|sign_val_val|&\.{"+"}&$-15$&$+19$&$+1$\cr
-&\.{(x}&|sign_val_sign|&\.{"+"}&$+4$&$-1$&$-1$\cr
-2&\.{(x}&|sign_val_val|&\.{"+"}&$+4$&$-2$&$-2$\cr
+2&\.{(x}&|sign_val_val|&\.{"+"}&$+4$&$-2$&$-1$\cr
)&\.{(x+2)}&|misc|\cr}}$$
At each stage we have put as much into the buffer as possible without
knowing what is coming next. Examples like `\.{x-0.1}' indicate why
@@ -2474,9 +2475,7 @@ end;
@ @<Read from |web_file|...@>=
begin incr(line);
if not input_ln(web_file) then input_has_ended:=true
-else if limit=change_limit then
- if buffer[0]=change_buffer[0] then
- if change_limit>0 then check_change;
+else if change_limit>0 then check_change;
end
@ @<Read from |change_file|...@>=
@@ -2505,7 +2504,7 @@ had a line that didn't match any relevant line in |web_file|.
@<Check that all changes have been read@>=
if change_limit<>0 then {|changing| is false}
- begin for ii:=0 to change_limit do buffer[ii]:=change_buffer[ii];
+ begin for ii:=0 to change_limit-1 do buffer[ii]:=change_buffer[ii];
limit:=change_limit; changing:=true; line:=other_line; loc:=change_limit;
err_print('! Change file entry did not match');
@.Change file entry did not match@>
@@ -2606,7 +2605,7 @@ exit:end;
@ @<Do special things when |c="@@"...@>=
if c="@@" then
begin c:=buffer[loc];
- if (c<>" ")and(c<>tab_mark)and(c<>"*")and(c<>"z")and(c<>"Z") then incr(loc)
+ if (c<>" ")and(c<>tab_mark)and(c<>"*") then incr(loc)
else begin err_print('! Section ended in mid-comment');
@.Section ended in mid-comment@>
decr(loc); return;
@@ -2827,7 +2826,7 @@ if k>=longest_name-2 then
@* Scanning a numeric definition.
When \.{TANGLE} looks at the \PASCAL\ text following the `\.=' of a numeric
-macro definition, it calls on the precedure |scan_numeric(p)|, where |p|
+macro definition, it calls on the procedure |scan_numeric(p)|, where |p|
points to the name that is to be defined. This procedure evaluates the
right-hand side, which must consist entirely of integer constants and
defined numeric macros connected with \.+ and \.- signs (no parentheses).
@@ -3105,14 +3104,14 @@ loop@+ begin continue: while next_control<=format do
else if next_control=equivalence_sign then
begin define_macro(simple); goto continue;
end
- else @<If the next text is `|(#)==|', call |define_macro|
+ else @<If the next text is `\.{(\#)==}', call |define_macro|
and |goto continue|@>;
err_print('! Definition flushed since it starts badly');
@.Definition flushed...@>
end;
done:
-@ @<If the next text is `|(#)==|'...@>=
+@ @<If the next text is `\.{(\#)==}'...@>=
if next_control="(" then
begin next_control:=get_next;
if next_control="#" then
diff --git a/systems/knuth/dist/web/weave.web b/systems/knuth/dist/web/weave.web
index c1785c35cf..4981570e9b 100644
--- a/systems/knuth/dist/web/weave.web
+++ b/systems/knuth/dist/web/weave.web
@@ -26,6 +26,7 @@
% Version 4.2 conforms to ANSI standard for-loop rules (September, 1990).
% Version 4.3 catches extra } in input (Breitenlohner, September, 1991).
% Version 4.4 corrects changed_module logic, %-overflow (January, 1992).
+% Version 4.5 corrects archaic @@z logic and empty change file (January, 2021).
% Here is TeX material that gets inserted after \input webmac
\def\hang{\hangindent 3em\indent\ignorespaces}
@@ -46,7 +47,7 @@
\def\rheader{\mainfont Appendix D\hfil \contentspagenumber}
\centerline{\titlefont The {\ttitlefont WEAVE} processor}
\vskip 15pt
- \centerline{(Version 4.4)}
+ \centerline{(Version 4.5)}
\vfill}
\pageno=\contentspagenumber \advance\pageno by 1
@@ -73,7 +74,7 @@ dependencies' in the index below.
The ``banner line'' defined here should be changed whenever \.{WEAVE}
is modified.
-@d banner=='This is WEAVE, Version 4.4'
+@d banner=='This is WEAVE, Version 4.5'
@ The program begins with a fairly normal header, made up of pieces that
@^system dependencies@>
@@ -817,7 +818,7 @@ to be treated when \PASCAL\ code is being formatted.
@d for_like=12 {\&{for}, \&{while}, \&{with}}
@d goto_like=13 {\&{goto}, \&{packed}}
@d if_like=14 {\&{if}}
-@d in_like=15 {\&{in}}
+@d intercal_like=15 {not used}
@d nil_like=16 {\&{nil}}
@d proc_like=17 {\&{function}, \&{procedure}, \&{program}}
@d record_like=18 {\&{record}}
@@ -831,7 +832,7 @@ to be treated when \PASCAL\ code is being formatted.
@ The names of modules are stored in |byte_mem| together
with the identifier names, but a hash table is not used for them because
\.{WEAVE} needs to be able to recognize a module name when given a prefix of
-that name. A conventional binary seach tree is used to retrieve module names,
+that name. A conventional binary search tree is used to retrieve module names,
with fields called |llink| and |rlink| in place of |link| and |ilk|. The
root of this tree is |rlink[0]|.
@@ -1027,7 +1028,7 @@ 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
+ASCII codes is $c_1c_2\ldots c_n$, its hash value will be
$$(2^{n-1}c_1+2^{n-2}c_2+\cdots+c_n)\,\bmod\,|hash_size|.$$
@<Compute the hash...@>=
@@ -1458,9 +1459,7 @@ end;
@ @<Read from |web_file|...@>=
begin incr(line);
if not input_ln(web_file) then input_has_ended:=true
-else if limit=change_limit then
- if buffer[0]=change_buffer[0] then
- if change_limit>0 then check_change;
+else if change_limit>0 then check_change;
end
@ @<Read from |change_file|...@>=
@@ -1497,7 +1496,7 @@ had a line that didn't match any relevant line in |web_file|.
@<Check that all changes have been read@>=
if change_limit<>0 then {|changing| is false}
- begin for ii:=0 to change_limit do buffer[ii]:=change_buffer[ii];
+ begin for ii:=0 to change_limit-1 do buffer[ii]:=change_buffer[ii];
limit:=change_limit; changing:=true; line:=other_line; loc:=change_limit;
err_print('! Change file entry did not match');
@.Change file entry did not match@>
@@ -1951,7 +1950,8 @@ straightforward outline.
@<Phase I: Read all the user's text and store the cross references@>=
phase_one:=true; phase_three:=false;
reset_input;
-module_count:=0; skip_limbo; change_exists:=false;
+module_count:=0; changed_module[0]:=false;
+skip_limbo; change_exists:=false;
while not input_has_ended do
@<Store cross reference data for the current module@>;
changed_module[module_count]:=change_exists;
@@ -2330,11 +2330,9 @@ while buffer[loc]<>"@@" do
if loc<=limit then
begin loc:=loc+2; c:=buffer[loc-1];
if (c=" ")or(c=tab_mark)or(c="*") then return;
- if (c<>"z")and(c<>"Z") then
- begin out("@@");
- if c<>"@@" then err_print('! Double @@ required outside of sections');
+ out("@@");
+ if c<>"@@" then err_print('! Double @@ required outside of sections');
@.Double \AT! required...@>
- end;
end
@ The |copy_TeX| routine processes the \TeX\ code at the beginning of a
@@ -2453,7 +2451,7 @@ The combination rules are given as context-sensitive productions that are
applied from left to right. Suppose that we are currently working on the
sequence of scraps $s_1\,s_2\ldots s_n$. We try first to find the longest
production that applies to an initial substring $s_1\,s_2\ldots\,$; but if
-no such productions exist, we find to find the longest production
+no such productions exist, we try to find the longest production
applicable to the next substring $s_2\,s_3\ldots\,$; and if that fails, we
try to match $s_3\,s_4\ldots\,$, etc.
@@ -3244,7 +3242,7 @@ else if cat[pp+2]=semi then
else if cat[pp+2]=var_head then
begin if cat[pp+3]=intro then
begin app1(pp+1); app(math_op); app(cancel);
- app1(pp+2); app("}"); reduce(pp+1,3,math,0)(31);
+ app1(pp+2); app("}"); reduce(pp+1,3,math,0)(33);
end;
end;
end
@@ -3436,7 +3434,8 @@ function translate:text_pointer; {converts a sequence of scraps}
label done,found;
var i: 1..max_scraps; {index into |cat|}
@!j:0..max_scraps; {runs through final scraps}
-@!k:0..long_buf_size; {index into |buffer|}
+@!debug@!k:0..long_buf_size; {index into |buffer|}
+gubed
begin pp:=scrap_base; lo_ptr:=pp-1; hi_ptr:=pp;
@<If tracing, print an indication of where we are@>;
@<Reduce the scraps...@>;
diff --git a/systems/knuth/dist/web/webman.tex b/systems/knuth/dist/web/webman.tex
index 61e12a2878..e4781c1da7 100644
--- a/systems/knuth/dist/web/webman.tex
+++ b/systems/knuth/dist/web/webman.tex
@@ -622,7 +622,8 @@ 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
+nested comments. The \.{WEAVE} processor outputs `\.{@\{}'.
+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
@@ -633,6 +634,7 @@ 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.
+The \.{WEAVE} processor outputs `\.{@\}}'.
\@\& [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
@@ -812,7 +814,7 @@ 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\{|"\{"|\}}'.
+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
@@ -1196,7 +1198,7 @@ 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.
+ \pageno=200 % 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
@@ -1590,7 +1592,7 @@ 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
+changes are extensive, you might be better off finding some computer
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}