[tex-k] bug in syntax of <numeric primary> in The METAFONTbook

胡亚捷 (Hu Yajie) 2500418497 at qq.com
Mon Jul 13 17:50:54 CEST 2020

The syntax for primaries solves the ambiguity of `-.5[a,b]' by restricting
what can occur in the `t' part of the `t[a,b]' notation: single-token things,
"literal" fractions like 2/3, parenthesized and grouped expressions can occur,
while things with an operator at the left, like -.5, sqrt3, 2/3x etc., cannot.
Therefore, the interpretation `(-.5)[a,b]' is ungrammatical, and it must be
parsed as `-(.5[a,b])'. However, the real reason MF chooses the latter is:

1.  Parsing is done from left to right.
2.  METAFONT makes each primary as long as possible. In other words, a
    <primary> is always extended if it is followed by `[<exp>,<exp>]'.

Thus, you cannot put `-.5' before something like `[a,b]' because `-.5' ends
with an unfinished primary and `[a,b]' happens to finish it, not because
`-.5' begins with an operator. Now, what's the problem if the the two
interpretations explain the same phenomena? The problem is that some `t' parts
begin with an operator and end with a finished primary, such as `-.5[a,b]'
itself occurring before another set of brackets! Try it, and you'll find that

    *show -.5[a,b][0,100];
    >> -50b-50a

is perfectly grammatical, even though `-.5[a,b]' does not meet the syntax of
<numeric atom>. Thus the syntax rules should be rebalanced to something like

    <numeric atom> ::= <numeric variable> | <numeric argument>
        | <numeric token primary>
        | <internal quantity>
        | normaldeviate
        | ( <numeric expression> )
        | begingroup <statement list> <numeric expression> endgroup
        | length <numeric primary> | length <pair primary>
        | length <path primary> | length <string primary>
        | ASCII <string primary> | oct <string primary> | hex <string primary>
        | <pair part> <pair primary> | <transform part> <transform primary>
        | angle <pair primary>
        | turningnumber <path primary> | totalweight <picture primary>
        | <numeric operator> <numeric primary>
        | directiontime <pair expression> of <path primary>
    <numeric primary> ::= <numeric atom> [ <numeric expr> , <numeric expr> ]
        | <numeric atom not followed by `[ <numeric expr> , <numeric expr> ]'>

Not sure if I got the new syntax right, but it's definitely cleaner if it is.
(You might also want to change the explanation of `sqrt 100(100)' on page 64.)

---------------------------now for some suggestions---------------------------

Page C127, line 19
Concatenation of strings isn't introduced yet for first-time readers.

Page C171, line 4
The parentheses in `round(n)' are superfluous (cf. `round a' and `round x' on
page C66, `round u' and `round 3u' on page 200, etc.)

Page C191, line 2
The `currentpicture' feature isn't introduced yet for first-time readers.

More information about the tex-k mailing list.