让命令成为参数标记

让命令成为参数标记

我正在尝试制作一个宏,为我定义一个单参数宏(原因说来话长)。这是我的实现。

\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。请注意无参数宏会吞噬其后的空格,因此您必须小心传递给结果宏的内容:

enter image description here

\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 ::}

不那么笨拙。

只是为了好玩,与expl3l3regex

\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

相关内容