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

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

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 \nodepartse inicia un nuevo alineamiento celular y las asignaciones realizadas anteriormente quedan así en el olvido.

Puede ampliar las piezas que necesita antes de \nodepartejecutarse. Necesitamos \noexpandestar delante \nodepartpara 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 \expandednecesita 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

ingrese la descripción de la imagen aquí

Respuesta2

Para estos fines xfppuede 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}

ingrese la descripción de la imagen aquí

Respuesta3

Ajá, el problema es ese \calcOney \calcTwoson 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}

información relacionada