Чтение аргументов в команде?

Чтение аргументов в команде?

Теперь я знаю, что если я хочу получить, например, 3-й аргумент, переданный команде, я должен использовать #3. Мой вопрос в том, если этот аргумент является массивом, как я могу прочитать элементы массива без цикла for?

Например, когда {1,2,3} передается как 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}

введите описание изображения здесь


Более простое определение, где цикл выполняется внутренними макросами, — с помощью xparseи LaTeX3

\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>и выбирает второй, основываясь на этом фиксированном определении. Работает, поскольку вы можете указать текст параметра макроса, который должен точно патчить.

Связанный контент