扩展如何与 pgf 多部分节点中的节点部分一起工作?

扩展如何与 pgf 多部分节点中的节点部分一起工作?

我在尝试使用多部分节点的计算值时遇到了一些奇怪的行为。有时值不可用(我收到未定义的控制序列错误)。

以下是 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}行,则不再触发错误,但我得到以下图像: 不正确结果的输出图像

并且Detail1的内容反映的是\splictcalcsb{3}{1}调用的计算而不是\splitcalcs{8}{4}调用本身。

如果我取消注释这些\global\let行,一切都会正常工作,但我真的想避免创建\global定义。

是否有人知道如何(a)\pgfmathsetmacro在宏中定义中间计算,以及(b)在同一个宏的调用中使用这些计算的结果\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}

正确的输出

相关内容