LuaTeX、unicode-math 和斜体校正

LuaTeX、unicode-math 和斜体校正

LuaTeX我在使用和包装时遇到了一些困难 unicode-math。下面是 MWE,

\documentclass[12pt]{article}
\usepackage[math-style=ISO]{unicode-math}

\begin{document}
\[
    f(T), f\left( T \right),
    \int_{a}^{b} f\left( x \right) d x, \frac{1}{T},
\]
\mathitalicsmode=1
\[
    f(T), f\left( T \right),
    \int_{a}^{b} f\left( x \right) d x, \frac{1}{T},
\]
\mathitalicsmode=2
\[
    f(T), f\left( T \right),
    \int_{a}^{b} f\left( x \right) d x, \frac{1}{T},
\]
\end{document}

以下是其生成的文档的屏幕截图,

统一码

我们在这里可以看到几个问题,

  1. 收盘前间距不正确\right)
  2. 收盘前间距不正确)
  3. 分数线太短。
  4. 最后一个逗号太近。
  5. 积分中的极限间距不正确。

默认设置有问题1,3,4,而\mathitalicsmode=1有问题3,4\mathitalicsmode=2有问题2,5

这是没有包的屏幕截图unicode-math,一切看起来很完美。

名词编码

似乎与 的斜体更正有关LuaTeX。最近有几场讨论建议进行更改,\mathitalicsmode但我们发现这会带来新问题,不太清楚该如何进行。

所有文档均使用 最新软件包制作MacTeX

答案1

简而言之:到目前为止,似乎还没有好的方法来使用 Opentype Math 字体解决 LuaLaTeX 中的问题。

继续阅读: 您看到的问题本质上是传统 TeX 字体和 Opentype 数学字体对斜体校正的处理不同,并且转换的某些字体实际上并未遵循新的(模糊的)标准(本质上是由 Cambria 设置的)。如果您不加载unicode-math,您将获得旧的 type1 字体,这就是您得到预期结果的原因。让我首先展示使用 Cambria 设置的示例的结果:

坎布里亚

在这里,我想说第一个例子看起来不错(除了f和 之间的空格(,但可以通过不使用 来避免\left)。我想说,原因是 Cambria 是“模型 Opentype 数学字体”,这是微软在制定相当模糊的规范的同时制作的字体,并且 luatex 已适应它(还有什么?)。

看着规范我们发现

斜体校正可用于下列情况:

  • 当一连串倾斜字符后跟一个直字符(例如操作符或分隔符)时,最后一个字形的斜体校正将添加到其前进宽度中。
  • 在 N 元运算符(例如积分符号)上定位限值时,上限的水平位置向右移动斜体校正量的 1/2,而下限的位置向左移动相同的距离。
  • 在定位上标和下标时,它们的默认水平位置也会根据前一个字形的斜体校正量而不同。

拉丁现代数学(屏幕截图中使用的字体)是从传统的计算机现代数学字体转换而来的,因此它也继承了其中的一些行为(有人可能会说它并没有真正变成真正的 Opentype 数学字体,不管这意味着什么)。这意味着人们会看到类似的问题出现,即使有快速修复(如\mathitalicsmode22022 年 4 月添加)来在某种情况下解决一个问题,但发生的情况是,问题只是被推到了其他地方/结构上。

我认为,要最终解决这个问题,需要做的事情(向维护者提出挑战unicode-math)是使用类似于 ConTeXt 和 luametatex 中的模型,其中通过改变字形宽度和添加角字距来处理斜体校正。这似乎是一个适用于大多数字体的模型。

您的示例(适用于 ConTeXt)如下所示:

ConTeXt 示例

如果你好奇的话,用于生成该代码的代码是:

\usebodyfont[modern]
\usebodyfont[cambria]
\setupbodyfont[modern]

\starttext
\startbuffer
\startformula
  f(T), f\left( T \right),
  \int_{a}^{b} f\left( x \right) \dd x, \frac{1}{T},
\stopformula
\stopbuffer

\getbuffer

\switchtobodyfont[cambria]
\getbuffer
\stoptext

答案2

您可以通过在数学列表末尾添加零宽度字符来鼓励 luatex 添加斜体校正,这并不完美,但比斜体模式参数提供了更多的控制。请参阅此处的尝试 4。

在此处输入图片描述

\documentclass[12pt]{article}
\usepackage[math-style=ISO]{unicode-math}

\begin{document}
\[1+
    f(T), f\left( T \right),
    \int_{a}^{b} f\left( x \right) d x, \frac{1}{T},
\]
\mathitalicsmode=1
\[2+
    f(T), f\left( T \right),
    \int_{a}^{b} f\left( x \right) d x, \frac{1}{T},
\]
\mathitalicsmode=2
\[3+
    f(T), f\left( T \right),
    \int_{a}^{b} f\left( x \right) d x, \frac{1}{T},
\]
\mathitalicsmode=0
\let\oldright\right
\protected\def\right{^^^^200b\oldright}
\let\oldfrac\frac
\protected\def\frac#1#2{\oldfrac{#1^^^^200b}{#2^^^^200b}}
\[4+
    f(T), f\left( T \right),
    \int_{a}^{b} f\left( x \right) d x, \frac{1}{T},
\]
\end{document}

相关内容