
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:
Se eu descomentar a \splitcalcsb{3}{1}
linha, o erro não será mais acionado, mas recebo a seguinte imagem:
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\let
linhas, tudo funciona corretamente, mas eu realmente gostaria de evitar a criação \global
de definições.
Alguém conhece uma maneira de (a) \pgfmathsetmacro
definir cálculos intermediários em uma macro e (b) usar os resultados desses cálculos em uma \nodepart
chamada 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 \noexpand
e \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}