我正在寻找近年来 TeX 核心算法(Knuth 于 1982 年左右编写)的重新实现。
在我看来,LaTeX、XeTeX、LuaTeX 都调用 TeX 核心,而 TeX 核心是用古雅的 Pascal-WEB 编写的。它们通过自动化工具将 WEB 程序转换为 Pascal 或 C,对吗?似乎没有用更现代的语言对 TeX 核心进行新的重写。
相关问题:TeX 的更多现代重新实现但那已经是 8 年前的事了。如果在这十年里,有任何新的彻底重写的项目,我都会非常愿意去研究代码。
除了 LuaTeX,有没有完全(或几乎完全)重新实现整个 TeX 核心算法,并且不使用 WEB 的?例如,有一个人据说在 Clojure 中实现了 TeX 核心算法,但我在 GitHub 上找不到它的任何踪迹。此外,还有一个纸其中说作者在 SML 中实现了 TeX 核心算法,但那是很久以前的事了,而且源代码似乎没有公开。
由于我引用了新材料,所以我认为这不算重复。当然,如果任何陈述有误或任何链接有误,请纠正我。
答案1
我正在尝试收集 TeX 实现的列表这里。以下是我所知道的。
首先,LuaTeX 是 TeX 的一个完整且功能齐全的扩展,目前被广泛使用,并且正在积极开发中(至少直到最近)。它没有任何 WEB 代码:代码很久以前就被手动翻译成 C 语言(而不是像 pdfTeX/XeTeX 构建过程内部那样自动翻译成丑陋的代码)。请参阅文章LuaTEX 与 Pascal 告别(MAPS 39,EuroTeX 2009)提供了详细信息。作为运行示例,我将使用
scan_left_brace
文章中的示例:请参阅 LuaTeX 源代码中的相应代码,目前这里.(在一些地方我看到提到了 CWEB,但我不知道为什么;这只是带有注释的 C 代码。)如果你唯一的问题是 Pascal,那么还有 Martin Ruckert 的 web2w 项目(网页,TUGboat 文章), 哪个是确实翻译成了 CWEB(使用自动化工具,但关心生成输出的可读性)。基于这个翻译的代码,Ruckert 教授成功开发了一个电子书阅读器应用程序(暗示) 包括他在 TUG 2019 上展示的第二个版本。排版的 CWEB 列表中的相应部分如下所示:
从源生成
.w
,如下所示:@* Basic scanning subroutines. Let's turn now to some procedures that \TeX\ calls upon frequently to digest certain kinds of patterns in the input. Most of these are quite simple; some are quite elaborate. Almost all of the routines call |get_x_token|, which can cause them to be invoked recursively. @^stomach@> @^recursion@> @ The |scan_left_brace| routine is called when a left brace is supposed to be the next non-blank token. (The term ``left brace'' means, more precisely, a character whose catcode is |left_brace|.) \TeX\ allows \.{\\relax} to appear before the |left_brace|. @p void scan_left_brace(void) /*reads a mandatory |left_brace|*/ {@+@<Get the next non-blank non-relax non-call token@>; if (cur_cmd!=left_brace) {@+print_err("Missing { inserted"); @.Missing \{ inserted@> help4("A left brace was mandatory here, so I've put one in.")@/ ("You might want to delete and/or insert some corrections")@/ ("so that I will find a matching right brace soon.")@/ ("(If you're confused by all this, try typing `I}' now.)"); back_error();cur_tok=left_brace_token+'{';cur_cmd=left_brace; cur_chr='{';incr(align_state); } }
如果 Pascal 和 web/cweb 风格的文学编程都有问题,那么还有 rsTeX(我最喜欢的阅读语言,可能是因为我有小部分在其在线可用时发挥作用)。这是将 WEB 代码手动翻译成(最小)C++(参见文件顶部的注释),以及相应的
scan_left_brace
是这里。如果您想了解更多深奥的知识,那么有很多过时/不完整的实现,它们的完整性和与当今编译器的兼容性各不相同。其中许多似乎源自 Pat Monardo 在 1980 年代末/1990 年代初进行的手动翻译,称为 CommonTeX。请参阅不同存储库中的相应代码部分这里 (CommonTeX),这里 (VorTeX)(见 Pehong Chen 的论文),这里 (cpptex),这里 (tex++),还有一些似乎不是(NTS 和 ExTeX 用 Java 编写,等等)。请参阅 GitHub 上的相应描述。还列出了一些部分重新实现。
正如 Barbara Beeton 在评论中提到的,Doug McKenna 的“JSBox”(其中的“JS”不是“JavaScript”而是“Johann Sebastian”)据说是对 TeX 的完全重写,并通过了 Trip 测试。在 TUG 2019 上,他展示了令人印象深刻的电子书/应用程序其中包括使用 TeX 排版某些交互式图形周围的所有文本。源代码尚未提供。TUG 2019 没有视频录制,但有两段 TUG 2014 的视频可供观看这里和这里,以及TUGboat 文章。
如果您知道任何其他信息,请告诉我。