“用 expl3 编写重要的 LaTeX 宏!”是一个好建议吗?

“用 expl3 编写重要的 LaTeX 宏!”是一个好建议吗?

我们假设某人已经使用 LaTeX 几年了,并且开始编写他/她自己的宏(超出了的级别\newcommand{\MyVector}[1]{\mathbf{#1}},执行更复杂的任务,可能涉及临时变量、算术、字符串操作等)。

他/她应该直接学习并应用,这是个好建议吗expl3?避免理解并死记硬背整个 TeXbook、LaTeX 的article.cls艺术,不学习、、和、、等之间的差异、、、\expandafter\expandafter\expandafter等命令之间的差异,以及空格字符计数和不计数的地方等。{\begingroup\bgroup\if\ifnum\ifcase\@namedef\@ifnextchar\@gobble\@gobbletwo

在我看来,在 的构建过程中expl3,团队首先收集了他们对 TeX 和 LaTeX 的所有不满,并致力于通过 尽量减少这些不满expl3。这是否已经成功到可以直接使用 开始严肃的宏编写生活的水平expl3

答案1

涵盖了广泛的编程任务expl3,因此可以将其用于大量任务。例如,我的包siunitx完全用 编写expl3,并且有非常我必须掌握一些 LaTeX2e 或纯 TeX 概念的几个地方。(这些往往是在界面上,例如使用 LaTeX2e 文档命令,或者一两个非常有限的地方没有expl3TeX 基元的界面。)

您需要了解一些基本的 TeX 思想expl3,最值得注意的是

  • TeX 处理的是 token 而不是字符/字符串,这意味着我们需要担心类别代码
  • TeX 参数通常是“平衡文本”(括号中的内容或者单个标记),除非明确设置为分隔
  • TeX 通过扩展来工作,但并非所有东西都是“可扩展的”
  • 范围是使用组明确创建的,而不是通过“函数”隐式创建的

(随着时间的推移,LaTeX 团队确实希望在expl3文档中记录所有这些内容。)

有了这些背景知识,您应该能够处理各种编程任务expl3。您可能需要一些“粘合剂”,例如,您需要使用 LaTeX2e 概念,例如包加载,但这通常只是代码的一小部分。特别是,您不太可能需要复杂的扩展控制,除非您追求高性能或非常具体的需求。

必须声明的expl3宽广地稳定。仍有弃用的情况,您可能需要随着时间的推移做出调整,但这种情况越来越少见。有一个正式的弃用机制并通知程序员有关更改。

答案2

[我决定删除多余的评论并提供答案。]

如果我理解正确的话,您想知道对于希望通过 TeX 完成或多或少复杂的编程任务的人来说,直接将重点放在 expl3 上是否有益,而不是从深入了解纯 TeX 和原语以及 LaTeX 2ε 内核开始。

这也取决于这些编程任务背后的目的。

如果您只是希望编写一些或多或少复杂的宏供私人使用,您可能会很高兴以某种方式完成它,例如,通过 expl3(如果这是您已经熟悉的)。

如果您希望发布用于扩展特定框架的代码,则需要熟悉该框架以及您可能用于编写代码的所有其他框架:
通过以包模式使用 expl3 为 LaTeX 2ε 编写包意味着需要熟悉 LaTeX 2ε 和 expl3。

如果第一次尝试使用 expl3 编写自己的宏时没有按预期工作,您可能希望回溯事情以找到原因。这样,您可以轻松快速地找到想要回溯 expl3 内核中定义的 expl3 宏的确切作用。
由于某些东西用于实现 expl3 内核,因此您已经到了需要熟悉该“东西”的地步。该“东西”基本上是一些带有“重命名”原语的 TeX 引擎。
所以你仍然需要熟悉基本概念(“消化过程”:读取和标记 .tex 输入文件、扩展、分配、粘合和盒子、输出例程等)适用于所有 TeX 引擎。

[解释性插入:]

我刚刚写道:

如果首次尝试使用 expl3 编写自己的宏没有达到预期效果...

我无意表明 expl3(或任何其他框架)不可靠/不稳定或诸如此类。
当我开始学习 TeX/LaTeX 2ε/expl3 时,我尝试编写自己的宏,但常常以失败告终。

原因不是“框架”。原因是,一开始我对这个“框架”了解不够多(只通过一些不错的教程传授了一些肤浅的知识,但没有深入的知识),因此试图以编写“框架”的实施者不打算使用的方式使用东西。为了获得有关“框架”的知识,我需要尝试和追踪事物(通过“查看”它们\show),并自己掌握它们的工作原理。

当时我得到了 usenet 新闻组常客的大力帮助压缩文本.tex压缩文本.tex

[说明性插入结束。]

一方面,expl3 的设计目标是让您在编程时不必担心每个晦涩难懂的扩展隐患。
另一方面,expl3 的设计目的是让您一遍又一遍地反复提醒您标记化和扩展等概念,因为使用 expl3,非用户级宏的名称已经告诉您该宏处理哪些参数,以及通过哪些标记化/扩展/任何方法,宏的每个参数在应用于宏定义的替换文本之前将进行预处理。
我认为这是一件好事,因为在出​​现错误消息时,只需查看代码即可追溯事情,这非常有用:您可以更轻松地看到宏没有获得它应该获得的参数类型。例如,宏获取正常参数,而“期望”在逐字分类代码机制下被标记的参数。例如,宏获取控制序列的名称,而期望控制序列标记。...

它也有点像汽车:为了很好地操作它,你必须在一定程度上了解它的工作原理。
我的经验是,对于 expl3,阅读用户文档通常就足够了——只要你非常仔细地阅读它并理解对基本 TeX 概念的引用。
不过,你可能会对 expl3 的实现感兴趣……

如果您喜欢像律师调查合同中的每个单词/短语以寻找陷阱一样仔细阅读用户文档,可能需要在其他信息源(如 TeXbook)中做一些研究,了解 TeX 相关术语和概念的含义,那么我认为 expl3 是一个不错的选择。
如果您喜欢通过阅读代码来学习,那么这也取决于您已经熟悉哪些宏集合等。
我认为,如果您通过学习 expl3 开始进入“TeX 世界”,那么学习曲线将非常陡峭,您将面临对基本 TeX 概念的引用,这迟早会让您能够应对用 LaTeX 2ε 或纯 TeX 编写的代码。;-)

说实话:对我来说,追溯 expl3 代码是一场噩梦,而且需要很长时间。这主要是因为我不熟悉/不习惯它。因此我认为:如果你希望快速达到一个对你来说不再是噩梦的阶段,那么尽快开始学习 expl3。;-)
我认为这也是一个训练的问题:在我刚开始的时候,当我对 TeX 编程和 LaTeX 2ε 代码的外观完全不熟悉时,追溯 LaTeX 2ε 代码(例如,通过阅读 source2e.pdf)对我来说也是一场噩梦。;-)

目前/现在你仍然会遇到很多不是用 expl3 编写的代码。如果你希望能够追踪这些代码,你还需要熟悉纯 TeX 和 LaTeX 2ε 编程。

相关内容