我经常看到人们创建新的宏,其中宏标记被括号括起来。例如,
\newcommand{\foo}{foo}
这是不必要的,而且我发现额外的括号使阅读起来更困难。人们为什么要这样做?
(顺便说一句,我甚至看到有人尝试使用\let{\foo}{\bar}
,但当然,没有用。)
答案1
戴上我的 LaTeX3 帽子,我想给出一个略有不同的观点。这将与其他答案重叠,但希望有用。要理解这一点,恐怕您需要了解“标记”。TeX 将输入转换为标记,特别是控制序列,例如\bar
单个标记。
当 Leslie Lamport 设计 LaTeX 时,他决定全部LaTeX 参数应该用括号括起来。这与 TeX 不同,TeX 的许多原语要求参数不带括号。但是,当只传递一个标记时,您可以省略括号,因此
\newcommand{\bar}
和
\newcommand\bar
都有效。
实际上,有两种不同情况可以省略括号:
参数始终为单个标记的情况。这就是 的情况
\newcommand
,其中必须有一个宏名称作为参数。由于参数始终为 ,因此永远不需要括号\<something>
。我不会对这些情况使用括号。将单个标记传递给将接受更多标记的参数的地方。经典示例是下标,其中
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 的所有内容。