> 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/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 的原始软件。

随着现代 TeX 引擎（如 XeTeX 和 LuaTeX）的出现，一些传统 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–5 年间开发的，它是对 TeX 的一种修改，允许使用普通 Computer Modern（CM）字体对带重音字母的单词进行断字。

### 激活（启用）MLTeX

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

要启用 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;
  did you perhaps forget the asterisk?
```

**注意**：不使用星号来启用“扩展模式”时，你可以改用 `-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.
进入扩展模式
MLTeX v2.2 enabled
....
....
....
开始写入文件 pdfetex.fmt
....
没有输出页面。
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)）合并，以生成 TeX 的一个新版本，称为 MLTeX，其中包含若干新的原语。如今，来自 `mltex.ch` 已并入主 `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 的字形代码设为 138（十进制），并且使用的是 Computer Modern 字体，这些字体中抑扬符位于 18 号位置，小写字母 ‘e’ 位于通常的 ASCII 101 十进制位置，那么你应使用 `\charsubdef` 如下：

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

  ```
  \charsubdefmax=-1 % 禁用所有替换
  \charsubdefmax=256 % 启用所有替换
  ```
* **`\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;
  did you perhaps forget the asterisk?
```

**注意**：不使用星号来启用“扩展模式”时，你可以改用 `-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;
  did you perhaps forget the asterisk?
```

**注意**：不使用星号来启用“扩展模式”时，你可以改用 `-etex` 命令行选项：

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

运行上面的命令行后，你会看到类似下面的消息，表明 MLTeX 和 EncTeX 都已启用：

```
This is pdfTeX, Version 3.14159265-2.6-1.40.19 (INITEX)
 \write18 enabled.
进入扩展模式
MLTeX v2.2 enabled
 encTeX v. Jun. 2004, reencoding enabled.
....
....
....
开始写入文件 pdfetex.fmt
....
没有输出页面。
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` （gz 压缩）或 `.synctex` （未压缩）的特殊文件，具体取决于提供给 SyncTeX 的 [命令行选项](#synoptions)。支持 SyncTeX 的文本编辑器和（大多数）PDF 查看器可以使用这些文件来执行输入（TeX 代码）与输出（排版后的 PDF 显示）之间所需的同步。显然，这不可能仅凭用户的文本编辑器和 PDF 文档查看器“自动发生”，它们必须具备相应功能，以便根据 SyncTeX 写出的 `.synctex.gz` （或者 `.synctex`）文件中包含的数据实现文本文件/PDF 查看器位置之间的通信。

除了 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` （gz 压缩文件）：

```
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://overleaf-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.
