我想要一个宏来分割另一个宏内容,字段分隔符是空格。所以:
\def\mytext{foo bar}
\def\secondof#1 #2{#2}
\secondof\mytext
什么?你是什么意思:“失控的争论”?哦,对了,我猜\mytext
这只算一个论点,而你期望的是两个。好的,那么
\expandafter\secondof\mytext
确实,结果确实是“bar”,正如我所希望的那样。
但不幸的是,接下来发生了一些令人惊奇的事情:
\def\firstof#1 #2{#1}
\expandafter\firstof\mytext
“fooar”?你一定是在开玩笑!你——亲爱的 TeX——怎么会做出如此荒谬的决定?毕竟,你在 上做得那么好\secondof
。怎么回事?
(为了让这成为一个完整的 MWE,我将\bye
在这里添加一个)
答案1
\firstof foo bar
将简单地foo
作为第一个参数和b
第二个参数。因此,ar
后面会留下一个,并将排版为普通文本。因此,您得到的结果是foo
+ ar
= 。fooar
如果您不想要这种行为,您需要添加一个结束分隔符,\nil
或者\@nil
通常用于此目的:
\def\firstof#1 #2\nil{#1}
\expandafter\firstof\mytext\nil
现在#1 将获得foo
,而#2 将获得所有其余的 ,直到\nil
,即bar
。