我使用包含pdflatex
大量 Unicode 字符的 UTF-8 输入文件来排版我的作品。其中大部分文件\usepackage[utf8]{inputenc}
在我的序言中都使用简单的,而对于其他文件,我只是维护一个很长的列表\DeclareUnicodeCharacter
。
但是,我经常将一些带有组合重音符号的文本粘贴到我的 LaTeX 文件中(这是 Mac OS X 的复制/粘贴机制的结果)。我必须规范化该文本,因为组合重音符号无法立即使用。我该如何让它们工作?(一劳永逸,例如在我的大量 Unicode 字符列表附近添加良好的定义)
最小独立示例:
\documentclass{article}
\usepackage[utf8]{inputenc}
\begin{document}
Élève
Élève
\end{document}
带重音符号的文本为:
U+00C9 É LATIN CAPITAL LETTER E WITH ACUTE
U+006C l LATIN SMALL LETTER L
U+00E8 è LATIN SMALL LETTER E WITH GRAVE
U+0076 v LATIN SMALL LETTER V
U+0065 e LATIN SMALL LETTER E
U+000A NEWLINE
U+0045 E LATIN CAPITAL LETTER E
U+0301 ́ COMBINING ACUTE ACCENT
U+006C l LATIN SMALL LETTER L
U+0065 e LATIN SMALL LETTER E
U+0300 ̀ COMBINING GRAVE ACCENT
U+0076 v LATIN SMALL LETTER V
U+0065 e LATIN SMALL LETTER E
答案1
如果您准备使用外部工具,那么 perl 脚本将为您标准化这种类型的编码。
您可以在Perl Unicode 手册作者:汤姆·克里斯滕森。
将标准前言(配方 R0)与配方 R1“通用 Unicode 智能过滤器”组合在一起(您可以删除 ... } continue {
代码部分)。将其放入文件 中normalise.pl
,通过 授予其执行权限chmod +x normalise.pl
,然后用作normalise.pl file.tex >out.tex
。
我会在这里发布这样的脚本normalise.pl
,但是根据我对食谱上的许可证的理解,这是不允许的。
答案2
简而言之,这个问题的答案是“否”。
如果您在水平列表中检测到 Unicode 组合尖音符,TeX 不会让您返回标记流cafe
,为时已晚,您无法删除e
并用重音字符替换它。在简单情况下,您可以编写一个宏,当它看到组合字符时,它会解析整个文本流并重新排序标记,但它非常脆弱,可能会破坏大多数其他软件包命令。
如果您的重音字母是 Unicode 形式 NFC 中的单个字符,那么在传递给 TeX 之前对输入进行规范化将更加稳健。
如果您使用支持 Unicode 的 tex,例如 luatex 或 xetex,那么重音组合将在字体系统中的 TeX 标记处理之下处理,类似于 ff 等连字符的处理方式,而 TeX 宏层对此没有任何控制。
答案3
如果您能够使用 LuaTeX 和 XeTeX,它们都可以处理这个问题。在少数情况下(涉及古希腊语的连字),我需要使用\usepackage{inputnormalization}
自动将 TeX 源转换为我的整个工具链都能理解的规范形式。(根据 Unicode 标准,这应该不是必需的,但并非所有字体或连字模式都符合该标准。)不幸的是,该包仅适用于 LuaTeX 或 XeTeX。
您通常要做的是将源文件转换为预编(NFC)形式。 不久前我写了一个小程序来实现这一点。
如果您必须使用传统的 8 位引擎和 Unicode 中没有预制形式的字符,则需要用 TeX 命令替换组合字符,例如\d{C}
。