
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 \nodepart
inicia um novo alinhamento celular e as atribuições feitas anteriormente ficam tão esquecidas.
Você pode expandir as peças necessárias antes de \nodepart
serem executadas. Precisamos \noexpand
na frente \nodepart
para 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 \expanded
precisa 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
Responder2
Para esses fins, xfp
pode ser útil. (Um aviso: você não pode substituir cálculos de coordenadas xfp
sem 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}
Responder3
Aha, o problema é esse \calcOne
e \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}