
У меня было странное поведение при попытке использовать вычисленные значения для многокомпонентных узлов. Иногда значения недоступны (я получаю ошибку неопределенной управляющей последовательности).
Вот 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}
Если я запускаю код, как указано, я получаю ошибку в строке 35:
Если я раскомментирую \splitcalcsb{3}{1}
строку, ошибка больше не возникает, но я получаю следующее изображение:
и содержание Детали 1 отражает расчеты вызова, \splictcalcsb{3}{1}
а не сам \splitcalcs{8}{4}
вызов.
Если я раскомментирую \global\let
строки, все работает правильно, но мне бы очень хотелось избежать создания \global
определений.
Кто-нибудь знает способ (а) использования \pgfmathsetmacro
для определения промежуточных вычислений в макросе и (б) использования результатов этих вычислений в \nodepart
вызове из того же макроса без использования глобальных переменных?
решение1
@egreg показал, как это следует делать, в ответе на аналогичный вопрос.
Как поместить вычисленное значение в разделенную фигуру с помощью макроса и pgfmath?
Используйте \noexpand
и \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}