在宏扩展中省略参数

在宏扩展中省略参数

更改一个简单的 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

相关内容