> 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/39-mltex-enctex-and-synctex-tex-extensions.md).

# MLTeX、EncTeX 和 SyncTeX 的 TeX 扩展

## 关于 TeX 扩展的一些背景信息

TeX 有着悠久的发展历史——如今已超过 40 年！在这段时间里，人们开发出了 TeX 的新“版本”——例如 e-TeX、pdfTeX、XeTeX、LuaTeX 等等。除了带有一整套附加功能的全新引擎之外，还有各种 *扩展* 它们通常侧重于实现某个特定功能，以增强 Knuth 的原始软件。

随着 XeTeX 和 LuaTeX 等现代 TeX 引擎的出现，一些传统 TeX 扩展的需求和使用已逐渐减少，因为较新的 TeX 引擎带来了强大的附加功能——例如对 UTF-8 编码文本的内置支持。本页的目的是提供一些关于扩展的说明，包括 MLTeX 和 EncTeX，你在 [TeX 引擎的命令行选项](/latex/zh-cn/geng-duo-zhu-ti/44-tex-engine-command-line-options-for-pdftex-xetex-and-luatex.md)。MLTeX 和 EncTeX 都已不再继续开发，但一个非常有用的扩展 SyncTeX 仍在积极开发中，并受到 Overleaf 支持。

## MLTeX

*多语言 TeX*，或称 MLTeX，是在 1992–1995 年间开发的，它是对 TeX 的一种修改，使其能够使用普通的 Computer Modern（CM）字体对带重音字母的单词进行断字。

### 激活（启用）MLTeX

MLTeX 被设计为作为所谓的 `.fmt` （格式文件）的一部分运行，它实际上是一组 TeX 宏的预编译二进制版本。要创建格式文件，你需要将 TeX 引擎置于其所谓的 `INI` 模式，处理宏集合，然后发出 `\dump` 命令以写出 `.fmt` 文件。参见 [这篇文章](/latex/zh-cn/shen-du-wen-zhang/50-the-two-modes-of-tex-engines-ini-mode-and-production-mode.md) 以了解有关 INI 模式的讨论。

要启用 MLTeX， *对于支持它的引擎*，例如 pdfTeX，你可以写

```
pdftex -ini -mltex *pdfetex.ini
```

其中 `pdfetex.ini` 是 TeX Live 发行版中包含的一个文件。

**为什么要用星号（`*`)?** 星号会将 pdfTeX 置于所谓的“扩展模式”，从而启用对 e-TeX 原语的支持。如果你省略它并输入 `pdftex -ini -mltex pdfetex.ini` 你将会收到一个错误：

```
This is pdfTeX, Version 3.14159265-2.6-1.40.19 (INITEX)
 \write18 enabled.
MLTeX v2.2 enabled
(c:/texmf-dist/tex/plain/config/pdfetex.ini
(c:/texmf-dist/tex/generic/tex-ini-files/pdftexconfig.tex)
(c:/texmf-dist/tex/plain/etex/etex.src

! e-TeX  fatal error: this file can be processed only in extended mode;
  你是不是忘了星号？
```

**注意**：你也可以使用 `-etex` 命令行选项来启用“扩展模式”：

```
pdftex -ini -etex -mltex pdfetex.ini
```

**注意**：使用 `-mltex` 选项在命令行中配合 `.fmt` 一个曾 *未生成* 在启用 MLTeX 的情况下生成的文件将 *不* 起作用：必须通过适当的格式文件“激活” MLTeX。

当你使用 `-mltex` 选项在 `.fmt` 文件创建期间，会将一个值为“true”的布尔变量写入 `.fmt` 文件中，告诉 TeX 引擎 MLTeX 扩展已被激活，并应提供给用户。如果你没有显式设置 `-mltex` 选项，那么相应变量将为“false”。如果检测到该变量的值为“false”（当该 `.fmt` 文件在 TeX 运行期间被重新加载）那么尝试使用 MLTeX 扩展将导致 `Undefined command...` 错误——因为 MLTeX 原语尚未被注册（加载），因此无法识别。

