\newcommand{\cmd}{defn} 和 \newcommand\cmd{defn} 之间有什么区别

\newcommand{\cmd}{defn} 和 \newcommand\cmd{defn} 之间有什么区别

我发现的关于的文档\newcommand仅使用\newcommand{\cmd}{defn},而没有讨论\newcommand\cmd{defn}形式,但我\newcommand\cmd{defn}经常看到形式,尤其是在嵌套定义中。它们之间有什么区别?

答案1

官方 LaTeX 手册(Lamport 的书)始终一致地对参数进行括号,因此x^{2}不是x^2\newcommand{\foo}{zzz}

然而,在 TeX 的最底层,它的宏参数解析器以完全相同的方式报告单个无括号标记和括号内的标记。因此,实际上 latex 定义\newcommand无法判断您是否使用

\newcommand\cmd{abc}

或者

\newcommand{\cmd}{abc}

这种差异对于宏观层面来说是完全不可见的。

这是可能的(本质上是用来\@ifnextchar\lbrace寻找一个括号,如果不存在则发出警告,但这会以代码的复杂性和速度为代价。

在实践中,对于(应该)具有单个命令标记作为参数的命令,没有括号的形式非常好,所以我会使用

\newcommand\cmd{abc}
\setlength\zzz{3pt}

ETC。

有些人过度使用这种方法,例如,对于通常具有较长字符串但在特定情况下是单个标记的参数,编写删除括号。出于同样的原因,这种方法可以工作,\frac12无法判断括号已被删除,但我认为这是非常糟糕的风格,使源代码难以阅读,并导致难以发现错误。\frac{1}{2}\frac

请注意,在错误情况下省略括号可能会改变行为。

\documentclass{article}

\begin{document}


\newcommand\zz123{zzz}

\texttt{\meaning\zz}

\newcommand{\ZZ123}{ZZZ}

\texttt{\meaning\ZZ}


\end{document}

这里是有效的,与定义的\newcommand\zz1相同,只是被保留下来并排版。\newcommand{\zz}{1}\zz123{zzz}

但是,如果将\newcommand{\zz123}整个组作为命令名(此时可能会出现错误,指出它不是单个标记,但事实并非如此),实际上会产生一系列奇怪的内部定义,并且根本没有产生有用的定义,尽管没有给出错误。

相关内容