Можно ли передать аргумент массива, newcommand
а затем получить доступ к этим отдельным элементам массива?
Например, если бы я хотел умножить третий элемент массива (первый аргумент) на значение второго аргумента:
\newcommand{\hello}[2]{(#1.#3)*#2}
(Примечание №1.№3, вероятно, неверно, я спрашиваю, как получить доступ к этому значению.)
И используем команду в теле кода:
I want \hello{1,2,5}{2} gumdrops.
Редактировать: минимальный рабочий пример?
\documentclass{standalone}
\newcommand{\hello}[2]{(#1)*(#2)}
\begin{document}
I want \hello{1}{2} gumdrops.
\end{document}
Это не совсем умножение (я думаю, я не знаю, как умножать числа в newcommand
), но это не важно для меня, и в любом случае я хочу иметь возможность доступа к значениям аргументов. За исключением первого аргумента, я хотел бы иметь возможность передавать массив и получать доступ к каждому его конкретному элементуиндивидуально(т.е. не зацикливаясь на нем), что совершенно не выражено в MWE.
решение1
Вам может подойти следующее:
\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>}
создает массив <array>
с элементами, содержащимися в списке значений, разделенных запятыми <csv list>
. \getelement{<array>}{<num>}
действует как индексация массива, в то время как \calc
может использоваться для выполнения вычисленийчисловойэлементы.
Такой подход позволяет хранить в массиве практически все, что угодно, а не только числа (и/или смешивать их).
решение2
Это что-то похожее на то, что вы имеете в виду? Возможно, это поможет вам начать.
\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}