
複数のノード部分を持つ複雑な分割図形があります。ノード部分に計算値を入力したいと思います。
\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
便利です。(警告:座標計算をxfp
Tiで置き換えるには注意が必要です。け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}