pgfextra:如何使用?

pgfextra:如何使用?

我正在尝试做一些棘手的事情,主要是利用此主题。然而,在下面的代码中,我不再明白发生了什么:

\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- 但是如果您编译上述代码,您仍然会看到它在指示的行崩溃,因为坐标p59p850不存在。事实上,所有坐标都命名为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)
}

相关内容