引擎问题?使用 Brill 字体创建动态变音符号

引擎问题?使用 Brill 字体创建动态变音符号

我正在尝试重新创建 John Hudson(Brill 字体的首席设计师)的以下图像演示幻灯片

动态变音符号 1
来源:Brill 类型,第 22 页。

该字体可免费用于非商业用途,请参阅Brill 官方网站。我被困在第21页的图像上了。

在评论后进行编辑特蕾莎的回答。我意识到这是引擎问题。在下面这个简化的示例中(仅包含前 4 个字母),您可能会发现两个引擎都得出了令人惊讶的结果。

\documentclass{article}
\usepackage{fontspec}
\setmainfont{Brill}
\ExplSyntaxOn
\NewDocumentCommand \dynamicdiacritics { }
  {
    Results ~ from ~
    \sys_if_engine_luatex:T { LuaLaTeX: ~ }
    \sys_if_engine_xetex:T  { XeLaTeX: ~ }
    d \char"030C \char"0304 \char"0323 \char"0326
    y \char"030D \char"0311 \char"0310 \char"0302 \char"0301 \char"0353 \char"0347
    n \char"0306 \char"0308 \char"1DD8 \char"0304 \char"0307 \char"032D \char"0332 \char"032B \char"0323
    a \char"0363 \char"0306 \char"0309 \char"0324 \char"0330 \char"032A
  }
\ExplSyntaxOff
\begin{document}
\dynamicdiacritics
\end{document}

不同引擎下的变音符号
根据《The Brill》的用户指南(感谢 Thérèse!),人们将变音符号置于下方的变音符号。LuaTeX 优雅地进行堆叠。对于 XeTeX,上方的“d”变音符号太低,而“n”周围的变音符号则有令人惊讶的水平偏移。但是,这两个引擎在垂直字距方面都存在轻微问题。

我添加了引擎的标签来更好地反映这个问题。


最初的尝试:

\documentclass{article}
\usepackage{fontspec}
\setmainfont{Brill}
\ExplSyntaxOn
\NewDocumentCommand \dynamicdiacritics { }
  {
    d \char"0323 \char"030C
    y \char"030D \char"0311
    n \char"0306 \char"032D
    a \char"0324 \char"0330
    m \char"0310 \char"0318
    i \char"0304 \char"1DCA
    c \char"0319 \char"030B
    ~
    d \char"0325 \char"0309
    i \char"030E \char"1DC7
    a \char"1DC8 \char"031E
    c \char"0348 \char"0332
    r \char"0346 \char"0332
    i \char"0313 \char"036F
    t \char"032B \char"0306
    i \char"1DC5 \char"0307
    c \char"0368 \char"0301
    s \char"031C \char"1DCC
  }
\ExplSyntaxOff
\begin{document}
\dynamicdiacritics
\end{document}

动态变音符号 2
我的尝试失败了;可能也使用了错误的变音符号。

答案1

XeTeX 行为是 HarfBuzz“功能”和字体限制的组合。

Unicode 中有一个东西叫规范等价. 当某个代码点序列被认为与另一个代码点序列规范等同时,Unicode 规定两个序列应该呈现为相同。

其中一个例子是(U+1E0D 拉丁小写字母 D 带下划线),它与d+ U+0323 组合下划线是规范等价的。前者称为组合形式,后者称为分解形式,Unicode 具有从一种形式映射到另一种形式的规范化标准(NFC 代表组合形式,NFD 代表分解形式)。

当字体支持时,HarfBuzz 始终倾向于使用组合形式,因此如果字体支持,d + U+0323 COMBINING DOT BELOW 会变成 ḍ。

Unicode 规范等效性的另一部分是规范排序,它指定无论输入顺序如何,组合标记的排序方式。HarfBuzz 再次应用了标记的规范排序。

两者的结合会导致 1) 您输入的标记顺序与 HarfBuzz 实际使用的顺序不同 2) 一些基本字形 + 标记序列被替换为组合形式(例如,您示例中的第一个 d 最终变为+ 其他标记)。在理想情况下,这不应该是一个问题,但对于 Brill 字体,字形没有与字形相同的用于定位组合标记的锚点,d这会导致标记位移。这是一个字体错误,因为它不能以相同的方式处理规范等效的代码点序列。

解决此问题的方法是插入 U+200C ZERO WIDTH NON-JOINER 字符,以防止出现问题的组合或重新排序:

\documentclass{article}
\usepackage{fontspec}
\setmainfont{Brill}
\ExplSyntaxOn
\NewDocumentCommand \dynamicdiacritics { }
  {
    Results ~ from ~
    \sys_if_engine_luatex:T { LuaLaTeX: ~ }
    \sys_if_engine_xetex:T  { XeLaTeX: ~ }
    d\char"200C\char"030C\char"0304\char"200C\char"0323\char"0326
    y\char"030D\char"0311\char"0310\char"0302\char"0301\char"0353\char"0347
    n\char"0306\char"0308\char"1DD8\char"0304\char"0307\char"200C\char"032D\char"0332\char"032B\char"0323
    a\char"0363\char"0306\char"0309\char"0324\char"0330\char"032A
  }
\ExplSyntaxOff
\begin{document}
\dynamicdiacritics
\end{document}

XeLaTeX 输出

您甚至可以将它插入到任何组合标记之前,这不会造成任何损害:

\documentclass{article}
\usepackage{fontspec}
\setmainfont{Brill}
\ExplSyntaxOn
\NewDocumentCommand \dynamicdiacritics { }
  {
    Results ~ from ~
    \sys_if_engine_luatex:T { LuaLaTeX: ~ }
    \sys_if_engine_xetex:T  { XeLaTeX: ~ }
    d\char"200C\char"030C\char"200C\char"0304\char"200C\char"0323\char"200C\char"0326
    y\char"200C\char"030D\char"200C\char"0311\char"200C\char"0310\char"200C\char"0302\char"200C\char"0301\char"200C\char"0353\char"200C\char"0347
    n\char"200C\char"0306\char"200C\char"0308\char"200C\char"1DD8\char"200C\char"0304\char"200C\char"0307\char"200C\char"032D\char"200C\char"0332\char"200C\char"032B\char"200C\char"0323
    a\char"200C\char"0363\char"200C\char"0306\char"200C\char"0309\char"200C\char"0324\char"200C\char"0330\char"200C\char"032A
  }
\ExplSyntaxOff
\begin{document}
\dynamicdiacritics
\end{document}

在此处输入图片描述

答案2

我没有耐心输入第一个字母以外的内容,但原则是这样的:先输入字母,然后输入其上方的变音符号,从最接近该字母的变音符号开始,然后再输入其下方的变音符号,同样从最接近的开始,然后输入。

在这里我直接输入组合变音符号(在 Emacs 中,使用C-x 8),然后再次使用\char

\documentclass{article}
\usepackage{fontspec}
\setmainfont{Brill}
\begin{document}
ḍ̦̌̄ \textit{or} d\char"030C\char"0304\char"0323\char"0326% no spaces, or the diacritics will appear after the character
\end{document}

输出

相关内容