LaTeX3 和 ConTeXt 相比如何?

LaTeX3 和 ConTeXt 相比如何?

据我了解,LaTeX3 是对 LaTeX 的重写,以修复 LaTeX2e 的缺点,而 ConTeXt 是另一种基于 TeX 的语言(像 LaTeX 一样的宏集?),它解决了相当多难以用 LaTeX2e 解决的问题。

它们相比如何?它们解决的是同样的问题吗?LaTeX3 是否为 LaTeX 世界带来了与 ConTeXt 类似的功能?

答案1

这里的完整答案有几个部分。首先,在撰写本文时,重要的是要记住 ConTeXt 不仅可用而且运行良好,而 LaTeX3 是一个正在开发的概念。这意味着甚至还不能 100% 确定 LaTeX3 将采取什么形式。LaTeX3 会实现什么也不清楚,但为了回答这个问题,我将忽略这一点!我还将强调看似(广泛的)相似之处。

基于 TeX 的系统

接下来要讨论的是两个大方面:用户“体验”和实施。这两个方面存在差异,但我想强调一个重要的相似之处:ConTeXt 和 LaTeX3 最终都是基于 TeX 的。一种截然不同的方法是使用另一种语言解析输入(Python 因其脚本能力而经常被强调),然后转换为 TeX 基元(加上低级宏),并且只在 TeX 中进行真正的排版。ConTeXt 和 LaTeX3 都不会这样做。

在用户层面

在用户层面,LaTeX 使用文档类的概念作为关键概念,。IE你总是有:

\documentclass{<whatever>}

在 LaTeX2e 中,类和添加代码之间的分离有些模糊。LaTeX3 的理念是将“设计”和“代码”分开,因此将文档类作为纯粹的设计概念。ConTeXt 不会以同样的方式强制加载文档的特定“样式”的概念(尽管可以加载模块来设置默认值)。这里有一个关键的哲学差异,因为 ConTeXt 在许多方面更接近普通 TeX 概念“作者即设计师”,而 LaTeX3 旨在加强这两个角色的分离。

一个明显相似之处是,LaTeX3 将比 LaTeX2e 更多地使用“开箱即用”的 keyval 输入。这与大量使用 keyval 的 ConTeXt 非常相似。然而,在实现上存在差异(经典的差异是 LaTeX keyval 输入会跳过 周围的空格=,而 ConTeXt 则不会)。

该领域的另一个相似之处是“核心”LaTeX3 支持的思想范围比“核心”LaTeX2e 的思想范围要广得多,因此与 ConTeXt 管理的思想范围相似。具体如何实现取决于 LaTeX3 的开发,因此目前还不可能对该领域进行更详细的分析。该领域涵盖了问题的“LaTeX2e 的局限性”部分。例如,ConTeXt 可以进行正确的网格排版,这是 LaTeX2e 面临的一个重大挑战。

执行

在实现层面,ConTeXt(Mark IV)混合使用了 TeX 和 Lua。另一方面,LaTeX3(目前)依赖于 e-TeX 加上宏\pdfstrcmp(或等效功能),因此可以与最新版本的 pdfTeX、XeTeX 和 LuaTeX 配合使用。然后,LaTeX3 使用所需的 TeX 原语构建自己的编程语言(“expl3”)。这显然是一个根本的不同,因为 Lua 为 ConTeXt 提供了一个灵活的编程系统,还可以访问使用原语无法获得的 TeX 内部功能。在撰写本文时,尚不清楚 LaTeX3 如何处理“仅 LuaTeX”的想法:例如,是否有团队支持的“仅 LuaTeX”模块?

LaTeX3 仅使用 TeX,而 ConTeXt 使用大量 Lua,这一事实导致了 LaTeX3 与 LaTeX2e 一样,旨在成为一种可以以“经典”方式使用的 TeX 格式

pdftex“&latex3”<我的文件>

相比之下,ConTeXt 是一个更“动态”的汇编,因为 Lua 部分不会保存到格式文件中。因此,ConTeXt 始终使用脚本执行context。使用这个基于脚本的包装器,ConTeXt 可以“自动”处理多个 TeX 运行、索引等。目前的目标是 LaTeX3 将以与 LaTeX2e 相同的方式工作:一次 LaTeX 运行 = 一次 TeX 运行。

记录接口

ConTeXt 明确基于 TeX 和 Lua 构建,而 LaTeX3 定义了自己的语言 expl3。因此,ConTeXt 编程意味着使用 TeX 编程,而这在 ConTeXt 手册中没有正式记录。LaTeX3 背后的一个关键驱动因素是,除了内核之外,LaTeX3 编程所需的一切都应记录在 LaTeX3 文档中。

LaTeX3 还致力于明确区分用户函数和内部函数,IE对于每个文档级函数,\foo都应该有一个(记录的)内部函数\int_foo。ConTeXt 有一组非常丰富的接口,但(据我所知)它并不是建立在如此严格的“两层”原则之上的。

答案2

ConTeXt 是一个完整的、独立的系统,它试图为(几乎)所有问题提供解决方案。

另一方面,LaTeX(所有版本)“仅仅”是一个内核。您需要加载软件包才能获得某些功能,这并不是缺陷:LaTeX 旨在通过软件包和类进行扩展。LaTeX3 将把当前软件包中的一些基本功能移至内核,尽管如此,其他软件包/类编写者仍需要添加许多功能。source3 或 xparse 定义的主要是供软件包编写者使用的基本函数。

ConTeXt 由一个相当小的团队管理(因此也受其控制)。(我不知道如果主要维护者(Hans Hagen)停止 ConTeXt 的工作会发生什么。)

LaTeX 团队规模越来越大,而且随着时间的推移也不断发展。有些人确实退出了团队,也有新人加入。

关于 ConTeXt 实现的内部工作和思想,目前还没有文档记录。这使得编写代码来扩展或更改 ConTeXt 变得相当困难。ConTeXt 有一个“用户模块”的概念,但我认为它并不常用(正如维护者曾经写道的“LaTeX 习惯于重载代码,从而创建维护体面,但这并不意味着我希望我的代码有这样的依赖性。”)。我的印象是,在大多数情况下,人们会等到 ConTeXt 维护者实现某个功能。

另一方面,存在数百和数千页的内部 LaTeX 文档。如果您查看 source3 等文档,您会发现 LaTeX 团队付出了巨大努力来描述代码背后的想法,并且每次您提出问题时,您都会得到长篇大论且有用的答案。LaTeX 不仅允许您参与,而且实际上还邀请您为 LaTeX 添加一些内容。

我认为 ConTeXt 非常强大,那些只想拥有一个好的系统来编写/处理文档的人应该考虑它。但对我来说,TeX 的乐趣之一就是能够编写自己的代码、调试问题、了解系统的工作原理。我不想只使用那些我只需要学习按哪个按钮或输入哪个命令的应用程序,即使这个应用程序可以做我想做的一切,所以每次我亲自尝试在 ConTeXt 中找到自己的方式时,我最终都会感到沮丧。

相关内容