> For the complete documentation index, see [llms.txt](https://ayakaleaf-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://ayakaleaf-pro.ayaka.space/latex/zh-cn/geng-duo-zhu-ti/01-a-six-part-series-how-do-tex-macros-actually-work.md).

# 六篇系列文章：TeX 宏究竟如何工作？

## 关于本系列

本系列文章有一个雄心勃勃的目标：逐步解释， *如何* TeX 宏，例如 LaTeX 命令，实际上是如何工作的——通过探究 TeX 引擎软件内部发生的过程。它试图讲述 TeX 的处理行为：

* 读取输入字符并使用类别码；
* 生成字符和命令标记——以及 TeX 使用的公式；
* TeX 如何识别并随后处理 TeX 命令；
* 将宏定义和宏参数以标记列表的形式存储的内部细节——使用由 TeX 内部数据生成的图形；
* 并以探讨宏展开 *实际上* 的含义作结——使用来自 TeX 引擎内部的真实数据。

然而，由于 TeX 引擎是极其复杂的软件程序，我们不可能涵盖一切，但我们已尽力涉及 TeX 宏处理能力中最重要、最核心的特性。

#### 导航栏

每篇文章在正文前后都有以下导航栏，以便你能快速跳转到系列中的另一篇文章：

[第 1 部分](https://www.overleaf.com/learn/latex/Understanding_TeX_macros:_Part_1?preview=true) [第 2 部分](https://www.overleaf.com/learn/latex/Understanding_TeX_macros:_Part_2?preview=true) [第 3 部分](https://www.overleaf.com/learn/latex/Understanding_TeX_macros:_Part_3?preview=true) [第 4 部分](https://www.overleaf.com/learn/latex/Understanding_TeX_macros:_Part_4?preview=true) [第 5 部分](https://www.overleaf.com/learn/latex/Understanding_TeX_macros:_Part_5?preview=true) [第 6 部分](https://www.overleaf.com/learn/latex/Understanding_TeX_macros:_Part_6?preview=true)

### 第 1 部分：类别码

本文考察了 TeX 类别码概念背后的原因：它们是什么，以及 TeX 如何使用它们将输入过滤成用于排版的内容和要执行的命令。

### 第 2 部分：透过 TeX 的“眼睛”读取输入

通过一系列图示，我们使用一个经久不衰的类比，把 TeX 想象成拥有能够读取（扫描）输入的“眼睛”。我们探讨 TeX 使用类别码创建字符标记的示例，以及 TeX 如何借助类别码 0（“转义字符”）识别并处理命令。

### 第 3 部分：从输入文本到命令

本文深入探讨 TeX 如何识别并处理在输入中检测到的命令。我们研究 TeX 如何存储和检索有关命令的信息：命令代码、命令修饰符，并考察一些 TeX 用来存储从输入中读入项目的信息的内部变量。本文的一些内容相当底层，首次阅读时可以跳过。

### 第 4 部分：宏的结构

我们引入并使用以下用于描述宏结构的“框架”：

```
<TeX 宏原语><宏名><参数文本>{<替换文本>}
```

然后我们通过一系列示例来探讨宏的 `<参数文本>` 作为一个“标记模板”，它可以通过使用充当 *分隔符*.

### 第 5 部分：标记列表与 TeX 的内部宏存储

本文详细探讨 TeX 如何使用标记列表来存储宏定义。借助用特别修改过的 TeX 版本生成的大量图示，我们探究 TeX 用来识别并处理用户宏参数的专门标记。

### 第 6 部分：宏展开与处理

在第 6 部分中，我们使用一些详细图示来解释并探讨宏展开的确切含义，以及在将宏参数送入宏的 . 之前，TeX 对它们进行标记化所带来的后果。

## 一则简短说明：使用“TeX”而不是 LaTeX

正如在文章中所讨论的 [《名字里有什么：TeX 的多种“风味”指南》](/latex/zh-cn/shen-du-wen-zhang/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) 有大量术语被用来指代/描述 TeX、LaTeX 及其衍生物。因此，简要澄清我们在本系列语境中对“TeX”的使用/含义是值得的。

“TeX”有点令人困惑，因为它既是一个可执行程序的名称，也是一个排版语言的名称。为了区分这两者，术语 *TeX 引擎* 用于区分可执行的 TeX 程序和排版语言。本系列中使用的某些特定数据、信息和细节来自对 Knuth 原始 TeX 软件源代码的详细考察，但所描述的原理适用于所有 TeX 引擎。因此，在我们的讨论中，“TeX”的用法应理解为指某一种可执行的 TeX 引擎——例如 Knuth 原始的 TeX、pdfTeX、XeTeX 或 LuaTeX。

在这些文章中，我们使用 TeX 原语命令 `\def` 来定义我们的宏示例：我们不使用 LaTeX 命令 `\newcommand` 这几乎肯定是大多数 Overleaf 用户更熟悉的做法。这样做有充分的理由：我们的目标是理解 TeX 宏行为背后的基本原理，但要做到这一点，我们需要使用 TeX 软件内置的核心命令（原语）。像 `\newcommand`，这样的 LaTeX 命令本身就是宏：具有特定程序化行为的命令，并且最终由更低层次的 TeX 原始命令层层构建而成。为了更好地理解 TeX 的基本行为，我们必须使用 TeX 原语，而不是 LaTeX 宏。

## 示例和图示

除了仅依赖一套旨在展示 TeX 各种特性、边界情况和行为的示例宏之外，我们还使用大量图形来深入 TeX 内部，看看 *如何* 和 *为什么* 它的宏处理为何以这样的方式工作。许多图形（标记列表/节点图）是使用 Knuth 原始 TeX 的一个特别修改版本制作的。

Overleaf 对 Knuth 的 TeX 进行了改造，添加了用 C 编写的额外代码，这些代码“接入” TeX 的宏处理并探索通常对用户不可访问的数据和数据结构。每次调用宏时，经过修改的 TeX 引擎都会生成额外的输出文件，其中包含可通过以下程序处理的数据格式： [Graphviz](https://www.graphviz.org/)，一款开源的图形可视化程序。最终结果是图形（节点列表图），它们准确展示了 TeX 如何存储宏定义，以及用户在调用宏时提供的任何参数的图形表示。

出于必要，本系列的目标要求讨论广泛的主题，其中许多相当底层，而且起初可能看起来与排版文档的任务相距甚远。希望在深入阅读后，你能建立起更扎实的基础，从而更好地理解，最终也会为你节省大量时间，或许还能减轻挫败感。我们也希望本系列随附的特别生成的图形，能为任何致力于更好理解 TeX 宏的读者提供独特而有价值的见解，帮助并支持他们的探索。

## Overleaf 定制版 TeX

视频简要演示了 Overleaf 修改版 TeX，它被改造成生成 Graphviz 节点图（`.gv` 文件）——TeX 行为的其他方面都不受这些更改影响。 `.gv` 文件包含 TeX 标记列表的表示，这些标记列表用于存储宏定义和宏参数。Graphviz 可视化结果会导出为 SVG，然后导入到 [Inkscape](https://inkscape.org/) 中进行进一步标注，然后再将该图形纳入文章。

{% embed url="<https://videos.ctfassets.net/nrgyaltdicpt/40EAwKxZnNwgxwe9SpAwNY/5bce5de21509f3324bc50527ec6815e7/texdemo.mp4>" %}


---

# 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://ayakaleaf-pro.ayaka.space/latex/zh-cn/geng-duo-zhu-ti/01-a-six-part-series-how-do-tex-macros-actually-work.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.
