查找字符串的第一个字符(空行问题)

查找字符串的第一个字符(空行问题)

我正在尝试构建一个宏,给出参数的第一个字符

代码

\def\FIRST#1{\First#1\TAIL}
\def\First#1#2\TAIL{#1}

工作几乎正常:

\FIRST{WORD}

W按预期生产,但

\FIRST{

WORD}

给出错误Paragraph ended before \FIRST was complete.

我有两个问题:

  1. (最重要的)在出现空行的情况下我也需要宏工作

  2. (不太重要)为什么我需要“\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 WOWRDWRD

另一方面,根据定义

\long\def\First#1#2\TAIL{#1}

第二个参数#2分隔参数。\First将第一个标记(或支撑列表)视为第一个参数,并将其前的所有内容\TAIL视为第二个参数。

相关内容