Gostaria de compactar este exemplo de código com \forcsvlist
(fornecido peloetoolbox
pacote).
\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 \iftoggle
s para \mycmd
e 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 forcsvlistargs
várias vezes no mesmo documento, sem precisar declarar explicitamente a função primeiro.
Suponho que isso \csname \detokenize{#1}\endcsname##1\relax
possa 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 \MyCmd
está recebendo os pares de argumentos corretamente e depois os passando para \mycmd
n 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:
\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.