マクロに格納された引数指定子を持つ NewDocumentCommand

マクロに格納された引数指定子を持つ NewDocumentCommand

オプションなどに応じて他のマクロを自動的に生成するマクロをいくつか作成しようとしています。

\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はい、 2 番目の (マクロ定義) 引数を取得する前にマクロを展開します。

\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
}

動作するでしょう。これが何に役立つのか、私にはまったくわかりません。

関連情報