TeX 输入/输出
TeX 文件
从技术上讲,任何文件都可以是 TeX 文件。它甚至不需要 .tex 扩展名。TeX 引擎逐字节读取输入,尝试识别它已知的命令(即其内部状态中的命令)。它只会在遇到未识别的命令时报告错误和/或在终端请求更正(如果它在 交互模式下运行)。但如果你期望看到类似精美排版的文档,输入应遵循 TeX 语法,并且最好仅包含引擎已知的命令。
TeX 输入
TeX 作业在一个明确指定的 TeX 文件上运行。因此,我们将此文件包含在某个 TeX 作业的输入中。此外,TeX 有四个与辅助输入相关的原语:
\input<file name>需要文件名,并在包含该命令的文件处理到\input命令时立即开始处理该文件。auxiliary 文件结束后,处理返回到包含\input命令的文件。\openin<4-bit-number>=<file name>也需要文件名,但它仅打开文件并将其映射到 0 到 15 之间的一个编号。\read<number> to <control sequence>需要文件映射的编号,并一次读取一行,使得<control sequence>对应读取的记号列表。\closein<4-bit-number>关闭映射到该编号的文件。
传递给 \input 和 \openin 命令的文件名同样会被计入 TeX 输入,我们将它们称为 辅助输入 文件或 依赖项,而为作业指定的文件我们称为 主输入 文件。
这四个命令可以出现在主输入文件或辅助输入文件中。但请注意循环依赖。
当在 交互模式下运行时,若出现任何错误,TeX 引擎会在终端请求更正。此时,你可能想将错误的命令替换为新的命令。这将是另一种也是最后一种向 TeX 提供输入的方式,我们称之为 终端输入。
TeX 输出
正如我们在 上文中提到的,TeX 作业在一个明确指定的文件上运行。该文件可能不包含任何可排版的数据。它可能只有不会产生字符的控制序列。但通常它会包含此类数据,以便我们得到一个目标格式的文件,该文件应包含我们的排版文本(或引擎和格式允许的其他内容,如果它们已扩展以适应某些目标格式的额外特性)。该文件的名称与输入文件的名称相同。我们将此文件称为 主输出 文件。正如我们在 上文提到的,对于原始 TeX,这将是一个 DVI 格式的文件。我们将输入和输出文件去除扩展名后的名称称为 作业名称。
此外,TeX 有三个与辅助输出相关的原语:
\openout<4-bit-number>=<file name>需要文件名,打开文件并将其映射到 0 到 15 之间的一个编号。\write<number>{token list}需要文件映射的编号,并将token list写入该文件。\closeout<4-bit-number>关闭映射到该编号的文件。
传递给 \openout 命令的文件名同样会被计入 TeX 输出,我们将它们称为 辅助输出 文件。
当 TeX 引擎遍历输入时,可能会向 日志 或 转录 文件输出一些调试信息。我们会将此文件计入 TeX 输出。
在写入日志文件的同时,TeX 引擎可能会向终端输出较少的详细信息。这是 TeX 引擎写入输出的最后一种方式,我们称之为 终端输出。
TeX 交互模式
TeX 作业在任何给定时刻都可能处于四种交互模式中的一种。这些模式通过以下 TeX 原语切换:
\batchmode。引擎省略所有停顿并省略终端输出,因此既不需要输入也不需要输出终端。\nonstopmode。引擎省略所有停顿,仅需要终端进行输出。\scrollmode。引擎省略错误停顿,并且需要终端进行输入和输出。\errorstopmode。引擎在每个机会都会停下来进行交互。
Aspose.TeX 允许我们在创建对象时将交互模式指定为 TeX 作业选项。此模式将在加载 TeX 格式后(如果需要加载任何格式)立即设置到引擎的内部状态中,并在引擎遇到上述四个命令之一时切换到另一个模式。此选项的默认值将保留由 TeX 格式定义的交互模式。如果未加载任何格式,交互模式将与 \errorstopmode 命令设置的相同。
接口抽象(IInputWorkingDirectory 与 IOutputWorkingDirectory)的作用
传统的 TeX 引擎在本质上与本地操作系统的文件系统紧密耦合,将文件视为磁盘上的绝对路径或相对路径。Aspose.TeX 通过引入一套稳健的抽象层——即 IInputWorkingDirectory 和 IOutputWorkingDirectory 这两个核心接口——打破了这一历史遗留的局限性。这种解耦机制使您能够:
- 完全在内存中通过基于流(stream-based)的存储方式处理文档。
- 直接读取 ZIP 压缩包中的内容,无需先将其解压到磁盘。
- 在多租户服务器应用中,通过将每个排版任务隔离在各自独立的虚拟工作目录实例中,确保线程安全。
为什么接口抽象对开发者至关重要
在现代企业级应用(如云微服务或后台任务队列)中,依赖物理磁盘路径会带来严重的瓶颈:
- 当多个线程同时读写同一个物理目录时,会发生冲突,甚至导致彼此的临时文件(如
.aux、.log文件)或输出文件被覆盖。 - 为了让排版引擎读取中间资源或动态生成的数据库字符串而将其写入磁盘,会严重降低系统性能。
- 在云环境(如 Docker 容器或无服务器函数/Serverless Functions)中,文件系统往往是只读的,或者对存储访问有严格限制。
通过利用接口对输入和输出进行抽象,Aspose.TeX 允许开发者将文件操作重定向至内存流、ZIP 压缩包、数据库或自定义的虚拟文件系统中,且无需对核心排版逻辑做任何修改。