我知道在 TeX 的早期,一些标准 ascii 之外的字符是由一些非常肮脏的黑客排版的。例如,在我的语言(波兰语)中,我们有一个“带有向下钩的 a”(ą)和一些类似的字符。由于早期版本的 TeX 并未涵盖它,人们过去常常在 a 上排版逗号,以创建类似的字符。
现在我开始怀疑,如果我需要输入一个法语单词,使用转义码会更容易,而不是切换键盘布局或使用符号表。但我想知道转义码是否会导致字母排版正确,或者这里是否使用了类似的肮脏黑客?
答案1
LaTeX2e 引入了输出字体编码和“LaTeX 内部字符表示”(LICR)的概念。
根据当前的字体编码,转义代码(例如\'{e}
“é”或\k{a}
“ą”)将使用组合字形或“真实”字形。
T1 字体编码包含大多数欧洲语言的字形。它定义了几种组合,这些组合在内部转换为真实字形,对用户来说是透明的。因此\k{a}
最终被翻译成指令“打印 slot 中的字形0xA1
(其中包含“ą”)。同样,\'{n}
将从 slot 打印一个真正的“ń” 0xAB
。相反,\'m
将用尖音符组成一个“m”,因为字体编码中不存在这样的字形。
如果您使用 OT1(传统)字体编码,则没有重音字符可用,因此所有字符都将由不同的部分组成。
因此答案是:说
\usepackage[T1]{fontenc}
在文档序言中,您将在大多数情况下使用真实字形,至少对于使用拉丁字母的欧洲语言而言。对于西里尔文、希腊文以及使用扩展拉丁字符集的非洲语言,都有编码。
限制在于 TeX 字体最多有 256 个字形。XeLaTeX 和 LuaLaTeX 消除了这一限制,它们使用巨大的字体编码(分别为 EU1 和 EU2),其中转义码通常指向预组合的字符,而不是由不同部分“即时”组合的字符。
t1enc.def
例如,在
\DeclareTextCommand{\k}{T1}[1]
{\hmode@bgroup\ooalign{\null#1\crcr\hidewidth\char12}\egroup}
\DeclareTextCommand{\textogonekcentered}{T1}[1]
{\hmode@bgroup\ooalign{\null#1\crcr\hidewidth\char12\hidewidth}\egroup}
定义了几种\k
在当前编码为 T1 时呈现命令的方法。然而,人们也发现
\DeclareTextComposite{\k}{T1}{A}{129}
\DeclareTextComposite{\k}{T1}{E}{134}
\DeclareTextComposite{\k}{T1}{a}{161}
\DeclareTextComposite{\k}{T1}{e}{166}
\DeclareTextCompositeCommand{\k}{T1}{o}{\textogonekcentered{o}}
\DeclareTextCompositeCommand{\k}{T1}{O}{\textogonekcentered{O}}
这确切地意味着,当编码为 T1 并且 TeX 找到\k{A}
、\k{E}
和(输入也可以是等等)时,将使用当前字体中对应位置的字形(例如 161= )。相反,和将被翻译成显示的命令。对于未定义的组合,将使用的默认定义。\k{a}
\k{e}
\k A
0xA1
\k{O}
\k{o}
\k
请注意,这与输入编码。例如,当输入编码为 UTF-8 时,如果 LaTeX 遇到ą
(U+0105),它会根据当前输出编码将该字符(实际上是几个字节)转换为,\k{a}
以便进行后续处理。相关指令可以在 中找到t1enc.dfu
:
\DeclareUnicodeCharacter{0105}{\k a}
(为节省时间,使用无括号符号)。