
Ich habe eine indizierte Variable und weiß nicht, wie ich einfache mathematische Operationen auf dem Index durchführen kann, wie z . B. x{\a-1}
.
Ich verwende es \tikzmath
häufig, daher ist es in meinem MWE enthalten:
\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}
Antwort1
Das \x
Makro führt für seine Argumente keine Arithmetikoperationen aus, Sie können es aber dazu veranlassen.
\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}
Erläuterung
Wenn Sie dies tun \tikzmath{\x<argument>=<expression>}
, definiert TikZ das Makro \x
und auch ein internes Makro
\tikz@math@var@indexed@x@<argument>
das wiederum wird zum (berechneten) Ausdruck erweitert. Das Makro \x
ist grundsätzlich so definiert, dass es sein Argument betrachtet und daraus den internen Makronamen zusammensetzt. Es <argument>
muss kein mathematischer Ausdruck sein und daher wird auch kein Versuch unternommen, ihn auszuwerten.
Sie müssen also die Auswertung durchführen (vorausgesetzt, dass im „Index“ nur ganze Zahlen enthalten sind), bevor \x
erweitert wird. Diese Aufgabe wird von ausgeführt \usevar
, das \x
beiseite legt, erweitert \the\numexpr#2\relax
, was eine ganze Zahl zurückgibt, und dann zu \x
(im Allgemeinen seinem ersten Argument) zurückkehrt, das nun das berechnete Argument „sieht“.
Antwort2
Kleine Ergänzung zu @egregs Fix:
Wenn wir nur die Ausdrücke auswerten möchten, die der {2*\ind+5}
von @egreg ähneln, ergibt sich folgende Lösung:
\newcommand{\useevalof}[1]{%
\the\numexpr#1\relax%
}
Beispiel: Betrachten Sie $A_{\ind-4}$
. Wenn \ind
der Wert 6 ist, $A_{\useevalof{\ind-4}}$
ergibt$A_2$
Das ist wirklich nützlich für mich. Ich entwickle eine Tikz-Bibliothek für Strukturmechanik für Bauingenieure. Sehen Sie sich die Bilder unten an. Die Ebenen sind vollständig automatisiert.
Vermerkt: \expandafter
nach Hinweis von @egreg entfernt.