我在尝试使用多部分节点的计算值时遇到了一些奇怪的行为。有时值不可用(我收到未定义的控制序列错误)。
以下是 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}
如果我取消注释该\splitcalcsb{3}{1}
行,则不再触发错误,但我得到以下图像:
并且Detail1的内容反映的是\splictcalcsb{3}{1}
调用的计算而不是\splitcalcs{8}{4}
调用本身。
如果我取消注释这些\global\let
行,一切都会正常工作,但我真的想避免创建\global
定义。
是否有人知道如何(a)\pgfmathsetmacro
在宏中定义中间计算,以及(b)在同一个宏的调用中使用这些计算的结果\nodepart
而不使用全局变量?
答案1
@egreg 在回答类似问题时展示了如何做到这一点。
使用\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}