Como posso colocar um valor calculado em uma forma dividida usando uma macro e pgfmath?

Como posso colocar um valor calculado em uma forma dividida usando uma macro e pgfmath?

Eu tenho uma forma dividida complicada, com vários nós. Gostaria de inserir valores calculados nas partes do nó.

Quando tento fazer isso usando \pgfmathsetmacro recebo um erro Sequência de controle indefinida.

Aqui está o 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}

Se eu colocar a declaração do nó dentro do comando tudo funciona, então acho que tem alguma coisa a ver com o tempo da avaliação, mas não sei o suficiente para consertar.

Aqui está o código funcional (mas não desejável):

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

Responder1

Aparentemente \nodepartinicia um novo alinhamento celular e as atribuições feitas anteriormente ficam tão esquecidas.

Você pode expandir as peças necessárias antes de \nodepartserem executadas. Precisamos \noexpandna frente \nodepartpara evitar sua expansão 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}

Observe que isso \expandedprecisa de uma distribuição TeX bastante recente. Você pode obter o mesmo resultado da maneira “tradicional”:

  \begingroup\edef\x{\endgroup
    \noexpand\nodepart{two}\calcOne
    \noexpand\nodepart{three}\calcTwo
  }\x

insira a descrição da imagem aqui

Responder2

Para esses fins, xfppode ser útil. (Um aviso: você não pode substituir cálculos de coordenadas xfpsem ser cauteloso porque TikZ distingue entre escalares e comprimentos com 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}

insira a descrição da imagem aqui

Responder3

Aha, o problema é esse \calcOnee \calcTwoé local da "parte um". Se você colocar \nodepart{one}no início, obterá exatamente os mesmos resultados. \nodepart{two}faz com que tudo depois seja colocado na "parte dois", inclusive \nodepart{three}(que coloca tudo depois na "parte três").

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

informação relacionada