[tex-k] a new solution to the Bernshtein trick on page 299 of The METAFONTbook

胡亚捷 (Hu Yajie) 2500418497 at qq.com
Tue Jan 19 06:12:34 CET 2021

Page 299 of The METAFONTbook shows a trick to extend METAFONT's syntax
to support Bernshtein polynomials. Knuth comments that his solution

    seems to work in all cases except with respect to formulas that
    involve `]]' (two consecutive brackets); the latter token, which
    plain METAFONT expands to `] ]', is not expanded when `lookahead'
    reads its text argument, hence the user must remember to insert
    a space between consecutive brackets.

Today I realized that I could further improve my solution so that it
worked not only with `flex' and `show' but also with `]]', by changing 
`[' and `]' from delimiters to macros:

let [[[ = [; let ]]] = ];
def [ = exitif numeric begingroup for u = enddef;
def ] = , hide(N_ := 0; let v_ = \):
  if incr N_ = 1: def v_ = u enddef
  else: expandafter def expandafter v_ expandafter = v_, u enddef
  fi; endfor endgroup; if N_ < 3: [[[v_]]] else: Bernshtein N_ fi
primarydef t Bernshtein nn = begingroup N_[[[1]]] := 1;
 for n = 1 upto nn - 1: N_[[[n + 1]]] := t * N_[[[n]]];
  for k = n downto 2: N_[[[k]]] := t[[[N_[[[k]]], N_[[[k - 1]]] ]]];
  endfor N_[[[1]]] := (1 - t) * N_[[[1]]]; endfor
 N_ := 0; for u = v_: + N_[[[incr N_]]] * u endfor endgroup enddef;

The new solution seems to be backward compatible with existing fonts
like cmr10, cmtt10, manfnt, cmman, random, and mfman. Furthermore,

show a[a[1]];

now prints `4' instead of giving an error.

Can you forward this to Knuth? Since he asks "Perhaps there is a simpler
way?" before giving his solution, he might be interested in this.


Previous reports:

More information about the tex-k mailing list.