novo comando: passando coordenadas como um único argumento

novo comando: passando coordenadas como um único argumento

É possível passar um argumento de array newcommande depois acessar esses elementos individuais do array?

Por exemplo, se eu quisesse multiplicar o terceiro elemento do array (primeiro argumento) pelo valor do segundo argumento:

\newcommand{\hello}[2]{(#1.#3)*#2}

(A nota nº 1.#3 provavelmente está incorreta, estou perguntando como acessar esse valor.)

E usando o comando no código do corpo:

I want \hello{1,2,5}{2} gumdrops.

Editar: exemplo mínimo de trabalho?

\documentclass{standalone}
\newcommand{\hello}[2]{(#1)*(#2)}
\begin{document}
I want \hello{1}{2} gumdrops.
\end{document}

Não é realmente uma multiplicação (acho que não sei como multiplicar números newcommand), mas isso não é importante para mim e de qualquer forma quero poder acessar os valores dos argumentos. Exceto no primeiro argumento eu gostaria de poder passar um array e acessar cada elemento específico deleindividualmente(ou seja, não fazer loop sobre ele), o que não é totalmente expresso no MWE.

Responder1

O seguinte pode ser adequado para você:

insira a descrição da imagem aqui

\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>}cria a matriz <array>com elementos contidos na lista de valores separados por vírgula <csv list>. \getelement{<array>}{<num>}atua como uma indexação de array, embora \calcpossa ser usado para realizar cálculos emnuméricoelementos.

A abordagem permite armazenar praticamente qualquer coisa na matriz, em vez de apenas números (e/ou misturá-los).

Responder2

Isso é algo parecido com o que você quer dizer? Talvez isso possa ajudar você a começar.

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

informação relacionada