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}