¿Cómo funciona la expansión con nodeparts en nodos multiparte pgf?

¿Cómo funciona la expansión con nodeparts en nodos multiparte pgf?

He tenido un comportamiento extraño al intentar utilizar valores calculados para nodos multiparte. A veces los valores no están disponibles (recibo un error de secuencia de control indefinida).

Aquí hay un 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}

Si ejecuto el código tal como está publicado, aparece un error en la línea 35: imagen del mensaje de error

Si descomento la \splitcalcsb{3}{1}línea, el error ya no se activa, pero aparece la siguiente imagen: imagen de salida con resultados incorrectos

y el contenido del Detalle 1 refleja los cálculos de la \splictcalcsb{3}{1}convocatoria en lugar de la \splitcalcs{8}{4}convocatoria.

Si descomento las \global\letlíneas, todo funciona correctamente, pero realmente me gustaría evitar crear \globaldefiniciones.

¿Alguien conoce una forma de (a) utilizar \pgfmathsetmacropara definir cálculos intermedios en una macro y (b) utilizar los resultados de esos cálculos en una \nodepartllamada desde la misma macro sin utilizar variables globales?

Respuesta1

@egreg mostró cómo se debe hacer esto en una respuesta a una pregunta similar.

¿Cómo puedo colocar un valor calculado en una forma dividida usando una macro y pgfmath?

Uso \noexpandy \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}

la salida adecuada

información relacionada