我正在尝试创建一个通用代码来绘制循环图。我使用在网络中找到的代码来创建节点...但是当重新使用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}