Как работает расширение с nodeparts в узлах pgf multipart?

Как работает расширение с nodeparts в узлах pgf multipart?

У меня было странное поведение при попытке использовать вычисленные значения для многокомпонентных узлов. Иногда значения недоступны (я получаю ошибку неопределенной управляющей последовательности).

Вот 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}

правильный вывод

Связанный контент