定义一个新命令,并在 newcommand 内添加参数

定义一个新命令,并在 newcommand 内添加参数

我已阅读有关以下的问题和答案:

我想做的事情类似,但更进一步。我想定义一个带有变量名的新命令,但新命令应该有参数(在我的情况下只有一个)。

我尝试使用两次井号#,如下所示:

\newcommand{\deffun}[1]{\expandafter\newcommand[1]\csname #1\endcsname[1]{#1(##1)}}

但这似乎不起作用,我太困惑或无知了,无法生成带有参数的宏定义嵌套的 mwe。对于答案,指出文档的相关位置就足够了。看起来宏定义嵌套不是一个常用或解释的功能。

PD:我几乎是对的,它是这样的:

\newcommand{\deffun}[1]{\expandafter\newcommand\csname #1\endcsname[1]{#1(##1)}}

答案1

有多种方法可以实现这一点:

在此处输入图片描述

\documentclass{article}

\def\deffunA#1{\expandafter\def\csname #1\endcsname##1{#1(##1)}}

\newcommand{\deffunB}[1]{\expandafter\newcommand\csname #1\endcsname[1]{#1(##1)}}

\usepackage{etoolbox}
\newcommand{\deffunC}[1]{\csdef{#1}##1{#1(##1)}}

\begin{document}

\deffunA{abc}
$\abc{123}$

\deffunB{ghi}
$\ghi{123}$

\deffunC{jkl}
$\jkl{123}$

\end{document}

\deffunA使用纯 TeX 方式定义宏,而\deffunB是与 LaTeX 相关的方式。\deffunC使用etoolbox它提供了一个简洁的接口来定义宏。请参阅3.1.1 宏定义文档。事实上,\csdef使用 LaTeX 定义的\@namedef... 还有另一种方法来实现您所追求的目标。

答案2

錯誤出於錯誤\newcommand[1]

这是一种使用方法expl3

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\deffun}{m}
 {
  \exp_args:Nc \newcommand{#1}[1]{#1(##1)}
 }
\ExplSyntaxOff

\begin{document}

\deffun{foo}

\texttt{\meaning\foo}

\end{document}

输出为

\long macro:#1->foo(#1)

诀窍是\exp_args:Nc跳过下一个标记(N),将下一个括号组作为参数并以此创建控制序列名称(c),然后从跳过的标记重新开始。

考虑到要定义的宏只有一个参数,一种可能的“更合适”的方法是

\NewDocumentCommand{\deffun}{m}
 {
  \cs_new:cpn {#1} ##1 { #1 ( ##1 ) }
 }

本质上使用了相同的想法;请注意,\cs_new:...拒绝定义已经存在的命令,但定义是全局的(与相反\newcommand)。

有多种变化可能。

相关内容