有什么理由使用 inputenc 吗?

有什么理由使用 inputenc 吗?

我的 LaTeX 文本编辑器是 GNU Emacs 25.1.1,它以 UTF-8 编码文本文件。有什么理由指定

\usepackage[utf8]{inputenc}

在序言中?即使我迁移到安装了不同 TeX 的另一台计算机,如果我省略此行,迁移的 LaTeX 文件是否会被误解?

答案1

截至 2018 年 4 月更新:

自 2018 年 4 月起,社区已将其默认编码更改为 UTF-8(请参阅https://tug.org/TUGboat/tb39-1/tb121ltnews28.pdf)。因此,关于 LuaTeX 或 XeTeX 的评论现在适用于所有编译器:

\usepackage[utf8]{inputenc}可以省略,因为它基本上不做任何事情

原始答案:

基本的 LaTeX/TeX 引擎需要(或者可能旨在处理)纯ASCII输入。每当您的文件使用任何其他字符时,该inputenc包就会提供帮助,并向引擎指定如何处理您输入的符号。

ASCII因此,每当您使用 unicode(非)字符时,使用该包是非常必要的,inputenc以便获得有意义的输出(或者有时成功运行 (La)TeX)

不同之处在于“自然符合 UTF8”的引擎,例如 LuaTeX 和 XeTeX,它们会自动将输入文件解释为并且UTF8不会接受不同的输入编码:在这种情况下\usepackage[utf8]{inputenc}可以省略,因为它基本上不执行任何操作(并且无论如何也不会在内部使用)

换句话说,程序不会检查文件字符是否符合 ASCII 标准,它们只是将其解释为符合 ASCII 标准。

答案2

使用 2018 年发布的 LaTeX,下面的测试文件生成

在此处输入图片描述

因为 UTF-8 被视为默认输入编码,除非您指定不同的编码,inputenc并且文件开头的 BOM 被妥善处理(在这种情况下被忽略)。


原始答案

注释掉 inputenc 后我得到了

在此处输入图片描述

尽管在 emacs 中输入。

\documentclass{article}

\usepackage[T1]{fontenc}
%\usepackage[utf8]{inputenc}

\begin{document}

© David Carlisle and cost £2000.
\end{document}

因为似乎有一些关于 BOM 的讨论..

如果上述文件在保存时带有字节顺序标记(或任何可打印字符),则会\documentclass出现错误

! LaTeX Error: Missing \begin{document}.

但这不是 TeX 引擎内置的,它只是字符的默认设置,可以根据您调用 LaTeX 的方式进行更改

命令行

pdflatex '\catcode"EF=9\catcode"BB=9\catcode"BF=9 \input' testfile

会声明 BOM 是安全的,然后 latex 会无错误地处理文件,并给出与上面相同的错误输出。BOM 的存在绝不意味着系统采用 UTF-8 编码。

答案3

这里有一些例子来明确一些细节(隐含在其他答案中),这可能有助于消除任何剩余的困惑。

añ©ⱥ考虑以下由以下内容组成的Unicode 文本:

字节是十进制中 0 到 255 之间的数字,十六进制中00为 到 之间的FF数字。因此,当使用 UTF-8 编码时,上述“四个字符”的字符串在文件中对应于 8 个字节61 C3 B1 C2 A9 E2 B1 A5

tex/pdftex 不带输入enc

引擎将输入视为字节流(上例中为 8 个字节)。它将每个字节视为一个字符,并决定从以下任一位置排版相应的字符:T1(Cork)编码或 OT1 编码(默认)或任何已设置的编码。示例:

OT1 上面,OT1 没有这些字节的字符,因此没有排版。 T1 我希望你能看到发生了什么:8 个字节中的每一个都被视为一个字符并输出:例如字节C3是“ÔT1

tex/pdftex 与 inputenc

使用\usepackage[utf8]{inputenc},TeX 可以正确地将每个 UTF-8 字节序列视为 Unicode 字符。例如,当 TeX 看到字节序列 时C3 B1,它会理解您指的是 Unicode 字符 U+00F1。(这样做的方法是将大于 127(十六进制80为 到FF)的字节设置为需要进一步输入的活动字符 — 这是由于 UTF-8 的有用设计而实现的。请参阅texdoc utf8ienc了解详情。

TeX 仍然需要知道如何处理该 Unicode 字符。TeX 发行版( TeX Live 上的文件)中包含大量定义(例如\DeclareUnicodeCharacter{00F1}{\~n}说明如何处理字符 U+00F1) 。因此使用将有助于texmf-dist/tex/latex/base/utf8.def\usepackage[utf8]{inputenc}如果你的角色有这样的定义(再次,见texdoc utf8ienc完整列表),或者你愿意自己定义它们。

输入

使用支持 Unicode 的引擎(XeTeX 或 LuaTeX)

您不需要 inputenc。引擎将默认使用 UTF-8,并将输入简单地理解为 Unicode 字符,并且对于每个字符,它只是根据当前选定的字体排版该字符。

西特克斯

BOM 怎么样?

使用 UTF-8 时,BOM(字节顺序标记)是不需要的(它是为非面向字节的编码而设计的,如 UTF-16 和 UTF-32),并且强烈不建议使用。典型的“优秀”编辑器不会包含它。忘掉它吧;你在实践中不太可能遇到它。

但是如果您的文件最终以某种方式包含了它,那么它只是一个字节序列EF BB BF(U + FEFF 的 UTF-8 编码),并且我认为您拥有足够的上述信息来计算出如果这些字节出现在文件的什么位置会发生什么。

如果我的文件只包含“普通”字符怎么办?

如果您指的是没有重音符号的拉丁字母字符,那么 UTF-8 具有与 ASCII 在 0 到 127(007F)范围内一致的属性。因此,仅包含这些字符的文件(以 UTF-8 编码)与以 ASCII 编码的文件没有区别。当然,输出也相同。

答案4

TeX 引擎有两种类型:一种需要 UTF-8(例如 LuaTeX 和 XeTeX),另一种不需要(例如 pdftex)。

如果 TeX 引擎需要 UTF-8,并且输入的是 UTF-8 编码的 .tex 文件,则\usepackage[utf8]{inputenc}可以省略该命令。事实上,如果不是,则会发出警告。

如果 TeX 引擎不接受 UTF-8,且 TeX 文件包含非 ASCII 字符,且文件不包含合适的inputenc命令,则可能会产生奇怪的输出,如下所示大卫的回答

相关内容