将一个字形替换为另一个风格集的替代字形

将一个字形替换为另一个风格集的替代字形

在 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

以下是如何做到这一点(借助答案12):

  1. 获取 Adob​​e 的澳大利亚联邦航空局字体工具并安装它们。

  2. 将字体文件放入空目录中。

  3. 运行tx -pdf -1 YOUR_FONT.otf > YOUR_FONT.pdf以映射字体的字形。

  4. 打开 YOUR_FONT.pdf,搜索想要的字形及其字形标签(左上角的数字,我们将其命名为 GLYPH_TAG)。

  5. 创建一个虚拟 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}
    
  6. 查看输出,显示的数字是 LuaOTF 表中的字符编号(我们将其命名为 CHAR_NUMBER)。

  7. 在您希望进行替换的文档中,添加以下行:

    \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")}%
    }
    
  8. 你完成了。


例子:我想用替代样式集中的 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")}%
}

相关内容