Usar forcsvlist con macros que toman más de un argumento

Usar forcsvlist con macros que toman más de un argumento

Me gustaría compactar este ejemplo de código con \forcsvlist(proporcionado por eletoolboxpaquete).

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

Me gustaría simplemente mover la \iftoggles \mycmdy definir los pares de argumentos en una 'lista'. Sin embargo, no sé si es posible pasar más de un argumento a la vez forcvslist.


Después de las excelentes respuestas de @Andrew y @Werner, escribí este comando como una versión multiargumento 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}

Si no me equivoco, crea el comando auxiliar si no está definido previamente. Lo hice para poder usarlo forcsvlistargsvarias veces en el mismo documento, sin tener que declarar explícitamente la función primero.

Supongo que \csname \detokenize{#1}\endcsname##1\relaxse puede cambiar a algo así #1##1\relax, pero me falta algo.

Respuesta1

Quizás haya una manera más eficiente pero siempre puedes hacer algo como esto:

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

Cuando látex esto, el archivo de registro contiene

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

lo que muestra que \MyCmdrecibe los pares de argumentos correctamente y luego los pasa a \mycmdn de la manera esperada.

(Eliminé tus comandos de alternancia porque parecen responder a algún otro código que no incluiste).

Respuesta2

Si especifica correctamente los elementos "individuales" en la lista CSV, puede dividirlos en tantos argumentos como desee:

ingrese la descripción de la imagen aquí

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

Después de capturar los elementos de la lista, se pasan a otra macro con los argumentos necesarios.

información relacionada