fontenc 与 inputenc

fontenc 与 inputenc

我似乎不明白。所以我来自瑞士德语区,自然而然地,当我写德语文本时,我经常需要 ä ü ö。因此,在 LaTeX 中,我可以选择通过

"a "u "o

这不太舒服,或者我可以使用额外的包。现在混乱开始了。我可以使用

\usepackage[T1]{fontenc}

或者

\usepackage[latin1]{inputenc}

因此,现在如果我创建一个新文档并将其保存为 latin-1 编码的 .tex 文件,似乎无论我选择哪个选项,它们都可以正常工作。现在我为什么要选择其中一个或同时使用两者?可能会出现哪些问题(如果我在另一个操作系统上使用相同的 .tex 文件,是否会出现这些问题,具体取决于我选择的选项?)?

如果我将 .tex 编码保存为 mac os latin,则第一个选项可以编译,但会显示错误的 ä ü ö 字符。那么是不是就像 latex 根据 latin1 将 ä 映射到一个字符,并且由于文档的编码与 latin1 不同,因此再次被编码为不同的内容?

因此,如果最后两段令人困惑(主要是因为我感到困惑),那么主要问题是:fontenc 能做什么,而 inputenc 不能做什么,反之亦然?

答案1

这两个包解决的是不同的问题。

  1. inputenc允许用户输入直接从键盘输入重音字符;

  2. fontenc面向输出,即打印字符时使用什么字体。

尽管最好fontenc先调用,然后再调用,但这两个包没有关联inputenc

选择\usepackage[T1]{fontenc}一种输出字体编码,该编码支持最广泛使用的欧洲语言(德语、法语、意大利语、波兰语和其他语言)使用的重音字符,这很重要,因为否则 TeX 将无法正确地对包含重音字母的单词进行连字。

\usepackage[<encoding>]{inputenc}可以直接输入重音符号和其他字符。重要的是它<encoding>与文件写入时的编码相匹配,这取决于您的操作系统和文本编辑器的设置。

如果仅调用

\usepackage[T1]{fontenc}

如果你似乎得到了正确的输出,那么你的文件可能用 Latin-1 (也称为 ISO 8859-1) 编码,但要注意对应关系不是完整:例如,输入ß输出SS中的内容,这显然是不正确的。因此,您的编辑器可能设置为 Latin-1,因此正确的调用应该是

\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}

这些包是如何工作的呢?让我们针对这两种编码和字符来做个例子ä

首先必须记住 TeX 知道没有什么关于文件编码:它真正看到的只是字符编号。

  1. 当您ä在为 Latin-1 设置的编辑器中键入内容时,机器会存储字符编号 228。

  2. inputenc当 TeX 读取该文件时,它会找到字符编号 228 并将其转换为 的宏\"a

  3. 现在fontenc开始行动;该命令\"有一个与字体可用的已知重音字符相关的表,并且ä包含在这些字符中,因此该序列\"a转换为当前(T1 编码)字体中的命令“打印字符 228”。

在这种情况下,两者是一致的。但以下情况则不然ß

  1. 机器存储字符数223

  2. 将其更改inputenc\ss

  3. fontenc将其转换为“打印字符 255”(其中 T1 编码字体有一个 ß 字符)。

UTF-8

当使用 时,情况会有所不同\usepackage[utf8]{inputenc}(当然,文件是 UTF-8 编码的)。当文本编辑器显示ä或 时ß,文件实际上包含两个字节序列,分别是<C3><A4><C3><9F>

第一个字节是字首其中包含一些信息,主要信息是它引入了一个双字节字符。现在inputenc使所有合法前缀都处于活动状态,因此<C3>其行为类似于宏;其定义是查看下一个字符,然后根据 Unicode 规则解释整个字符对并将其转换为相应的代码点,分别为 U+00E4 和 U+00DF。

其他前缀宣布三或四个字节的组合,但行为基本相同:不是多一个字符,而是吸收另外两个或三个字符并转换为代码点。

ot1enc.dfu我们发现t1enc.dfu

\DeclareUnicodeCharacter{00DF}{\ss}

\DeclareUnicodeCharacter{00E4}{\"a}

哦,等等!还有别的!是的,在这种情况下inputenc会与fontenc(对于其他输入编码则不会):对于每个加载的编码,在文档启动之前都会读取相应的文件(Unicode 定义)。这就是为什么我更喜欢始终先加载(尽管不是必需的)的.dfu原因。fontencinputenc

这些声明提供了必要的设置:组合<C3><A4>和分别<C3><9F>转换成\"a和,\ss并且从现在开始一切都按描述的进行工作latin1

警告

这是另一个有时会出现的问题(见可用字符 iso-8859-1)。Latin-1 编码在位置0xA5(十进制 165) 处提供了日元字符。根据上面的描述,选项latin1定义inputenc\textyen此字符的翻译,但 T1 输出编码没有为此字符保留位置,因此输入¥会导致运行时 LaTeX 错误。必须加载一个提供 默认输出的包\textyen,例如textcomp。输入编码也一样utf8

只有输出编码涵盖的字符或根据输出编码给出合适渲染的字符才可以安全输入。

答案2

是的,你搞糊涂了。你应该使用两个都带有 或 的包采用与或pdflatex不同的方法。xelatexlualatex

pdflatex

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

xelatex

\usepackage{fontspec}
\defaultfontfeatures{Ligatures=TeX}

lualatex

\usepackage{luatextra}
\defaultfontfeatures{Ligatures=TeX}

或者在完整文档中:

\documentclass[a4paper]{scrartcl}
\usepackage[ngerman]{babel}
\usepackage{iftex}
\ifPDFTeX
   \usepackage[utf8]{inputenc}
   \usepackage[T1]{fontenc}
   \usepackage{lmodern}
\else
   \ifXeTeX
     \usepackage{fontspec}
   \else 
     \usepackage{luatextra}
   \fi
   \defaultfontfeatures{Ligatures=TeX}
\fi
\usepackage{blindtext}
\begin{document}
äöüßÄÖÜ

\blindtext
\end{document}

这假设您的输入是utf8,但无论如何您都应该这样做。毕竟现在是 2012 年了。

也可以看看:

答案3

inputenc如果输入文件不是 ascii,则需要指定其使用的字符编码。例如 latin1(或者更通用、更现代的 utf8)。

fontenc指定字体中使用的编码。这(或多或少)与输入编码无关。传统 TeX 使用特定于 Tex 的字体编码,例如适用于“latin1”语言的 8 位字体的“T1”。

从概念上讲,输入和字体编码是完全独立的,但它们是相关的,因为您需要一种包含所需语言字符的字体编码,并且(遗憾的是)由于 TeX 的工作方式,用于在文档中连字的连字模式与字体编码相关。

答案4

要理解这一点,你需要意识到 TeX 是一个“翻译器”,它将输入(你写的文本)翻译成输出(PDF 或 PS 文件)。因此,输入的编码和输出的编码是两个完全不同的东西。

inputenc告诉 TeX 文件的编码.tex。可以是latin1utf8、 或koi8r,或其他任何编码。这是您在用于编写文本的编辑器中设置的编码。

fontenc告诉 TeX 你想要哪种编码输出文件。它主要影响连字符之类的东西。这取决于您选择的字体,因为名称。

相关内容