运行后 `pdftex -ini -mltex *pdfetex.ini` 在命令行中运行，你将看到类似以下的文本，表明 MLTeX v2.2 已启用：

```
This is pdfTeX, Version 3.14159265-2.6-1.40.19 (INITEX)
\write18 enabled.
entering extended mode
MLTeX v2.2 enabled
....
....
....
Beginning to dump on file pdfetex.fmt
....
No pages of output.
Transcript written on pdfetex.log.
```

这会生成一个 `.fmt` 名为 `pdfetex.fmt` 从而使你能够使用 MLTeX 命令：

```
pdftex -fmt=pdfetex <yourfile.tex>
```

其中 `<yourfile.tex>` 可以使用 MLTeX 特有的原语

MLTeX 最初是作为一个单独的变更文件分发的， [mltex.ch](http://tug.ctan.org/systems/generic/mltex/mltex.ch)，它可以与 Knuth 的主源代码（[`tex.web`](https://ctan.org/tex-archive/systems/knuth/dist/tex?lang=en)）合并，从而生成一个名为 MLTeX 的 TeX 新版本，其中包含若干新的原语。如今，来自 `mltex.ch` 的 MLTeX 代码已并入主 `tex.ch` 变更文件中，该文件用于构建几乎所有 TeX 引擎。

### MLTeX 原语

以下说明主要整理并转载自文件 `web2c.info` 它包含在 [TeX Live](https://tug.org/texlive/) 发行版中。

* **`\charsubdef`**：字符替换定义。声明如何使用两个字符字形（它们确实存在）来构造一个重音字符字形（不一定存在于当前字体中）。

  ```
  \charsubdef COMPOSITE [=] ACCENT BASE
  ```

  COMPOSITE、ACCENT 和 BASE 都是字体字形编号，使用常见的 TeX 语法表示：\`\e 为符号形式，'145 表示八进制，"65 表示十六进制，101 表示十进制。因此，它定义了某个字符字形代码——无论是作为单个字符输入还是使用 `\char` 原语输入时，是映射到某个字体字形，还是映射到一个 `\accent` 字形构造。

  例如，假设你为 ê（e-circumflex）使用字形代码 138（十进制），并且使用 Computer Modern 字体，该字体的抑扬符重音位于 18 号位置，而小写 ‘e’ 位于通常的 ASCII 101 十进制位置，那么你可以使用 `\charsubdef` 如下：

  ```
  \charsubdef 138 = 18 101
  ```
* **`\charsubdefmax`**：设置 `\charsubdef` 列表中的最大值。例如：

  ```
  \charsubdefmax=-1 % disable all substitutions
  \charsubdefmax=256 % enable all substitutions
  ```
* **`\tracingcharsubdef`**：跟踪替换。为帮助诊断与 `\charsubdef`相关的问题，MLTeX 提供了一个原始参数， `\tracingcharsubdef`。如果该值为正，则每次使用 `\charsubdef` 都会被报告。这有助于追踪某个字符何时被重新定义。

## EncTeX

EncTeX 于 1997–2004 年间开发，是一种 TeX 扩展，通过增加新的原语提供灵活的输入/输出重新编码——例如，在输入进入 TeX 的过程中进行转换的一种方式。它例如允许将多字节序列（如 UTF-8 编码）转换后用于标准的 8 位 TeX 引擎。

### 激活（启用）EncTeX

与 MLTeX 一样，EncTeX 也被设计为作为所谓的 `.fmt` （格式文件）的一部分运行——参见 [MLTeX](#mltex)上文，了解有关格式文件/INI 模式的说明。

要启用 EncTeX， *对于支持它的引擎*，例如 pdfTeX，你可以通过编写以下命令创建一个启用 EncTeX 的格式文件：

```
pdftex -ini -enc *pdfetex.ini
```

其中 `pdfetex.ini` 是 TeX Live 发行版中包含的一个文件。

**为什么要用星号（`*`)?** 星号会将 pdfTeX 置于所谓的“扩展模式”，从而启用对 e-TeX 原语的支持。如果你省略它并输入 `pdftex -ini -mltex pdfetex.ini` 你将会收到一个错误：

```
This is pdfTeX, Version 3.14159265-2.6-1.40.19 (INITEX)
 \write18 enabled.
MLTeX v2.2 enabled
(c:/texmf-dist/tex/plain/config/pdfetex.ini
(c:/texmf-dist/tex/generic/tex-ini-files/pdftexconfig.tex)
(c:/texmf-dist/tex/plain/etex/etex.src

! e-TeX  fatal error: this file can be processed only in extended mode;
  你是不是忘了星号？
```

**注意**：你也可以使用 `-etex` 命令行选项来启用“扩展模式”：

```
pdftex -ini -etex -mltex pdfetex.ini
```

该 `-enc` 命令行选项会促使 pdfTeX 引擎通过在生成的 `pdfetex.fmt` 格式文件中写入一些数据来启用 EncTeX。

**注意**：使用 `-enc` 选项在命令行中配合 `.fmt` 一个曾 *未生成* 在启用 EncTeX 的情况下生成的文件将 *不* 起作用：必须通过适当生成的格式文件“激活” EncTeX。

### EncTeX 原语

EncTeX 向 TeX 引擎添加了 10 个新的原语命令：

* 最初版本（1997 年）中的 3 个原语：
* `\xordcode`
* `\xchrcode`
* `\xprncode`
* 2003 年增加的 7 个原语（用于 UTF-8 支持）：
* `\mubyte`
* `\endmubyte`
* `\mubytein`
* `\mubyteout`
* `\mubytelog`
* `\specialout`
* `\noconvert`

这些原语的用法和行为在 [EncTeX 参考手册](http://mirrors.ctan.org/systems/enctex/encdoc-e.pdf)，由 EncTeX 的作者 Petr Olšák 编写。为避免在此重复不必要的内容，感兴趣的读者请参阅该文档。

### 关于 EncTeX 的更多信息

* [EncTeX 的第二个版本：UTF-8 支持](http://mirrors.ctan.org/systems/enctex/eurotex2003-enctex.pdf)：EncTeX 作者 Petr Olšák 的一篇文章。
* [EncTeX 参考手册](http://mirrors.ctan.org/systems/enctex/encdoc-e.pdf) （英文）。

### 同时激活（启用）MLTeX 和 EncTeX

要同时启用 MLTeX 和 EncTeX，你可以使用如下命令行生成合适的格式文件：

```
pdftex -ini -enc -mltex *pdfetex.ini
```

其中 `pdfetex.ini` 是 TeX Live 发行版中包含的一个文件。

**为什么要用星号（`*`)?** 星号会将 pdfTeX 置于所谓的“扩展模式”，从而启用对 e-TeX 原语的支持。如果你省略它并输入 `pdftex -ini -enc -mltex pdfetex.ini` 你将会收到一个错误：

```
This is pdfTeX, Version 3.14159265-2.6-1.40.19 (INITEX)
 \write18 enabled.
MLTeX v2.2 enabled
(c:/texmf-dist/tex/plain/config/pdfetex.ini
(c:/texmf-dist/tex/generic/tex-ini-files/pdftexconfig.tex)
(c:/texmf-dist/tex/plain/etex/etex.src

! e-TeX  fatal error: this file can be processed only in extended mode;
  你是不是忘了星号？
```

**注意**：你也可以使用 `-etex` 命令行选项来启用“扩展模式”：

```
pdftex -ini -etex -enc -mltex pdfetex.ini
```

运行上述命令行后，你会看到类似以下的消息，提示 MLTeX 和 EncTeX 都已启用：

```
This is pdfTeX, Version 3.14159265-2.6-1.40.19 (INITEX)
 \write18 enabled.
entering extended mode
MLTeX v2.2 enabled
 encTeX v. Jun. 2004, reencoding enabled.
....
....
....
Beginning to dump on file pdfetex.fmt
....
No pages of output.
Transcript written on pdfetex.log.
```

和 `pdfetex.fmt` 将生成一个同时启用 MLTeX 和 EncTeX 的格式文件。

## SyncTeX

SyncTeX 扩展自 2008 年起可用，并且至今仍由其创建者 Jérôme Laurens 积极开发。它被广泛使用，包括 Overleaf，也受到当今所有 TeX 引擎的支持。

### SyncTeX 有什么作用？

在查看由 TeX 排版的文档时，也许是为了在提交给出版社之前校对/检查，你可能会发现一个错误，并需要在 TeX 源代码中修正它。然而，在 TeX 文件中找到正确位置可能很棘手，尤其当文档较长时。同样，你也可能希望反向操作：从 TeX 源文件中的某个位置直接跳转到最终排版 PDF 中对应的页面位置。在这两种情况下，都需要 *同步* TeX 文件中的特定位置及其在排版结果显示中的对应位置：而这正是 SyncTeX 提供的功能——一种将 TeX 文件中的位置与排版文档中的页面位置自动关联起来的方法。

如果启用了 SyncTeX，它会写出一个扩展名为 `.synctex.gz` （gzip 压缩）或者 `.synctex` （未压缩），具体取决于 [传给 SyncTeX 的命令行选项](#synoptions)。支持 SyncTeX 的文本编辑器和（大多是）PDF 查看器可以使用这些文件，在输入（TeX 代码）和输出（排版后的 PDF 显示）之间执行必要的同步。显然，如果用户的文本编辑器和 PDF 文档查看器没有相应功能，使其能够基于包含在 `.synctex.gz` （或者 `.synctex`）文件中的数据来传递文本文件/PDF 查看器位置，那么这一切不可能“自动发生”，而该文件正是由 SyncTeX 写出的。

除了 TeX 引擎内部生成 `.synctex.gz` 文件的功能之外，SyncTeX 还提供了一个特殊的 [解析器](https://github.com/jlaurens/synctex/) 用于读取 `.synctex.gz` （或者 `.synctex`）文件并提取相关的页面/行位置信息。应用程序使用该解析器来提供对 SyncTeX 的支持。

### 激活（启用）SyncTeX

支持 SyncTeX 的 TeX 引擎有两种方式来启用/禁用 SyncTeX：

* 一个命令行选项： `-synctex=NUMBER`
* 在 `.tex` 文件中的一个命令：该 `\synctex` 原始

### 在命令行中使用 SyncTeX

你可以使用 `-synctex=NUMBER` 选项，当你运行支持 SyncTeX 的 TeX 引擎（如 pdfTeX）时。

#### 示例

* 启用 SyncTeX：输出 `.synctex.gz` （gzip 压缩文件）：

```
pdftex -synctex=1 myfile.tex
```

生成 `myfile.synctex.gz`

* 启用 SyncTeX：输出 `.synctex` （未压缩文件）：

```
pdftex -synctex=-1 myfile.tex
```

生成 `myfile.synctex`

* 禁用 SyncTeX：

```
pdftex -synctex=0 myfile.tex
```

不会生成任何 SyncTeX 输出。

### SyncTeX 唯一的原语

SyncTeX 提供了一个原语， `\synctex`，用户可以将其添加到自己的 `.tex` 文件：

* 启用 SyncTeX： `\synctex=1`
* 禁用 SyncTeX： `\synctex=0`

### 关于 SyncTeX 的更多信息

* [Jérôme Laurens 在 TUGBoat 上的一篇文章](http://www.tug.org/TUGboat/tb29-3/tb93laurens.pdf)，即 SyncTeX 的作者。
* 该 [GitHub 仓库](https://github.com/jlaurens/synctex) ，即 SyncTeX 解析器的仓库。


---

# 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/39-mltex-enctex-and-synctex-tex-extensions.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.
