
Tenho uma variável indexada e não sei como realizar operações matemáticas simples no índice, como x{\a-1}
.
Estou usando \tikzmath
muito; 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 \x
macro 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}
Explicação
Ao fazer isso \tikzmath{\x<argument>=<expression>}
, o TikZ define a macro \x
e 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 \x
ser expandido. Essa é a tarefa realizada por \usevar
, que deixa \x
de 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 \ind
tiver 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 \expandafter
após a nota @egreg.