
Ich habe eine komplizierte geteilte Form mit mehreren Knotenteilen. Ich möchte berechnete Werte in die Knotenteile eingeben.
Beim Versuch, dies mit \pgfmathsetmacro zu tun, erhalte ich die Fehlermeldung „Undefinierte Steuersequenz“.
Hier ist der Code:
\documentclass[letterpaper, 12 pt] {article}
\usepackage{tikz}
\usetikzlibrary{shapes,calc}
\newcommand{\splitcalcs}[2]{
\pgfmathsetmacro\calcOne{ #2 / #1 }
\pgfmathsetmacro\calcTwo{ \calcOne + #1 }
\nodepart{two}\calcOne
\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}
Wenn ich die Knotendeklaration in den Befehl einfüge, funktioniert alles. Ich denke also, dass es etwas mit der Auswertungszeit zu tun hat, aber ich weiß nicht genug, um es zu beheben.
Hier ist der funktionierende (aber nicht wünschenswerte) Code:
\documentclass[letterpaper, 12 pt] {article}
\usepackage{tikz}
\usetikzlibrary{shapes,calc}
\newcommand{\splitcalcsb}[2]{
\pgfmathsetmacro\calcOne{ #2 / #1 }
\pgfmathsetmacro\calcTwo{ \calcOne + #1 }
\node (d1)[shape=rectangle split, rectangle split parts=4, fill=red!20, draw] at (4,0)
{Detail 1%
\nodepart{two}\calcOne
\nodepart{three}\calcTwo
};
}
\begin{document}
\begin{tikzpicture}
\splitcalcsb{8}{4}
\end{tikzpicture}
\end{document}
Antwort1
Offenbar \nodepart
beginnt eine neue Zellausrichtung und die zuvor vorgenommenen Zuordnungen werden so vergessen.
Sie können die Teile, die Sie benötigen, erweitern, bevor \nodepart
sie ausgeführt werden. Wir müssen dies \noexpand
im Voraus tun \nodepart
, um eine vorzeitige Erweiterung zu vermeiden.
\documentclass[letterpaper, 12pt] {article}
\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 \splitcalcs{8}{4}};
\end{tikzpicture}
\end{document}
Beachten Sie, dass \expanded
hierfür eine relativ neue TeX-Distribution erforderlich ist. Sie können dasselbe Ergebnis auch mit der „herkömmlichen“ Methode erzielen:
\begingroup\edef\x{\endgroup
\noexpand\nodepart{two}\calcOne
\noexpand\nodepart{three}\calcTwo
}\x
Antwort2
Für diese Zwecke xfp
kann praktisch sein. (Eine Warnung: Sie können Koordinatenberechnungen nicht ersetzen, xfp
ohne vorsichtig zu sein, weil TikZ unterscheidet zwischen Skalaren und Längen mit Einheiten.)
\documentclass[letterpaper, 12 pt] {article}
\usepackage{xfp}
\usepackage{tikz}
\usetikzlibrary{shapes,calc}
\newcommand{\splitcalcs}[2]{%
\nodepart{two}\fpeval{#2/#1}
\nodepart{three}\fpeval{1+#2/#1}
}
\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}
Antwort3
Aha, das Problem ist, dass \calcOne
und \calcTwo
lokal für „Teil eins“ sind. Wenn Sie \nodepart{one}
an den Anfang setzen, erhalten Sie genau dieselben Ergebnisse. \nodepart{two}
bewirkt, dass alles, was danach kommt, in „Teil zwei“ platziert wird, einschließlich \nodepart{three}
(was alles, was danach kommt, in „Teil drei“ platziert).
\documentclass[letterpaper, 12 pt] {article}
\usepackage{tikz}
\usetikzlibrary{shapes,calc}
\newcommand{\splitcalcs}[2]{%
\pgfmathparse{ #2 / #1 }%
\global\let\calcOne=\pgfmathresult
\pgfmathparse{ \calcOne + #1 }%
\global\let\calcTwo=\pgfmathresult
\nodepart{two}\calcOne
\nodepart{three}\calcTwo
}
\begin{document}
\begin{tikzpicture}
\node (d1)[shape=rectangle split, rectangle split parts=4, fill=red!20, draw] at (4,0)
{Detail%
\splitcalcs{8}{4}};
\end{tikzpicture}
\end{document}