Wie funktioniert die Erweiterung mit Nodeparts in PGF-Multipart-Nodes?

Wie funktioniert die Erweiterung mit Nodeparts in PGF-Multipart-Nodes?

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: Bild der Fehlermeldung

Wenn ich die \splitcalcsb{3}{1}Zeile auskommentiere, wird der Fehler nicht mehr ausgelöst, aber ich erhalte das folgende Bild: Bild der Ausgabe mit falschen Ergebnissen

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 \globalDefinitionen wirklich vermeiden.

Kennt jemand eine Möglichkeit, (a) \pgfmathsetmacroZwischenberechnungen in einem Makro zu definieren und (b) die Ergebnisse dieser Berechnungen in einem \nodepartAufruf 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.

Wie kann ich mithilfe eines Makros und pgfmath einen berechneten Wert in eine geteilte Form einfügen?

Verwenden Sie \noexpandund \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}

die richtige Ausgabe

verwandte Informationen