我正在 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
针对相关字形的表格。而对于那些没有经过字距调整的字体,表格mathkern
是nil
。对于 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 等字体还可以。所以我现在只剩下三个选择了。
- 使用蹩脚的免费字体。Pagella、Termes 等字体的设计确实很糟糕。
- 使用像 Minion math 这样的优质字体(我的首选字体)我现在忍受了尖锐问题。
\!
必要时使用 - 回到 Math time pro 等,旧的 PS 数学字体。
没有一个是理想的解决方案。最好是有人能告诉我如何修补 Lua 中的数学查询表。我试过 xetex,它在处理开放类型数学时有很多问题。如果有人知道如何修补字体的良好参考,那将非常有帮助。不要给我看 luatex 参考手册。这是我见过的所有软件中最糟糕的文档。