![如何定义一个宏并在另一个宏内使用参数](https://linux22.com/image/294014/%E5%A6%82%E4%BD%95%E5%AE%9A%E4%B9%89%E4%B8%80%E4%B8%AA%E5%AE%8F%E5%B9%B6%E5%9C%A8%E5%8F%A6%E4%B8%80%E4%B8%AA%E5%AE%8F%E5%86%85%E4%BD%BF%E7%94%A8%E5%8F%82%E6%95%B0.png)
如何定义 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>
。