我多次重复使用tikz
图片中的帮助坐标名称。通常,它们会被覆盖。现在我找到了一个保留它们的例子。
\documentclass{article}
\usepackage{tikz}
\begin{document}
Reuse of coordinate names overwrites them:
\begin{tikzpicture}
\foreach \x in {1,...,5}
\node (A) at (\x,0){.};
\draw[red] (A) circle(2pt);
\end{tikzpicture}
When placed in a macro also:
\def\overwritecoords{%
\foreach \x in {1,...,5}
\node (A) at (\x,0){.};}
\begin{tikzpicture}
\overwritecoords
\draw[green] (A) circle(2pt);
\end{tikzpicture}
But when the \verb|\foreach| uses a macro, not:
\def\placecoord{\node (A) at (\x,0){.};}
\def\keepcoords{%
\foreach \x in {1,...,5}
\placecoord}
\begin{tikzpicture}
\keepcoords
\draw[blue] (A) circle(2pt);
\end{tikzpicture}
Although, they can only be used once:
\begin{tikzpicture}
\keepcoords
\draw[blue] (A) circle(2pt);
\draw[->] (A)--++(0,-1);
\end{tikzpicture}
\begin{tikzpicture}
\keepcoords
\draw[->] (A)--++(0,-1);
\draw[blue] (A) circle(2pt);
\end{tikzpicture}
If the same name is reused again, the previous ones are lost, as usual:
\begin{tikzpicture}
\keepcoords
\node (A) at (6,0){.};
\draw[orange] (A) circle(2pt);
\end{tikzpicture}
\end{document}
我找不到这种行为的描述,但由于手册太过详尽,我可能忽略了它。我不明白为什么以及如何tikz
维护一个同名坐标列表,而这些坐标通常会被覆盖。我有点担心,在这样的设置下,在某个时候,tikz
可能会选择错误的帮助坐标,或者不止一个,来绘制我的图片。会发生这种情况吗?有没有办法避免同名坐标的积累?
另一方面,如果我出于某种目的使用这种行为,那么在包的新更新中它是否会稳定?
答案1
PGF 手册\foreach
在第 88 节“重复的事情:Foreach 语句”中解释了如何找出循环主体:
命令的语法。让我们继续讨论更复杂的设置。第一个复杂情况发生在不是花括号中的文本。如果
\foreach
语句没有遇到左括号,它将改为扫描所有内容直到下一个分号并将其用作 。
(粗体-强调部分为本人所加)
其中一个关键部分是扫描不会随扫描而扩展。因此,扫描里面的分号不会\placecoord
被看到,而\foreach
会将所有内容拖到命令末尾的分号处\draw
。因此\draw
会被拖入\foreach
循环。
为了阻止这种行为(假设这是您想要做的),那么您需要确保 TikZ/PGF 在正确的位置遇到分号而无需扩展。
一个选择是将其放在之后\keepcoords
:
\begin{tikzpicture}
\keepcoords;
\draw[blue] (A) circle(2pt);
\end{tikzpicture}
另一种是将其放在里面\keepcoords
:
\def\keepcoords{%
\foreach \x in {1,...,5}
\placecoord;}
另一种方法是使用括号来界定循环主体。
\def\keepcoords{%
\foreach \x in {1,...,5}
{\placecoord}}
至于你的问题依靠关于这种行为,我会说“它有记录,所以它可能会继续存在。”。但从你对它的描述来看,我不确定它的行为是否符合你的预期——尤其是 TikZ/PGF不是维护一个用相同标签定义的节点列表,每个节点都会覆盖前一个节点,而是\draw
使用每个节点的定义。所以如果这就是你想要的,那么你就可以依赖它(就像任何东西一样)。