我正在尝试制作一个宏,为我定义一个单参数宏(原因说来话长)。这是我的实现。
\def\foo#1#2{%
\expandafter\def\csname bar#1\endcsname##1{#2}%
}
\foo{qix}{:: #1 ::}
\barqix{hi world}
现在的问题是。#1
在我的应用程序中可以使用符号,但不美观。我想改用未使用的宏,例如\PARAM
。我想为此我应该使用\let
,但如果我这样做,就会出错。\PARAM
#1
有什么办法可以解决这个问题吗?
答案1
您可以通过将捕获的参数存储在 中来实现这一点\PARAM
。请注意无参数宏会吞噬其后的空格,因此您必须小心传递给结果宏的内容:
\documentclass{article}
\begin{document}
\def\foo#1#2{%
\expandafter\def\csname bar#1\endcsname##1{\def\PARAM{##1}#2}%
}
\foo{baz}{:: \PARAM ::}
\barbaz{hi world}
\foo{bat}{:: {\PARAM} ::}
\barbat{hi world}
\end{document}
答案2
人们通常有相反的问题。;-)
\def\PARAM{##1}
\def\foo#1#2{%
\expandafter\edef\csname bar#1\endcsname##1{#2}%
}
\foo{qix}{:: \PARAM\space ::}
\barqix{hi world}
\bye
您必须使用\edef
,以及所有相关问题,因为 TeX 不会解释 中的替换文本\def
。
否则,您必须对替换文本进行长时间的扫描,用\PARAM
;替换##1
(如果它出现在一组中)...
此外,我发现
\foo{qix}{:: #1 ::}
不那么笨拙。
只是为了好玩,与expl3
和l3regex
:
\input expl3-generic
\ExplSyntaxOn
\cs_new_protected:Npn \foo #1 #2
{
\tl_set:Nn \l_tmpa_tl { #2 }
\regex_replace_all:nnN { PARAM } { \cP\#1 } \l_tmpa_tl
\cs_set:NV \temp:n \l_tmpa_tl
\cs_set_eq:cN {bar#1} \temp:n
}
\cs_generate_variant:Nn \cs_set:Nn { NV }
\ExplSyntaxOff
\foo{qix}{:: PARAM ::}
\barqix{hi world}
\bye