![奇怪的字符变化(Xe(La)TeX 或 pdf(La)TeX,无关紧要)](https://linux22.com/image/281140/%E5%A5%87%E6%80%AA%E7%9A%84%E5%AD%97%E7%AC%A6%E5%8F%98%E5%8C%96%EF%BC%88Xe(La)TeX%20%E6%88%96%20pdf(La)TeX%EF%BC%8C%E6%97%A0%E5%85%B3%E7%B4%A7%E8%A6%81%EF%BC%89.png)
我的一个朋友和我一样,也使用 pdfLaTeX 来记录她的大学笔记。她使用 inputenc 软件包,因为在她的 Windows 上,它可以正确排版带有变音符号的字符,例如 è 或 ò,而无需输入 `e 或 `o。我不使用 inputenc,因为在我的 Mac 上,它会生成“键盘字符未设置为用于 LaTeX”或类似的东西。所以第一个问题是:为什么会有这种差异?第二个问题是:为什么如果她给我发送一份 tex 文档,我看到的是 √® 而不是“è”,√≤ 而不是“ò”?最后,pdfTeX 排版为带有变音符号的原始字符:为什么?它不应该像 XeTeX 那样排版为输入的内容吗?
答案1
这是编码问题。从您提供的示例(即:您的朋友写道è
),è
可以看出,您的朋友使用的编辑器以 UTF-8 编码保存文本,而您使用的编辑器使用 MAC-ROMAN 编码。
让我进一步详细阐述一下。
编辑器和编码
您(或您的朋友)在编辑器中输入的每个字符都必须编码为字节序列,以将其存储在文件中。写入文件中的特定字节序列取决于编辑器。
所有编辑器都同意使用一组称为 ASCII 的字符,其中字符和字节之间的映射是一个标准(您可以找到一个包含此集合中所有字符及其代码的表格这里例如)。TeX 也理解这个标准,所以只要你编写的文件只使用这个集合中的字符,所有的编辑器都会同意向用户显示的内容,而且 (La)TeX 也会毫无问题地处理它。
不幸的是,ASCII estandard 不包含重音字母和其他非英语字符的代码。TeX 包含一些简写来引入这些符号,通过 ASCII 字符序列,例如 \`e。
但是,大多数操作系统和编辑器都允许您直接键入字母(前提是您的键盘有无重音键),并显示è
,这更方便。问题是当必须将此字符存储在磁盘上时。由于字符 没有 ASCII 代码è
,因此必须使用另一种编码。编码是字符和二进制代码之间的映射,就像 ASCII 一样。有很多替代编码,其中包括“utf-8”和“mac-roman”。每个编码都对 使用了不同的位序列è
,这解释了为什么您和您的朋友在编辑器中看不到相同的字母。
具体来说,UTF-8 使用两个字节来表示è
。这些字节的具体值(十六进制)是c3
和a8
。您的编辑器改用 Mac-Roman,并且此编码对每个字符使用单个字节,因此这两个字节显示为两个字符。具体来说,您可以看到这里这些字节的解释如下:c3
= √
,a8
= ®
,这当然解释了为什么您会看到√®
。
输入
默认情况下,TeX 仅理解 ASCII 字符集,而在 ASCII 中,所有代码都低于值80
(十六进制),因为 ASCII 仅使用 7 位。因此,TeX 决定忽略从源中读取的所有代码大于或等于 的字节80
。具体来说,它将忽略c3
和a8
,然后è
不会显示在输出中。
您需要明确要求 TeX 不要忽略这些字符,此外,您还需要告诉 TeX 您的编辑器使用的是哪种编码。换句话说,当 TeX 找到序列c3
,时a8
,他应该生成字符è
还是生成字符?除非您告诉他您的编辑器使用的是 UTF-8(因此 TeX 将生成)或 Mac-Roman(因此 TeX 将生成),√®
否则 TeX 无法决定。è
è
这就是包inputenc
的用途。加载此包会告诉 TeX 保存文件的编辑器使用的编码,以便 TeX 可以正确呈现其内容。
所以?
现在你应该能够理解你面临的两个不同的问题以及它们的解决方案了:
您必须告诉 TeX 文件的编码是“utf8”。您可以使用 来做到这一点
\usepackage[utf8]{inputenc}
。假设这行已经存在于您的朋友生成的文件中。否则,他在编译文档时也会生成错误的 PDF。您希望在编辑器中看到
è
而不是。对于此问题,您有两种解决方案:√®
告诉你的编辑器他应该使用 utf-8 而不是 Mac-Roman。我无法告诉你如何做到这一点,因为我不知道你使用的是哪个编辑器,但任何像样的编辑器都应该允许你指定你想要的任何编码。这是首选解决方案,因为这样你和你的朋友将使用相同的编码,这也将是指定的编码
inputenc
。将朋友发来的文件重新编码为 Mac-Roman 编码。您可以使用或等工具来
iconv
执行recode
此操作。但这是一个糟糕的解决方案,因为您还必须更改inputenc
以指定新的编码(否则 TeX 将呈现错误的字符)。
特克斯
XeTeX 和 LuaTeX 原生使用 utf-8。这意味着它们希望源文件使用 utf-8 来编码任何非 ascii 字符。所以inputenc
没有必要。
但这也意味着 XeTeX 和 LuaTeX不允许任何其他编码。特别是他们不允许使用 Mac-Roman 编码。因此,要使用 XeTeX,您必须将编辑器配置为以 utf-8 格式保存。这又将我们引向了相同的“最佳解决方案”(在这种情况下是唯一的解决方案)。
你的问题
我不使用 inputenc,因为在我的 Mac 上它会生成“键盘字符未设置为用于 LaTeX”或类似的东西。所以第一个问题是:为什么会有这种差异?
假设您在 Mac 中使用了\usepackage[utf8]{inputenc}
,复制了朋友的文件。但随后您使用è
Mac-Roman 编写并保存了文件,而这并不是 中声明的编码inputenc
。因此 TeX 会报错,或者字符错误。
特别是,当你编写è
编辑器保存一个字节的值时8f
(正如可以看到的那样这里)。但该值不是有效的 utf-8 序列,因此出现 TeX 错误。
有趣的事实:如果您随意保存了有效的 utf-8 序列(例如,如果您输入公式$√∂$
),TeX 不会抱怨,但您会得到意想不到的结果(ö
)。此特定输入(√∂
)在 Mac-Roman 中由序列编码c3
,b6
该序列随意是有效的 utf8 并代表ö
。
第二个问题是:为什么当她向我发送一份 tex 文档时,我会看到 √® 而不是“è”,并且看到 √≤ 而不是“ò”?
我希望这个问题已经得到解答了。
最后,使用 pdfTeX 将原始字符排版为带有变音符号:为什么?
因为文件包含\usepackage[utf8]{inputenc}
,并且确实包含 utf8 代码。尽管您的编辑器会错误地显示这些字符,因为它会忽略文件是 utf8,但 TeX 会根据inputenc
声明正确显示它们。
它不应该像 XeTeX 那样排版吗?
pdfTeX、XeTeX 和编辑器都不知道“输入了什么”。它们只知道“保存了什么”,要解释这一点,它们需要知道保存时的编码。XeTeX 盲目地假设它是 utf-8。pdfTeX 从声明中获取信息inputenc
。编辑器需要用户设置正确的设置。