명령에서 인수를 읽으시나요?

명령에서 인수를 읽으시나요?

예를 들어 명령에 전달된 세 번째 인수를 얻으려면 #3. 내 질문은 이 인수가 배열인 경우 for 루프 없이 배열 요소를 어떻게 읽을 수 있습니까?

예를 들어 {1,2,3}이 세 번째 인수로 전달되는 경우입니다. 두 번째 요소를 어떻게 읽어야 합니까?

참고: 항상 일정한 길이의 쉼표로 구분된 배열을 얻는다고 가정합니다.

답변1

\documentclass{article}

\def\firstinlist#1,#2,#3\stoplist{#1}
\def\secondinlist#1,#2,#3\stoplist{#2}
\def\thirdinlist#1,#2,#3\stoplist{#3}

\newcommand{\foo}[1]{%
  The list has\\
  \firstinlist#1\stoplist\\
  \secondinlist#1\stoplist\\
  \thirdinlist#1\stoplist}

\begin{document}

\noindent\foo{1,2,3}

\end{document}

여기에 이미지 설명을 입력하세요


루프가 내부 매크로에 의해 수행되는 더 간단한 정의는 xparseLaTeX3을 사용하는 것입니다.

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\getlistitem}{mm}
 {
  \clist_item:nn { #2 } { #1 }
 }
\ExplSyntaxOff

\newcommand{\foo}[1]{%
  The list has\\
  \getlistitem{1}{#1}\\
  \getlistitem{2}{#1}\\
  \getlistitem{3}{#1}}

\begin{document}
\noindent\foo{1,2,3}

\end{document}

답변2

다음은 귀하의 요청과 일치할 수 있습니다.

여기에 이미지 설명을 입력하세요

\documentclass{article}
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\newcounter{itemnum}
\newcommand{\mymacroA}[3]{%
  \setcounter{itemnum}{0}% Start counting from first item
  \gdef\seconditem{\relax}%
  \renewcommand*{\do}[1]{%
    \stepcounter{itemnum}%
    \ifnum\value{itemnum}=2\relax
      \gdef\seconditem{##1}%
    \fi%
  }%
  \docsvlist{#3}%
}
\makeatletter
\def\extractsecond#1,#2,#3{#2}%
\newcommand{\mymacroB}[3]{%
  \gdef\seconditem{\extractsecond#3}%
}
\makeatother
\begin{document}
\mymacroA{a}{b}{1,2,3,4,5}%
\seconditem

\mymacroA{a}{b}{6,1}%
\seconditem

\mymacroA{a}{b}{123}%
\seconditem

\mymacroA{a}{b}{a,\textbf{b},c}%
\seconditem

\mymacroB{a}{b}{1,2,3}%
\seconditem

\mymacroB{a}{b}{6,1,9}%
\seconditem

\mymacroB{a}{b}{a,\textbf{b},c}%
\seconditem

\end{document}

첫 번째는 다음을 사용하여 구현하는 것입니다.etoolbox의 목록 처리 기능입니다. 따라서 \mymacroA주어진 목록을 순회하고 두 번째 항목을 선택하여 에 저장합니다 \seconditem.

<first>,<second>,<third>두 번째 구현에서는 이 고정 정의를 기반으로 두 번째와 유사하고 선택하는 고정 목록을 가정합니다 . 정확하게 패치해야 하는 매크로의 매개변수 텍스트를 지정할 수 있기 때문에 작동합니다.

관련 정보