
Beim Versuch, berechnete Werte für mehrteilige Knoten zu verwenden, ist mir ein seltsames Verhalten begegnet. Manchmal sind die Werte nicht verfügbar (ich erhalte die Fehlermeldung „undefinierte Steuersequenz“).
Hier ist ein MWE:
\documentclass[border=1mm] {standalone}
\usepackage{tikz}
\usetikzlibrary{shapes,calc}
\newcommand{\splitcalcsb}[2]{
\pgfmathsetmacro\calcOne{ #2 / #1 }
\pgfmathsetmacro\calcTwo{ \calcOne + #1 }
\node (d0)[shape=rectangle split, rectangle split parts=4, fill=red!20, draw] at (0,0)
{Detail 0%
\nodepart{two}\calcOne
\nodepart{three}\calcTwo
};
}
\newcommand{\splitcalcs}[2]{
\def\calcOne{\fpeval { #2 / #1 }}
\def\calcTwo{\fpeval{ #2 / #1 + #1 }}
% Uncomment these two lines to get proper functioning
% \global\let\calcOne=\calcOne
% \global\let\calcTwo=\calcTwo
\nodepart{two}\calcOne
\nodepart{three}\calcTwo
}
\begin{document}
\begin{tikzpicture}
%Uncomment only this line to avoid an error but Detail 1 uses the results of this macro call
%\splitcalcsb{3}{1}
\node (d1)[shape=rectangle split, rectangle split parts=4, fill=red!20, draw] at (4,0)
{Detail 1%
\splitcalcs{8}{4}
};
\splitcalcsb{9}{4}
\end{tikzpicture}
\end{document}
Wenn ich den Code wie gepostet ausführe, erhalte ich in Zeile 35 einen Fehler:
Wenn ich die \splitcalcsb{3}{1}
Zeile auskommentiere, wird der Fehler nicht mehr ausgelöst, aber ich erhalte das folgende Bild:
und der Inhalt von Detail 1 spiegelt die Berechnungen des \splictcalcsb{3}{1}
Anrufs und nicht den \splitcalcs{8}{4}
Anruf selbst wider.
Wenn ich die Zeilen auskommentiere \global\let
, funktioniert alles ordnungsgemäß, aber ich möchte das Erstellen von \global
Definitionen wirklich vermeiden.
Kennt jemand eine Möglichkeit, (a) \pgfmathsetmacro
Zwischenberechnungen in einem Makro zu definieren und (b) die Ergebnisse dieser Berechnungen in einem \nodepart
Aufruf desselben Makros zu verwenden, ohne globale Variablen zu verwenden?
Antwort1
@egreg hat in einer Antwort auf eine ähnliche Frage gezeigt, wie dies gemacht werden sollte.
Verwenden Sie \noexpand
und \expanded
.
\documentclass[border=1mm] {standalone}
\usepackage{tikz}
\usetikzlibrary{shapes,calc}
\newcommand{\splitcalcs}[2]{
\pgfmathsetmacro\calcOne{ #2 / #1 }
\pgfmathsetmacro\calcTwo{ \calcOne + #1 }
\expanded{%
\noexpand\nodepart{two} \calcOne
\noexpand\nodepart{three} \calcTwo
}%
}
\begin{document}
\begin{tikzpicture}
\node (d1)[shape=rectangle split, rectangle split parts=4, fill=red!20, draw] at (4,0)
{Detail 1%
\splitcalcs{8}{4}
};
\end{tikzpicture}
\end{document}