
マルチパート ノードに計算値を使用しようとすると、奇妙な動作が発生することがあります。値が利用できない場合があります (未定義の制御シーケンス エラーが発生します)。
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
(a)マクロ内で中間計算を定義するために使用し、(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}