TeX Gyre Termes Math 中 \{f\} \sigma_0 的正确字距调整

TeX Gyre Termes Math 中 \{f\} \sigma_0 的正确字距调整

继续https://chat.stackexchange.com/rooms/97632/discussion-between-marcel-kruger-and-mdayq6,运行 lualatex

\documentclass{article}
\usepackage{fontspec}
\usepackage{unicode-math}
% \setmathfont{texgyretermes-math.otf}
\setmathfont[Kerning=On]{TeXRygeTermesMath-Regular.otf}%%% same as Tex Gyre Termes Math, with an attempt to improve kerning
\begin{document}
\(\{f\}\)
\[
  \{f\}
\]
\end{document}

字体取自哪里http://filebin.net/36gqo82z5evv2869(我们尝试改进 tex gyre termes 数学),产生

左字距

如我们所见,第一种情况下应用了字距调整,但第二种情况下没有。在第二种情况下如何才能获得正确的字距调整?

此外,尝试减少 f 和 } 之间的字距调整不会有任何结果:无论我输入哪个值到 kern offset

没有正确的字距调整

,得到的 PDF 保持不变。

关于如何调整 f 和 } 之间的字距,您有什么想法吗?

最后但同样重要的是,关于如何减少$\sigma_0$\[\sigma_0\]使用吗?到目前为止,这个字距非常大……

编辑:关注马塞尔的建议,我放弃了寻找一个好的解决方案{f}并创建了一个具有新字距调整的 TeX Ryge Termes Math 字体改进斜体\sigma\tau数学模式的正确下标。让我们考虑输入

\documentclass{article}
\pagestyle{empty}
\usepackage{unicode-math}
%\setmathfont[Ligatures=TeX]{TeX Gyre Termes Math}
\setmathfont[Ligatures=TeX]{TeXRygeTermesMath-Regular.otf} %%% Name changed to comply with the license. The shapes are (hopefully) the same, and the math kernings are new.
\begin{document}
\newcommand{\test}[1]{#1_{abc} #1_0^a #1^b_b #1_1^c #1^d_⊤ #1_⟂^e #1_T^f #1_k^g #1_{\mathup{k}}^h #1_{h}^j}
\newcommand{\testtest}{\test{\sigma}\test{\tau}}
\(\testtest\)
\[\testtest\]
\end{document}

使用原始的 Gyre 字体,上面的输出结果如下

原始 xelatex 输出

对于 xelatex 和

原始 lualatex 输出

对于 lualatex。

使用调整字距的 Ryge 字体时,我们得到

使用带字距调整的 Ryge 字体的 xelatex 输出

使用 xelatex 编译时

使用带字距调整的 Ryge 字体进行 lualatex 输出

当使用 lulatex 进行编译时。

使用新的 Ryge 字体时,xelatex字距调整总体上表现良好,lualatex除了下标“abc”外,几乎没有任何字距调整。为什么会这样?

有必要进一步改进:

  • 稍微增加下标 ⊤ 的字距,

答案1

对于你的两个问题,请阅读我对你的另一个问题的回答:普通字距调整不是数学的正确工具,通常不会应用。LuaTeX 有时确实会应用,这可能是因为 TeX 不再知道这些字符曾经是数学。f插入斜体校正后,和f不会}直接相互跟随 -> 无字距调整。此外,在显示数学中,LuaTeX 不会期望找到需要字距调整的内容,因此会跳过字距调整。

无论如何,你的最后一个问题更有趣:

字符与其下标之间的字距在 OpenType Math 中称为数学字距。请参阅https://docs.microsoft.com/en-us/typography/opentype/spec/math#mathkerninfo-table了解详情。对于你的情况,你只需要调整 sigma。

在 FontForge 中打开一个数学字体。然后你可以通过 Element->Other Info->MATH Info 更改数学相关参数。将打开如下窗口: 在此处输入图片描述

选择“数学字距”并按下以添加新字形的数学字距。输入字形的名称,在本例中为“u1D70E”(数学斜体小 SIGMA)。然后按更改以调整值。

在此处输入图片描述

这将带您进入数学字距调整对话框:

在此处输入图片描述 要添加新点,请转到“文本”,然后选择“右下角”。按三次添加三个点,然后返回“图形”。在这里单击右下角下方的 sigma 以选择此块。您的字距调整点出现,您可以将其拖动到适当的位置。粗略地说,每个点都意味着如果下标附加在此高度或更低的高度,那么它应该获得此量的字距调整。例如,您可以像这样设置您的点:

在此处输入图片描述

现在再次单击“确定”,确认,然后生成字体。

如果你像我一样把观点放在首位,$\sigma_0$那么

在此处输入图片描述

当然,如果你不想改变字体,LuaTeX 还允许你使用 Lua 代码来改变 mathkerns:

\documentclass{standalone}
\usepackage{unicode-math}
\usepackage{luacode}
\begin{luacode*}
  -- First create a table specifying the mathkerns we want to set:
  local mathkerns = {
    ["TeXGyreTermesMath-Regular"] = { -- This should be the PostScript name of the font
      [0x1D70E] = { -- If the character would have a regular name, you could also use the glyphname here
        bottomright = {
          {height=0,kern=-175},
          {height=216,kern=-76},
          {kern=0},
        },
      },
    },
  }
  local function initmathkern(tfmdata)
    local values = mathkerns[tfmdata.properties.psname]
    if not values then return end
    for cp, value in next, values do
      local tcp = type(cp)
      if tcp == 'string' then
        cp = tfmdata.resources.unicodes[cp]
      end
      local char = tfmdata.characters[cp]
      if char then
        local mathkern = char.mathkerns
        if not mathkern then
          mathkern = {}
          char.mathkerns = mathkern
        end
        for corner, v in next, value do
          mathkern[corner] = v
        end
      end
    end
  end
  fonts.constructors.newfeatures'otf'.register{
    name = 'mathkern',
    description = 'Overwrite mathkern values',
    initializers = {
      base = initmathkern,
    },
  }
\end{luacode*}
\setmathfont[RawFeature=mathkern]{texgyretermes-math.otf}
\begin{document}
$\sigma_0$
\end{document}

相关内容