![为什么在同一个文档中同时使用 fontenc 和 inputenc?](https://linux22.com/image/355052/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%9C%A8%E5%90%8C%E4%B8%80%E4%B8%AA%E6%96%87%E6%A1%A3%E4%B8%AD%E5%90%8C%E6%97%B6%E4%BD%BF%E7%94%A8%20fontenc%20%E5%92%8C%20inputenc%EF%BC%9F.png)
fontenc
在同一个前导码中同时使用和有什么意义?为什么有人要指定不一致的inputenc
输入编码(带有inputenc
)和输出编码(带有)?如果它们确实一致,为什么要同时使用两者?fontenc
场景 1
当您
ä
在为 Latin-1 设置的编辑器中键入内容时,机器会存储字符编号 228。
inputenc
当 TeX 读取该文件时,它会找到字符编号 228 并将其转换为 的宏\"a
。现在
fontenc
开始行动;该命令\"
有一个与字体可用的已知重音字符相关的表,并且ä
包含在这些字符中,因此该序列\"a
转换为当前(T1 编码)字体中的命令“打印字符 228”。在这种情况下,两者是一致的。
场景 2
例如
ß
:
机器存储字符数223
将其更改
inputenc
为\ss
fontenc
将其转换为“打印字符 255”(其中 T1 编码字体有一个 ß 字符)。
在第一种情况下,指定两者有什么意义inputenc
,fontenc
如果它们一致(例如,它们都将字符编号 228 与字符串相关联)\"a
。
在第二种情况下,为什么要将字符编号 223 转换为字符编号 225?为什么不能坚持使用 223?
答案1
字体编码和输入基本没有关系。通过改变字体编码,你可以将相同的输入映射到不同的输出:
\documentclass{article}
\usepackage[LSF,LGR,T3,T1]{fontenc}
\begin{document}
K Q N
\fontencoding{LSF}\selectfont
K Q N
\fontencoding{LGR}\selectfont
K Q N
\fontencoding{T3}\selectfont
K Q N
\end{document}
为什么不只有一种编码?
pdflatex 只能处理 256 个字符的字体,因此即使您使用像 utf8 这样的大型输入编码,您也无法在字体方面使用它。
而使用 lualatex 时,您可以在两边使用“unicode”,因此对特殊字体编码的需求大大减少:unicode 并不涵盖所有可能的符号。例如,在排版国际象棋所需的符号(图形、棋盘和注释符号)中,只有大约一半实际上是 unicode。
答案2
好的,我将尝试采取与重复问题的答案不同的观点。
一份文档(假设以 UTF-8 编码保存)
\documentclass{article}
%\usepackage[utf8]{inputenc}
%\usepackage[T1]{fontenc}
\begin{document}
Söméţhìñĝ
\end{document}
这产生了
因为 tex 不解码 UTF-8 输入,并且所有重音字母都使用 127 以上的字符构成多字节序列,而默认字体编码(OT1)在这些位置没有字符,所以日志显示
Missing character: There is no � in font cmr10!
Missing character: There is no � in font cmr10!
Missing character: There is no � in font cmr10!
Missing character: There is no � in font cmr10!
Missing character: There is no � in font cmr10!
Missing character: There is no � in font cmr10!
Missing character: There is no � in font cmr10!
Missing character: There is no � in font cmr10!
Missing character: There is no � in font cmr10!
Missing character: There is no � in font cmr10!
Missing character: There is no � in font cmr10!
Missing character: There is no � in font cmr10!
请注意,缺失字符的数量与内部 UTF8 表示中的字节数有关。
如果我们使用 inputenc 来声明编码
你得到
看起来不错,但如果你的文本很长,你会发现 (a) 连字符不起作用,并且 (b) 你无法在生成的 PDF 中搜索此文本,因为字体编码 OT1 没有重音字母,ö 被呈现为"
带有重音符号的普通 o。
如果现在我们声明我们想要使用不同的字体编码,比如 T1,然后取消注释该行,那么你将得到
如果仔细观察,它会略有不同,但最重要的是它(大部分)使用字体中预先构造的字形,因此可搜索且可连字符连接。
但请注意,您仍然可以用 UTF-8 输入(数千)个字符输入与声明的字体编码(只有 256 个插槽)中的字符无关,因此根据所使用的说明,LaTeX 要么需要像对 OT1 那样“构建”某些内容,要么给出不支持该字符的错误,或者如 Ulrike 所示,您可以在同一文档中对相同的输入编码使用不同的字体编码来覆盖不同的范围。
返回原始文档将其保存为 latin1 (iso-8859-1) 编码
\documentclass{article}
%\usepackage[latin1]{inputenc}
%\usepackage[T1]{fontenc}
\begin{document}
SöméThìñG
\end{document}
请注意,尽管我可以使用上面的 7 位 OT1 tex 编码对它们进行排版,但我必须删除两个无法在该输入编码中编码的字符。
声明 latin1输入编码到 latex 让我们
但与以前一样,这是构造的字符,因此无需搜索。
如果你声明输入编码为 latin1 并且字体编码为 T1(一般来说并不相同),那么
答案3
很简单。
1. 不inputenc
,不fontenc
首先我们假设您没有加载inputenc
。
如果不加载fontenc
,则按照 OT1 编码选择字体;在输入中找到 ß 后,主要有两种情况:
- 该文件使用单字节编码(例如 Latin-1)
- 该文件使用 UTF-8
对于情况 1,您会收到消息Missing character ^^df
;对于情况 2,该消息会告诉您缺少两个字符,即^^c3
和^^df
。
2. 有inputenc
或无fontenc
如果您使用inputenc
与文件编码对应的选项加载,ß
将映射到\ss
。OT1 编码定义将选择正确的字符进行输出。另一方面,带有重音字符的单词的连字符通常是错误的或大量不完整的。对于法语和德语来说,这将是一个障碍。
3. 不inputenc
,但加载fontenc
假设您加载了\usepackage[T1]{fontenc}
并且没有inputenc
。同样,两种情况与之前类似。在 Latin-1 的情况下,ß 将打印 ý;在 UTF-8 的情况下,ß 将打印 Ãý。
4.inputenc
和fontenc
ß 将打印 ß
结论
这四个选项哪一个好?
答案4
如果我正确理解了你的最后一个问题,你问的是为什么我们不能在输入编码和字体编码的所有地方使用相同的“数字”。
简短的回答是,我们想要赋予“数字”的两个集合是不同的:
A字体是字形(形状)的集合:它描述外观。字体设计师可以把任何形状放在任何位置,但他们通常会很明智,并尽可能遵循某些惯例(其中有很多)。丰滕克,你告诉 TeX 在哪里查找它想要找到的某些形状。
你的输入是字符的集合,被 TeX 视为字节流。输入,你告诉 TeX 哪个字节(序列)您的输入对应哪些字符。
输入字符的示例:小写字母 A(看起来像a
)、空格字符、换行符、希腊字母 pi(看起来像π
)、天城文字母 ka(看起来像क
)、埃符号(看起来像Å
)、带有虚线圆圈的字母 A(看起来像Å
)。
形状示例:您可以绘制的任何东西。
它们有何不同?让我来数一数……
字体包含形状,而不是字符。
- 一种字体可能包含一个字符的多种形状(例如小写字母 a 的不同书写方式)。
- 一种字体可能包含多个字符的相同形状(例如 Å 和 Å)。
- 字体可能包含非字符的形状(例如“天城文字母क中竖线左侧的碗”)。
- 字体可能会省略字符的形状(例如换行符)。当然,任何字体都会省略最多字符并且仅支持非常有限的范围。
简而言之:没有可以赋予字符和形状的唯一“数字”,因为这两组是不同的,并且不能相互映射。
但是,在有限的情况下字体编码和输入编码可能会一致:
如果您只使用字符 A–Z、a–z、0–9(以及其他一些字符),那么输入约定确实可以同意将字母 A 放在位置 65(这称为 ASCII),并且字体约定也可以同意将其形状放在
A
位置 65。默认情况下,这已经发生,您无需指定任何内容。使用 Unicode(目前有超过 120,000 个字符),相当多的字符都被赋予了数字,并且只包含这些字符形状的字体可以同意使用相同的数字。这意味着为婆罗米文(并且包含精确对应各个字符的形状)必须将其字符放在位置 69632 到 69743 中。如此大的“位置编号”仅适用于支持 Unicode 的引擎 XeTeX 和 LuaTeX。相反,如果字体仅使用位置(例如)10 到 122,即使没有这些引擎,它也可能工作。
在所有其他(和典型)情况下,字体和字符根本就不能被赋予相同的数字。或者恰好没有被赋予相同的数字。如果您始终坚持它们必须使用“相同”的编码(无论在哪个有限的域中,这种说法都是有意义的),那么您将只能使用某些字体和某些输入编码:例如,如果您改变了输入的方式ä
,那么在您的假设世界中,您可能会突然发现自己需要使用不同的字体。这将是愚蠢的。