我正在尝试使用 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}
答案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}