Xunicode 主要是为了向后兼容,提供合理的一般的旧软件包中已定义的宏定义现在应该不是与 XeTeX 一起使用。这样可以重复使用 LaTeX 源,并且不会强迫人们学习新的输入法,因为他们已经积累了使用非 XeTeX 版本的 LaTeX 的经验等。
我想知道为什么xunicode
用一种不同于自然 LaTeX 方法的方法来模拟 LaTeX 重音(见描述这里):
xunicode 接受通过传统 TeX 按键输入的字符(\'e 表示 e-acute 等),并将预组合的 Unicode 字符(U+00E9 表示 e-acute)放置在输出文件中。(换句话说,如果您的键盘支持 e-acute,那么直接输入 e-acute 或使用 TeX 按键并不重要;您仍然可以获得 Unicode 预组合字符。) 如果你使用传统 TeX 方法输入的组合在 Unicode 预制形式中不存在(例如,\vy,因为 y-caron 不是预组合),xunicode 在基本字母后插入组合标记。 我还注意到,如果我输入'e' 后跟 \char"0301,组合标记保留(即 xunicode 不会用预组合版本替换该序列。)
因此,对于某些没有预制重音字符的字体,如果e-acute
缺少该字符,则输出效果并不令人满意。
我的意思是为什么xunicode
要输出e\char"0301
而不是模拟\'{e}
命令的真正 LaTeX 定义?
答案1
除了 Ross Moore,我不确定是否有人能具体回答这个问题。我的印象是,使用最多现代字体使用组合字形。如果您不这样做,我会认为这是一个字体错误。
关于:
我还注意到,如果我输入
e
后跟\char"0301
,组合标记会保留(即 xunicode 不会用预组合版本替换该序列。)
在这种情况下,xunicode 无法合理地做任何事情——它只能控制重音宏本身。
答案2
我不同意威尔·罗伯逊的言论最多xunicode
当字体中没有预制重音符号时,现代字体会为默认使用的方法提供更好的输出[抱歉,我不知道如何调用该方法;我的意思是e\char"0301
在源文件中输入重音符号 e]。
在我的 Windows 7 中,此默认方法仅对以前版本的 Windows 中不存在的字体(特别是 Cambria、Constantia、Corbel)产生正确的重音位置。甚至 Times New Roman 和 Palatino Linotype 也会在西里尔字母上产生错误的重音。对于非 Microsoft 提供的字体,没什么可说的。Adobe Arno Pro 是非常新的字体,但它有同样的问题。
\c
而且,对于许多重音命令/字体组合( ,\b
,\r
,\d
,\v
),此默认方法不输出任何内容(或划掉的框或问号)\=
。
这两个问题都可以解决最多我目前通过调整标准 LaTeX 对 EU1 编码重音命令的定义来测试字体。这是我的代码:
\DeclareTextAccent{\`}{EU1}{"0300}
\DeclareTextAccent{\'}{EU1}{"0301}
\DeclareTextAccent{\^}{EU1}{"02C6}
\DeclareTextAccent{\~}{EU1}{"02DC}
\DeclareTextAccent{\=}{EU1}{"02C9}
\DeclareTextAccent{\u}{EU1}{"02D8}
\DeclareTextAccent{\.}{EU1}{"02D9}
\DeclareTextAccent{\"}{EU1}{"00A8}
\DeclareTextAccent{\r}{EU1}{"02DA}
\DeclareTextAccent{\H}{EU1}{"02DD}
\DeclareTextAccent{\v}{EU1}{"02C7}
\makeatletter
\DeclareTextCommand{\b}{EU1}[1]
{\hmode@bgroup\o@lign{\relax#1\crcr\hidewidth\ltx@sh@ft{-3ex}%
\vbox to.2ex{\hbox{\char"005F}\vss}\hidewidth}\egroup}
\DeclareTextCommand{\c}{EU1}[1]
{\leavevmode\setbox\z@\hbox{#1}\ifdim\ht\z@=1ex\accent11 #1%
\else{\ooalign{\unhbox\z@\crcr
\hidewidth\char"00B8\hidewidth}}\fi}
\DeclareTextCommand{\d}{EU1}[1]
{\hmode@bgroup
\o@lign{\relax#1\crcr\hidewidth\ltx@sh@ft{-1ex}.\hidewidth}\egroup}
\DeclareTextCommand{\k}{EU1}[1]
{\hmode@bgroup\ooalign{\null#1\crcr\hidewidth\char"02DB}\egroup}
\DeclareTextCommand{\textogonekcentered}{EU1}[1]
{\hmode@bgroup\ooalign{\null#1\crcr\hidewidth\char"02DB\hidewidth}\egroup}
\makeatother
再次,Arno Pro 超出了常见范围:如上所述的“and \”对于该字体失败,因为“and”分别位于插槽 0060 和 00B4。
答案3
一个简单但现实的问题是,例如,并非每种字体都有重音字母。假设我们要排版 pdfTeX 的作者 Hàn Thế Thành 的名字:很少有字体有符号 ế (U+1EBF),而且在大多数键盘上很难输入。而且,xunicode
无法很好地处理双重音。我想使用\'{\^e}
或\'{ê}
,但两者都失败了,即使字体中有 ế 字形。
测试代码:
\documentclass{article}
\usepackage{fontspec}
\begin{document}
Latin Modern: {\LARGE \'{\^e}, \'{ê}, ế}
\fontspec{XITS}
XITS: {\LARGE \'{\^e}, \'{ê}, (ế)}
\fontspec{Minion Pro}
Minion Pro: {\LARGE \'{\^e}, \'{ê}, ế}
\end{document}
那么可以xunicode
做什么呢?我认为可以使用进行测试\iffontchar
。然后xunicode
可以决定使用哪种方法:单个字形或组合字形。