This page lists bugs in the original (Knuthian) TeX distribution which have been received since the last tune-up (2021). They have been accepted by Knuth's vetters, but are not expected to be seen by Knuth until the next tune-up. If and when he does see them, there is no guarantee that he will consider them to be bugs, or take any particular action.
The original reports and answers have been edited or paraphrased for presentation here.
The page and section numbers are just an initial hint about a relevant location; often more than one place in the code is involved. The initial letter (A, B, …) refers to the corresponding Computers & Typesetting volume.
A list of non-bugs is also available. These (plausible) reports have already been deemed not a bug by Knuth or his vetters.
For any discussion about these issues, or further reports, please use the contact information on the main TeX bugs page here.
Contents: A: The TeXbook - B: TeX: The Program - C: The Metafontbook - D: Metafont: The Program - E: Computer Modern Typefaces - Errata in the errata - Other WEB programs and sources
Avii, line -6 (#Aviitis) 2021-08-28, Martin Budaj: A left-quote is used instead of an apostrophe in the beginning of the quotation (`Tis instead of 'Tis). Contractions should be marked by an apostrophe (see e.g. The Chicago Manual of Style, 17th ed., section 7.30 which explicitly states that 'tis should be used, not `tis). Most importantly, the apostrophe was used in the quoted 1809 printing.
The original 1809 text also has a slightly different spelling at the end: “altho' there's nothing in't”.
A041, line -2 (#A041tis) 2021-08-28, Martin Budaj: Left-quote is again used instead of apostrophe (`Tis instead of 'Tis). The original has an apostrophe.
A044, line 11 (#A044percent) 2021-07-26, Hu Yajie: The temporary definition “\def\%{\char`\%}” lacks a space at the end, so the input “50\% of” (with this definition) will not have a space in the output: “50%of”. The idea of an optional space after a constant being ignored was introduced on the previous page.
A123, line -1 (#A123amount) 2021-03-13, Wolfgang Helbig: The last line reads “First compute the largest amount $v$ such that a height plus depth of $v$”, but an amount does not have a height or depth, not being a box.
A143,A152 (#A143above) 2021-01-20, Barbara Beeton: The descriptions of \above and \abovewithdelims don't mention that the given <dimen> affects the spacing above and below the fraction rule, as well as specifying the height of the rule. Appendix G rule 15d gives the computation, but the visual effect is hard to infer. Indeed, the typeset results are undesirable for any <dimen> larger than 1pt or so; the fraction appears too spacey (but of course the behavior cannot be changed at this late date).
A158, line -12 (#A158rparen) 2021-03-20, Hu Yajie: The math symbol ) is said to be character "28 of family 0, but plain.tex (line 90) assigns \mathcode`\)="5029, so "28 should be "29.
A209, \if (#A209cscatcode) 2021-03-01, Hu Yajie: It's not correct that “TeX considers [control sequences] to have category code 16”. The implementation extends category codes to command codes and considers control sequences to have command code 0 (\relax), as explained in the pTeX manual.
A209, \if and \ifcat (#A209active) 2021-03-01, Hu Yajie: an active character that has been \let to something unexpandable, like a or \par, doesn't require \noexpand, and doesn't have category 13 in \if and \ifcat comparisons.
Response: the examples in the original message are well-taken. Fixing \noexpand not always being required seems fairly simple: The TeXbook's “you have to say” could be “you should say”. The other problem, when active characters are not expandable, does not seem to have any existing detailed discussion, unfortunately.
A210, exercise 20.13 (#A210period) 2021-05-25, Hu Yajie: The second-to-last-item, \ifx\ifx\ifx, should presumably be followed by a semicolon, not a period.
A214, line 27 (#A214tenrmquad) 2024-11-01, Ruixi Zhang: \the\fontdimen6\tenrm expands to 10.00002pt (ten tokens), not the stated six tokens (10.0pt).
A219, line -9 (#A219expands) 2021-03-02, Hu Yajie: The \length macro does not “expand” to 8, since assignments are involved. Similarly on A218, line 21, “expanding the \primes macro” is technically incorrect, though perhaps there the informality is acceptable.
A249, line 5 (#A249crcr) 2023-04-26, Udo Wermuth: The text states: “\crcr … acts exactly like \cr except that it does nothing when it immediately follows a \cr or a \noalign{...}”. \crcr also does nothing when following \crcr.
A254, line 11 (#A254tracingoutput) 2021-05-28, Udo Wermuth: “\tracingoutput is nonzero” should be “\tracingoutput is positive” (as on page 273). If \tracingoutput is less than zero, TeX doesn't write this tracing data.
A267, line -16 (#A267eyes) 2021-04-13, Hu Yajie: Use “eyes and mouth” rather than just “mouth”, since this is about reading from input files. Also on C217, line 10.
A272, line -1 (#A272floatingpenalty) 2023-08-19, Udo Wermuth: \floatingpenalty is described as “(penalty for insertions that are split)”, but that is not correct. Insertions that are split don't receive \floatingpenalty. The insertions that follow a split insertion get this value. See page 123, Step 2. Step 4, the step that describes the split, doesn't mention \floatingpenalty. (Perhaps something like: “(penalty for insertions following a split insertion)”, as the description has to fit on one line.)
A274, line 4 (#A274hboxes) 2021-04-05, Hu Yajie: in the description of \overfullrule, “width of rules appended to overfull boxes”, change “boxes” to “hboxes”.
A280, second and fourth bullets (#A280closeout) 2021-05-27, Udo Wermuth: \closeout is specified to take a <4-bit number>, but in fact it takes a general <number>. A \closeout<number> argument outside the 4-bit range 0–15 still produces a whatsit item (but, as described in The TeXbook, has no other effect; for example, \closeout-1 does not close the log file). Aside: In the long past, David Fuchs suggested changing the \closeout implementation to syntactically recognize only a <4-bit number>, as with \openout, \openin, and \closein, but Knuth decided not to do this.
A297, line -10 (#A297nextpara) 2021-07-11, Wolfgang Helbig: TeX will usually notice a missing “}” at the end of the current paragraph, not “the end of the next paragraph”. Perhaps “the next end of paragraph”.
A312, answer to exercise 12.10 (#A312nolineskip) 2021-12-16, Donald Arseneau: mention that \offinterlineskip still allows page breaks between the boxes. And/or, on A331, answer to exercise 21.1: mention that \nointerlineskip prevents a page break, as the interline glue is suppressed.
A315, line 10, answer to exercise 14.16 (#A315glueparse) 2021-04-07, Ruixi Zhang: There should be a \relax between “\rightskip=1pt” and “<text>” to avoid misparsing of following text starting with plus or minus. \relax is similarly needed in other places:
Two other cases where \relax following a glue assignment might be desirable for clarity and consistency, but since these assignments are followed by tokens that stop parsing of a glue specification, the \relax is not technically needed:
\input manmac \begintt minuscule \endtt\end
The control space before minuscule terminates the assignment, but this seems an obscure interaction of catcodes on which to rely. It would also fail if a control space is not present, for instance:
\def\@{...do something after begintt, e.g., set up \special's...} % so this succeeds: \begintt|@minuscule \endtt ... % but later in the document nullify the special setup, \def\@{} % causing failure: \begintt|@minuscule \endtt
A315, line -3, answer to exercise 14.23 (#A315par) 2022-05-08, Ruixi Zhang:
1.The \vskip\parskip […] accommodates a document-wide nonzero \parskip setting from the user. If so, then for the sake of consistency, \hfil would be [better written as] \hskip\parfillskip […]
2. […] A regular \par would perform \unskip, followed by \nobreak\hskip\parfillskip (and finally a \break). This code lacks the “\unskip\nobreak” part. In certain cases, this leads to extra empty lines, which are surely undesired. […]
A316, lines 5 and 7, answer to exercise 14.24 (#A316parse) 2024-11-20, Ruixi Zhang: line 5 should be \hangindent=\the\hangindent}% with the final % [to avoid a spurious space in the macro definition]. Also, line 7 should be \edef\next{\prevgraf=\the\prevgraf\relax} to avoid following numerals being swallowed.
A332, line 14 (#A332exercuted) 2021-02-26, Wolfgang Helbig: Replace “exercuted” by “executed”. [Typo made in 2021, handling a report from 2017. Fixed in the 24th (July 2021) printing of The TeXbook, although the online texbook.tex file has not been updated.]
A333, A363 (#A333m@cro) 2023-09-19, Igor Liferenko: In texbook.tex, code on page 333 uses 0\p@, and on page 363, \dp\z@ and 12\p@. These should be 0pt, \dp0, and 12pt, respectively, per page 348: “we shall stick to the unabbreviated forms below, so that the macros are more readable.”
A339 (#A339arbitrary) 2024-09-17, Karl Berry: On page A339, in the “Breakable horizontal spaces” list, \hskip takes \<arbitrary glue>, not a dimen. The line in texbook.tex is:
\+\strut|\hskip| \<arbitrary dimen>& |\kern| \<arbitrary dimen>\cr
Also, “<arbitrary dimen>” is not used anywhere in The TeXbook except this one line. So for consistency, maybe switch to “<glue>” and “<dimen>”? For instance, on page A285, \hskip is defined to have a <glue> argument.
A343, line 15 (#A343plainmodify) 2024-11-05, Karl Berry: This line in The TeXbook:
% And don't modify the file under any circumstances.
has been changed in the plain.tex file to:
% And don't modify the file unless you change its name: % Everybody's "plain.tex" file should be the same, worldwide. % Unlimited copying and redistribution of this file are permitted as % as this file is not modified. Modifications are permitted, but only % the resulting file is not named plain.tex.iflong
Same goes for line C262 in The Metafontbook and plain.mf.
A354, \s@tcols definition has spurious space (#A354settabsspace) 2023-02-18, Udo Wermuth: the typeset description of \settabs contains the line:
\def\s@tcols#1\columns{\count@=#1 \dimen@=\hsize
That space between #1 and \dimen will be typeset in horizontal modes. The actual definition in plain.tex does not have this space.
A370, line -10 (#A370pattern) 2023-02-07, Ulrich Diez: “\pattern” should be “\patterns”.
A373, line -2 (#A373space) 2021-06-29, Igor Liferenko: In texbook.tex, page 373 has \t* (no space), while page 374 (line -7) has \t *. They are consistent (both have spaces) in the 34th printing; the discrepancy was created at the 2014 tuneup.
A377, line 6 (#A377funnyif) 2023-10-25, Igor Liferenko: In texbook.tex, page 377 says the test \if\fspace* is false. But in this case * is ignored during tokenization. It can be confirmed by adding another \fspace after *:
\if\fspace*\fspace\message{TRUE}\else\message{FALSE}\fiWe get TRUE. If * were not ignored, we would get FALSE.
Response: agreed; the \if is neither true nor false, but incomplete. It would work if, say, \0 were used for the name instead of \fspace. A complete runnable file extracted from The TeXbook:
\uccode` =`* \uppercase{\uppercase{\def\fspace{ }\let\ftoken= } } \catcode`*=10 \loggingall \if\fspace*\fspace\message{true}\else\message{false}\fi \end
A400, line 9(#A400topmark) 2024-05-03, Max Chernoff: page A400 says
Underfull and overfull boxes are not reported when \box255 is packaged for use by the output routine, so there's no harm in ejecting a page prematurely if you want to pass a signal.
But the \topmark value is lost with such silent output routines, so add something like: “, provided you don't use ^|\topmark|.” to the end of the sentence.
Pages A125 and A254 imply that \outputpenalty is the only thing to worry about with silent output routines.
Response: as part of the discussion around this, Udo Wermuth wrote an article for TUGboat about silent output routines and how to handle \topmark: \topmark in output routines without \shipout.
A455, line -8 (not counting the quotations) (#A455whatsitnode) 2024-08-20, Karl Berry: page A455 says “a whatsit node specifying …”. It's not surprising, since it's consistently called a “whatsit node” in tex.web. But it seems to be an inconsistency in The TeXbook, where everywhere else it's called a “whatsit item”, or just a “whatsit”, as far as my searching could discern.
A463, binary operator in index (#A463binaryoperator) 2023-02-18, Udo Wermuth: searching for “binary operator” returns two hits, both in the index: one in the entry for \dagger, the other for \ddagger. These two places are the only occurrences of “binary operator”; everywhere else Knuth writes “binary operation”. (Aside: in The METAFONTbook only “binary operator” is used.)
A467ff., \halign, \ialign, \ooalign index entries (#A467halign) 2022-10-08, Udo Wermuth: page 361 listed in the index entry for \halign does not mention it, and several useful entries could be added; there are also useful additions for \ialign and \ooalign. Specifically:
A480, line -5 (#A480varsigma) 2021-08-28, Martin Budaj: entry for \varsigma: The reference to page 483 should be deleted (see next).
A483, line -5 (#A483varsigma) 2021-08-28, Martin Budaj: The correct title is “Ὀρθοτυπογραφία” without the final sigma. Although the final α has a long tail in the original printing, it surely is neither ς nor the ας ligature. The facsimile edition on archive.org does not always show the title page in the free preview, so here are some other title page images: image 1, image 2, image 3.
Bvi, The TeXbook entry (#BviCT;) Dvi, The Metafontbook entry; E020, line 4 2021-06-05, Hu Yajie: Change “Computers and Typesetting” to “Computers \& Typesetting”. The series seems to be otherwise referred to consistently with the ampersand.
B030, section 173 (#B030limit) 2021-07-18, Hironori Kitagawa: Garbage can be printed after a fatal error.
$ cat v.tex \def\testB#1{\read-1to\temp\testB\relax\relax} \testB\relax\relax $ (for i in `seq 1 40`; do echo c;done)| tex v This is TeX, Version 3.141592653 (TeX Live 2021) (preloaded format=tex))) (./v.tex! Emergency stop.)c^^Mo\temp\testB\rela
Proposed patch is to initialize limit to zero in two modules.
@x [5.71] l.1713 - term_input: set limit when fatal_error if not input_ln(term_in,true) then fatal_error("End of file on the terminal!"); @y if not input_ln(term_in,true) then begin limit:=0; fatal_error("End of file on the terminal!"); end; @z @x [27.484] l.9495 - set limit when fatal_error else fatal_error("*** (cannot \read from terminal in nonstop modes)") @y else begin limit:=0; fatal_error("*** (cannot \read from terminal in nonstop modes)"); end @z
Response: Agreed; committed to TeX Live, with the analogous fix to LuaTeX. See also #B140bufferzero.
B071, section 173 (#B071twolevels) 2023-09-28, Tyge Tiessen: [The description here] states that the recursion of short_display is “never more than one level deep”. It should probably read “more than two levels deep” since calling it on an hlist containing a discretionary node containing a ligature will cause two recursive calls to short_display.
B076, section 185 (code)
(#B076columns) 2023-02-18, Udo Wermuth: The string (word)
"columns" is always used although in a \valign rows
are spanned. This is done without a hint in the text (or in a comment)
that the word “columns” is a simplification, as in
§159.
A possible implementation of a fix: To output "columns" or
"rows" in the code one could split the field glue_sign
in an unset_node that is abused in alignments to store the
two-bit information glue_order if glue has to shrink. If this
field is split into two parts there is enough space for an indicator if
the alignment is horizontal or vertical. For example, add 16 to the
field in §796 if the alignment is vertical so that the
glue_order is extracted in §185, §807, §810, and
§811 by a mod 16. In §185 the test
glue_sign(p)>15 can be used to decide if "columns" or
"rows" should be output.
(Test file,
sample implementation.)
B085, section 208 (#B085lastitem) 2024-03-07, Udo Wermuth: The entry for last_item:
@d last_item=70 {most recent item ( \.{\\lastpenalty}, \.{\\lastkern}, \.{\\lastskip} )}should be extended to:
@d last_item=70 {most recent item ( \.{\\lastpenalty}, \.{\\lastkern}, \.{\\lastskip}, etc.~)}
In section 208 all primitives to a command code are listed or an “etc.” is appended to the list if there are too many. Here this “etc.” is missing.
[Since TeX 3.0, last_item has two more modifiers, input_line_no_code and badness_code, to implement \inputlineno and \badness, per section 416. But explicitly listing these two probably makes the page too long.]
B130, section 305 (#B130skipping) 2022-06-12, Tyge Tiessen: in the description of skipping, “a subfile can safely end here” is incorrect, as TeX complains about \outer control sequences in skipped conditional text.
B134, section 313
(#B134insertspace)
2024-02-10, Tyge Tiessen:
When TeX prints the context after an error message there is a
superfluous space after “<insert>” as
compared to other input stack types such as “<*>”.
This extra space is produced in section 313 by the code:
else print_nl("<insert> ").
Response: Accepted and will report, especially since since Metafont (mf.web line 13511) does not produce this space.
B139, section 324 (code) (#B139endwrite) 2022-06-27, user202729: The \endwrite token can be accessed, causing mem[0] to be dereferenced, causing a segmentation fault in web2c tex, or an out-of-bounds in original TeX if mem_min != 0. Fixed in web2c tex.ch. (Test file.)
Subsequently, Tyge Tiessen discovered that the original fix was insufficient. And earlier, Bruno Le Floch discovered a way to crash pdfTeX (but not original TeX).
Fix from DRF: unbalanced-braces.ch change file, unbalanced-braces.test input texts and references. This fix has been applied in TeX Live to pdfTeX, XeTeX, e-uptex, and siblings; but not to LuaTeX (apparently it would cause other problems that are worse than the original) or original TeX.
B140, section 331 (code)
(#B140bufferzero)
2024-05-26, David Fuchs: In virtex,
This change was committed on 2024-11-24 to tex.ch (r72951), so for all engines
except LuaTeX and Aleph.
B142, section 336 (#B142outer)
2024-03-04, Tyge Tiessen: Deleting an \outer token interactively
leads to an error, as explained in the report.
Fix from DRF: We can take advantage of the fact that
OK_to_interrupt has been set to false during the critical moment
and omit the \outer check (this is in the
check_outer_validity procedure):
This change was committed on 2024-06-03 to tex.ch, so for all engines
except LuaTeX and Aleph.
B184, section 456; B185, section 459
(#B184units)
2024-04-14, Udo Wermuth: both help texts in these sections end with:
In each second last line the word “units” should
be “unit”. Also, the word
“letters” in the last line should probably be
“characters” as the input might be, for example
“\dimen0=1@t”, but this seems less important to me.
B258, section 697 (#B258indent)
2023-09-27, Tyge Tiessen: line 13736, if
(small_fam(left_delimiter(p))<>0)or@+, should end with @|
rather than @+, for consistent indentation with the
right_delimiter case directly following.
B297, section 717 (#B297remainder)
2022-08-23, Eran Yarkon: mini-index entry for remainder
should link to section 104 (“remainder, scaled”) instead of
543 (different remainder, from font metric file).
B326, section 777
(#B326modnameformat) 2022-06-14, Udo Wermuth: in the
section name, “|preamble| list” is inconsistent
with other uses of “preamble list”, which don't have the
code formatting.
B344, section 817
(#B344explicitkern) 2024-01-26, David Fuchs: the position
of the break can also be an explicit kern_node. Similarly, in
section 879, the first sentence should say “explicit kern”,
since non-explicit kern_nodes are not deleted.
B409, section 972
(#B409modnameformat)
2022-06-14, Udo Wermuth: in the section name, “is
null” is inconsistent with other uses of
“|null|” in the section name (e.g., section 979,
“link to |null|”), which do have the code
formatting.
B470, section 1128
(#B470consternation)
2023-11-02, Doug McKenna: [regarding the section title] If the error
message is issued while an alignment is in progress, then it's not a
“fact” that “no alignment is in progress”. A
better title would be: @<Express consternation over the
possibility that no alignment is in progress@>.
B524, section 1312; D510, section 1195 (code)
(#B524undump) 2023-09-14, Gregory James Duck: corrupt
fmt/base files can cause a crash, since the result of the addition
q+node_size(q) is not checked.
Response and fix from DRF:
Given that in some environments the overflow from the
addition would be caught in hardware first, and even failing that, we
want to catch cases where node_size was, say, bogusly the
equivalent of -1 and thus q+node_size would still look valid, a
fix would be:
I also added another term to catch a bad rlink(q) field.
There are all sorts of other fields that aren't checked,
since it would be a hassle (such as all the |pointer| fields in
all node types that have them). Still, it feels right to do this check,
since a mess-up in the basic memory-allocation scheme can lead to
mysterious, hard-to-find memory-corruption bugs, while other bad values
in some node field will generally lead to a clear, relatively
easy-to-find failure.
B548, section 1375 (code)
(#B548tracingimmediate)
2021-12-17, Udo Wermuth: The one-line input file
“\tracingcommands=1 \immediate\openout1=tempfile
\end” writes “{vertical mode:
\immediate}” in the log; no mention is made of the
\openout. Same for the other commands to which
\immediate applies: \write and \closeout.
However, The TeXbook pages 212 and 273 indicate that
\tracingcommands traces every command (emphasis added).
Thus \openout, etc., should presumably be included in the trace
output. A possible fix: add “if tracing_commands>0 then
show_cur_cmd_chr;” after the begin of the
if.
B558, index (#B558extra)
2021-06-22, Hu Yajie: in entry Extra \right., delete the
period for consistency.
C051, line -3 (#C051britannia) 2021-08-28, Martin Budaj:
Brittania should be spelled either Britannia or Britain. The original work was published by William Camden in Latin, titled
“Britannia”. In
1610, Philémon Holland published an English translation titled “Britain”. The spelling
“Brittania” is used neither in the Latin original nor the
English translation.
Regarding the attribution of the quotation, Camden as an author should
perhaps get more credit.
Regarding the comment on line 3121 in mfbook.tex, the correct
page number of this quotation in the 1610 edition is 506 (the next page
is numbered 519 by mistake, which explains 518 in OED).
C119, line 22 (#C119octants)
2023-06-07, Mike
Spivey: the octant code ENE should be glossed as East-Northeast.
Similarly in other cases: page 206, line -3: South-Southeast,
East-Southeast; page 228, line -2: South-Southwest, West-Southwest; page
234, line 6, answer 3.1: south-southwesterly. Wikipedia listing.
C077, line -8 (exercise 9.1) (#C077lft)
2021-07-02, Igor
Liferenko: part (c) asks about “lft z21 = rt z20 +
1” but this gives the error “Not implemented:
(pair)+(known numeric)”. Presumably “lft z21 = rt
z20 + (1,0)” is intended.
C250, line 1 (#C250hide)
2021-03-01, Hu
Yajie: “hide(<statement list>)” does not allow for
omitting the final semicolon in the argument to hide, since
<statement list> (per C217) requires a semicolon. The semicolon to
hide is optional because the replacement text (as given)
provides it. The informal <statements> would apparently work,
since it's used in the definition of hide on C259. (By the way,
other bugs in the statement-related syntax rules were fixed in the 2020
tune-up.)
C277, line 17 (openit) (#C277origen)
2024-06-02, Igor
Liferenko: “origen” should be “origin” in
the definition of openit.
C299, line -3 (#C299beggars) 2021-08-28, Martin Budaj:
The correct title is “The Jolly Beggars” (see
archive.org item).
D018, section 37 (#D018siso)
2021-06-02,
Hu Yajie: module 37 says that “we access the string pool only
via” si and so, which convert between ASCII characters (0..255)
and their internal representations in the string pool (either 0..255 or
-128..127). However, the function str_vs_str of module 46 fails to do so
and fetches characters from the string pool directly.
D040, section 101, @d quarter_unit
(#D040zero)
2021-04-10, Hu Yajie: “represents 0.250000”
should perhaps be “represents 0.25000”, since
all the other items in the list have five decimal places.
D042, section 107 (#D042lparen)
2021-06-25, Igor
Liferenko: In |@t$(2^{29}$@>*p+q), the left paren should be
before the @t, to match the q). [Typo made in the 2021
tune-up.]
D094, section 214 (#D094hashcode)
2024-02-06, Patrick
Varilly: in the text “A symbolic token whose hash code is
p…”, “hash code” should be “hash
address”.
D131, section 289, line 2 (#D131comma)
2021-04-03, Hu Yajie:
The comma at the end of the displayed fraction should not be in the
denominator. That is, the whole display should be in braces except for
the comma: “{...\over...},”.
D425, section 968 (#D425another)
2024-09-23, Hu Yajie:
mf.web, line 18996, typo: “a another”.
D538, index (#D538indexhash)
2021-06-22, Hu Yajie: in entry Missing # (to
section 1113, on page 478), the # is the web macro
argument, not the character that's missing. Presumably should be merged
with the entries for Missing : and
Missing ,.
Exiii, bib entries (#Exiiimf)
2024-10-09, Hu Yajie:
The supplementary bibliography entries for “Designing new
typefaces …” and “The Euler Project …”
contain three METAFONT logos. Two of them should be slanted because they
occur in italic text.
E012, line -4 (#E01274)
(before table) 2021-05-28, Udo Wermuth: The text says “All of the
Computer Modern parameter files look like cmr10.mf, … the other
73 files …”. But there are 74 files besides cmr10; see, for
example, page 10, line 1.
E012ff., parameter values
(#E012cmparams)
2021-05-26, Hu Yajie:
E020, line 12 (#E020in)
2021-06-05, Hu Yajie:
Change the “in” in “1in#” from
roman to text italic, for consistency with other sharped units.
E046, line 17 (#E046sqrt)
2021-06-07, Hu Yajie: 36*sqrt(2) is 50.9…; the stated
approximation of 52.3 seems unusually imprecise. 52.3 is 37*sqrt(2)
computed to one decimal place, so I think Knuth intended to compute
36*sqrt(2) electronically but typed 37.
E193, line 7 (#E193ital0)
2021-06-09, Hu Yajie:
The stated “copy of the program for `0' in romand”
is not quite correct. romand.mf's 0 contains the equation
x2r=hround max(.7u,1.45u-.5curve), whereas itald.mf's
0 has x2r=hround(1.5u-.5curve).
Similarly, E543-544 state various greekl programs are
copied in tsetsl.mf, but there are differences in the source
files.
E559, cmbx8 sample (#E559embdash)
2024-05-04, David Fuchs: An em-dash is missing before “yes, it was
this”, according to the original publication.
E571ff. (index) (#E571indexhu)
2021-06-07, Hu Yajie.
E582, p.457 references (#E582idx457)
2024-10-09, Hu Yajie:
Page E582, index entries for '015 and '040, and
page E584, index entry for '015:
Change “456” to “457”, because this index is
supposed to point to programs instead of illustrations.
E584, line -1 (#E584ligs)
2021-07-12,
Hu Yajie: Change “the csc driver file” to “the csc
driver file when ligs=1”. When the font layout depends on
the ligs parameter, this has generally been indicated (cf.
E581, E582, E585), so E584 should probably do the same.
errata.tex, entry for B21
(#errataB21)
2021-06-28, Hu Yajie:
The entry for B21 in errata.tex uses a right arrow
(\to), but the source uses “..”.
errata.tex, entry for C251
(#errataC251)
2021-03-01, Hu Yajie:
The entry for C251 in errata.tex lacks a period after
22.1 following other errata entries. Thus:
“{\bf 22.1.}\enspace”.
(Aside: the output from manmac's \ansno macro has
the \enspace inside the \bf group, as in
“{\bf 22.1.\enspace}”, but errata.tex
consistently puts the \enspace outside the group. Fine.)
errata.twelve, entry for E125
(#errataE125)
2024-10-15, Hu Yajie:
The errata says that page E125, line -3 is changed to:
errata.twelve, entry for E377
(#errataE377)
2024-10-15, Hu Yajie:
The errata says that page E377, lines -3 and -4 are changed to:
dvitype.web, line 2227, section 99
(#dvitypefontoutput)
2022-01-25
and
2022-01-26,
Igor Liferenko:
When running dvitype on a file from gftodvi, the font definitions can
get mashed together, at any output level > 0. For example,
dvitype io.dvi as produced from io.mf and
gftodvi results in:
One possible fix, also supplied by Igor (and already applied in Web2C):
gftodvi.web, line 3523, section 160
(#gftodvirange)
2021-04-27, Hu Yajie:
The first Pascal comment should be |"/".."8"| rather than
|"/"..."8"|, since Pascal ranges are specified with two dots
(as in section 181).
gftopk.web, line 606, section 19
(#gftopkwidth)
2019-07-02, Richard Sandberg:
In the description of the character width w, “2^{24}”
should be “2^{20}”. [Noted by Igor Liferenko; other
instances of this were fixed in 2021 tune-up, but this one was missed.]
gftype.web, line 943, section 43
(#gftypeindexhu)
2021-06-14, Hu Yajie:
The index entry “@.This pixel's upper@>” should
be “@.This pixel's upper...@>”, since the
message is truncated, just like the index entry “@.This
pixel's lower...@>” at line 925 just above.
mfman.mf, figure 14e labels
(#mfmanfig14e)
2021-05-30, Hu Yajie:
mfman.mf, lines 1272 and 1274:
As a result, the top middle of Figure 14e has these points labeled
twice. The figure is printed on page C139; it's correct there. So the
error is only that mfman.mf hasn't been updated.
plain.mf, lines 565ff.
(#plainmfdowncase)
2024-06-02, Igor Liferenko:
Discrepancies with volume C:
Response: Agreed they are discrepancies. Whether Knuth will
choose to fix them, we'll see. DRF found several other
“PLAIN”s that should perhaps be lowercased, although there
are no printed counterparts:
plain.mft, updates (#plainmft)
2021-05-29, Hu Yajie:
plain.mft misspells plain Metafont's nodisplays as
nodisplay. It is also incomplete. In addition to the table
here, the tokens range and thru could be either in bold
or roman font, but italic seems wrong.
tangle.web, section 31, line 640
(#tangle31quote)
2021-06-01, Hu Yajie:
The first Pascal comment should be |`\..'| rather than
|'\..'|.
tftopl, section 92, unconditional stop parsing
(#tftoplstop)
2024-03-17, James Fennell: Some unusual lig/kern programs
using the unconditional stop instruction give a misleading error, or are
not recognized even when valid. (See linked message for specifics and a
proposed fix; input files are available in this zip file, since not all the urls in the
original message are still valid.)
Response: agreed, with minor caveats; see analysis by David Fuchs with an
alternate fix and additional explanations.
weave.web, section 137, long comment
overflow
(#weave137commentoverflow)
2023-07-16, Benjamin Gray: If an input line starts with %
and has no valid breakpoints, Weave's input buffer can overflow. For
example, the two line input file:
(that's 150 b's) results in various junk being included in the output
file. One possible fix, supplied by Andreas Scherer (and already applied
in Web2C):
weave.web, section 151 et al.
(#weave151squash)
2024-08-18, Andreas Scherer: resolve the asymmetry between red(uce) and
sq(uash). Change file.
weave.web, section 249, max_sorts test
(#weave249maxsorts)
2021-08-06, Andreas Scherer: line 4663 of weave.web, in
the unbucket procedure, should be changed to use =:
Because the variable declaration is sort_ptr:0..max_sorts.
weave.web formatting
(#weaveformatting)
2023-07-19, Andreas Scherer:
webmac.tex headline module number
(#webmacheadline)
2021-08-26, Wolfgang Helbig: this innocent-looking two-line web file:
when run through weave and tex, shows module number 2 instead of 1 in
the headline of the first page. Although all practical web programs end
with @* Index, in which case the bug does not manifest, it
is relevant for extremely short or example programs where a starred
index module is not desirable.
Response: Wolfgang and Andreas Scherer found this fix for
webmac.tex (not applied there; but the fix is included in
the current cwebmac.tex and pwebmac.tex):
webman.tex Appendix F (#webmanf)
2021-03-02,
Andreas Scherer: Appendix F of webman.tex has an outdated listing
for webmac.tex:
webman.tex fixes (#webmanfixes)
2024-08-27,
2023-07-19,
2021-08-08,
Andreas Scherer:
webman.tex formatting (#webmanformat)
2021-08-18, Andreas Scherer:
(See Andreas' pwebmac
package for consolidated WEB changes.)
For any discussion about these issues, or further reports to be
listed here, please use the contact information on the main TeX bugs page here.
@x [23.331] l.7095
first:=buf_size; repeat buffer[first]:=0; decr(first); until first=0;
@y
first:=buf_size; repeat buffer[first]:=0; decr(first); until first=0;
buffer[0]:=0;
@z
@x [24.336] l.7152 - allow interactive deletion of \outer token
begin if scanner_status<>normal then
@y
begin if OK_to_interrupt and(scanner_status<>normal) then
@z
("delete the erroneous units; e.g., type `2' to delete")@/
("two letters. (See Chapter 27 of The TeXbook.)");
@x
p:=q+node_size(q);
if (p>lo_mem_max)or((q>=rlink(q))and(rlink(q)<>rover)) then goto bad_fmt;
@y
if (node_size(q)>lo_mem_max-q) or (rlink(q)>lo_mem_max)
or ((q>=rlink(q))and(rlink(q)<>rover))
then goto bad_fmt;
p:=q+node_size(q);
@z
Volume C: The Metafontbook
Volume D: Metafont: The Program
Volume E: Computer Modern Typefaces
Page
Column Row
Typo Fix
12
cmr17 letter_fit
-0.1 -3.6
21
cmssqi8 notch_cut
23/26 23/36
21
cmssqi8 cap_notch_cut
23/26 23/36
21
cmssq8 notch_cut
23/26 23/36
21
cmssq8 cap_notch_cut
23/26 23/36
22
cmb10 cap_height
246 247
22
cmbxsl10 bar_height
87 85
22
cmbxsl10 tiny
8 13
23
cmfib8 cap_stem
43 34
26
cmmi8 fig_height
185.8 185.6
26
cmmi10 thin_join
7.5 7
28
cmu10 cap_height
247 246
29
cmfi10 notch_cut
2 2/36
29
cmitt10 vair_corr
1.5 0
Errata in the errata
draw z1-flourish_change{up}+(0,.15asc_height){up}
...{right}(z1+(2u,0))---z6...{down}z7; % upper bar
But the program in calu.mf, lines 85-86, as well as the latest
Volume E (ninth printing, February 2021 / electronic edition, May 2021),
does not have the “{up}” and uses
“-” in place of the second
“+”:
draw z1-flourish_change+(0,.15asc_height){up}...{right}(z1-(2u,0))
---z6...{down}z7; % upper bar
[...]
p_=z$$l{z@1-z$$l}...darkness[z@1,.5[z@2,z$$l] ]
[...]
But the program in cmbase.mf, line 11, as well as the latest
Volume E (ninth printing, February 2021 / electronic edition, May 2021),
use “:=” for the assignment to “p_”.
p_:=z$$l{z@1-z$$l}...darkness[z@1,.5[z@2,z$$l] ]
Other WEB programs and sources
Font 1: cmr8Font 2: cmtt10Font 3: grayFont 5: logo8
@x
begin define_font(first_par(k)); k:=nop;
@y
begin define_font(first_par(k));
if out_mode<>errors_only then print_ln(' ');
k:=nop;
@z
labels.top(2r,2,2l, ...
labels.bot(2r,2,2l, ...
plain.mf:% It is customary to input another file to supplement the PLAIN base.
plain.mf:% Remember that the present file PLAIN.MF should not be changed;
plain.mf:screen_cols:=500; % by reading in a separate file after PLAIN.MF
manmac.tex:\catcode`@=11 % borrow the private macros of PLAIN (with care)
webmac.tex:% standard macros for WEB listings (in addition to PLAIN.TEX)
webman.tex:% standard macros for WEB listings (in addition to PLAIN.TEX)
webman.tex:\.{PLAIN} format: You can say `\.{\{\\sc STUFF\}}' to get {\sc STUFF}
manfnt.mf:%vardef pentaper@#(expr lt,rt) = % dropped from PLAIN
waits.mf:% This file can be loaded after PLAIN.MF.
The token
should be formatted like
bye
end
rotatedabout
rotatedaround
div
mod
define_good_x_pixels
define_pixels
define_good_y_pixels
define_pixels
define_whole_vertical_blacker_pixels
define_pixels
define_horizontal_corrected_pixels
define_pixels
cutdraw, cutoff
filldraw
pensquare, penrazor, penspeck
pencircle
proofrule, makelabel, makegrid
screenrule
mode_def
mode_setup
penlabels
labels
gfcorners
screenchars
@
%\bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
@x l.2234
preceded by another backslash. In the latter case, a |"%"| is output at
the break.
@y
preceded by another backslash or a \TeX\ comment marker. In the latter case, a
|'%'| is output at the break.
@z
@x l.2248
if (d="\")and(out_buf[k-1]<>"\") then {in this case |k>1|}
@y
if (d="\")and(out_buf[k-1]<>"\")and(out_buf[k-1]<>"%") then
{in this case |k>1|}
@z
@x
begin if sort_ptr>max_sorts then overflow('sorting');
@y
begin if sort_ptr=max_sorts then overflow('sorting');
@z
Section 172.
@x l.3337
@<Change |pp| to $\max(|scrap_base|,|pp+d|)$@>;
@y
@<Change |pp| to $\max(|scrap_base|,\,|pp+d|)$@>;
@z
Section 173.
@x
@ @<Change |pp| to $\max(|scrap_base|,|pp+d|)$@>=
@y
@ @<Change |pp| to $\max(|scrap_base|,\,|pp+d|)$@>=
@z
@* Test.
@
--- texmf-dist/tex/plain/knuth-lib/webmac.tex 2021-02-26 15:56:54.461350000 -0800
+++ /tmp/webmac.tex 2024-05-22 09:51:40.797624738 -0700
@@ -168,3 +168,3 @@
\output{\ifpagesaved\normaloutput{\box\sbox}\lheader\rheader\fi
- \global\setbox\sbox=\page \global\pagesavedtrue}
+ \global\setbox\sbox=\page \global\pagesavedtrue \mark{\topmark}}
\pagesavedfalse \eject % eject the page-so-far and predecessors
< \xdef\fmtversion{\fmtversion+WEBMAC4.0} % identifies current set of macros
---
> \xdef\fmtversion{\fmtversion+WEBMAC4.2} % identifies current set of macros
[... many other changes ...]
@x l.358 Extra space in example code.
\.{which is a \\\&\{packed\}{ }\\\&\{array\}{ }\$
@y
\.{which is a \\\&\{packed\}{ }\\\&\{array\}{ }\$%
@z
@x l.607 an -> as
the \.{TANGLE} processor will treat this an equivalent to `\.{64}';
@y
the \.{TANGLE} processor will treat this as equivalent to `\.{64}';
@z
@x l.608 Single quotes around number, as everywhere else.
the constant will be formatted as ``\O{100}'' in the \TeX\ output
@y
the constant will be formatted as `\O{100}' in the \TeX\ output
@z
@x l.1050 Incorrect subscript.
ASCII codes is $c_1c_2\ldots c_m$, its hash value will be
@y
ASCII codes is $c_1c_2\ldots c_n$, its hash value will be
@z
@x l.1129
ASCII codes is $c_1c_2\ldots c_m$, its hash value will be
@y
ASCII codes is $c_1c_2\ldots c_n$, its hash value will be
@z
@x l.1139 Outdated use of \U macro.
\U section~58.\fi
@y
\U58.\fi
@z
@x l.1149
those lines. There are 1559 lines in all; the notation
@y
those lines. There are 1585 lines in all; the notation
@z
@x l.1158 Generated code has changed.
{2:}{4:}{$C-,A+,D-}{[$C+,D+]}{:4}
PROGRAM WEAVE(WEBFILE,CHANGEFILE,TEXFILE);LABEL 9999;CONST{8:}
MAXBYTES=45000;MAXNAMES=5000;MAXMODULES=2000;HASHSIZE=353;BUFSIZE=100;
@y
{2:}{4:}{$C-,A+,D-}{[$C+,D+]}
{:4}PROGRAM WEAVE(WEBFILE,CHANGEFILE,TEXFILE);LABEL 9999;
CONST{8:}MAXBYTES=45000;MAXNAMES=5000;MAXMODULES=2000;HASHSIZE=353;
@z
@x l.1162
TOKPTR:0..MAXTOKS;{MAXTOKPTR,MAXTXTPTR:0..MAXTOKS;}{:53}{55:}
IDFIRST:0..LONGBUFSIZE;IDLOC:0..LONGBUFSIZE;
@y
{:53}{55:}IDFIRST:0..LONGBUFSIZE;IDLOC:0..LONGBUFSIZE;
@z
@x l.1166
PROCEDURE INITIALIZE;VAR{16:}I:0..127;{:16}{40:}WI:0..1;{:40}{56:}
H:0..HASHSIZE;{:56}{247:}C:ASCIICODE;{:247}BEGIN{10:}HISTORY:=0;{:10}
@y
{:40}{56:}H:0..HASHSIZE;{:56}{247:}C:ASCIICODE;
@z
@x l.1169
TOKPTR:=1;TEXTPTR:=1;TOKSTART[0]:=1;TOKSTART[1]:=1;{MAXTOKPTR:=1;
MAXTXTPTR:=1;}{:54}{57:}FOR H:=0 TO HASHSIZE-1 DO HASH[H]:=0;{:57}{94:}
SCANNINGHEX:=FALSE;{:94}{102:}MODTEXT[0]:=32;{:102}{124:}OUTPTR:=1;
@y
{:54}{57:}FOR H:=0 TO HASHSIZE-1 DO HASH[H]:=0;
{:57}{94:}SCANNINGHEX:=FALSE;{:94}{102:}MODTEXT[0]:=32;
@z
@x l.1173
IF R=0 THEN XREF[P]:=XREFPTR ELSE XMEM[R].XLINKFIELD:=XREFPTR;END;{:51}
{58:}FUNCTION IDLOOKUP(T:EIGHTBITS):NAMEPOINTER;LABEL 31;
@y
IF R=0 THEN XREF[P]:=XREFPTR ELSE XMEM[R].XLINKFIELD:=XREFPTR;END;
{:51}{58:}FUNCTION IDLOOKUP(T:EIGHTBITS):NAMEPOINTER;LABEL 31;
@z
@x l.1176
L:0..LONGBUFSIZE;P:NAMEPOINTER;BEGIN L:=IDLOC-IDFIRST;{59:}
H:=BUFFER[IDFIRST];I:=IDFIRST+1;
@y
L:0..LONGBUFSIZE;P:NAMEPOINTER;BEGIN L:=IDLOC-IDFIRST;
{59:}H:=BUFFER[IDFIRST];I:=IDFIRST+1;
@z
@x l.1184
LINK[P]:=HASH[H];HASH[H]:=P;31:{:60};IF P=NAMEPTR THEN{62:}
BEGIN W:=NAMEPTR MOD 2;
@y
LINK[P]:=HASH[H];HASH[H]:=P;31:{:60};
IF P=NAMEPTR THEN{62:}BEGIN W:=NAMEPTR MOD 2;
@z
@x l.1194
XREF[P]:=0;END{:62};IDLOOKUP:=P;END;{:58}{66:}
FUNCTION MODLOOKUP(L:SIXTEENBITS):NAMEPOINTER;LABEL 31;VAR C:0..4;
@y
XREF[P]:=0;END{:62};IDLOOKUP:=P;END;
{:58}{66:}FUNCTION MODLOOKUP(L:SIXTEENBITS):NAMEPOINTER;LABEL 31;
@z
@x l.1592 Missing verb.
first change files; then you can sure that your compiler will handle
@y
first change files; then you can be sure that your compiler will handle
@z
@x l.180 enumeration labels stick out into left margin
\yskip\item{1)} A \TeX\ part, containing explanatory material about what
@y
\begingroup\parindent=2.5em
\yskip\item{1)} A \TeX\ part, containing explanatory material about what
@z
@x l.788 indent subitems more than main item
\yskip\itemitem{a)}Comments in \PASCAL\ text should appear only after
@y
\yskip
\begingroup\parindent=1.5em
\itemitem{a)}Comments in \PASCAL\ text should appear only after
@z
$Date: 2024/12/04 22:41:57 $;
TUG home page;
join TUG/renew membership;
webmaster;
facebook;
x;
mastodon.