我可以在参数文本中使用文字 # 来分隔宏吗?

我可以在参数文本中使用文字 # 来分隔宏吗?

我正在尝试定义一个宏,它抓取所有内容直到下一个#(参数标记)。
我扭曲的想象力想要这样的东西:

\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⟨控制序列⟩⟨参数文本⟩ {⟨替换文本⟩}

其中 ⟨参数文本⟩ 不包含括号,且⟨替换文本⟩ 中的所有{和均正确嵌套。此外,该符号具有特殊意义:在 ⟨参数文本⟩ 中,第一次出现的 后面必须跟,下一次出现的 后面必须跟,依此类推;最多允许九个 。}##12#

#由于上述规则,参数文本包含 (类别代码 6) 的方式。

正如 TeXbook 中常见的情况一样,这并不是全部的事实;在第 204 页的第二个双重危险的转折处,我们读到

允许对这些规则进行特殊扩展:如果 ⟨参数文本⟩ 的最后一个字符是#,因此#紧接着的是{,则 TeX 将表现得好像{已插入到参数文本和替换文本的右端。例如,如果您说 ' \def\a#1#{\hbox to #1}',则后续文本 ' \a3pt{x}' 将扩展为 ' \hbox to 3pt{x}',因为 的参数\a由左括号分隔。

但是,这种特殊的延伸对于你的目标并没有什么好处。

答案2

你实际上无法做到你所要求的,但你可以#在解析参数时忽略它,然后摆脱它:

在此处输入图片描述

\def\test#1#{\def\tmp##1{#11}\zz}
\def\zz#1{(\tmp{})[#1]}

\test hello#{world}

\bye

相关内容