我正在尝试重新创建 John Hudson(Brill 字体的首席设计师)的以下图像演示幻灯片:
来源: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}
答案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}
您甚至可以将它插入到任何组合标记之前,这不会造成任何损害:
\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}