comando de renovação com argumentos separados por vírgula

comando de renovação com argumentos separados por vírgula

Tenho perguntas bastante básicas (eu acho), mas não consigo encontrar uma resposta clara.

Eu tenho um comando existente \ox{#1,#2}de um pacote (chemmacros) que possui dois argumentos separados por vírgulas. Quero alterar o comando (ou seja \renewcommand), mas não sei como lidar com os argumentos separados por vírgula.

Por ideia básica seria:

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

Mas isso não funciona.

Alguém tem alguma sugestão de como separar os argumentos?

Responder1

Aqui está uma versão simples:

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

Responder2

Aqui estão três maneiras de fazer isso:

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

informação relacionada