\newcommand 和花括号之间的奇怪依赖关系

\newcommand 和花括号之间的奇怪依赖关系

举个例子有点不自然,但重点是我不明白为什么 会以下面描述的方式{}影响结果。\newcommand

考虑以下定义:

\newcommand\printit[1]{#1}

其结果显而易见。然而,有一个小小的改变:

\newcommand{\printit[1]}{#1}

例如\printit{2}产量:

在此处输入图片描述

我不知道为什么。你能解释一下这是怎么回事吗?

答案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

相关内容