Argumente in einem Befehl lesen?

Argumente in einem Befehl lesen?

Ich weiß jetzt, dass ich verwenden muss, wenn ich beispielsweise das 3. Argument erhalten möchte, das an einen Befehl übergeben wird #3. Meine Frage ist, wenn dieses Argument ein Array ist, wie kann ich dann Elemente eines Arrays ohne eine for-Schleife lesen?

Wenn beispielsweise {1,2,3} als drittes Argument übergeben wird, wie soll ich das zweite Element davon lesen?

Hinweis: Gehen Sie davon aus, dass ich immer ein durch Kommas getrenntes Array konstanter Länge erhalte.

Antwort1

\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}

Bildbeschreibung hier eingeben


Eine einfachere Definition, bei der die Schleife durch interne Makros ausgeführt wird, ist mit xparseund 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}

Antwort2

Folgendes könnte zu Ihrem Anliegen passen:

Bildbeschreibung hier eingeben

\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}

Die erste ist eine Implementierung mitetoolbox's Listenverarbeitungsfunktionen. \mymacroADurchläuft daher die angegebene Liste, wählt das zweite Element aus und speichert es in \seconditem.

Die zweite Implementierung geht von einer festen Liste aus, die dieser ähnelt, <first>,<second>,<third>und wählt die zweite aus, basierend auf dieser festen Definition. Das funktioniert, da Sie den Parametertext des Makros angeben können, der genau patchen soll.

verwandte Informationen