둘 이상의 인수를 사용하는 매크로와 함께 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} }{}
}

나는 s를 '목록'의 인수 쌍 \iftoggle으로 이동하고 정의하고 싶습니다 . \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}

목록 항목을 캡처한 후 필수 인수와 함께 다른 매크로로 전달됩니다.

관련 정보