我使用 ConTeXt 和 Lucida OTF 字体,我想调整撇号和左括号之间的数学字距。让我们看这个例子:
\startluacode
fonts.handlers.otf.addfeature {
name = "kerntest",
type = "kern",
data = {
[0x61] = { [0x62] = -150 }, -- a and b in text
[0x1d44e] = { [0x1d44f] = -150 }, -- mathematical italic small a and b
[0x02032] = { [0x00028] = -150 }, -- prime and left parenthesis
}
}
\stopluacode
\definefontfeature[kerntest][kerntest=yes]
\definefontfamily[lucidaopentype][rm][Lucida Bright OT]
\definefontfamily[lucidaopentype][mm][Lucida Bright Math OT]
\setupbodyfont[lucidaopentype,10pt]
\startTEXpage[offset=3pt]
abba $abba f'(x)$
\addff{kerntest}
abba $abba f'(x)$
I prefer $f'\mkern-3mu(x)$
\stopTEXpage
新版本的 ConTeXt MKIV 的输出如下:
正如你所看到的,我能够(在阅读了第 178 和 179 页之后)本字体手册) 来调整字符 a 和 b 之间的字距(如果是文本的话),但不是数学。此外,更重要的是,撇号和左括号之间的间距不变(我承认我的方法有点幼稚)。
问题有没有一种方法,可以在不弄乱一切的情况下,自动在整个文档中更改数学模式下上括号和左括号之间的字距?
您可能认为我从不使用类似f'\left(
或f'\bigl(
类似的结构,但如果解决方案也适用于它们,那当然更好。需要强调的是,我在 ConTeXt 中工作,所以我正在寻找一种在 ConTeXt 中有效的解决方案。该解决方案可能基于 lua,当然还有一个好处,那就是它也可以在 lualatex 中工作。
附加问题这可能是基于个人观点的,所以我更希望我们关注第一个问题。这个问题是否可以被视为 Lucida OpenType 字体的一个错误?
我尝试过其他一些开放式字体,包括 lualatex 和 ConTeXt,在我看来,其中许多字体的撇号和括号之间的间距都不是最佳的。不过,我认为这不是引擎(luaotfload?)的问题,而是字体中可以/应该修复的问题。
答案1
向下滚动到 7 月 31 日的更新,该问题现在被认为已得到解决。
我现在已经收到了一些回复邮件列表主题。有一种名为“goodies”的东西可以调整开放式数学字体中的细节。对于 lucida,有一个名为的文件lucida-opentype-math.lfg
可以编辑。
在 goodie 文件中,可以设置字符的字距、字距对(我只能设置 a 和 b 等字符,而不能设置撇号和括号)以及字符的宽度和偏移量。由于我没有成功完全设置字距对,因此我暂时使用最后一个选项。
在我的 lucida-opentype-math.lfg 中,我将尺寸变量更改为以下内容(并且暂时将文件保存在与我的 tex 文件相同的文件夹中):
dimensions = {
default = {
[0x2032] = { xoffset = 50, width = 250, yoffset=-10}, -- prime
[0x2033] = { xoffset = 50, width = 650 , yoffset=-10}, -- double prime
[0x2034] = { xoffset = 50, width = 1050 , yoffset=-10}, -- triple prime
[0x2057] = { xoffset = 50, width = 1450 , yoffset=-10}, -- quadruple prime
},
},
现在,最小文档(lucidaot typescript 自动加载这个好文件)
\setupbodyfont[lucidaot,10pt]
\startTEXpage[offset=3pt]
$f'(x)f''(x)f'''(x)f''''(x)$
$\bigl(f'\bigr)^2=f''+f^{(4)}$
\stopTEXpage
得出以下结果:
我不知道其他人怎么想,但对我来说,这看起来比问题中显示的输出更好(它可能仍然需要调整)。
该解决方案的一个可能的缺点是素数可能会与其他一些字符“冲突”,但在我当前处理的文档中,情况似乎并非如此。
6月26日更新
这种方法不再有效。汉斯改变 LuaTeX 1.05 中素数的处理方式,并且输出(使用修改后的 lucida-opentype-math.lfg)如下所示(即没有任何变化):
我猜测仍然可以使用好文件 lucida-opentype-math.lfg 来解决这个问题,但我不知道如何解决。
7 月 31 日更新
感谢 Hans Hagen 的帮助,这个问题现在已经解决了邮件列表。在引入素数的新机制时,它们的 unicode 槽被重新映射(我不明白细节)。因此,我现在在我的 中添加了以下几行lucida-opentype-math.lfg
:
dimensions = {
default = {
[0xFE932] = { width = 150 }, -- prime
[0xFE933] = { width = 435 }, -- double prime
[0xFE934] = { width = 720 }, -- triple prime
[0xFE957] = { width = 1005 }, -- quadruple prime
},
},
下面是具有这些设置的上述示例。
最后两点评论:
1) 以上值是我自己测试得到的值。我会给 ConTeXt 邮件列表写一封电子邮件,建议将它们(或其他类似值)添加到字体 goodie 文件中。如果我们幸运的话,它们将被插入到分发中。
2) 似乎不可能使用该参数kernpairs
仅更改撇号和左括号之间的字距。我猜测原因是这些符号很特殊。
答案2
不是一个真正的答案,但评论太长了。在 LaTeX 中,字距调整适用于数学字体(我没有 lucida,所以我使用了 latin moderm math)。但您应该知道数学排版是二维的。并非每个间距都可以作为两个相邻字形之间的字距调整来处理。
\documentclass{article}
\usepackage{luacode}
\begin{luacode}
fonts.handlers.otf.addfeature {
name = "kerntest",
type = "kern",
data = {
[0x61] = { [0x62] = -150 }, -- a and b in text
[0x1d44e] = { [0x1d44f] = -150 }, -- mathematical italic small a and b
[0x02032] = { [0x00028] = -150 }, -- prime and left parenthesis
}
}
\end{luacode}
\usepackage{unicode-math}
\setmathfont{latinmodern-math.otf}[RawFeature=+kerntest]
\begin{document}
\loggingoutput
\showoutput
$ab f\prime(a$
$ab f'(a$
\end{document}
可以看出,带撇号的输入\prime
和带撇号的输入之间存在差异。第二个不调整字距的原因可以在日志中看到。当使用撇号时,字形来自两种不同的字体(7pt 和 10pt):
.....\TU/latinmodern-math.otf(0)/m/n/7 ′
....\TU/latinmodern-math.otf(0)/m/n/10 (
使用时\prime
,两者都来自 10pt 字体:
....\TU/latinmodern-math.otf(0)/m/n/10 ′
....\kern-1.5
....\TU/latinmodern-math.otf(0)/m/n/10 (
当您使用\biggl(
而不是简单的括号时,您会在日志文件中得到一个由各种 hbox 组成的复杂结构:在这里使用素数进行字距调整是不可能的。