更改一个简单的 TeX 宏,例如
\def\macro#1 #2{#1 #2}
进入
\def\macro#1 #2{#1}
改变输出
\macro Hello world
让我吃惊的是
Helloorld
我的期望是
Hello
恐怕我从根本上误解了 TeX 的工作机制。如果有人能花点功夫解释一下结果就好了。
答案1
TeX 以两种方式抓取参数。第一种是“无界的”,它将吸收一个平衡文本对于每个参数。这里,平衡文本表示一个 token 或单个 token 组。例如
\def\foo#1{<#1>}
和
\foo bar
印刷
<b>ar
同时
\foo{bar}
印刷
<bar>
因为在第一种情况下没有括号(分组),而在第二种情况下有。
TeX 吸收标记作为参数的另一种方式是“分隔”。这是当您指定必须存在某个或某些标记时发生的情况。在定义中
\def\foo#1 {<#1>}
TeX 查找第一个空格之前的所有内容。因此
\foo bar stuff
印刷
<bar>stuff
请注意,空间已被此匹配“用尽”。
在这种情况下
\def\foo#1 #2{<#1><#2>}
你有两个参数。第一个参数是分隔符,读取到第一个空格,而第二个参数是无分隔符,因此会抓取平衡文本.因此
\foo Hello world
你看
<Hello><w>orld
在问题的上下文中,重要的是“剩余内容”仍被打印出来,并且不受\foo
: 的影响,这就是我们仍然orld
在这里看到的原因。在问题的例子中,没有添加“标记”标记,这就是为什么你可能会认为
\def\macro#1 #2{#1 #2}
world
用作时很抢眼
\macro Hello world
而实际上#2
这里只是w
,并且执行完orld
之后在输入流中还剩下。\macro