> 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/50-the-two-modes-of-tex-engines-ini-mode-and-production-mode.md).

# TeX 引擎的两种模式：INI 模式和生成模式

所有 TeX 引擎都有两种“模式”：一种是“INI”模式，另一种是“生产”模式——后者只是用于排版材料制作的默认（标准）模式。INI 模式相当不同，你需要使用命令行选项才能让 TeX 引擎进入 INI 模式。你可以通过在 `--help` 命令行上执行它来了解如何做到这一点。例如，在 LuaTeX 中如果你运行

`luatex --help`

你会看到该引擎支持的许多命令行选项：

```
用法：luatex --lua=FILE [OPTION]... [TEXNAME[.tex]] [COMMANDS]
   或：luatex --lua=FILE [OPTION]... \\FIRST-LINE
   或：luatex --lua=FILE [OPTION]... &FMT ARGS
  在 TEXNAME 上运行 LuaTeX，通常会生成 TEXNAME.pdf。
  在读取 TEXNAME 后，其余的 COMMANDS 将作为 luatex 输入进行处理。

  或者，如果第一个非选项参数以反斜杠开头，
  luatex 会将所有非选项参数解释为一行输入。

  或者，如果第一个非选项参数以 & 开头，
  则下一词被视为要读取的 FMT，且优先于其他所有设置。任何
  其余参数将按上述方式处理。

  如果未指定参数或选项，则会提示输入。

  以下常规选项可识别：

   --credits                     显示致谢并退出
   --debug-format                启用格式调试
   --draftmode                   开启草稿模式（不生成输出 PDF）
   --[no-]file-line-error        禁用/启用 file:line:error 风格消息
   --[no-]file-line-error-style  --[no-]file-line-error 的别名
   --fmt=FORMAT                  加载格式文件 FORMAT
   --halt-on-error               在第一个错误处停止处理
   --help                        显示帮助并退出
   --ini                         进入 iniluatex，用于转储格式
   --interaction=STRING          设置交互模式（STRING=batchmode/nonstopmode/scrollmode/errorstopmode）
   --jobname=STRING              将作业名设为 STRING
   --kpathsea-debug=NUMBER       根据 NUMBER 的各位设置路径搜索调试标志
   --lua=FILE                    加载并执行一个 lua 初始化脚本
   --[no-]mktex=FMT              禁用/启用 mktexFMT 生成（FMT=tex/tfm）
   --nosocket                    禁用 lua socket 库
   --output-comment=STRING       使用 STRING 作为 DVI 文件注释而不是日期（对 PDF 无效）
   --output-directory=DIR        使用现有的 DIR 作为写入文件的目录
   --output-format=FORMAT        将 FORMAT 用于作业输出；FORMAT 为 'dvi' 或 'pdf'
   --progname=STRING             将程序名设为 STRING
   --recorder                    启用文件名记录器
   --safer                       禁用易被利用的 lua 命令
   --[no-]shell-escape           禁用/启用系统命令
   --shell-restricted            将系统命令限制为 texmf.cnf 中给出的命令列表
   --synctex=NUMBER              启用 synctex（参见 man synctex）
   --utc                         将时间初始化为 UTC
   --version                     显示版本并退出

可通过特殊开关获得替代的行为模式

  --luaonly                      运行一个 lua 文件，然后退出
  --luaconly                     对 lua 文件进行字节编译，然后退出
  --luahashchars                 当前 Lua 解释器用于字符串哈希的位

有关启动过程的更多信息，请参阅参考手册。

将错误报告发送至 dev-luatex@ntg.nl。
```

在这些众多选项中，这里相关的有两个：

```
--ini              进入 iniluatex，用于转储格式
--fmt=FORMAT       加载格式文件 FORMAT
```

这里，LuaTeX 将其 INI 模式称为 `iniluatex`。那么这 `iniluatex` （INI 模式）究竟是什么意思？上面显示的第二个命令行选项给出了一个小线索：

```
--fmt=FORMAT       加载格式文件 FORMAT
```

### INI 模式？格式文件？我有点糊涂了……

宏包，例如 LaTeX，是大量复杂宏的集合：加载并处理所有组成文件的原始文本确实需要一定的时间和计算开销；例如：

* 读取并扫描数以万计的单个文本字符；
* 解析、处理并存储数百个宏/命令；
* 初始化字体和断字数据的内部表。

所有这些都必须完成，并将结果存储在内存中，然后 TeX 引擎才真正准备好处理用户的 TeX 文档，而该文档会使用例如 Plain TeX 或 LaTeX 宏集合所提供的宏。你可以把这看作 TeX 引擎的引导过程：在准备好处理你的文档之前所做的必要准备。

这也许反映了当时的技术水平，TeX 引擎为处理充满宏集合的文本文件提供了一条捷径：加载经过预处理的二进制（*格式*）。

当置于 INI 模式时，TeX 引擎的任务不是进行排版，而是：

