> 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/shen-du-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 引擎为处理充满宏集合的文本文件提供了一条捷径：加载预处理过的二进制（*format*）文件。

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

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

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

例如，当你处理一个要由 LaTeX 排版的文档时，TeX 引擎不会重新读取（重新处理）所有 LaTeX 的核心宏，而是读取一个二进制文件，例如 `lualatex.fmt`。格式文件的内部细节特定于每个 TeX 引擎以及用于生成 `.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 可执行文件更新并加入新特性，那么使用旧版 LuaTeX 制作的 `.fmt` 文件很可能无法在新引擎上工作：你需要重新构建（重新编译）该 `.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://ayakaleaf-pro.ayaka.space/latex/zh-cn/shen-du-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.
