正如所述TeXbook,TeX 逐字节读取文件,无论具体格式如何 —— 据我所知,这只是 IniTeX 的设置方式。
我也了解 LaTeX 只是在 IniTeX 之上构建的宏集合,在大多数 TeX 发行版中都通过文件进行描述latex.ltx
。
以上两点与我对 LaTeX 读取 UTF-8 的能力的理解不一致。我的印象是,逐字节读取输入(因此,例如,只能使用\char
或类似的东西访问 0 到 255 之间的数字)是 TeX 固有的,因此存在于在其基础上构建的所有变体中。
那么,LaTeX 是如何做到这一点的呢?
答案1
如果你想知道 8 位引擎如何处理 utf8 输入,你可以使用 \tracingmacros:
\documentclass{article}
\begin{document}
{\tracingmacros =1 ä }
\end{document}
这使
Ã->\UTFviii@two@octets Ã
\UTFviii@two@octets #1#2->\expandafter \UTFviii@defined \csname u8:#1\string #2
\endcsname
#1<-Ã
#2<-¤
\UTFviii@defined #1->\ifx #1\relax \if \relax \expandafter \UTFviii@checkseq \s
tring #1\relax \relax \UTFviii@undefined@err {#1}\else \PackageError {inputenc}
{Invalid UTF-8 byte sequence}\UTFviii@invalid@help \fi \else \expandafter #1\fi
#1<-\u8:ä
\u8:ä ->\IeC {\"a}
这意味着 的第一个字节ä
( Ã
) 是一个活动字符,然后该命令拾取下一个字节,然后调用\u8:ä
。\"a
这样 (pdf)latex 可以处理相当多的 utf8 输入,但它在“字符 + 组合重音”方面存在问题,因为没有合理的代码让组合重音返回到字符上添加重音。
答案2
为了从 8 位 TeX90 迁移到 Unicode XeTeX 或 LuaTeX,需要扩展/修改内部结构。不过,这在很大程度上是一个努力的问题,而不是任何重大的概念限制。毕竟,Knuth 在 TeX82(TeX 2)和 TeX90(TeX 3)之间将 TeX 从 7 位扩展到了 8 位。
XeTeX 和 LuaTeX 都以 UTF-8 格式读取文件,而不是按字节读取。这发生在任何与 TeX 相关的进程参与之前,因此在宏级别只有 UTF-8 字符。(可以在 LuaTeX 中更改此设置:请参阅luainputenc
例如。)然后两个引擎都使用扩展的表来覆盖完整的 Unicode 范围。
接受输入的变化可用于测试 Unicode 感知引擎,如以下示例所示https://www.contextgarden.net/Encodings_and_Regimes
\def\test#1#2!{\def\secondarg{#2}}
\test χ!\relax % That's Chi, a 2-byte utf-8 sequence
\ifx\secondarg\empty \message{newstuff}\else \message{tex82}\fi
总体而言,宏代码无需更改即可接受 Unicode:引擎处理字节方面,因此从宏的角度来看,一切都“符合预期”。当然,需要进行一些设置,例如设置\catcode
, \uccode
,ETC。适用于完整的 Unicode 范围。目前,这是通过使用unicode-data
,因此内置于纯 TeX 衍生格式和 LaTeX 格式中。
在一些地方,LaTeX 必须知道正在使用哪个引擎,但 Unicode 的直接影响主要限于
- 设置数据
\catcode
,ETC。 - 设置连字符模式(目前所有连字符都以 UTF-8 格式存储,使用 pdfTeX 比使用 Unicode TeX 引擎需要做更多工作)
- (不)设置基于活动 8 位字符的 Unicode 支持(请参阅Ulrike 的回答了解它在 8 位引擎中的工作原理)
宏层的其他方面与其他功能相关,例如 XeTeX 和 LuaTeX 加载系统字体的能力:这需要 Unicode 字体编码(TU
),但这与处理输入不同。