使用 \usepackage[utf8]{inputenc} 对 unicode 字符进行 Catcodes

使用 \usepackage[utf8]{inputenc} 对 unicode 字符进行 Catcodes

我不明白为什么这会产生错误消息......

\documentclass{article}
\usepackage[utf8]{inputenc}

\begin{document}
\catcode`ẟ=\active
\end{document}

正如所inputenc建议的,我正在使用pdflatex。*导入不应该inputenc导致ẟ表现得像任何其他字母一样吗?

*我需要的功能xelatex不支持。

答案1

TeX 不了解 unicode。对于 TeX 来说,一个字符在输入中只是 1 个字节。但 unicode 是多字节的。\usepackage[utf8]{inputenc}是一种巧妙的技巧,可以欺骗 TeX 接受这些多字节字符。

当您使用编码编写文件时utf8,文件中的每个字符都可以编码为 1、2 或 3 个字节(对于非常奇特的字母表,甚至可以编码为 4 个字节)。如果字符符合 ASCII 标准,则仅占用 1 个字节,对于 TeX 来说一切都没问题。这些字符具有形式为 的二进制代码0xxxxxxx,即第一位为零(因为 ASCII 标准仅包含最多 127 个代码)。

您在输入中使用的 unicode 字符 ẟ 在 utf8 中编码为三个字节,二进制值为:111000011011101010011111。请注意,所有这些都以位值 开头1,这是 utf8 用来表示它们不是 ASCII 而是多字节字符的“标记”。

然而,对于 TeX 来说,这三个字节只是三个字符,其代码分别为"E1"BA"9F"这是 TeX 的十六进制前缀)。它inputenc的作用基本上是使带有代码的字符成为"E1活动字符,并定义与该字符关联的命令,这样,如果该字符后面跟着字符,"BA就会发出"9FTeX 命令。\delta

我想你现在可以理解为什么不能改变 Unicode 字符的 catcode 了。

另一方面,XeTeX 或 LuaTeX 使用能够接受 32 位宽“字符”的 TeX 引擎,输入阶段将 utf8“翻译”为适当的 unicode 点,这就是 TeX“眼睛”看到的。

相关内容