我发现 Stix Two 字体的内联分数有点太高,导致基线分离。所以我想把它们缩小一点。原则上,我知道怎么做;见下文。
问题在于,字体大小改变后参数会被重置,即使大小改变只发生在某个组内。MWE:
\documentclass{minimal}
\usepackage{fontspec,unicode-math}
\setmathfont{STIX2Math.otf}
\begin{document}
$\frac12$\quad
\Umathfractionnumup\textstyle=5pt
\Umathfractiondenomdown\textstyle=5pt
$\frac12$\quad
{\fontsize{8pt}{9pt}\selectfont$\frac12$}\quad
$\frac12$
\end{document}
输出如下。
第二个分数是我想要的(或多或少)。但正如您从第四个分数中看到的那样,在较小的分数排版后,参数又恢复为标准。所以看来我需要加入某物以某种方式重复相关设置。我也可以从 lua 设置这些参数,但我一直找不到合适的钩子。特别是,设置这个并luaotfload.patch_font
不能解决问题。
是的,我可以尝试使用\everymath
,但这很容易被其他东西覆盖。或者可能不行。如果绝望的话我会尝试一下,但这似乎不是一个足够强大的解决方案。
另外,我想知道这种行为是否是预期的?它确实让生活变得困难。
答案1
这似乎有效:
\documentclass{minimal}
\usepackage{fontspec,unicode-math,luacode}
\begin{luacode}
local patch_stix = function (fontdata)
if fontdata.psname == "STIXTwoMath" then
local mc=fontdata.MathConstants
local mp=fontdata.mathparameters
mc.FractionNumeratorShiftUp = 0.85 * mc.FractionNumeratorShiftUp
mp.FractionNumeratorShiftUp = 0.85 * mp.FractionNumeratorShiftUp
mc.FractionDenominatorShiftDown = 0.8 * mc.FractionDenominatorShiftDown
mp.FractionDenominatorShiftDown = 0.8 * mp.FractionDenominatorShiftDown
end
end
luatexbase.add_to_callback(
"luaotfload.patch_font",patch_stix,
"my_private_callbacks.patch_stix")
\end{luacode}
\setmathfont{STIX2Math.otf}
\begin{document}
$\frac12$
\end{document}
它产生如下的分数:
我如何发现:
在被温柔地催促之后乌尔丽克·菲舍尔在标准发行版中,我发现了一个注释luaotfload.pdf
。我在那里运行了第 9.1 节中显示的 TeX 代码,并查看了 的结构STIX2Math.otf
。一点点猜测(不是那这对我来说太难了,最终我得到了这个解决方案。这个答案当然也非常有帮助。
MathhConstants
奇怪的是,分数移位在部分和部分中都列出mathparamters
(具有相同的数据),您必须更改两个都。
答案2
2021 年更新
在 Harald Hanche-Olsen 的答案的基础上,我稍微更新了代码,以适应当前 TeXLive 2021 版本的 STIX2Math 字体以及当前的 lauaotfload 库:
\documentclass{standalone}
\usepackage{fontspec,unicode-math,luacode}
\begin{luacode}
local patch_stix = function (tfmdata)
if tfmdata.psname == "STIXTwoMath-Regular" then
-- Some of the loaded files do not appear to contain these MathConstants
-- but I don't know why
if not (tfmdata.MathConstants and next(tfmdata.MathConstants)) then
-- In those cases we simply do nothing
return
end
local mc=tfmdata.MathConstants
mc.FractionNumeratorShiftUp = 0.85 * mc.FractionNumeratorShiftUp
mc.FractionDenominatorShiftDown = 0.85 * mc.FractionDenominatorShiftDown
end
end
luatexbase.add_to_callback(
"luaotfload.patch_font",patch_stix,
"my_private_callbacks.patch_stix")
\end{luacode}
\setmathfont{STIXTwoMath}
\begin{document}
$\frac{a}{b}$
\end{document}
主要区别似乎是名称略有变化。也许一些更有经验的 OTF 专家可以评论为什么字体被加载多次(我仍然知道有不同的变体),有时参数不可用。但有一个非常简单的构造可以捕获这些情况。
这是未应用和应用补丁后的情况的示例:
背景
除了 Harald Hanche-Olsen 的回答之外,我还使用了这个转储脚本,它取自luaotfloat.pdf(版本 2021-01-08 v3.17)
\begin{luacode}
local dumpfile = "fontdump.lua"
local dump_stix = function (fontdata)
if fontdata.psname == "STIXTwoMath-Regular" then
local data = table.serialize(fontdata)
io.savedata(dumpfile, data)
end
end
luatexbase.add_to_callback(
"luaotfload.patch_font",dump_stix,
"my_private_callbacks.dump_stix")
\end{luacode}
人们可以轻松读取生成的文件以找到必要的参数。
我还从 luaotfload 源代码中获得了灵感,更具体地说这部分。