Como funciona a expansão com nodeparts em nós multipartes pgf?

Como funciona a expansão com nodeparts em nós multipartes pgf?

Tive um comportamento estranho ao tentar usar valores calculados para nós multipartes. Às vezes, os valores não estão disponíveis (recebo um erro de sequência de controle indefinida).

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

Se eu executar o código conforme postado, recebo um erro na linha 35: imagem da mensagem de erro

Se eu descomentar a \splitcalcsb{3}{1}linha, o erro não será mais acionado, mas recebo a seguinte imagem: imagem de saída com resultados incorretos

e o conteúdo do Detalhe 1 reflete os cálculos da \splictcalcsb{3}{1}chamada e não a \splitcalcs{8}{4}chamada.

Se eu descomentar as \global\letlinhas, tudo funciona corretamente, mas eu realmente gostaria de evitar a criação \globalde definições.

Alguém conhece uma maneira de (a) \pgfmathsetmacrodefinir cálculos intermediários em uma macro e (b) usar os resultados desses cálculos em uma \nodepartchamada da mesma macro sem usar variáveis ​​globais?

Responder1

@egreg mostrou como isso deveria ser feito em resposta a uma pergunta semelhante.

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

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

a saída adequada

informação relacionada