使用同一字体中的另一个字形填充字体中的空位

使用同一字体中的另一个字形填充字体中的空位

我正在尝试使用 OpenType 字体中的现有字形来使用 LuaLaTeX 填充同一字体中的空槽。字体规格.pdf(v2.6g,第六部分)展示了一种可以替代已经存在字形使用fonts.handlers.otf.addfeature,但没有空槽,大概是因为它们的名称不存在。

有问题的字体是专有的 Garamond Premier Pro,但 EB Garamond 也发现了同样的问题,它在 TeXLive 中以过时的上游形式提供,ebgaramond或者在 Google Fonts fork 中以较新的形式提供他们的回购。因此,虽然直接的解决方案是为 EB Garamond 做出贡献,但现实世界的问题在于无法修改的字体。

U+03F5( ϵ)(c 形)通常是名为 的字形epsilon1,我想用足够相似的(在 Noto Sans 中,它们是直接链接的)乌克兰语U+0454(即є)来填充这个位置,它的名字很隐秘afii10101(甚至不是opentype.js.org正确,uni0454不会出现在 MWE 中。

对于文本,我们可以使用它newunicodechar,而且它运行良好,除了复制粘贴产生乌克兰字母的小问题。

对于数学来说,0x03F5"uni03F5""epsilon1"Lua 代码中都没有任何作用。U+03B5如果我们愿意,我们可以替换 ,但我们没有这样做。luaotfload.pdf(v2.8,第 5 章)有一些关于如何组合不同字体的信息,但没有介绍如何在单个字体中从头开始(重新)映射字形。

我们是否需要先创建一个“幽灵”字形条目才能重新映射它?我们可以从头开始创建它吗(并参考轮廓,以获得正确的复制粘贴)?我是否遗漏了一些文档?

\documentclass{article}
\usepackage{fontspec}
\usepackage[math-style=ISO]{unicode-math}
\usepackage{newunicodechar}
\directlua{
    fonts.handlers.otf.addfeature {
        name = "cstm",
        type = "substitution",
        data = {
             [0x261E] = "afii10101",% pointing finger for example
             %[0x261E] = "uni0454",% has NO effect
             ["uni03F5"] = "afii10101",% c-shape, has NO effect
             [0x03F5] = "afii10101",% c-shape, has NO effect
             ["epsilon1"] = "afii10101",% c-shape, has NO effect
             %["uni03B5"] = "afii10101",% 3-shape, has NO effect
             %[0x03B5] = "afii10101",% 3-shape, DOES HAVE effect
             %["epsilon"] = "afii10101",% 3-shape, DOES HAVE effect
} } }
\setmainfont{EB Garamond}[RawFeature=+cstm]
\setmathfont{Latin Modern Math}
\setmathfont{EB Garamond Italic}[range=it,RawFeature=+cstm]
\newunicodechar{ϵ}{\char"0454}
\begin{document}
{\addfontfeature{RawFeature=-cstm}\itshape ☞} ← normal\par
{\addfontfeature{RawFeature=+cstm}\itshape ☞} ← substitution in action\par
\begin{tabular}{cccc}
     & 03B5           & 03F5           & 0454           \\
text & ({\itshape ε}) & ({\itshape ϵ}) & ({\itshape є}) \\
math & ($\symit{ε}$)  & ($\symit{ϵ}$)  & {\scshape n/a} \\
\end{tabular}
\end{document}

pdf 输出

答案1

您可以尝试在字体加载时映射字形。出于某种原因,它在数学模式下不是斜体,但我不知道为什么。

\documentclass{article}
\usepackage{fontspec}
\usepackage[math-style=ISO]{unicode-math}
\usepackage{newunicodechar}

\usepackage{luacode}
\begin{luacode*}
local function patch(fontdata)
    if string.match(fontdata.psname or "", "^EBGaramond") then
        fontdata.characters[0x03F5] = fontdata.characters[0x0454]
    end
end
luatexbase.add_to_callback("luaotfload.patch_font", patch, "missing glyph")
\end{luacode*}

\setmainfont{EB Garamond}
\setmathfont{Latin Modern Math}
\setmathfont{EB Garamond}[range=it]
\begin{document}
\begin{tabular}{cccc}
     & 03B5           & 03F5           & 0454           \\
text & ({\itshape ε}) & ({\itshape ϵ}) & ({\itshape є}) \\
math & ($\symit{ε}$)  & ($\symit{ϵ}$)  & {\scshape n/a} \\
\end{tabular}
\end{document}

在此处输入图片描述

相关内容