我已阅读有关以下的问题和答案:
我想做的事情类似,但更进一步。我想定义一个带有变量名的新命令,但新命令应该有参数(在我的情况下只有一个)。
我尝试使用两次井号#
,如下所示:
\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
)。
有多种变化可能。