Erneuerungsbefehl mit durch Kommas getrennten Argumenten

Erneuerungsbefehl mit durch Kommas getrennten Argumenten

Ich habe (glaube ich) ziemlich grundlegende Fragen, kann aber keine klare Antwort finden.

Ich habe einen vorhandenen Befehl \ox{#1,#2}aus einem Paket (Chemmacros), der zwei durch Kommas getrennte Argumente hat. Ich möchte den Befehl ändern (also \renewcommand), weiß aber nicht, wie ich mit den durch Kommas getrennten Argumenten umgehen soll.

Meine Grundidee wäre:

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

Aber das funktioniert nicht.

Hat jemand einen Vorschlag, wie man die Argumente trennen kann?

Antwort1

Hier ist eine einfache Version:

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

Antwort2

Hierfür gibt es drei Möglichkeiten:

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

verwandte Informationen