宏分隔符

宏分隔符

我想要一个宏来分割另一个宏内容,字段分隔符是空格。所以:

\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

相关内容