我正在尝试定义一个宏,它抓取所有内容直到下一个#
(参数标记)。
我扭曲的想象力想要这样的东西:
\def\test#1###2{(#1)[#2]}
\test hello#{world}
抓取hello
(#1
以 分隔#
) 和world
(#2
以 括号分隔) 然后打印
(hello)[world]
然而我失败了(很惨),因为无论##
我尝试什么组合,TeX 都会大喊:
! Parameters must be numbered consecutively.
<to be read again>
##
l.1 \def\test#1##
#2{(#1)[#2]}
?
所以我猜想简单地写下来#
并不是解决问题的办法。
是否有可能以某种方式拥有一个#
-delimited 宏?
答案1
TeXbook 第 203 页在第一个双重危险的段落中说道
现在我们已经看到了很多例子,让我们来看看控制 TeX 宏的精确规则。定义具有一般形式
\def
⟨控制序列⟩⟨参数文本⟩{
⟨替换文本⟩}
其中 ⟨参数文本⟩ 不包含括号,且⟨替换文本⟩ 中的所有
{
和均正确嵌套。此外,该符号具有特殊意义:在 ⟨参数文本⟩ 中,第一次出现的 后面必须跟,下一次出现的 后面必须跟,依此类推;最多允许九个 。}
#
#
1
2
#
有不#
由于上述规则,参数文本包含 (类别代码 6) 的方式。
正如 TeXbook 中常见的情况一样,这并不是全部的事实;在第 204 页的第二个双重危险的转折处,我们读到
允许对这些规则进行特殊扩展:如果 ⟨参数文本⟩ 的最后一个字符是
#
,因此#
紧接着的是{
,则 TeX 将表现得好像{
已插入到参数文本和替换文本的右端。例如,如果您说 '\def\a#1#{\hbox to #1}
',则后续文本 '\a3pt{x}
' 将扩展为 '\hbox to 3pt{x}
',因为 的参数\a
由左括号分隔。
但是,这种特殊的延伸对于你的目标并没有什么好处。