答案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)
你会发现1
as 下标和尾随0
...
寓意:使用\newcommand
而不是\def
,不要太懒惰使用括号。正确的做法是
\newcommand*{\SpinOrb}[2]{\chi_{#1}(x_{#2})}
\SpinOrb{i}{2}
这样您就永远不会遇到问题。还请注意扩展文本中参数周围的括号;如果没有它们,您可能会遇到不愉快的意外。只有当您确实想要并且确实知道自己在做什么时才使用分隔参数。
答案2
在 TeX 中,大多数地方的空格都是常规标记,因此只需添加随机空格就会经常改变输出。在这种情况下,像#2
which 这样的参数说明符后面没有 a{
或另一个参数说明符,它指定了一个分隔参数,该参数捕获所有内容,直到第一次出现以下标记(在本例中为一个空格)。因此,在解析时\SpinOrb i 2
,TeX 首先读取第一个参数i
,然后查看“ 2
”。现在它读取所有内容,直到第一个空格作为第二个参数。由于第一个字符已经是空格,因此第二个参数为空。