![NewDocumentCommand 的参数说明符存储在宏中](https://linux22.com/image/310349/NewDocumentCommand%20%E7%9A%84%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E%E7%AC%A6%E5%AD%98%E5%82%A8%E5%9C%A8%E5%AE%8F%E4%B8%AD.png)
我正在尝试编写一些宏,这些宏会根据选项等自动生成其他宏。
我想知道是否可以使用\NewDocumentCommand{\somename}{\standardargs}
,即参数列表本身在宏中“隐藏”。
这是一个不起作用的简短示例(当然,不必要的开销被删除了)
\documentclass{article}
\usepackage{xparse}
\newcommand{\standardargs}{O{}+m}
\NewDocumentCommand{\somecmd}{\standardargs}{%
% Do something more or less useful
My args: #2
}
\begin{document}
\somecmd{Hello World}
\end{document}
错误信息是
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
! LaTeX error: "xparse/unknown-argument-type"
!
! Unknown argument type '\standardargs' replaced by 'm'.
!
! See the LaTeX3 documentation for further information.
!
! For immediate help type H <return>.
!...............................................
l.10 }
一些注释
- 我很确定这是扩展问题
- 我是意识到我可能必须使用更复杂的方法来维护
{}
括号作为的可选值默认说明符\NewDocumentCommand
。 - 我同意这种标准参数列表的使用/可用性可能值得怀疑。
答案1
\NewDocumentCommand
是的,在尝试获取第二个(宏定义)参数之前展开宏:
\documentclass{article}
\usepackage{xparse}
\newcommand{\standardargs}{O{}+m}
\expandafter\NewDocumentCommand\expandafter\somecmd\expandafter{\standardargs}{%
% Do something more or less useful
My args: #2
}
\begin{document}
\somecmd{Hello World}
\end{document}
答案2
l3 可让您避免\expandafter
\documentclass{article}
\usepackage{xparse}
\newcommand{\standardargs}{O{}+m}
\ExplSyntaxOn
\def\MyNewDocumentCommand{\exp_args:NNo\NewDocumentCommand}
\ExplSyntaxOn
\MyNewDocumentCommand{\somecmd}{\standardargs}{%
% Do something more or less useful
My args: #2
}
\begin{document}
\somecmd{Hello World}
\end{document}
答案3
这恰恰是一个扩展问题。以下是的定义\NewDocumentCommand
:
\cs_new_protected:Npn \NewDocumentCommand #1#2#3
{
\cs_if_exist:NTF #1
{
\__msg_kernel_error:nnx { xparse } { command-already-defined }
{ \token_to_str:N #1 }
}
{ \__xparse_declare_cmd:Nnn #1 {#2} {#3} }
}
定义一个接受参数进行扩展的变体非常容易,如果\__xparse_declare_cmd:Nnn
是公共函数的话,但事实并非如此。在不违背编程惯例的情况下,您可以自己做:
\ExplSyntaxOn
\cs_set_eq:NN \hupfer_newdocumentcommand:Nnn \NewDocumentCommand
\cs_generate_variant:Nn \hupfer_newdocumentcommand:Nnn { No }
\NewDocumentCommand\NewDocumentCommandExp{mmm}
{
\hupfer_newdocumentcommand:Non #1 { #2 } { #3 }
}
\ExplSyntaxOff
然后你的语法
\NewDocumentCommandExp{\somecmd}{\standardargs}{%
% Do something more or less useful
My args: #2
}
会起作用。我真的不知道这有什么用处。