在 ConTeXt 中更改数学字符(撇号和左括号)之间的字距

在 ConTeXt 中更改数学字符(撇号和左括号)之间的字距

我使用 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 组成的复杂结构:在这里使用素数进行字距调整是不可能的。

相关内容