Tikz:pgfmathparse 之后的 pgfmathresult 返回 0

Tikz:pgfmathparse 之后的 pgfmathresult 返回 0

我正在尝试创建一个通用代码来绘制循环图。我使用在网络中找到的代码来创建节点...但是当重新使用pgfmathparse和时pgfmathresult,我只得到第二个的值\pgfmathresult...0。即使在这个例子中,我已经放了\pgfmathparse{int(2)},在第二行,他给我画了一个带有标签“0”的顶点...应该是“2”...对吗?我不明白我错过了什么。

    \tikzstyle{vertex}=[circle,fill=black!0, draw, minimum size=10pt,inner sep=0pt]
    \tikzstyle{edge} = [draw,thick,-]
    \begin{tikzpicture}[scale=0.8, auto,swap]
      \foreach \i in {1,...,4}{%
        \pgfmathparse{(\i-1)*90+floor(\i/5)*22.5}
        \node[vertex] (N-\i) at (\pgfmathresult:2) [thick] {}; % Put some nodes N-1 to N-4
        \pgfmathparse{int(2)}
        \node (muck) at (0,0) {\pgfmathresult}; % DISPLAY 0 AS RESULT
      }
    \end{tikzpicture}

答案1

TikZ 使用\pgfmathparse{...}\pgfmathresult自己的机制来计算节点大小、背景路径等,就像您访问它进行自己的计算一样。因此它会被大量覆盖。

在这里,你进行了计算,但调用该值太晚了。所以\node也调用它,它甚至可能给出不等于零的其他值,这取决于放置节点之前发生的情况。在这种情况下,y节点的坐标,例如,这给出1

    \node (muck) at (0,1) {\pgfmathresult}; % DISPLAY 1 AS RESULT 

这就是为什么你必须“快”,正如 Gonzalo Medina 评论的那样,你在计算后立即调用它。

在第一种情况下,\pgfmathparse您使用相同的方法,但该方法似乎有效。为什么?它之所以有效,是因为在节点计算发生之前调用了该值,因为它仅解析输入,但实际上并未开始执行节点创建。所以我们很幸运。例如,

\node[vertex,line width=1pt] (N-\i) at (\pgfmathresult:2) [thick] {}; 

将不起作用,因为我们进行了内部计算线宽。

答案2

\pgfmathsetmacro{}{...}Precusse 的回答解释了发生了什么。这是我总是使用而不是\pgfmathparse{...}组合的原因之一\pgfmathresult

在此处输入图片描述

笔记:

  • \pgfmathtruncatemacro当需要整数结果时也会出现这种情况。

代码:

\documentclass{article}
\usepackage{tikz}

\newcommand{\MyPgfMathResult}{}% Ensure that we are not already using this somewhere

\begin{document}
    \tikzstyle{vertex}=[circle,fill=black!0, draw, minimum size=10pt,inner sep=0pt]
    \tikzstyle{edge} = [draw,thick,-]
    \begin{tikzpicture}[scale=0.8, auto,swap]
      \foreach \i in {1,...,4}{%
        %\pgfmathparse{(\i-1)*90+floor(\i/5)*22.5}% replaced with \pgfmathsetmacro
        \pgfmathsetmacro{\MyPgfMathResult}{{(\i-1)*90+floor(\i/5)*22.5}}%
        \node[vertex] (N-\i) at (\MyPgfMathResult:2) [thick] {}; % Put some nodes N-1 to N-4
        %\pgfmathparse{int(2)} replaced with \pgfmathsetmacro
        \pgfmathsetmacro{\MyPgfMathResult}{int(2)}%
        \node (muck) at (0,0) {\MyPgfMathResult}; % 
      }
    \end{tikzpicture}
\end{document}

相关内容