为什么 xunicode 不提供真正的向后兼容性?

为什么 xunicode 不提供真正的向后兼容性?

正如xetex 邮件列表

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]。

  1. 在我的 Windows 7 中,此默认方法仅对以前版本的 Windows 中不存在的字体(特别是 Cambria、Constantia、Corbel)产生正确的重音位置。甚至 Times New Roman 和 Palatino Linotype 也会在西里尔字母上产生错误的重音。对于非 Microsoft 提供的字体,没什么可说的。Adobe Arno Pro 是非常新的字体,但它有同样的问题。

  2. \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可以决定使用哪种方法:单个字形或组合字形。

相关内容