Operações matemáticas nos índices de variáveis ​​indexadas

Operações matemáticas nos índices de variáveis ​​indexadas

Tenho uma variável indexada e não sei como realizar operações matemáticas simples no índice, como x{\a-1}.

Estou usando \tikzmathmuito; portanto, meu MWE inclui:

\documentclass[]{standalone}
\usepackage{tikz}
\usetikzlibrary{math}

\begin{document}

\begin{tikzpicture}
\tikzmath{
\x1 = 1;
\x2 = 3;
\x3 = 5;
\x4 = 7;
%Since units are not given in \tikzmat, they will be evaluated as cm in tikz enviroment below.
}

\draw (\x{1},0) -- (10cm,10cm) node[at start, below]{\x{1}}; %This works

%\draw (\x{2-1},0) -- (10cm,10cm) node[at start, below]{\x{2-1}}; %This does not work

%\foreach \ind in {2,...,4}
%\draw (\x{\ind},0) -- (10cm,10cm) node[at start, below]{\x{\ind}}; %This works

%\foreach \ind in {2,...,4}
%\draw (\x{\ind-1},0) -- (10cm,10cm) node[at start, below]{\x{\ind-1}}; %This does not work

\end{tikzpicture}
\end{document}

Responder1

A \xmacro não realiza aritmética em seu argumento, mas você pode fazer com que ela faça isso.

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{math}

\newcommand{\usevar}[2]{%
  \expandafter#1\expandafter{\the\numexpr#2\relax}%
}

\begin{document}

\begin{tikzpicture}
\tikzmath{
\x1 = 1;
\x2 = 3;
\x3 = 5;
\x4 = 7;
%Since units are not given in \tikzmat, they will be evaluated as cm in tikz enviroment below.
}

\draw (\x{1},0) -- (10,5) node[at start, below]{\x{1}};

\draw[red] (\usevar\x{2-1},0) -- (4,5) node[at start, below]{\usevar\x{2-1}};

\foreach \ind in {2,...,4}
\draw (\x{\ind},0) -- (10,10) node[at start, below]{\x{\ind}};

\foreach \ind in {2,...,4}
\draw[red] (\usevar\x{\ind-1},0) -- (5,5) node[at start, below]{\usevar\x{\ind-1}};

\end{tikzpicture}
\end{document}

insira a descrição da imagem aqui

Explicação

Ao fazer isso \tikzmath{\x<argument>=<expression>}, o TikZ define a macro \xe também uma macro interna

\tikz@math@var@indexed@x@<argument>

que por sua vez se expande para a expressão (computada). A macro \xé essencialmente definida para analisar seu argumento e compor o nome da macro interna a partir dele. Não precisa <argument>ser uma expressão matemática e, portanto, nenhuma tentativa de avaliá-la é feita.

Portanto, você precisa realizar a avaliação (assumindo que apenas números inteiros estejam envolvidos no “subscrito”) antes de \xser expandido. Essa é a tarefa realizada por \usevar, que deixa \xde lado, expande \the\numexpr#2\relax, que retorna um número inteiro, e depois volta para \x(seu primeiro argumento, em geral) que agora “vê” o argumento computado.

Responder2

Pequena adição à correção do @egreg:

Se quisermos avaliar apenas as expressões semelhantes à {2*\ind+5}solução de @egreg torna-se:

\newcommand{\useevalof}[1]{%
  \the\numexpr#1\relax%
}

Exemplo: considere $A_{\ind-4}$. Se \indtiver um valor de 6, $A_{\useevalof{\ind-4}}$dará$A_2$

Isso é realmente útil para mim. Estou desenvolvendo uma biblioteca Tikz de mecânica estrutural para engenheiros civis. Veja as fotos abaixo. Os níveis são totalmente automatizados.

Anotado: removido \expandafterapós a nota @egreg.

insira a descrição da imagem aqui

informação relacionada