Usando forcsvlist com macros que levam mais de um argumento

Usando forcsvlist com macros que levam mais de um argumento

Gostaria de compactar este exemplo de código com \forcsvlist(fornecido peloetoolboxpacote).

\newcommand\mycmd[2]{
  \pagestyle{#2}
  \csname tit#1\endcsname
  \cleardoublepage
}

\def\DOtitlepages{
 \iftoggle{togfancy}{ \mycmd{fancy}{empty} }{}
 \iftoggle{togplain}{ \mycmd{plain}{empty} }{}
 \iftoggle{toguser}{ \mycmd{user}{plain} }{}
}

Gostaria apenas de mover \iftoggles para \mycmde definir os pares de argumentos em uma 'lista'. Porém não sei se é possível passar mais de um argumento por vez para forcvslist.


Após as ótimas respostas de @Andrew e @Werner, escrevi este comando como uma versão multiargumentada de \forcsvlist:

\documentclass{article}
\usepackage{etoolbox}

\newcommand\mycmd[2]{#1 \par#2 \par}

\newcommand\forcsvlistargs[2]{
  \expandafter\providecommand\csname \detokenize{#1}aux\endcsname[1]{\csname \detokenize{#1}\endcsname##1\relax}
   \forcsvlist{\expandafter\csname \detokenize{#1}aux\endcsname}{#2}
}

\begin{document}

\forcsvlistargs{mycmd}{{{fancy}{empty}},{{plain}{empty}},{{user}{plain}}}

\end{document}

Se não me engano, ele cria o comando auxiliar caso não tenha sido definido anteriormente. Fiz isso para usar forcsvlistargsvárias vezes no mesmo documento, sem precisar declarar explicitamente a função primeiro.

Suponho que isso \csname \detokenize{#1}\endcsname##1\relaxpossa ser alterado para algo assim #1##1\relax, mas estou faltando alguma coisa.

Responder1

Talvez exista uma maneira mais eficiente, mas você sempre pode fazer algo assim:

\documentclass{article}
\usepackage{etoolbox}
\newcommand\MyCmd[1]{\typeout{Mycmd: #1}\mycmd#1}
\def\mycmd(#1|#2){
\typeout{mycmd:  1: #1. 2: #2.}
}

\begin{document}
    \forcsvlist\MyCmd{{(fancy|empty)}, {(plain|plain)}, {(user|plain)}}
\end{document}

Quando você faz o latex, o arquivo de log contém

Mycmd: (fancy|empty)
mycmd: 1: fancy. 2: empty.
Mycmd: (plain|plain)
mycmd: 1: plain. 2: plain.
Mycmd: (user|plain)
mycmd: 1: user. 2: plain.

o que mostra que \MyCmdestá recebendo os pares de argumentos corretamente e depois os passando para \mycmdn da maneira esperada.

(Retirei seus comandos de alternância, pois eles parecem responder a algum outro código que você não incluiu.)

Responder2

Se você especificar os itens "individuais" na lista CSV corretamente, poderá dividi-los em quantos argumentos desejar:

insira a descrição da imagem aqui

\documentclass{article}
\usepackage{etoolbox}
\makeatletter
\newcommand{\MyCmd@aux}[2]{\iftoggle{tog#1}{#2, }{no #1, }}
\newcommand{\MyCmd}[1]{\MyCmd@aux#1}
\makeatother
\begin{document}

\newtoggle{togfancy}
\newtoggle{togplain}
\newtoggle{toguser}

\toggletrue{togplain}% togplain is TRUE
\forcsvlist{\MyCmd}{%
  {{fancy}{empty}},
  {{plain}{plain}},
  {{user}{plain}}}


\toggletrue{togfancy}% togfancy is TRUE
\forcsvlist{\MyCmd}{%
  {{fancy}{empty}},
  {{plain}{plain}},
  {{user}{plain}}}

\toggletrue{toguser}% toguser is TRUE
\forcsvlist{\MyCmd}{%
  {{fancy}{empty}},
  {{plain}{plain}},
  {{user}{plain}}}
\end{document}

Depois de capturar os itens da lista, eles são passados ​​para outra macro com os argumentos necessários.

informação relacionada