TikZ 中的节点名称和嵌套循环

TikZ 中的节点名称和嵌套循环

我正在尝试绘制一个(部分)格子。为了实现这一点,我使用了两个嵌套的 foreach 循环,如下所示:

\foreach \x in {-1, 0, 1} {
    \foreach \y in {0, 1, 2} {
        \path node (\x.\y) at (\x+\y-1, \y-\x) {};
    }
}

无论如何,我无法引用我在上面的代码中创建的节点。具体来说,如果我尝试这样的操作:

\path[->] (0.0) edge [bend right = 30] (0.1);

我收到一个错误:

ERROR: Package pgf Error: No shape named 0 is known.

所以问题是:TikZ 会接受哪个名称?名称应该与格点相对应。因此,在某种程度上,它们应该包含 \x 和 \y。

尝试改变节点名称也无济于事。例如,如果我尝试这个

\path node (X\x Y\y) at (\x+\y-1, \y-\x) {};

我仍然收到同样的错误:

ERROR: Package pgf Error: No shape named X0 Y0 is known.

答案1

尝试这个:

\documentclass{article} 
\usepackage{tikz} 

\begin{document} 

\begin{tikzpicture}[>=latex,scale=2]
\foreach \x in {-1, 0, 1} {
    \foreach \y in {0, 1, 2} {
        \path node (\x-\y) at (\x+\y-1, \y-\x) {};
    }
}
\path[->] (0-0) edge [bend right = 30] (0-1);
\end{tikzpicture}

\end{document}

在此处输入图片描述

来自pgf文档(部分3.7 命名节点):

节点名称可以任意选择,但不能包含逗号、句号、括号、冒号和其他特殊字符。不过,可以包含下划线和连字符。

答案2

补充一下 Gonzalo 的回答,在节点名称中不应使用句点的原因是,它们在处理节点时已经具有特殊含义。当您命名节点时,如 ,\node (mynode) at (0,0) {hello};TikZ 会在节点周围设置一组“锚点”。引用这些锚点的格式是nodename.anchor。所以我们有mynode.northmynode.north east,还有角度锚点,例如mynode.90mynode.-10。解析器在引用中查找.,当它看到something.something else时,它会将其解释为nodename = somethinganchor = something else。这种情况会发生它会查看是否nodename确实存在。然后测试是否存在,如果找不到,则退出。

逗号也很容易解释,就像(x,y)坐标的通常语法一样,并且x最初y不必只是数字。

括号可能也会使解析器感到困惑,因为它们通常用于特殊语法(尤其是在calc库中)。

极坐标语法中使用冒号,所以这解释了为什么应该避免使用它们。

原因是:

\path node (X\x Y\y) at (\x+\y-1, \y-\x) {};

不起作用是其他原因。这是因为 TeX 会吞掉命令后的空格。因此,节点名称被设置为其扩展名X\x Y\y,例如,X-1Y0因为后面的空格\x被吃掉了。要获得实际的空格,您应该使用宏\space或在 后放置一个“空”标记\x。因此, 或X\x\space Y\yX\x{} Y\y可以。

这里有一些可能对您有用的代码。

\makeatletter
\tikzset{%
  show node name/.code={%
    \expandafter\def\expandafter\tikz@mode\expandafter{\tikz@mode\show\tikz@fig@name}%
    }
}
\makeatother

如果您将其放在前言中,它会放入一小段代码,用于在日志中显示节点名称。将其用作\node[show node name] ...

相关内容