在 Tikz 中重用坐标名称

在 Tikz 中重用坐标名称

我多次重复使用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使用每个节点的定义。所以如果这就是你想要的,那么你就可以依赖它(就像任何东西一样)。

相关内容