我有一个定义的命令,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}