我正在尝试构建一个宏,给出参数的第一个字符
代码
\def\FIRST#1{\First#1\TAIL}
\def\First#1#2\TAIL{#1}
工作几乎正常:
\FIRST{WORD}
W
按预期生产,但
\FIRST{
WORD}
给出错误Paragraph ended before \FIRST was complete.
我有两个问题:
(最重要的)在出现空行的情况下我也需要宏工作
(不太重要)为什么我需要“\TAIL”?如果我删除它,则输出
\FIRST{WORD}
为WRD
答案1
正如链接问题所解释的,如果您希望宏接受\par
令牌,则应该使用前缀\long
:
\long\def\FIRST#1{\First#1\TAIL}
\long\def\First#1#2\TAIL{#1}
至于你的第二个问题:如果我们简单地写会发生什么?
\long\def\FIRST#1{\First#1}
\long\def\First#1#2{#1}
并省略\TAIL
?让我们看看扩展会做什么:当你写
\FIRST{WORD}
整个序列WORD
是宏的参数\FIRST
。的展开\FIRST
给出
\First WORD
和在此过程中牙套被剥掉了!宏\First
现在接受两个参数并丢弃第二个参数:在这种情况下,第一个参数(保留)是W
,第二个参数(丢弃)是。因此O
的扩展是,而其他两个标记仍然存在,从而为您提供。\First WO
W
RD
WRD
另一方面,根据定义
\long\def\First#1#2\TAIL{#1}
第二个参数#2
是分隔参数。\First
将第一个标记(或支撑列表)视为第一个参数,并将其前的所有内容\TAIL
视为第二个参数。