我正在尝试做一些棘手的事情,主要是利用此主题。然而,在下面的代码中,我不再明白发生了什么:
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\usetikzlibrary{calc}
\pgfmathtruncatemacro\nodecount{0}
\begin{tikzpicture}
\coordinate (P0) at (-6, -0.5);
\coordinate (P1) at (-3,-1);
\coordinate (P2) at ( -0,-0.7);
\coordinate (P3) at ( 3,-1);
\coordinate (P4) at ( 6, -0.5);
\coordinate (P5) at ( 6, 0.5);
\coordinate (P6) at ( 3, 1.1);
\coordinate (P7) at ( 0, 1.2);
\coordinate (P8) at (-3, 1.1);
\coordinate (P9) at (-6, 0.5);
\foreach \i in {0,...,9}{
\pgfmathtruncatemacro{\j}{mod(\i+1,10)}
\coordinate (X\i) at ($(P\i)!0.5!(P\j)$);
}
\foreach \i in {0,...,9}{
\pgfmathtruncatemacro{\j}{mod(\i+1,10)}
\draw (X\i) .. controls ($(X\i)!0.7!(P\j)$) and ($(X\j)!0.7!(P\j)$) .. (X\j)
{\foreach \k in {0,...,100} {
\pgfextra{\pgfmathtruncatemacro\nodecount{\nodecount+1}}
coordinate[pos=\k/100] (p\nodecount)
}
};
\draw(p59) -- (p850); % crash
}
\end{tikzpicture}
\end{document}
该位的理念\pgfextra
是让它为节点创建一个计数器,这样以后就可以更轻松地使用它们来绘制东西。但是,我不明白何时对内容进行评估\pgfextra
。我本来希望坐标能够很好地编号p0
- p1000
- 但是如果您编译上述代码,您仍然会看到它在指示的行崩溃,因为坐标p59
和p850
不存在。事实上,所有坐标都命名为p1
。为什么会这样,我该如何解决这个问题?
答案1
首先,移动线
\draw(p59) -- (p850);
在其包含循环之外,因为p850
坐标尚未在外循环第一次迭代结束时定义(即使编号工作正确)。
其次,正如评论中指出的那样,\foreach
将每个迭代都包围在一个 TeX 组中,因此迭代内的任何局部更改都会丢失。有几种方法可以解决这个问题,其中一种是使用:
\foreach \k in {0,...,100} {
\pgfextra{\pgfmathtruncatemacro\nodecount{\nodecount+1}%
\global\let\nodecount=\nodecount}
coordinate[pos=\k/100] (p\nodecount)
}
尽管您可能考虑使用计数寄存器(即\newcount\nodecount
在前言中使用),因为它会更有效:
\foreach \k in {0,...,100} {
\pgfextra{\global\advance\nodecount by1}
coordinate[pos=\k/100] (p\the\nodecount)
}
另一种方法是简单地\nodecount
动态计算变量:
\foreach \k [evaluate={\nodecount=int(\i*100+\k);}] in {0,...,100} {
coordinate[pos=\k/100] (p\nodecount)
}