マクロと pgfmath を使用して、分割された図形に計算値を配置するにはどうすればよいですか?

マクロと pgfmath を使用して、分割された図形に計算値を配置するにはどうすればよいですか?

複数のノード部分を持つ複雑な分割図形があります。ノード部分に計算値を入力したいと思います。

\pgfmathsetmacro を使用してこれを実行しようとすると、「未定義の制御シーケンス」というエラーが発生します。

コードは次のとおりです:

\documentclass[letterpaper, 12 pt] {article}

\usepackage{tikz}
\usetikzlibrary{shapes,calc}

\newcommand{\splitcalcs}[2]{
  \pgfmathsetmacro\calcOne{ #2 / #1 }
  \pgfmathsetmacro\calcTwo{ \calcOne + #1 }
   \nodepart{two}\calcOne
   \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}

コマンド内にノード宣言を入れると、すべてが機能するので、評価の時間と関係があると思いますが、修正するには十分な知識がありません。

動作する(ただし望ましくない)コードは次のとおりです。

\documentclass[letterpaper, 12 pt] {article}

\usepackage{tikz}
\usetikzlibrary{shapes,calc}

\newcommand{\splitcalcsb}[2]{
  \pgfmathsetmacro\calcOne{ #2 / #1 }
  \pgfmathsetmacro\calcTwo{ \calcOne + #1 }
  \node (d1)[shape=rectangle split, rectangle split parts=4, fill=red!20, draw] at (4,0) 
{Detail 1%
   \nodepart{two}\calcOne
   \nodepart{three}\calcTwo
  };
    }

\begin{document} 

\begin{tikzpicture}

  \splitcalcsb{8}{4}

 \end{tikzpicture}
\end{document}

答え1

どうやら\nodepart新しいセルの配置が開始され、以前に行われた割り当ては忘れられてしまいます。

\nodepart実行前に必要な部分を展開することができます。不必要な展開を避けるために、\noexpand事前に展開しておく必要があります。\nodepart

\documentclass[letterpaper, 12pt] {article}

\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 \splitcalcs{8}{4}};
\end{tikzpicture}

\end{document}

かなり最近の TeX ディストリビューションが必要であることに注意してください\expanded。「従来の」方法でも同じ結果が得られます。

  \begingroup\edef\x{\endgroup
    \noexpand\nodepart{two}\calcOne
    \noexpand\nodepart{three}\calcTwo
  }\x

ここに画像の説明を入力してください

答え2

これらの目的にはxfp便利です。(警告:座標計算をxfpTiで置き換えるには注意が必要です。Z はスカラーと単位付きの長さを区別します。

\documentclass[letterpaper, 12 pt] {article}
\usepackage{xfp}
\usepackage{tikz}
\usetikzlibrary{shapes,calc}

\newcommand{\splitcalcs}[2]{%
   \nodepart{two}\fpeval{#2/#1}
   \nodepart{three}\fpeval{1+#2/#1}
  }

\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}

ここに画像の説明を入力してください

答え3

問題は、\calcOneと が「パート 1」にローカルであることです。 を先頭に \calcTwo置くと、まったく同じ結果になります。により、 以降のすべてが「パート 2」に配置されます(これにより、 以降のすべてが「パート 3」に配置されます)。\nodepart{one}\nodepart{two}\nodepart{three}

\documentclass[letterpaper, 12 pt] {article}

\usepackage{tikz}
\usetikzlibrary{shapes,calc}

\newcommand{\splitcalcs}[2]{%
  \pgfmathparse{ #2 / #1 }%
  \global\let\calcOne=\pgfmathresult
  \pgfmathparse{ \calcOne + #1 }%
  \global\let\calcTwo=\pgfmathresult
  \nodepart{two}\calcOne
  \nodepart{three}\calcTwo
  }

\begin{document} 

\begin{tikzpicture}

  \node (d1)[shape=rectangle split, rectangle split parts=4, fill=red!20, draw] at (4,0) 
{Detail%
  \splitcalcs{8}{4}};
 \end{tikzpicture}
\end{document}

関連情報