Me gustaría compactar este ejemplo de código con \forcsvlist
(proporcionado por eletoolbox
paquete).
\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 \iftoggle
s \mycmd
y 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 forcsvlistargs
varias veces en el mismo documento, sin tener que declarar explícitamente la función primero.
Supongo que \csname \detokenize{#1}\endcsname##1\relax
se 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 \MyCmd
recibe los pares de argumentos correctamente y luego los pasa a \mycmd
n 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:
\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.