LuaTeX 0.95“数学字距调整不正确”

LuaTeX 0.95“数学字距调整不正确”

我正在 TeXLive 2016 预测试中试用新的 luatex 0.95。数学内核存在问题。下面是 MWE

\documentclass{article}
\usepackage{unicode-math}
\setmathfont{Lucida Bright Math OT}
\begin{document}
\selectfont$W_i^i$
\end{document}

使用新版本(0.95)进行编译时,我得到以下内容,

在此处输入图片描述

可以看出,下标i根本没有字距调整。使用旧版本(TeXLive 2015,版本 0.80)编译时,我得到了正确的结果,

在此处输入图片描述

我做了一些调查,似乎与新版本处理表格的方式有关mathkern。它现在有两个代码路径,一个用于 TeX82 行为,一个用于 OpenType 数学。有没有办法让新版本恢复到旧行为?事实上,我希望它始终重现 TeX82。

更新 1

@egreg

我认为问题不在于 luaotfload。我试过 Asana-math,它是经过字距调整的。我还试过 Minion Math,它没有经过字距调整。所以我做了更多的检查。对于那些经过字距调整的字体,有一个mathkern针对相关字形的表格。而对于那些没有经过字距调整的字体,表格mathkernnil。对于 Lucida,mathkern根本没有表格。我也尝试过使用旧的 Type 1 Lucida 数学字体。它工作正常。考虑到它们相隔几十年发布,新开放类型的 Lucida Math 的度量标准可能与原始标准不同,但它们至少是相似的。

在我看来,luatex 0.9 对 TFM 字体和 OT 字体采用了两种不同的代码路径。它一直都是这样做来处理 OT。然而,最终结果通常是一致的。现在看来他们现在以不同的方式处理数学字距调整。我记得在某个地方读过类似的东西,但记不清具体在哪里了。

更新 2

我找到了一个旧帖子LuaTeX 和 Asana Math 的奇怪字体/间距问题 它在某种程度上与这里的问题有关,尽管完全不同。但根据那篇文章中的答案,我尝试使用类似以下内容的字体进行修补,

function patch(font)
  if font.psname then
    if string.find(font.psname, 'LucidaMath') then
      char = font.characters[119882]
      char.mathkern = char.mathkern or {}
      char.mathkern.bottom_right = char.mathkern.bottom_right or {}
      char.mathkern.bottom_right.height = { }
      char.mathkern.bottom_right.kern = { -1000 }
    end
  end
end

在回调中添加上述函数后luaotfload,似乎没有任何效果。我尝试将字距设置为更极端的值,只是为了看看是否有任何效果。那篇旧帖子是几年前的。所以我猜也许字体表结构已经发生了某种变化。有人能告诉我应该mathkern在字体数据中的哪个位置添加/修改表格吗?我查看了手册luatex,表格的结构mathkern非常清晰。但它在大型字体数据表中的位置完全不清楚。

修补后,我检查了字体表。该mathkern表确实插入了字符子表中。但是没有效果。我W通过检查输出 PDF 获得了的代码点(我认为上述函数中应该使用的代码点应该在数学部分,而不是通常的W。)

更新 3

我又试了几种字体。看来 Minion Math、Licida 等商业字体处理得不太好。TeX gyre termes math 等字体还可以。所以我现在只剩下三个选择了。

  1. 使用蹩脚的免费字体。Pagella、Termes 等字体的设计确实很糟糕。
  2. 使用像 Minion math 这样的优质字体(我的首选字体)我现在忍受了尖锐问题。\!必要时使用
  3. 回到 Math time pro 等,旧的 PS 数学字体。

没有一个是理想的解决方案。最好是有人能告诉我如何修补 Lua 中的数学查询表。我试过 xetex,它在处理开放类型数学时有很多问题。如果有人知道如何修补字体的良好参考,那将非常有帮助。不要给我看 luatex 参考手册。这是我见过的所有软件中最糟糕的文档。

相关内容