Verwenden von forcsvlist mit Makros, die mehr als ein Argument annehmen

Verwenden von forcsvlist mit Makros, die mehr als ein Argument annehmen

Ich möchte dieses Codebeispiel komprimieren mit \forcsvlist(bereitgestellt von deretoolboxPaket).

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

\iftoggleIch möchte einfach die s nach verschieben \mycmdund 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 forcsvlistargsmehrmals 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\relaxin 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 \MyCmddie Argumentpaare korrekt empfangen und dann \mycmdwie 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:

Bildbeschreibung hier eingeben

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

verwandte Informationen