> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/latex/zh-cn/shen-ru-wen-zhang/01-a-new-series-of-articles-tex-tokens-and-related-concepts-but-why-and-how.md).

# 新系列文章：TeX token 及相关概念——但为什么（以及如何）？

这篇导言文章旨在解释撰写这一系列文章的原因、我希望达成的目标，并提供一些背景信息，说明如何通过观察 TeX 引擎内部运作来探索 TeX 记号所使用的技术。此文章页面还旨在收录本系列所有文章的链接，并会在每篇新文章发布时更新这些链接。

### 相关文章链接

每篇文章都会包含一组指向本系列其他文章的链接。

* [什么是“TeX 记号”？](/latex/zh-cn/shen-ru-wen-zhang/53-what-is-a-tex-token.md)
* [什么是“TeX 记号列表”？](/latex/zh-cn/shen-ru-wen-zhang/54-what-is-a-tex-token-list.md)

## 本系列文章的背景

撰写这一系列文章的动机，源于阅读关于 TeX 的资料，其中通过“记号”的概念，以及 TeX 的“记号化过程”、“记号列表”和相关概念，如“宏展开”和“可展开命令”，来解释 TeX 的许多活动。每当我遇到用“TeX 记号”来表述的 TeX 相关解释时，同样的问题总会浮现在脑海中：究竟， *是* 什么是 TeX 记号？我需要弄清楚。

第一篇文章的范围和内容， [什么是“TeX 记号”？](/latex/zh-cn/shen-ru-wen-zhang/53-what-is-a-tex-token.md)从其本质上说，正如程序员可能会说的，它非常“贴近底层”，毫无疑问，“TeX 记号”可以被归类为一个相当晦涩的话题：那为什么还要写它呢？最终，你会得出一种看法——或者，也许是一种信念上的一跃——即其他人也可能对同一主题感到困惑，而一两篇文章有空间去填补一些空白。我的目标是提供一些有用的背景说明，它们可以补充你正在阅读的其他材料，并且希望能帮助更好地理解你在学习 TeX、探索宏和编程时出现的一些关键概念。

显然，在博客文章的范围内，我们只能浅尝辄止——试图解释所有相关主题或深入最晦涩的领域，根本不现实。出于必要，我会跳过相当多的细节，并在过度简化与把类比推到极限之间谨慎拿捏。

“写你自己也愿意读到的文章”是一个有用的指导原则，而我在写这一系列文章时也努力践行了这一点。

## 提出了这个问题，那么接下来呢？

眼前的挑战很明确：你如何了解 TeX 记号？因为这些细节（记号、记号化等）都深埋在 TeX 引擎的软件代码中——其实并不真的要求你去担心它，当然，除非你确实对这些细节感兴趣。

