Ich möchte dieses Codebeispiel komprimieren mit \forcsvlist
(bereitgestellt von deretoolbox
Paket).
\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} }{}
}
\iftoggle
Ich möchte einfach die s nach verschieben \mycmd
und die Argumentenpaare in einer „Liste“ definieren. Ich weiß jedoch nicht, ob es möglich ist, mehr als ein Argument gleichzeitig an zu übergeben forcvslist
.
Nach den tollen Antworten von @Andrew und @Werner habe ich diesen Befehl als mehrargumentige Version von \forcsvlist
: geschrieben:
\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}
Wenn ich mich nicht täusche, wird der Hilfsbefehl erstellt, wenn er nicht zuvor definiert wurde. Ich habe das gemacht, um ihn forcsvlistargs
mehrmals im selben Dokument verwenden zu können, ohne die Funktion vorher explizit deklarieren zu müssen.
Ich nehme an, dass man das \csname \detokenize{#1}\endcsname##1\relax
in so etwas ändern kann #1##1\relax
, aber mir fehlt etwas.
Antwort1
Vielleicht gibt es einen effizienteren Weg, aber Sie können immer so etwas tun:
\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}
Wenn Sie dies mit Latex tun, enthält die Protokolldatei
Mycmd: (fancy|empty)
mycmd: 1: fancy. 2: empty.
Mycmd: (plain|plain)
mycmd: 1: plain. 2: plain.
Mycmd: (user|plain)
mycmd: 1: user. 2: plain.
Dies zeigt, dass \MyCmd
die Argumentpaare korrekt empfangen und dann \mycmd
wie erwartet an n weitergegeben werden.
(Ich habe Ihre Umschaltbefehle entfernt, da sie auf anderen Code zu reagieren scheinen, den Sie nicht eingefügt haben.)
Antwort2
Wenn Sie die „einzelnen“ Elemente in der CSV-Liste richtig angeben, können Sie sie in beliebig viele Argumente aufteilen:
\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}
Nachdem die Listenelemente erfasst wurden, werden sie mit den erforderlichen Argumenten an ein anderes Makro übergeben.