宏参数后面可以加空格吗?

宏参数后面可以加空格吗?

如下所示,定义了一个宏,宏参数后没有空格也可以正常使用,

$$
\def \SpinOrb#1#2{ \chi_#1(\x_#2) }  
\SpinOrb i 2 \SpinOrb j 1
$$

宏参数后不能有空格

如下所示,相同的宏,但宏参数后有一个空格,无法以相同的方式使用。您能解释一下为什么会发生这种情况吗?

$$
\def \SpinOrb#1#2 { \chi_#1(\x_#2) }  
\SpinOrb i 2 \SpinOrb j 1
$$

宏参数后一个空格

答案1

当你这样做

\def\foo#1#2{(#1,#2)}

然后#1#2未限定参数。未限定的参数要么是单个标记({或除外}),要么是括号组{...}。TeX忽略查看未限定参数时的空格:来自

\def\foo#1#2{(#1,#2)}
\foo a b \foo ab \foo {abc}   {def}

我们得到

在此处输入图片描述

另一方面,当你写

\def\foo#1#2 {(#1,#2)}

然后#1是一个正常的,未限定的参数,但#2现在是一个由明确的空间标记。有了这个定义,你会发现

\def\foo#1#2 {(#1,#2)}
\foo ab \foo a b

在此处输入图片描述

在这两种情况下,控制序列后面的空格都会被忽略(通常),并被a抓取为第一个(未分隔的)参数。现在 TeX 开始查看空格之前的所有内容。在第一种情况下,它会找到b空格,b第二个参数也是如此。但在第二种情况下,第一个标记跟在空格后面a 一个空格,因此第二个参数为空。

具体来说你的例子

\def\SpinOrb#1#2 { \chi_#1(x_#2) }  
\SpinOrb i 2

根据我刚才说明的 TeX 规则,i被抓取为第一个参数,第二个参数为空,因此代码可以有效扩展为

\SpinOrb i 2\chi_i(x_) 2

并且括号作为下标。这是在扩展文本中省略括号的结果:即使定义正确(后面没有空格#2),在输入中使用括号仍然会导致意外结果,因为

\SpinOrb{i}{10}\chi_i(x_10)

你会发现1as 下标和尾随0...

寓意:使用\newcommand而不是\def,不要太懒惰使用括号。正确的做法是

\newcommand*{\SpinOrb}[2]{\chi_{#1}(x_{#2})}  
\SpinOrb{i}{2}

这样您就永远不会遇到问题。还请注意扩展文本中参数周围的括号;如果没有它们,您可能会遇到不愉快的意外。只有当您确实想要并且确实知道自己在做什么时才使用分隔参数。

答案2

在 TeX 中,大多数地方的空格都是常规标记,因此只需添加随机空格就会经常改变输出。在这种情况下,像#2which 这样的参数说明符后面没有 a{或另一个参数说明符,它指定了一个分隔参数,该参数捕获所有内容,直到第一次出现以下标记(在本例中为一个空格)。因此,在解析时\SpinOrb i 2,TeX 首先读取第一个参数i,然后查看“ 2”。现在它读取所有内容,直到第一个空格作为第二个参数。由于第一个字符已经是空格,因此第二个参数为空。

相关内容