使用 LuaLaTeX 放置点下重音符:根据文本字体的不同会有显著差异

使用 LuaLaTeX 放置点下重音符:根据文本字体的不同会有显著差异

根据使用的是 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

目前发生的情况是,\dTU 编码中没有声明任何复合词,因此\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)无论如何都会找到正确的字形。

无论如何我都需要针对报告的错误进行更新

如何在下面放置一个点,例如:e?

但我不知道是否要添加一些\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, 这并非不可能的目标

相关内容