1. 加载并初始化其所有原始命令，同时设置最少量的 catcode（以及其他代码），以便 TeX 引擎可以开始进一步处理。
2. 一旦（1）完成，它随后会加载并处理用户提供的宏集合，称为“格式”（例如 Plain TeX 或 LaTeX 宏集合）。
3. 在成功完成（1）和（2）后，TeX 会将已加载并处理到其内存中的所有内容进行一次“二进制大脑转储”，并将其写入一个二进制 *格式* 文件（例如， `lualatex.fmt`).

格式文件是一个二进制文件，它存储了 TeX 在初始化众多内部数据表（包括原语）并处理用户提供的宏集合中所有宏命令之后的“状态”的表示。TeX 引擎这样做是因为，与每次想用例如 Knuth 的 Plain TeX 或 LaTeX 宏包——或者任何设计为“格式”的宏包——时都重新处理原始宏相比，加载一个“预编译”的二进制文件要快得多。

例如，当你处理一个要由 LaTeX 排版的文档时，TeX 引擎不会重新读取（重新处理）LaTeX 的所有核心宏，而是读入一个名为，例如， `lualatex.fmt`。 `.fmt` 文件。例如，如果你升级你的 LaTeX 发行版（即 LaTeX 本身的核心，而不是附加包），那么你可能也需要生成一个新的 `.fmt` 文件。

### 示例

在 LaTeX 源代码分发包中，你会找到带有一个 `.ini` 扩展名的文件，例如 lualatex.ini，它们用于生成 `.fmt` 文件——这些 `.ini` 文件通常包含特定于引擎的初始化代码，然后继续输入核心 LaTeX 宏文件。例如，如果你使用下面的命令行运行 LuaTeX：

`luatex --ini lualatex.ini`

LuaTeX 将写出一个名为 `lualatex.fmt`

截至撰写本文时， `lualatex.ini` 包含以下代码：

```
% tex-ini-files 2016-04-15：lualatex.ini
% 最初由 Karl Berry 于 2008 年编写。公有领域。

\input luatexconfig.tex

\begingroup
  \catcode`\{=1 %
  \catcode`\}=2 %
  % 在 latex.ltx 之前设置作业名引用
  % Web2c 的 pdfTeX/XeTeX 会对包含空格的作业名加引号，但 LuaTeX 不会
  % 在引擎层面这样做。可以通过
  % 一个回调来改变该行为。最初这段代码是通过 lualatexquotejobname.tex 加载的
  % 但这需要对 latex.ltx 做一个变通处理：该行为已经被修改
  % 以允许直接使用回调方式。
  \global\everyjob{\directlua{require("lualatexquotejobname.lua")}}
\endgroup

\input latex.ltx
```

`lualatex.ini` 先输入一个名为 `luatexconfig.tex` 的文件，它会执行一些 LuaTeX 特有的初始化——正如你对一个 `.ini` （初始化）文件所预期的那样！在最后一行，它输入 `latex.ltx` ，这会使 LuaTeX 读取并处理核心 LaTeX 宏。

在 LuaTeX 完成处理 `lualatex.ini` 后，它将输出二进制 *格式文件* 名为 `lualatex.fmt`。一旦 LaTeX 代码被编译成二进制格式，LuaTeX（或任何其他 TeX 引擎）就能非常快速地读取 `.fmt` 该文件，以引导并初始化其内部的 LaTeX 宏定义、字体等表；它不必再经历读取和处理 LaTeX 宏包中包含的数以千计字符的漫长过程。

现在你可以指示 LuaTeX 为你的 LaTeX 文档排版 `yourfile.tex` （使用 `lualatex` 格式文件）通过执行以下命令：

```
luatex --fmt=lualatex yourfile.tex
```

`.fmt` 文件通常特定于某个引擎：例如，LuaTeX 的 `.fmt` 文件通常不能移植到其他 TeX 引擎中使用：例如 pdfTeX 或 XeTeX。此外，如果 LuaTeX 可执行程序更新了新功能，那么很可能 `.fmt` 用旧版本 LuaTeX 准备的文件将无法与新引擎配合工作：你需要重新构建（重新编译）该 `.fmt` 文件中完全相同的大小写或拼写。

如果你尝试使用不兼容的 `.fmt` 文件，那么 TeX 引擎将无法加载它，并返回错误：

```
严重的格式文件错误；我被难住了
```

同样，如果核心 LaTeX 宏更新了，你可能也需要重新构建这些 `lualatex.fmt` 文件。

`.fmt` 文件可以由任何合适的宏包生成——不只是 LaTeX；例如，Knuth 原始且简单得多的“Plain” TeX 宏也可以被处理以生成一个 `.fmt` 文件。你也可以，如果你有时间的话，编写自己的宏集合，并为该宏包生成一个格式文件——请注意，你需要在宏包中的某处调用原始命令 `\dump` 该命令告诉 TeX 引擎执行其“二进制大脑转储”并写出 `.fmt` 文件中完全相同的大小写或拼写。

然而，绝大多数用户从不需要担心 TeX 引擎的“INI”模式，或生成 `.fmt` 文件的过程：Overleaf 和 TeX Live 发行版会为你屏蔽这些细节——除非你需要去了解它们。


---

# 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/50-the-two-modes-of-tex-engines-ini-mode-and-production-mode.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.
