如何在 Metafont 中循环遍历 ligtable?

如何在 Metafont 中循环遍历 ligtable?

字距调整roman.mf是针对 Computer Modern Roman 字体定义的。

我想ligtable更有效地编写定义,但我尝试的一切都是错误的:

% With macro
def group_kerning(text L)(expr k)(text R) =
 ligtable for l=L: l: endfor for r=R: r kern k, endfor
enddef;

group_kerning("A", "F", "K")(k#)("C", "G");% wrong

% Without macro
ligtable for l="A", "F", "K": l: endfor for r="C", "G": r kern k#, endfor;% wrong, too

% Less complicated
ligtable for l="A", "F", "K": l: endfor "C" kern k#;% again wrong

有人能帮助我吗?

答案1

您不需要将for..endfor循环放入ligtable命令中——它们已经支持字符列表。

您可能想阅读 Knuth 的 Metafont Book 中的第 316-317 页。我无法在此重复该部分的全部内容,但他的一个例子可能会有所帮助(我添加了换行符以使其更清晰;通常您会将其全部放在一行上)。

ligtable "o": "b": "p": 
    "e" kern .5u#, 
    "o" kern .5u#, 
    "x" kern -.5u#, 
    "!" kern u#;

这定义了以下 12 个字距调整对

oe (add 1/2 unit)
be (add 1/2 unit)
pe (add 1/2 unit)
oo (add 1/2 unit)
bo (add 1/2 unit)
po (add 1/2 unit)
ox (subtract 1/2 unit)
bx (subtract 1/2 unit)
px (subtract 1/2 unit)
o! (add 1 unit)
b! (add 1 unit)
p! (add 1 unit)

所以它已经支持“隐式”循环,你可以写出我认为你想要的内容:

ligtable "A": "F": "K": "C" kern k#, "G" kern k#; 

这已经非常紧凑了(并且我假设您已经k#在程序中定义了......)

相关内容