探究这些问题的一种方法，是尝试阅读 TeX 的原始源代码 [`tex.web`](https://www.ctan.org/tex-archive/systems/knuth/dist/tex)——通过运行 [WEAVE](http://tug.org/texinfohtml/web2c.html#weave-invocation) 来提取 TeX 文档——或者购买一本 [Computers & Typesetting, Volume B: TeX: The Program](https://www.amazon.co.uk/Computers-Typesetting-TEX-Program-v/dp/0201134373)的书。我买了一本印刷版！把 TeX 的源代码以书籍形式出版当然非常有帮助，书中也有许多实用的说明。不过，Knuth 的 TeX 是用 Pascal 编写的，自然其 Pascal 源代码采用了 Knuth 的文学编程方法进行文档化——把代码以小而易读的片段呈现出来。很容易理解，Knuth 的文档方式对于像 TeX 这样复杂的软件确实很有帮助，但阅读这本书确实需要进行大量交叉引用和翻页查找。

尽管这本书很有帮助，但仅靠它对我来说还不足以更好地理解 TeX 在创建“记号”时会发生什么——这正是我特别感兴趣的主题。真正想弄清楚，只有一种办法：构建 TeX 程序，在一个小的 TeX 文件上运行它，并在 TeX 扫描和读取输入时，直观看着代码执行。用源代码构建 TeX 的细节有些晦涩——要把 Pascal 转换成 C——但下一节会有一段简短说明，并附上一个个人博客文章链接，里面会更详细地展开。

与 XeTeX 和 LuaTeX 不同——它们可以处理 UTF-8 格式的文本并支持 Unicode 文本编码——Knuth 的 TeX 是一个 8 位引擎，这意味着它假定输入字符的范围是 0 到 255。尽管这是一个重要区别，但它并不会 *实质上* 影响我们对 TeX 记号的讨论，因为我们讨论的是所有 TeX 引擎共有的主题和原理：它们正是该软件的核心。

## 你如何研究 TeX 记号？

对输入文本到 TeX 记号的路径进行拆解，对我来说是一段相当漫长的旅程——我必须承认，在这一路上，不同程度的困惑几乎一直如影随形：TeX 实在是一款极其复杂的软件。

多年来（大约从 2009 年起），我一直习惯于从源代码编译最新版本的 LuaTeX——得益于 LuaTeX 源代码分发方式极其出色，这一过程相当直接。基于那段经验，我开始对如何从源代码构建 Knuth 最初的 TeX 产生兴趣——一个 *非常* 不同的命题，因为 TeX 使用了 Knuth 的文学编程方法编写。我在 Windows 上、借助开源编译器和工具集完成的那个个人版 TeX 构建，是在 TeX Live 发行版之外进行的，属于一个独立项目。它还需要构建所需的工具链，以便将 `tex.web` 转换成一个可编译的 C 程序，然后在调试器中执行它，以查看 TeX 在处理输入字符时到底做了什么。

我使用的是 Knuth 的原版 TeX，而不是 pdfTeX、XeTeX 或 LuaTeX，因为我需要一个最接近书籍《TeX: The Program》中印刷源代码的 TeX 版本。那本书最初出版于 1986 年，尽管 TeX 自那以后经历了一些更新，但 TeX 的最新版本（3.14159265，于 2014 年 1 月发布）无疑与书中所包含的源代码足够接近。

体现了 Knuth 的文学编程方法，TeX 的源代码以一种名为 WEB 的文本格式分发：它是 TeX 文档与 Pascal 源代码的混合体。基本思路是使用两个名为 TANGLE 和 WEAVE 的工具来处理 WEB 文件，从而提取 TeX 文档或 Pascal 源代码：

* [TANGLE](http://tug.org/texinfohtml/web2c.html#tangle-invocation) 从 WEB 文件中提取 Pascal 源代码
* [WEAVE](http://tug.org/texinfohtml/web2c.html#weave-invocation) 从 WEB 文件中提取 TeX 文档

不过，在提取 Pascal 源代码之前，你必须先预处理 Knuth 的 `tex.web` 文件，以应用若干更改，使 TeX 的 Pascal 代码能够通过一个称为 Web2C 的过程转换为 C 代码。这个预处理步骤称为 *应用更改文件*.

Knuth 的原始代码文件（tex.web）绝不能以任何方式直接修改；相反，你要使用所谓的更改文件（扩展名 `.ch`）来应用你希望对主 `.web` 文件所做的修改——例如 `tex.web`。更改文件会与 Knuth 的原始源代码合并——使用一个名为 TIE 的附加工具程序——从而创建一个文件，例如 `mytex.web` ，然后你再用 TANGLE 处理它，把 Pascal 代码提取到 `mytex.pas`中。一旦你有了合适的 Pascal 源文件，就可以在 Web2C 过程的最后步骤中将其转换为一个 C 源代码文件，进而编译成可执行的 TeX 程序。如果你想了解这个相当曲折的 Web2C 转换过程，这位作者的 [个人博客网站](http://www.readytext.co.uk/?p=2529).

最终结果是一个可以使用免费且优秀的 [Eclipse IDE for C/C++](http://www.eclipse.org/home/index.php) 来逐步单步执行 TeX 的源代码（C 语言版本），并观察它在扫描输入时发生了什么。这绝对算不上最有趣的消遣，因为 C 代码是机器生成的，而且在某些地方极其难以跟踪（TeX 的源代码大量使用 GOTO 和全局变量）。尽管书中包含的是排版精美的 Pascal 代码，《TeX: The Program》这本书对于帮助你在 C 源代码中导航仍然极其重要。

为了给讨论收个尾，下面是一张示例截图，显示 TeX 通过 Eclipse IDE 执行时，程序在函数 `getnext()`上暂停——该函数位于 TeX 生成记号过程的核心。

![显示 TeX 通过 Eclipse IDE 执行的截图](/files/a011bf84cbade04b78844bf1bf942a916e4e6b20)

使用开源的 Eclipse IDE for C/C++ 逐步执行 TeX 的 C 源代码。

## 结论与致谢

撰写第一篇文章以及为系列未来的博客文章构思内容，确实花费了相当多的时间。我非常感谢 Overleaf 的 John Hammersley 和 Mary Anne Baynes 对这一系列想法的支持，以及允许我花时间进行额外的背景研究。我希望这一系列文章能够成功识别并解决普遍关心的话题，并能对读者有所帮助。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/latex/zh-cn/shen-ru-wen-zhang/01-a-new-series-of-articles-tex-tokens-and-related-concepts-but-why-and-how.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
