2021 年更新

2021 年更新

我发现 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}

输出如下。

lualatex 运行的输出

第二个分数是我想要的(或多或少)。但正如您从第四个分数中看到的那样,在较小的分数排版后,参数又恢复为标准。所以看来我需要加入某物以某种方式重复相关设置。我也可以从 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 专家可以评论为什么字体被加载多次(我仍然知道有不同的变体),有时参数不可用。但有一个非常简单的构造可以捕获这些情况。

这是未应用和应用补丁后的情况的示例:

FractionNumeratorShift 的比较

背景

除了 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 源代码中获得了灵感,更具体地说这部分

相关内容