为什么在定义新命令时使用空定义 {},则会在调用该命令时执行括号之间的任何内容?

为什么在定义新命令时使用空定义 {},则会在调用该命令时执行括号之间的任何内容?

以下是 MWE:

\documentclass{article}
\newcommand{\new}{}
\begin{document}
\new{Why is this printed?}
\end{document}

输出一份文档,内容是“为什么打印这个?”。

我的主要问题是是否有人可以向我解释这里new command的定义\new

出于好奇的一个附带问题是,这{Why is the printed?}在技术上不是一个论点,\new默认情况下应该期望 0 个论点?

另一个例子是

\documentclass{article}
\newcommand{\new}{$\sigma$}
\begin{document}
\new{test}
\end{document}

它会打印命令定义的符号 sigma,但在 sigma 之后会打印测试...但是,如果我这样做

\documentclass{article}
\newcommand{\new}[1]{$\sigma$}
\begin{document}
\new{test}
\end{document}

然后我只得到符号 sigma;测试没有被打印(我认为这意味着告诉它这$/sigma$是唯一的参数会使它忽略{test}一个额外的参数......

谢谢。

答案1

OP 的第一个例子是

\documentclass{article}
\newcommand{\new}{}
\begin{document}
\new{Why is this printed?}
\end{document}

并且他/她想知道为什么“为什么要打印这个?”被打印出来。

这里要理解的关键是,宏名称后面的内容,即使看起来像参数,例如\new{Why is this printed?},也只有在宏需要参数时才是实际参数,正如其定义中所要求的那样。然而,定义

\newcommand{\new}{}

用零个参数定义\new。因此,\new{Why is this printed?实际执行\new只有在完成后,遇到组{Why is this printed?}。因此,它会处理该组,在本例中,它只会打印出所附的文本。

OP 的第二个例子类似,但有一个区别:

\documentclass{article}
\newcommand{\new}{$\sigma$}
\begin{document}
\new{test}
\end{document}

这里,宏\new仍然不接受参数;但是,它确实打印出数学字符\sigma。但由于\new没有指定参数,{test}导致在完成后打印出单词“test” \new(打印出 sigma)。

最后,在示例 3 中,

\documentclass{article}
\newcommand{\new}[1]{$\sigma$}
\begin{document}
\new{test}
\end{document}

\new定义为带有 1 个参数,如其定义[1]中宏名称后面的 所示\newcommand。因此,在本例中,\new{test}确实将组{test}作为参数传递给\new。然而,在 的定义中\new, 未对参数执行任何操作,因此 一词test实际上从输入流中消失了。

相关内容