答案1
如果现在正在编写 LaTeX,
\newcommand{\printit[1]}{#1}
\printit[1]
会给出一个不是单个标记的错误消息。
正确的语法是
\newcommand{\printit}[1]{#1}
或者
\newcommand\printit[1]{#1}
LaTeX 并没有采取任何特殊措施来允许这两种形式,只是根据一般的 TeX 宏语法规则,如果宏参数是一个单个标记,则可以省略括号。
如果您传递两个(或在本例中为四个)令牌,\newcommand
那么发生的任何事情本质上都只是意外行为,因为系统实际上无法提供捕获“不太可能”的错误所需的空间或时间。
至于接下来会发生什么,
\documentclass{article}
\begin{document}
\newcommand{\printit[1]}{#1}
\show\printit
\expandafter\show\csname\string\printit\endcsname
\end{document}
生成终端日志
> \printit=macro:
->\@protected@testopt \printit \\printit {0}.
l.7 \show\printit
?
> \\printit=\long macro:
[#1]->#1.
该命令定义\printit
为具有可选的第一个参数,尽管所提供的默认值 0 是作为\newcommand
其自身的默认值。它与定义没有参数的命令\newcommand\foo
相同。\newcommand\foo[0]
处理可选参数的命令的内部部分\\printit
只是删除方括号。
所以
\printit{2}
是
\printit[0]{2}
即
0{2}
排版为 02