字距调整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#
在程序中定义了......)