LaTeX 是 TeX 的编程框架吗?

LaTeX 是 TeX 的编程框架吗?

我的看法TeX 和 LaTeX 有什么区别?TeX 是呈现文档的编程语言。LaTeX 是 TeX 的一个著名宏包,旨在让作者的工作更轻松。

我有一些 Web 开发经验。在 JavaScript 领域,反应是一个允许你编写不受支持的 JavaScript 语法(即 JSX)的库,以使开发人员的工作更轻松(改进开发者体验)。

我猜 LaTeX 到 TeX 就像 React 到 JavaScript。不同之处在于,与 React 不同,LaTeX 语法并非不受支持;它只是在 TeX 引擎中未预定义。而 React 语法 (JSX) 对 JavaScript 引擎来说实际上是陌生的、奇特的,编译器必须在运行 JSX 之前将其转换为受支持的 JavaScript 语法。

我的理解正确吗?

答案1

问题不在于编程范式的差异,而在于对术语的概述。

尽管如此,该答案的初始版本的作者建议在熟悉 TeX 和 LaTeX 时不要过多关注与其他事物的类比。

相反,首先熟悉 TeXbook 和 LaTeX Companion 中介绍和使用的术语,用于表示与 TeX 和 LaTeX 以及底层编程范式相关的概念。

当你对 TeX 和 LaTeX 以及底层编程范式足够熟悉时,那么,在思考与编程范式略有不同的事物进行类比时,你可以最大限度地降低因类比不足而产生难以摆脱的误解的风险。


TeX 是呈现文档的编程语言。

让我们看一下术语“TeX”:

术语 TeX 至少有两种用法:

TeX 一词表示排版和文档格式化语言TeX发明者唐纳德·E·克努斯

TeX 一词也表示一种编译器/计算机程序,其名称为TeX并由唐纳德·E·克努斯也被称为 Donald E. Knuth 的原始 TeX 编译器。
如今,TeX 一词除了 Donald E. Knuth 的原始 TeX 编译器外,还表示一系列基于 Donald E. Knuth 的原始 TeX 编译器的计算机程序,这些程序被归入术语“TeX 编译器”和“TeX 引擎”中。
这些编译器的重点不是为所谓的可执行文件创建代码,而计算机可以对该文件进行操作以执行任何算法,同时可能在程序运行时请求任何(用户)输入。
这些编译器的重点是创建处理文档描述的结果,其中描述以排版和文档格式化语言 TeX 给出,结果通常是

  • 输出文件,即 .dvi 文件或 .pdf 文件,程序可以使用它们将 .dvi 文件/.pdf 文件渲染为可见/可打印的内容,
  • 以及文本格式的 .log 文件
  • 以及终端上的一些消息
  • 以及一些文本格式的(辅助)文件
  • 并且,如果\write18激活了 shellescape/-feature,则可能是执行 TeX 以外的程序或 TeX 程序的其他实例的结果。

如今,TeX 编译器已不只一种,而是有多种变体。在 TeX 编译器变体的上下文中,您可以谈论 TeX 引擎。

当今所有 TeX 引擎的祖先是Donald E. Knuth 的原始 TeX 编译器,也称为TeX821 . TeX82 的 0 版于 1982 年 9 月发布。自 TeX82 的 3.0(3.1?)版以来,TeX82 的更新通过在小数点末尾添加一位数字来表示,因此版本号渐近于 π。TeX82 的 3.141592653 版于 2021 年 1 月发布。自 1990 年 3 月 15 日发布的 3.0 版以来,Knuth 的 TeX82 内部使用 8 位数字来表示字符,而 7 位数字字符编码方案ASCII是 Knuth TeX 引擎内部 8 位数字符编码方案的严格子集,因此 TeX 内部可以表示 256 种不同的字符,因此可以实现 TeX,读取/处理以某种 8 位数字符编码方案编码的文本文件。Knuth 的 TeX82 以设备独立格式 (dvi) 生成输出文件。(在与文档格式化和排版语言 TeX 无关的上下文中,“dvi”也是“数字视频接口”或“数字可视接口”的首字母缩写词 - 确保不要混淆这些内容。)

Knuth 的 TeX 编译器的一个扩展是来自 NTS 项目的 ε-TeX。该编译器为 Knuth 的原始 TeX 编译器带来了扩展,例如用于进行整数计算的表达式或用于计算已在扩展处理阶段的长度的表达式,以及重新标记已标记的 .tex 输入的可能性,仅举几例。

另一个 TeX 引擎是pdfTeX 编译器(作者:Hàn Thế Thành)。该编译器附带 ε-TeX 扩展。默认情况下,它会生成可移植文档格式 (pdf) 的输出文件,并带来微排版功能以及大量创新和附加原语,这些原语和原语针对可移植文档格式提供的可能性进行了量身定制。

通过实现特殊的算法来处理来自将 8 位字符标记为 utf-8 编码的多字节字符的表示的显式字符标记序列,您可以“欺骗”这些“8 位编译器”来处理以 utf-8 编码的 .tex 输入文件。

另一个 TeX 引擎是Jonathan Kew 的 XeTeX,当 TeX 处于将文本拆分为段落行并自动跨页拆分段落行的模式时,不仅允许 TeX 排版文本从左到右读取行,还允许 TeX 排版文本从右到左读取行或符号垂直对齐。XeTeX 原生处理以 utf-8 编码的 .tex 输入文件,并支持现代字体格式,如 OpenType (OTF) 和 SIL 的 Graphite 字体技术。

