
Tengo una forma dividida complicada, con múltiples partes de nodos. Me gustaría ingresar valores calculados en las partes del nodo.
Cuando intento hacerlo usando \pgfmathsetmacro, aparece un error Secuencia de control indefinida.
Aquí está el código:
\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}
Si pongo la declaración del nodo dentro del comando, todo funciona, así que creo que tiene algo que ver con el tiempo de la evaluación, pero no sé lo suficiente para solucionarlo.
Aquí está el código funcional (pero no deseable):
\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}
Respuesta1
Al parecer \nodepart
se inicia un nuevo alineamiento celular y las asignaciones realizadas anteriormente quedan así en el olvido.
Puede ampliar las piezas que necesita antes de \nodepart
ejecutarse. Necesitamos \noexpand
estar delante \nodepart
para evitar su expansión prematura.
\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}
Tenga en cuenta que \expanded
necesita una distribución TeX bastante reciente. Puedes obtener el mismo resultado con la forma “tradicional”:
\begingroup\edef\x{\endgroup
\noexpand\nodepart{two}\calcOne
\noexpand\nodepart{three}\calcTwo
}\x
Respuesta2
Para estos fines xfp
puede resultar útil. (Una advertencia: no se pueden reemplazar los cálculos de coordenadas porxfp
sin ser cauteloso porque TikZ distingue entre escalares y longitudes con unidades).
\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}
Respuesta3
Ajá, el problema es ese \calcOne
y \calcTwo
son locales de la "primera parte". Si pones \nodepart{one}
al principio, obtienes exactamente los mismos resultados. \nodepart{two}
hace que todo lo que sigue se coloque en la "segunda parte", incluida \nodepart{three}
(lo que coloca todo lo que sigue en la "tercera parte").
\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}