人们为什么要使用不必要的牙套?

人们为什么要使用不必要的牙套?

我经常看到人们创建新的宏,其中宏标记被括号括起来。例如,

\newcommand{\foo}{foo}

这是不必要的,而且我发现额外的括号使阅读起来更困难。人们为什么要这样做?

(顺便说一句,我甚至看到有人尝试使用\let{\foo}{\bar},但当然,没有用。)

答案1

戴上我的 LaTeX3 帽子,我想给出一个略有不同的观点。这将与其他答案重叠,但希望有用。要理解这一点,恐怕您需要了解“标记”。TeX 将输入转换为标记,特别是控制序列,例如\bar单个标记。

当 Leslie Lamport 设计 LaTeX 时,他决定全部LaTeX 参数应该用括号括起来。这与 TeX 不同,TeX 的许多原语要求参数不带括号。但是,当只传递一个标记时,您可以省略括号,因此

\newcommand{\bar}

\newcommand\bar

都有效。

实际上,有两种不同情况可以省略括号:

  1. 参数始终为单个标记的情况。这就是 的情况\newcommand,其中必须有一个宏名称作为参数。由于参数始终为 ,因此永远不需要括号\<something>。我不会对这些情况使用括号。

  2. 将单个标记传递给将接受更多标记的参数的地方。经典示例是下标,其中a_i可以工作,但您需要a_{ii}。我总是在这里使用括号,所以请支持a_{i}

这个答案的 LaTeX3 部分是,我们试图更加严格地确定哪些参数是单个标记,哪些是多个标记。目前,这只发生在代码级别,但我预计用户也会采取类似的方法。因此,如果参数必须是单个标记,则通过不是使用括号。另一方面,如果参数可以采用多个标记,那么你必须即使只传递一个标记,也要使用括号。

答案2

代码应该易于阅读和理解。对所有参数使用括号(即使它们不是必需的)更一致。因此,我更喜欢使用括号,以免让没有经验的用户感到困惑。

Leslie Lamport 写道LaTeX - 文档准备系统:“Macho TeX 程序员有时会删除第一个参数周围的括号\newcommand;不要自己动手。”

Leslie Lamport 是 LaTeX 的最初开发者。在参考手册中,他规定了 的语法\newcommand必须包含括号:\newcommand{cmd}[args][opt]{def}。即使您偏离了语法也不会出错,但这并不意味着这种偏离是正确的,并且始终有效,并且自动语法检查器会理解这种偏离不会造成任何损害,对于\newcommand\renewcommand\providecommand它们的星号环境,以及可能对于所有括号属于语法但并非绝对必要的地方。

由于\let不是 LaTeX 命令,因此该语法不适用。

答案3

对于一个人来说容易阅读的东西对于另一个人来说不一定容易阅读。我个人认为:

\newcommand{\foo}{foo}

很多比以下更易于阅读:

\newcommand\foo{foo}

特别是,它清楚地揭示了函数的两个参数是什么,而后者却没有。

答案4

我在 LaTeX 中对所有宏的所有参数都使用括号,因为不是在我看来,这样做是需要解释的情况。LaTeX 的设计使得其宏表现为函数,因此我对类似内容的心理模型\newcommand{\foo}{\bar}是“提供\newcommand预期的命令\foo及其行为\bar”;当我看到\newcommand\foo{\bar}(或者更糟的是,因为是单个标记\newcommand\foo\bar所以有效)时,我看到的不是那么明显“展开;此外,这里是,它恰好在它本身展开之前被这个展开所吞噬;此外,这里是,它同样被偶然吸收”。如果我不知道(或者,在早衰的时刻,我没有记得)它是如何工作的,后一种形成不会告诉我。前者会。即使在阅读我自己的文档时,这也允许我直观地将标记分组为“函数的一部分”和“文本的一部分”。\bar\newcommand\foo\bar\newcommand

我有点惊讶竟然有对 的支持(更不用说非常有说服力的支持)\newcommand\foo{\bar},而对 的点头\frac23让我感到困惑(第二十三个分数命令是什么?)。这似乎表明受访者经常对 TeX 解析器进行低级分析,远远超出了编写结构化文档所需的范围。我自己不会直接用 XML 编写,但 LaTeX 括号样式强加的结构很清晰,可以减少错误(尤其是因为 LaTeX 允许一致地应用它,不像 TeX 的 的有害行为\let,幸运的是,在正常情况下永远不需要使用这个命令)。

在我看来,它基本上\newcommand\foo{\bar}是源自从 TeX 中学到的残留习惯,这种习惯支持并需要一种编程思维方式,而这种思维方式在日常使用 LaTeX 时既不需要也不受欢迎。事实上,在只涉及 LaTeX 的参考资料中从未教授过它,我怀疑这里使用它的人在早期就学会了,或者从那些自己在那个时代学习过的人那里学会了(特别是对 Geoffrey Jones 的回应:TeX 的习语对某些人来说很熟悉,但希望这种熟悉程度会降低)。如果新手应该阅读此回复,我个人认为他们应该意识到这种现象,并在学习之前仔细检查他们在互联网上阅读的有关 LaTeX 的所有内容。

相关内容