根据使用的是 pdfLaTeX、XeLaTeX 还是 LuaLaTeX,在“下点”重音的水平对齐方面似乎存在显著差异。(我使用 MacTeX2016,它(仍然)使用 LuaTeX 0.95,所有软件包都已更新至今天(2/22)。)
使用 pdfLaTeX:
使用 XeLaTeX (和fontspec
):
使用 LuaLaTeX (和fontspec
):
pdfLaTeX 和 XeLaTeX 中下点重音的位置非常相似,但 LuaTeX 中则有所不同,在某些情况下,看起来相当杂乱;参见字母下方下点重音的位置i
。字母下方下点重音的位置e
也不太好。
LuaLaTeX 用户可以做些什么来“修复”下点重音符号的位置?
顺便说一句,如果EB Garamond
使用 而不是Computer/Latin Modern
,下点符号的位置对于 pdfLaTeX、XeLaTeX 和和LuaLaTeX。
\documentclass[border=0.5pt]{standalone}
\usepackage{ifluatex,ifxetex}
\ifluatex
\usepackage{fontspec,luatex85}
\else
\ifxetex
\usepackage{fontspec}
\else
\usepackage[T1]{fontenc}
\fi
\fi
\begin{document}
\d{a} \d{e} \d{i} \d{o} \d{u}
\end{document}
答案1
目前发生的情况是,\d
TU 编码中没有声明任何复合词,因此\d{a}
等等都是通过与下面的组合点 (U+0323) 进行组合来实现的。
但是,使用 XeLaTeX 时,HarfBuzz 库将掌握主动权,如果字体中存在预制字符,它将使用它。使用 LuaTeX 时不会发生这种情况。
我想说,这是一个灰色地带。如果声明了复合字体,如果字体不支持这些字符,您将一无所获,否则,您必须依靠良好的定位。
事实上,如果我尝试\showoutput
使用 LuaLaTeX,我会得到\d{i}
....\TU/lmr/m/n/10 i
....\TU/lmr/m/n/10 ̣
而 XeLaTeX 显示
....\TU/lmr/m/n/10 ị
不幸的是,Latin Modern 在定位某些组合字符方面相当弱,其他字体在这方面表现更好。
您可以通过自己定义必要的复合材料来暂时解决该问题:
\documentclass{article}
\usepackage{fontspec,ifluatex}
\makeatletter
% fix the hidden feature in tuenc.def
\def\add@unicode@accent#1#2{%
\if\relax\detokenize{#2}\relax^^a0\else#2\fi
\char#1\relax
}
\makeatother
\ifluatex
\usepackage{luatex85}
\DeclareTextComposite{\d}\UnicodeEncodingName{A}{"1EA0}
\DeclareTextComposite{\d}\UnicodeEncodingName{a}{"1EA1}
\DeclareTextComposite{\d}\UnicodeEncodingName{E}{"1EB8}
\DeclareTextComposite{\d}\UnicodeEncodingName{e}{"1EB9}
\DeclareTextComposite{\d}\UnicodeEncodingName{I}{"1ECA}
\DeclareTextComposite{\d}\UnicodeEncodingName{i}{"1ECB}
\DeclareTextComposite{\d}\UnicodeEncodingName{O}{"1ECC}
\DeclareTextComposite{\d}\UnicodeEncodingName{o}{"1ECD}
\DeclareTextComposite{\d}\UnicodeEncodingName{U}{"1EE4}
\DeclareTextComposite{\d}\UnicodeEncodingName{u}{"1EE5}
\fi
\begin{document}
\d{a} \d{e} \d{i} \d{o} \d{u}
\end{document}
对于“隐藏功能”,请参阅如何在下面放置一个点,例如:e?
答案2
正如 egreg 所说,这很棘手,如果我们将其保留为默认\d
重音,那么只要字体具有 U+0303,您至少会得到某种点,但是如果我们声明复合字体,如果字体具有复合字体,您会得到一个位置更好的点,但如果没有,luatex 中会缺少一个字形,这对未对齐的点来说并不是真正的改进。如果字体具有预组合字符,xetex(harfbuzz)无论如何都会找到正确的字形。
无论如何我都需要针对报告的错误进行更新
但我不知道是否要添加一些\d
声明。我怀疑至少对于今天或明天需要进行的更新来说不需要。
Unicode 有 42 个预组合字符,其基础字符后跟 U+0303,但并非所有字体都有这些字符,因此在 tuenc 默认值中声明复合字符显然不是一个优势。
\documentclass{article}
\showoutput
\makeatletter
\input{tuenc.def}
\begin{document}
1 \d{i}
2 i^^^^0323
3 ^^^^1ecb
\end{document}
在 luatex 和 xetex 中:
看看如果所有带有拉丁字母的复合词都被声明会发生什么
\documentclass{article}
\showoutput
\makeatletter
\input{tuenc.def}
\begin{document}
x: \d{A} \char"1EA0
x: \d{B} \char"1E04
x: \d{D} \char"1E0C
x: \d{E} \char"1EB8
x: \d{H} \char"1E24
x: \d{I} \char"1ECA
x: \d{K} \char"1E32
x: \d{L} \char"1E36
x: \d{M} \char"1E42
x: \d{N} \char"1E46
x: \d{O} \char"1ECC
x: \d{R} \char"1E5A
x: \d{S} \char"1E62
x: \d{T} \char"1E6C
x: \d{U} \char"1EE4
x: \d{V} \char"1E7E
x: \d{W} \char"1E88
x: \d{Y} \char"1EF4
x: \d{Z} \char"1E92
x: \d{a} \char"1EA1
x: \d{b} \char"1E05
x: \d{d} \char"1E0D
x: \d{e} \char"1EB9
x: \d{h} \char"1E25
x: \d{i} \char"1ECB
x: \d{k} \char"1E33
x: \d{l} \char"1E37
x: \d{m} \char"1E43
x: \d{n} \char"1E47
x: \d{o} \char"1ECD
x: \d{r} \char"1E5B
x: \d{s} \char"1E63
x: \d{t} \char"1E6D
x: \d{u} \char"1EE5
x: \d{v} \char"1E7F
x: \d{w} \char"1E89
x: \d{y} \char"1EF5
x: \d{z} \char"1E93
\end{document}
如果声明了复合字符,则使用\d
指定基数的命令将等同于\char
使用复合字符,下面显示了 luatex 和 xetex 的结果。
注意 luatex 删除了一些字符,报告
Missing character: There is no Ḅ (U+1E04) in font [lmroman10-regular]:+tlig;!
Missing character: There is no Ḳ (U+1E32) in font [lmroman10-regular]:+tlig;!
Missing character: There is no Ṿ (U+1E7E) in font [lmroman10-regular]:+tlig;!
Missing character: There is no Ẉ (U+1E88) in font [lmroman10-regular]:+tlig;!
Missing character: There is no ḅ (U+1E05) in font [lmroman10-regular]:+tlig;!
Missing character: There is no ḳ (U+1E33) in font [lmroman10-regular]:+tlig;!
Missing character: There is no ṿ (U+1E7F) in font [lmroman10-regular]:+tlig;!
Missing character: There is no ẉ (U+1E89) in font [lmroman10-regular]:+tlig;!
\d
因此,这些组合只有在拉丁现代中才有效不是宣告。
请注意,可以声明\d
(或所有重音符号)来检查复合字符是否存在,如果不存在则使用组合组合,但目前这意味着每次使用时都要进行测试,因为 latex 将这些重音符号命令存储为每个编码而不是每个字体。fontspec 提供了一种声明 TU 编码变体的机制,可用于解决这个问题,但为每种字体声明自定义编码并不是很方便。
当然,另一种可能性是使用 luatex 的 harfbuzz, 这并非不可能的目标。