我想以以下方式实现队列。一个宏(变量?)\queue
保存一个可能包含点的字符串。用点分隔的子字符串是队列的元素。因此,字符串“abc”表示一个包含 3 个元素的队列,即“a”、“b”和“c”。然后我想定义一个宏,它接收一个队列作为参数并返回不包含第一个元素的队列。
当我将其定义为
\def\firstout#1.#2{#2}
(上面一行没有任何空格)或
\def\firstout #1.#2{#2}
\firstout
(和之间有一个或多个空格#1.#2{#2}
)它运行良好,也就是说,以下代码按预期返回“bc”:
\def\queue{a.b.c}
\expandafter\firstout\queue
但如果我将其定义为
\def\firstout#1.#2 {#2}
\def\firstout#1.#2
(和之间有空格{#2}
)或
\def\firstout #1.#2 {#2}
(后面有一个空白\def\firstout
,后面还有另一个空白#1.#2
)然后当我尝试执行时收到以下错误\expandafter\firstout\queue
:
段落在 \firstout 完成之前结束。
为什么?那些空白处有什么作用?如果可以的话,请也参考一些文档。
笔记:我在 MikiTeX 上使用 TeXMaker。
答案1
宏定义中使用的是代币不是输入文件中的字符。命令名称后的空格被视为命令名称标记的结束,并且其本身永远不会被标记。\firstout
是一标记。名称为 的 csname 标记firstout
。相反,后面的空格字符#2
被标记为字符标记,因此#2
成为由空格分隔的分隔参数,就像#1
由 分隔的分隔参数一样.
。