我正在嘗試編寫一些宏,這些宏又根據選項等自動產生其他宏。
我想知道是否可以使用\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
}
會工作。這能有什麼用,我真的不知道。