Ist es möglich, ein Array-Argument zu übergeben newcommand
und dann auf die einzelnen Array-Elemente zuzugreifen?
Wenn ich beispielsweise das dritte Element des Arrays (erstes Argument) mit dem Wert des zweiten Arguments multiplizieren möchte:
\newcommand{\hello}[2]{(#1.#3)*#2}
(Hinweis Nr. 1.3 ist wahrscheinlich falsch. Ich frage, wie man auf diesen Wert zugreift.)
Und verwenden Sie den Befehl im Body-Code:
I want \hello{1,2,5}{2} gumdrops.
Bearbeiten: minimales funktionierendes Beispiel?
\documentclass{standalone}
\newcommand{\hello}[2]{(#1)*(#2)}
\begin{document}
I want \hello{1}{2} gumdrops.
\end{document}
Es ist nicht wirklich eine Multiplikation (ich glaube, ich weiß nicht, wie man Zahlen in multipliziert newcommand
), aber das ist mir nicht wichtig und ich möchte in jedem Fall auf die Werte der Argumente zugreifen können. Außer im ersten Argument möchte ich in der Lage sein, ein Array zu übergeben und auf jedes einzelne Element davon zuzugreifenindividuell(d. h. keine Schleife darüber), was im MWE überhaupt nicht zum Ausdruck kommt.
Antwort1
Folgendes könnte für Sie passen:
\documentclass{article}
\usepackage{etoolbox,xparse}
\ExplSyntaxOn
\cs_new_eq:NN \CALC \fp_eval:n
\ExplSyntaxOff
\newcounter{argcnt}
\makeatletter
\newcommand{\newarray}[2]{% \newarray{<array>}{<csv list>}
\setcounter{argcnt}{0}% Restart argument count
\renewcommand{\do}[1]{% With each element do...
\stepcounter{argcnt}% Next arg
\expandafter\gdef\csname #1@\theargcnt\endcsname{##1}% Store arg in \<array>@<num>
}%
\docsvlist{#2}% Store array
\expandafter\xdef\csname #1@0\endcsname{\theargcnt}% Store array element count
}
\newcommand{\getelement}[2]{% \getelement{<array>}{<num>}
\@ifundefined{#1@0}% <array> not defined
{\@latex@error{Array #1 undefined}\@ehc}{}
\expandafter\ifnum\csname #1@0\endcsname<#2 % <num> out of range
\@latex@error{Array #1 only has \csname #1@0\endcsname\space elements}\@ehc
\fi
\csname #1@#2\endcsname% Print element
}
\newcommand{\calc}[1]{\expandafter\CALC\expandafter{#1}}% calculations
\makeatother
\begin{document}
\newarray{arrayA}{a,b,c}%
\newarray{arrayB}{1,2,3}%
\getelement{arrayA}{1}
$2 \times \getelement{arrayB}{2} + \getelement{arrayB}{3} = \calc{2*\getelement{arrayB}{2}+\getelement{arrayB}{3}}$
\end{document}
\newarray{<array>}{<csv list>}
erstellt das Array <array>
mit Elementen, die in der durch Kommas getrennten Werteliste enthalten sind <csv list>
. \getelement{<array>}{<num>}
fungiert als Array-Indizierung, während \calc
verwendet werden kann, um Berechnungen durchzuführen aufNumerischElemente.
Mit diesem Ansatz können Sie praktisch alles im Array speichern und nicht nur Zahlen (und/oder diese mischen).
Antwort2
Ist das in etwa das, was Sie meinen? Vielleicht hilft Ihnen das beim Einstieg.
\documentclass{article}
\newcommand{\twothings}[2]{%
\gdef\thingone{#1}
\gdef\thingtwo{#2}
}
\newcommand{\pickone}[1]{%
\ifnum#1 = 1
\thingone
\else
\ifnum#1 = 2
\thingtwo
\else
\relax
\fi
\fi%
}
\begin{document}
\twothings{First}{Second}
The second thing is \pickone{2}.
\end{document}