历史 - LaTeX2e - \newcommand - 为什么可选参数为 (]-) 分隔的参数?

历史 - LaTeX2e - \newcommand - 为什么可选参数为 (]-) 分隔的参数?

[请将此问题视为一个无实际意义的问题/“学术”问题。]

LaTeX 内核命令\newcommand发明于几十年前解释3解析并且\NewDocumentCommand可用。

\newcommand带来了可选参数的概念,即形成可选参数的标记需要嵌套在[和之间]

对于按照\newcommand处理可选参数的方式定义的宏,只有左方括号的存在才会[被检测为可选参数存在的指示。匹配项的存在]不会被检测。

简而言之,你可以说:

使用此概念,可选参数的存在指示符是存在左方括号[。可选参数本身由 分隔]

用 ( ) 分隔可选参数]可能会带来问题,例如,]当在可选参数中嵌套可选参数时,会出现 (-) 分隔符匹配问题,而没有意识到需要在花括号之间嵌套可选参数的整个内容。

我的问题是:

为什么决定让可选参数不仅以特定字符标记()开头,而且还以另一个特定字符标记()分隔?[12]12

为什么可选参数作为分隔参数?

为什么可选参数是-delimited 参数?]12

如果省略了分隔符,则可以选择使用 而不是 前缀[,例如,使用 前缀? 来标记可选参数的存在。

处理可选参数的宏的语法\mymacro 是:

\mymacro?{optional}{non-optional}各自\macro{non-optional}

(没有分隔符意味着在嵌套的情况下不会出现缺少分隔符或分隔符匹配的问题。)

答案1

从历史上看,第二个可选参数\newcommand实际上是后来添加到 LaTeX 中的,最早出现在 LaTeX2e 中。LaTeX 2.09\newcommand没有该功能。因此,可选参数实际上也早于该机制。

但历史记录不仅仅具有学术兴趣:它实际上有助于解释这里的决策过程。

诸如 之类的命令的内核代码\section甚至本身\caption\newcommand展示了此类功能的原始实现,其中涉及跨多个宏的多步骤输入处理(这就是我们如何获得调用\section或取决于是否存在)。再加上一个事实,当 LaTeX 首次创建时,TeX 主内存的 16 位寻址是常态(这意味着实际上没有那么多空间用于宏定义)。将其更改为 32 位寻址的“Big TeX”于 80 年代后期首次推出,我认为它最早直到 90 年代才成为标准化(我曾试图在 TUGboat 中找到原始的 Big TeX 文章,但这是一个很难在 Google 上找到的主题)。\@startsection\@sect\@ssect*

因此,考虑到所有这些以及使用 TeX 宏语言编程的挑战,Lamport 追求实现的简单性(因此[₁₂...]₁₂而不是...,也就是说[₁₃...]₁₃这也有可能使非可选参数的括号使用成为挑战)以及用户的人体工程学(选择用[...]{...分隔参数},可以很容易地观察到两者之间的区别,而使用前缀标志则不完全是这样,更不用说?虽然*在文本和数学中并不常见,所以这不太可能\somecommand*意味着执行\somecommand然后排版,*但有人可能想写,例如,How long have you been using \LaTeX?)。

随着 TeX 编程在过去 35 年中日趋复杂,今天有人试图从头开始重新创建 LaTeX,实际上可以实现\section[$\sqrt[3]{x}$]{Cube roots}正确解析,但这样做几乎肯定会破坏向后兼容性¹。


  1. 这充分证明了扩展 LaTeX2e 而不是发布可能破坏 LaTeX3 的决定并不是最好的选择。向后兼容性可能是一个沉重的负担。

相关内容