我想用\forcsvlist
(由etoolbox
包裹)。
\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
s移到\mycmd
并在“列表”中定义参数对。但是我不知道是否可以一次将多个参数传递给forcvslist
。
在@Andrew 和@Werner 给出出色的回答之后,我将此命令写为多参数版本\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}
如果我没记错的话,如果之前没有定义,它会创建辅助命令。我这样做是为了forcsvlistargs
在同一个文档中多次使用,而不必先明确声明该函数。
我认为\csname \detokenize{#1}\endcsname##1\relax
可以将其改变为类似的东西#1##1\relax
,但我忽略了一些东西。
答案1
也许有更有效的方法,但你总是可以做这样的事情:
\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}
当你使用 latex 时,日志文件包含
Mycmd: (fancy|empty)
mycmd: 1: fancy. 2: empty.
Mycmd: (plain|plain)
mycmd: 1: plain. 2: plain.
Mycmd: (user|plain)
mycmd: 1: user. 2: plain.
这表明\MyCmd
正确接收参数对,然后以\mycmd
预期的方式将它们传递给 n。
(我删除了你的切换命令,因为它们似乎回复了你未包含的其他代码。)
答案2
如果您正确指定 CSV 列表中的“单个”项目,则可以将它们分解为任意数量的参数:
\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}
捕获列表项后,它们会与所需的参数一起传递给另一个宏。