在 LuaTeX 中,我想要执行以下操作:
使用字体的标准样式集中的文本,但对于特定字母,不使用标准样式集的字形,而是用替代样式集的字形代替。
例子:在 Arno Pro 中,第一个替代样式集 ( Alternate=0
) 的 Q 比标准形式具有更长的尾部。我希望编译器自动为文档中出现的每一个 Q 字形(并且只使用替代 Q 字形)使用替代 Q 字形。
编辑: Contextuals=Alternate
否则就CharacterVariant={1-99}
别这么做。
答案1
这个问题没有普遍的答案,也不可能有。这不仅仅是因为一些设计师误用了calt
其他功能,或者对规范的解释不一致。即使他们都按照预期使用了这些功能,字体仍然会表现出不同的行为。
假设每个人都同意使用ss01
表示 Q,ss02
使用 表示 & 符号。现在计算一下人类语言中的字符数。如果您还有时间,请考虑一种字体可能有三个替代的 & 符号、两个 Q 变体、装饰等。显然,不可能存在ss03
控制这个或那个的通用协议,因为可能性太多了。
我稍微夸大了这个问题,因为为 A、带重音符的 A、带重音符的 A 等设置单独的风格集会很奇怪。将不同基本字符的替代字符分组到单个风格集中可能是有意义的;例如,无衬线字体可能将其所有人文主义替代字符放在一个集合中,将其几何替代字符放在另一个集合中。但可能的风格集数量是有限的,设计师必须找出最有用的方法,将特定字体中的风格替代字符安排到不超过二十个集合中。让用户对一切都可预测的标准会限制设计师不可预测的创造力,无法反映人类语言及其类型表现的丰富性。
因此,当您获得一种新字体时,您需要研究它并记下您感兴趣的功能。我保留了一个 Emacs org-mode 文件,其中包含每种字体的功能表和示例调用;无论您喜欢如何保留笔记,如果没有笔记,您将浪费大量时间。
如果在检查字体时,你发现设计师没有提供影响你感兴趣的唯一一个字符的样式集,那么你可以创建功能文件得到你想要的。
答案2
获取 Adobe 的澳大利亚联邦航空局字体工具并安装它们。
将字体文件放入空目录中。
运行
tx -pdf -1 YOUR_FONT.otf > YOUR_FONT.pdf
以映射字体的字形。打开 YOUR_FONT.pdf,搜索想要的字形及其字形标签(左上角的数字,我们将其命名为 GLYPH_TAG)。
创建一个虚拟 TeX 文件,并使用以下代码进行设置:
\documentclass{article} \usepackage{fontspec,luacode} \setmainfont{YOUR_FONT} \begin{luacode} function luatexglyph(glyph) local f = fonts.hashes.identifiers[font.current()] local ff = fontloader.open(f.filename) local g = ff.glyphs[glyph] local n = luaotfload.aux.slot_of_name(font.current(),g.name) if n then tex.sprint(n); else tex.error('font has no glyph '.. glyph) end fontloader.close(ff) end \end{luacode} \def\LuaTeXglyph#1{\directlua{luatexglyph "#1"}} \begin{document} \LuaTeXglyph{GLYPH_TAG} \end{document}
查看输出,显示的数字是 LuaOTF 表中的字符编号(我们将其命名为 CHAR_NUMBER)。
在您希望进行替换的文档中,添加以下行:
\usepackage{luacode,luatexbase} \begin{luacode} function dosub(s) s = string.gsub(s, 'CHARACTER_YOU_WANT_TO_SUBSTITUTE', '\\charCHAR_NUMBER') return(s) end \end{luacode} \AtBeginDocument{% \luaexec{luatexbase.add_to_callback("process_input_buffer", dosub, "dosub")}% }
你完成了。
例子:我想用替代样式集中的 Q 替换 Arno Pro 的标准 Q。替代 Q 的 GLYPH_TAG 为 247。此字形对应于 LuaOTF 表中的 CHAR_NUMBER 983047。我只需将以下内容添加到文档开头即可:
\usepackage{luacode,luatexbase}
\begin{luacode}
function dosub(s)
s = string.gsub(s, 'Q', '\\char983047')
return(s)
end
\end{luacode}
\AtBeginDocument{%
\luaexec{luatexbase.add_to_callback("process_input_buffer", dosub, "dosub")}%
}