(La)TeX 如何读取 UTF-8?

(La)TeX 如何读取 UTF-8?

正如所述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 的直接影响主要限于

  • 设置数据\catcodeETC。
  • 设置连字符模式(目前所有连字符都以 UTF-8 格式存储,使用 pdfTeX 比使用 Unicode TeX 引擎需要做更多工作)
  • (不)设置基于活动 8 位字符的 Unicode 支持(请参阅Ulrike 的回答了解它在 8 位引擎中的工作原理)

宏层的其他方面与其他功能相关,例如 XeTeX 和 LuaTeX 加载系统字体的能力:这需要 Unicode 字体编码(TU),但这与处理输入不同。

相关内容