当今非常重要的 TeX 引擎是LuaTeX经过LuaTeX 开发团队。该引擎将文档格式化和排版语言 TeX 与编程语言/脚本语言 Lua 相结合。它还可以原生处理以 utf-8 编码的 .tex 输入文件,并支持现代字体格式,例如 OpenType (OTF) 和 SIL 的 Graphite 字体技术。

让我们看一下这句话“... 是呈现文档的编程语言”:

据本答案初始版本的作者所知,渲染是一个过程,而语言本身是抽象的,不会启动过程。因此,排版和文档格式化语言 TeX 本身不会渲染文档。计算机可以。通过计算机程序,即称为 TeX 引擎的编译器,它使计算机能够“理解”排版和文档格式化语言 TeX 并执行该语言给出的指令以创建如上所述的结果。

让我们看看“LaTeX 是一个著名的 TeX 宏包,旨在使作者的生活更轻松”和“LaTeX 是 TeX 的编程框架吗?”:

LaTeX,更具体地说是 LaTeX 2ε,是一个用排版和文档格式化语言 TeX 编写的宏集合,因此 — — 正如问题的主题行所示 — — 可能可以被视为一种“TeX 的编程框架”。

然而,LaTeX 并不是一个“TeX 的编程框架”,因为它不提供某种带有输入编辑器和图形用户界面的集成开发环境,在该环境中,只需单击鼠标或通过触摸屏上的手势就可以执行编译器、查看 .log 文件等。

LaTeX 2ε 并没有扩展排版和文档格式化语言 TeX 语法的基础语法。

名为“LaTeX 2ε”的宏集合被归入术语“格式”之下,其中“格式”一词也是 TeX 术语,在 Donald E. Knuth 的 TeXbook 中进行了解释。

在此上下文中,使用术语“集合”代替术语“包”。
在 TeX 术语格式中形成一种特殊的“包”:

“格式”是在 TeX 基元之上设计的例程集合,以排版和文档格式化语言 TeX 编写。通常 .tex 输入存储在普通文本文件中。但“格式”旨在进行预处理,预处理的结果会产生一个格式文件,其扩展名为 .fmt,其中的数据以某种二进制格式排列,与普通文本文件不同,在启动 TeX 编译器时,数据可以高速加载到内存中。让 TeX 引擎创建这种快速加载的 .fmt 文件的过程称为“转储格式文件”。

仅使用具有 ε-TeX 扩展的 TeX 引擎才能成功转储(并使用)来自当前版本的 LaTeX 2ε 源的 .fmt 文件。这意味着现在您无法再使用 Knuth 的传统 TeX 编译器来成功转储(并使用)LaTeX 2ε 的格式文件。但使用 TeX 引擎 εTeX、pdfTeX、XeTeX 和 LuaTeX 则可以。

使用如今的 TeX 实现,TeX 可执行文件会“查看”命令行,查看它们被调用的名称,并从该名称推断出要加载的 .fmt 文件/格式文件名称的基本名称部分。“它们被调用的名称”的含义取决于操作系统的情况和/或所使用的文件系统。在允许符号链接它可能是代表指向有问题的 TeX 可执行文件的符号链接的文件的文件名的基本名称部分。

这样,格式提供的例程就可以立即“从头开始”使用,而无需用户/程序员将命令放入他们的 .tex-input 中来加载它们。

对于非格式的软件包,想要使用这些软件包提供的例程的用户/程序员需要将命令放入其 .tex 输入中以处理相应的文本文件。(此类文本文件的加载速度并不快,但速度与处理外部文本文件的速度相当。)

例如,对于一些需要以 LaTeX 2ε 格式加载才能成功加载其自身并执行其提供的例程的包,您通常会放置类似\usepackage或这样的命令\RequirePackage,这些命令本身是以 LaTeX 2ε 格式定义的指令。

在处理 TeX 时,“语言”这个概念也很有趣。使用 TeX 编程时,排版和文档格式化语言 TeX 的语法基本原理是无法更改的,但只要您不想在编译器运行时收到低级错误消息,就必须遵守该语法的基本原理。但是,程序 TeX 提供了在执行程序 TeX 的过程中从较早状态进入较晚状态的方法,例如,较早状态中控制序列所表示的功能在较晚状态中不再可用,或者通过完全不同的控制序列集/通过不同的名称可用。此外,可以在较晚状态中引入尚未在较早状态引入的语法方面,例如,通过定义处理(分隔)参数的宏,使得形成参数和参数分隔符的标记出现的顺序很重要,或者通过(重新)定义宏,使得\outer相应的控制序列标记本身不能成为其他宏的参数的组成部分。
因此问题出现了:在早期状态和晚期状态下,你是否仍然拥有相同的语言,而不仅仅是相同的语法基础。;-)


1编辑于 2024/03/03, 16:20 UTC:受人尊敬的 TeX - LaTeX Stack Exchange 成员什里瓦萨一条评论指出“TeX90”不是官方术语。在 Knuth 的原始 TeX 编译器的当前版本(版本 3.141592653,2021 年 1 月)的源代码中,tex.web,该程序仍名为 TeX82。

相关内容