如何定义一个宏并在另一个宏内使用参数

如何定义一个宏并在另一个宏内使用参数

如何定义 a \newcommand(或在 LaTeX 3 中为 a \NewDocumentCommand),它本身定义一个\newcommand带参数的 a 。例如在

\documentclass{article}
\begin{document}

\newcommand{\test}[1]
{
\newcommand{#1}[2]
    {\#1 \#2}
}

\test{\you}
\you{3}{4}
\end{document}

我希望输出是“3 4”而不是“#1 #2”,因为我希望#1 #2 在内部被解释\newcommand为参数。

答案1

类似这样的方法可行。(也可以用xparse同样的方式工作。)

\documentclass{article}

\newcommand{\test}[1]{%
  \expandafter\newcommand\csname #1\endcsname[2]{%
    ##1 and ##2}}
\test{you}

\usepackage{xparse}
\NewDocumentCommand{\xtest} {m}
  {%
    \expandafter\NewDocumentCommand\csname #1\endcsname {mm}
    {##1 and also ##2}%
  }
\xtest{andher}

\begin{document}

\you{3}{4}

\test{me}
\me{5}{6}

\andher{7}{8}

\xtest{andhim}
\andhim{9}{10}

\end{document}

答案2

LaTeX2e 内核定义\@namedef{<csname>}为可以精确地用于此目的,因为它定义为:

\def\@namedef#1{\expandafter\def\csname #1\endcsname}

它将其参数的定义设置为控制序列,等待实际替换文本作为通常\def构造的一部分。

在此处输入图片描述

\documentclass{article}

\makeatletter
\newcommand{\test}[1]{\@namedef{#1}##1##2{##1 and ##2}}
\makeatother

\begin{document}

\test{you}\you{3}{4}

\end{document}

\namedef{<csname>}扩展为\expandafter\def\csname <csname>\endcsname,扩展为\def\<csname>

相关内容