カンマ区切りの引数を持つ renewcommand

カンマ区切りの引数を持つ renewcommand

かなり基本的な質問(だと思う)があるのですが、明確な答えが見つかりません。

パッケージ (chemmacros) の既存のコマンド\ox{#1,#2}には、コンマで区切られた 2 つの引数があります。コマンド (つまり\renewcommand) を変更したいのですが、コンマで区切られた引数をどのように処理すればよいかわかりません。

基本的な考え方は次のようになります。

\renewcommand{\ox}[2]{#1($\mathrm{#2}$)}

しかし、これは機能しません。

引数を分離する方法について提案はありますか?

答え1

簡単なバージョンは次のとおりです。

\documentclass{article}

\usepackage{expl3,xparse}
\ExplSyntaxOn
\DeclareDocumentCommand { \ox } { m }
    {
        \clist_set:Nn \l_tmpa_clist { #1 }
        \clist_item:Nn \l_tmpa_clist { 1 }
        ($\mathrm{\clist_item:Nn \l_tmpa_clist {2}}$)
    }
\ExplSyntaxOff

\begin{document}
\ox{1,2}
\end{document}

答え2

これを行うには次の 3 つの方法があります。

\documentclass{article}
\usepackage{xparse}
\usepackage{pgffor}
\usepackage{etoolbox}
\begin{document}

Using xparse and SplitArgument to extract the values and then
pass them to a second helper macro:

\NewDocumentCommand\oxone{>{ \SplitArgument{1}{,} } m }{\realoxone#1}
\newcommand\realoxone[2]{#1($\mathrm{#2}$)}
\oxone{one,two}

Using a plain def to extract the values using a helper macro:

\newcommand\oxtwo[1]{\realoxtwo#1!}
\def\realoxtwo#1,#2!{#1($\mathrm{#2}$)}
\oxtwo{one,two}

Using a pgf loop to extract the values into ox1, ox2, ...:

\newcommand\oxthree[1]{%
  \foreach \x [count=\n] in {#1} {
      \csxdef{ox\n}{\x}% save value n as ox<n>
  }%
  \csuse{ox1}($\mathrm{\csuse{ox2}}$)% use values
}
\oxthree{one,two}

\end{document}

関連情報