將 forcsvlist 與具有多個參數的巨集一起使用

將 forcsvlist 與具有多個參數的巨集一起使用

我想用\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} }{}
}

我只想將\iftoggles移至\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在同一個文件中多次使用,而不必先明確聲明 de 函數。

我想這\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}

當你乳膠這個日誌檔包含

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}

捕獲清單項目後,它們將傳遞給另一個具有所需參數的巨集。

相關內容