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}、エラーは発生しなくなりますが、次の画像が表示されます。 誤った結果の出力の画像

詳細 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}

適切な出力

関連情報