From 7428e668f046bec10d1200214789e40390fa51e7 Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Wed, 10 Feb 2021 03:01:13 +0000 Subject: CTAN sync 202102100301 --- systems/knuth/dist/errata/errata.nine | 2 +- systems/knuth/dist/errata/errata.tex | 2474 ++++++++++---------- systems/knuth/dist/errata/errata.three | 2 +- systems/knuth/dist/errata/errata.twelve | 1709 ++++++++++++++ systems/knuth/dist/errata/errorlog.tex | 25 +- systems/knuth/dist/errata/mf84.bug | 109 +- systems/knuth/dist/errata/tex82.bug | 180 +- systems/knuth/dist/etc/vftovp.web | 4 +- systems/knuth/dist/etc/vptovf.web | 8 +- systems/knuth/dist/lib/grayf.mf | 2 +- systems/knuth/dist/lib/plain.tex | 6 +- systems/knuth/dist/lib/slant.mf | 4 +- systems/knuth/dist/lib/webmac.tex | 22 +- systems/knuth/dist/mf/mf.web | 139 +- systems/knuth/dist/mf/mfbook.tex | 755 +++--- systems/knuth/dist/mf/trap.72270gf | Bin 0 -> 1028 bytes systems/knuth/dist/mf/trap.fot | 4 +- systems/knuth/dist/mf/trap.log | 90 +- systems/knuth/dist/mf/trap.pl | 0 systems/knuth/dist/mf/trap.typ | 2 +- systems/knuth/dist/mf/trapin.fot | 78 + systems/knuth/dist/mf/trapin.log | 8 +- systems/knuth/dist/mfware/gftodvi.web | 4 +- systems/knuth/dist/mfware/gftopk.web | 18 +- systems/knuth/dist/mfware/gftype.web | 4 +- systems/knuth/dist/mfware/mft.web | 22 +- systems/knuth/dist/tex/glue.web | 2 +- systems/knuth/dist/tex/tex.web | 213 +- systems/knuth/dist/tex/texbook.tex | 393 ++-- systems/knuth/dist/tex/trip.dvi | Bin 0 -> 2920 bytes systems/knuth/dist/tex/trip.fot | 2 +- systems/knuth/dist/tex/trip.log | 16 +- systems/knuth/dist/tex/trip.tex | 2 +- systems/knuth/dist/tex/trip.typ | 2 +- systems/knuth/dist/tex/tripin.fot | 89 + systems/knuth/dist/tex/tripin.log | 6 +- systems/knuth/dist/texware/dvitype.web | 6 +- systems/knuth/dist/texware/pltotf.web | 10 +- systems/knuth/dist/texware/pooltype.web | 8 +- systems/knuth/dist/texware/tftopl.web | 4 +- systems/knuth/dist/web/tangle.web | 35 +- systems/knuth/dist/web/weave.web | 33 +- systems/knuth/dist/web/webman.tex | 10 +- systems/texlive/tlnet/tlpkg/texlive.tlpdb | 87 +- systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 | 2 +- systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 | 2 +- .../texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc | 14 +- systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz | Bin 2278700 -> 2277040 bytes systems/win32/miktex/tm/packages/next/pr.ini | 8 +- systems/win32/miktex/tm/packages/pr.ini | 8 +- systems/win32/w32tex/ChangeLog | 33 + 51 files changed, 4553 insertions(+), 2103 deletions(-) create mode 100644 systems/knuth/dist/errata/errata.twelve create mode 100644 systems/knuth/dist/mf/trap.72270gf mode change 100644 => 100755 systems/knuth/dist/mf/trap.pl create mode 100644 systems/knuth/dist/mf/trapin.fot create mode 100644 systems/knuth/dist/tex/trip.dvi create mode 100644 systems/knuth/dist/tex/tripin.fot (limited to 'systems') 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|\|=|\ - -\bugonpage A290, lines 25--26 (02/24/08) - -\ninepoint\textindent{$\bull$} -\\\.\enskip -Here \ refers to one of the first five glue-appending -commands just mentioned; the formal syntax for \\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 \, 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 \ +commands other than \.{\char`\\setbox}, possibly with \. +If the assignments are not followed by a \, where +\ 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}% + \\\.\enskip +A \ has the form +`\\.{\char`\{}\\.{\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 +\ 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}% + \\\.\enskip +This command has the same effect as in horizontal mode (see Chapter~25), but the +third \ 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 +`\.{}', 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 \. +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 +\ 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`\{}\\.{\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 +\, $\underline{287}$, 292.\par +\, $\underline{276}$, 279, 280.\par +\, 278, 285, 287.\par +integral signs, {\sl see\/} |\int|, |\oint|, |\smallint|.\par +\, 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 +\, 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 \ -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 -\is\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 -\\is\|:|\ {\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 -\is\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|\' in a \. +\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 \.) + % 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 +\is + \alt + \alt[(][)] + \alt[normaldeviate] + \alt[length] + \alt[length] + \alt[length] + \alt[angle] + \alt[xpart] + \alt[ypart] + \alt +\is[/] + \alt +\is[,]}> + \alt[\char'133]% + [,][\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}\(\,\thinspace\). -\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 +\\is\\\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 +\, via \. +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\\thinspace|of|\thinspace + \ -\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 +\is\alt + \alt + \alt + \alt[normaldeviate] + \alt[(][)] + \alt[begingroup][endgroup] + \alt[length]\alt[length] + \alt[length]\alt[length] + \alt[ASCII]\alt[oct]\alt[hex] + \alt\alt + \alt[angle] + \alt[turningnumber]\alt[totalweight] + \alt + \alt[directiontime][of] +\is[/] + \alt +\is[,]}> + \alt[\char'133]% + [,][\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 +\is + \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][of] +\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 +\is[end] + \alt[dump] +\is\alt[;] +\is\alt + \alt\alt\alt + \alt\alt\alt +\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}\\ee +\; \ +\bb|ligtable|\\cr|charlist|\\cr|extensible|\\cr + |fontdimen|\\cr|headerbyte|\\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|(|\|,|\|)|; \ +|makegrid(|\|)(|\|)|;\smallskip\noindent +|proofrulethickness| \; \ |proofoffset| \. -\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=|\|; input |\ -\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 +\alt[::]\alt[\\\\:] +\is\[:] +\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 +\is[extensible] +\is[,][,][,] +\endsyntax +Notice that a \ 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 +\, 118, $\underline{220}$.\par +bell-shaped distribution, $\underline{183}$, 251.\par +|black|, 270, 332--333.\par +\ and \, $\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 +\, $\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 +\, 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 +\, $\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 +\, 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\]\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|\|=|\ + +\bugonpage A290, lines 25--26 (02/24/08) + +\ninepoint\textindent{$\bull$} +\\\.\enskip +Here \ refers to one of the first five glue-appending +commands just mentioned; the formal syntax for \\cutpar + +\bugonpage A292, line 15 (12/02/02) + +\ninepoint\noindent +are defined as in the +second alternative of a \, 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 \ +should actually be replaced by a slightly more complicated pair of rules: + + +\bugonpage C129, line 16 (02/21/08) + +\ninepoint\beginsyntax +\is\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 +\\is\|:|\ {\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 +\is\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|\' in a \. + +\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 \.) + +\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 +@ @= +loop@+begin continue: clear_for_error_prompt; prompt_input("? "); +@y +@ @= +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. + +@= +@!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. + +@= +@!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] -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 +@ @= +loop@+begin continue: clear_for_error_prompt; prompt_input("? "); +@y +@ @= +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. + +@= +@!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. + +@= +@!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; +@y +begin @; 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@> @= wterm(banner); @@ -1538,7 +1540,7 @@ by all \PASCAL\ compilers. @= 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; @ @= -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 @; @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 to proceed, S to scroll future error messages,");@/ @.Type 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 @= @@ -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. @= @!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 `\.{[]}'. @= @@ -5584,7 +5594,7 @@ The global variable |save_ptr| points to the top item on the save stack. @ @=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=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. @= -@{@!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 ' I expect to see a semicolon.")@/ + help2("After `exitif ' 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@>@@; @t\4@>@@; 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 @ @= 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; @; @@ -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+remaindercolon 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 @ @@ -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. @= procedure close_files_and_terminate; @@ -23038,7 +23052,7 @@ if (base_ident=0)or(buffer[loc]="&") then while (loc; if 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 \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$', ^^|<| ^^|>| +\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))(1\mathbin{\rm or}a))a$' is indeterminate because $a$~is unknown; \MF\ treats this as -false. Finally `${\rm false}\is - \alt[\char'133]% - [,][\char'135] +\is + \alt + \alt[(][)] + \alt[normaldeviate] \alt[length] \alt[length] \alt[length] @@ -4135,13 +4157,12 @@ cases here, in order to have a foretaste of the complete menu: \alt[xpart] \alt[ypart] \alt -\is - \alt - \alt[(][)] - \alt[normaldeviate] \is[/] \alt +\is[,]}> + \alt[\char'133]% + [,][\char'135] \is[sqrt]\alt[sind]\alt[cosd]\alt[mlog]\alt[mexp] \alt[floor]\alt[uniformdeviate]\alt \is @@ -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\, ^"bot"\thinspace\, ^"lft"\thinspace\, ^"rt"\thinspace\, and even \begindisplay -@penpos@\(\,\thinspace\). +"penpos"\(\,\thinspace\). \enddisplay \danger A \MF\ program can say `\$[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:}\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 -\is[end] +\is[end] \is\alt[;] \endsyntax define a \ in terms of a \. @@ -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\\thinspace\ +{\tt begingroup}\thinspace\\thinspace\% \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 ^\ and ^\ 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 ^\, ^\, ^\, or ^\ that immediately follows the delimited arguments. An undelimited `@expr@~$x$~^{of}~$y$' specifies two arguments, found -by taking the longest syntactically correct \~of~\. +by taking the longest syntactically correct `\~of~\'. In each of these cases, the expression might also be preceded by an optional `^{=}' or~`^{:=}'. An undelimited @suffix@ is the longest \ 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 \, 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 \. 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 \. \ (Cf.\ Chapter~14.) \ddanger The boolean expression `^@path@ $((0,0))$' is false, even though `$((0,0))$' meets Chapter~14's syntax rules for -\, via (\) and -(\) and -(\). A ^{pair expression} is not considered to be -of type @path@ unless the path interpretation is mandatory. +\, via \. +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@ \;' will exit the current loop +`@exitunless@ \;'\ 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] \alt[char] \alt[decimal] - \alt[substring][of] + \alt[substring][of] \is \is \is @@ -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[(][)] \alt[begingroup][endgroup] -\is[/] - \alt -\is - \alt[\char'133]% - [,][\char'135] \alt[length]\alt[length] \alt[length]\alt[length] \alt[ASCII]\alt[oct]\alt[hex] @@ -12623,6 +12643,12 @@ nucleus of the entire \MF\ language: \alt[turningnumber]\alt[totalweight] \alt \alt[directiontime][of] +\is[/] + \alt +\is[,]}> + \alt[\char'133]% + [,][\char'135] \is[xpart]\alt[ypart] \is\alt[xxpart]\alt[xypart]\alt[yxpart]\alt[yypart] \is[sqrt]\alt[sind]\alt[cosd]\alt[mlog]\alt[mexp] @@ -12777,7 +12803,8 @@ Pens and future pens coexist as follows: \alt[nullpen] \alt[(][)] \alt[begingroup][endgroup] -\is[pencircle] +\is + \alt[pencircle] \alt[makepen] \is \is @@ -12820,7 +12847,7 @@ repeat the syntax again for completeness here. \alt[str] \alt[char] \alt[decimal] - \alt[substring][of] + \alt[substring][of] \is \is \is @@ -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 \ and for \: \beginsyntax -\is[end]\alt[dump] +\is[end] + \alt[dump] \is\alt[;] \is\alt - \alt\alt - \alt\alt - \alt\alt + \alt\alt\alt + \alt\alt\alt \is \is[begingroup][endgroup] \is @@ -12976,7 +13004,7 @@ We shall concentrate in this chapter on the various types of {\sl \is \alt[,] \is\kern-1.5pt[interim]% - [:=]\kern-1pt + [:=]\kern1pt\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 -\is[randomseed][:=] +\is[randomseed][:=]\kern1pt \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... - mode_setup + mode_setup |quad ; @@ -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, ; ...]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}\\ee\; \ \\bb|+|\cr|-|\ee\; \ \|[|\|,|\|]|;\\ -\|*|\; \ +\\thinspace|*|\thinspace\; \ \\bb|*|\cr|/|\ee\; \ \\;\\ \\bb|intersectionpoint|\cr|intersectiontimes|\ee\; \ @@ -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=|\; \ |mag=|\bb\\cr|magstep|\\ee;\\ +|\mode=|\; \ |mag=|\bb\\cr|magstep|\\ee;\\ |screenchars|; \ |screenstrokes|; \ |imagerules|; \ |gfcorners|; \ |nodisplays|;\\ |notransforms|; \ |input| \. @@ -13979,7 +14008,7 @@ with an informal ^{inventory} of all the features that are available. \bb|=|\cr\noalign{\kern-2pt}|:=|\cr\noalign{\kern-2pt}\\ee \; \ \bb|ligtable|\\cr|charlist|\\cr|extensible|\\cr - |fontdimen|\\cr|headerbytes|\\ee;\\ + |fontdimen|\\cr|headerbyte|\\ee;\\ \bb|font_identifier|\cr|font_coding_scheme|\ee \smash{\bb\tt=\cr\noalign{\kern-2pt}\tt:=\cr\noalign{\kern-2pt}\\ee}% \. @@ -14050,8 +14079,8 @@ $\hbox{\bb\bb|=|\cr|:=|\ee |(|\|,|\|)|; \ \bb|titlefont|\cr|labelfont|\cr|grayfont|\cr|slantfont|\ee \;\\ \bb|proofrule|\cr|screenrule|\ee|(|\|,|\|)|; \ -|makegrid(|\|)(|\|)|;\\ -|proofrulethickness| \; \ |proofoffset| \. +|makegrid(|\|)(|\|)|;\\ +|proofrulethickness| \; \ |proofoffset| \. \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=|\|; input |% + \ \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_ u0$ 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 ^\ 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\\=`\| \is[ligtable] \is\alt[,] -\is[,] [skipto]\alt +\is[,][skipto]\alt \is \alt[kern] \alt