如何使用宏和 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}

请注意,这\expanded需要较新的 TeX 发行版。您可以使用“传统”方式获得相同的结果:

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

在此处输入图片描述

答案2

对于这些目的来说,xfp它可以很方便。(警告:xfp如果不小心,你不能用坐标计算来代替,因为 TiZ 用单位来区分标量和长度。)

\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\calcTwo是“第一部分”的局部。如果你把放在\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}

相关内容