Как поместить вычисленное значение в разделенную фигуру с помощью макроса и 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 без соблюдения осторожности, поскольку 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и \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}

Связанный контент