如何定义一个定义另一个命令的命令?

如何定义一个定义另一个命令的命令?

我有一个定义的命令,xparse如下所示:

\NewDocumentCommand{\ME}{sogd<>}{\added[id=ME,remark={#1}]{#2}}

(完整代码见将复杂的参数模式传递给新命令

现在,我想定义它通过另一个命令,类似于

\newcommand{\definerevision}[1]{
    \NewDocumentCommand{\#1}{gg}{\added[id=#1,remark={??#1}]{??#2}}
}

??意思是“这里放什么?”)

这是\definerevision{INITIAL}扩展来定义命令\NewDocumentCommand{\INITIAL}{gg}{\added[id=INITIAL,remark={#1}]{#2}}(例如在标题中)

有两个潜在的问题,第一是扩展\#1,第二是参数#1必须区分是顶级命令还是嵌套命令(如何区分)。

有没有办法使用\newcommand或通过另一个命令来定义一个命令\xparse

答案1

在另一个命令中定义一个命令需要使用\csname #1 \endcsname方法\NewDocumentCommand(或\newcommand同样)(假设#1 是新命令的名称,作为外部命令的参数),前面是\expandafter

如果一个命令在另一个命令中定义,则所有参数参数字符#都必须加倍,即##1,,##2等等。

\documentclass{article}
\usepackage{xparse}

\newcommand{\added}[1]{%
\Large%
\textbf{Arg was #1}%
}

\newcommand{\definerevision}[1]{%
  \expandafter\NewDocumentCommand\csname #1\endcsname{gg}{\added[id=#1,remark={##1}]{##2}}%
}


\definerevision{MOE}  

\definerevision{LARRY}  

\definerevision{CURLY}  
\begin{document}

\MOE{Added}{only this}

\LARRY{Added}{other more important stuff}

\CURLY{Screwed}{up the whole thing}


\end{document}

相关内容