
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:
Si descomento la \splitcalcsb{3}{1}
línea, el error ya no se activa, pero aparece la siguiente imagen:
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\let
líneas, todo funciona correctamente, pero realmente me gustaría evitar crear \global
definiciones.
¿Alguien conoce una forma de (a) utilizar \pgfmathsetmacro
para definir cálculos intermedios en una macro y (b) utilizar los resultados de esos cálculos en una \nodepart
llamada 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 \noexpand
y \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}