我正在尝试绘制一个(部分)格子。为了实现这一点,我使用了两个嵌套的 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.north
和mynode.north east
,还有角度锚点,例如mynode.90
和mynode.-10
。解析器在引用中查找.
,当它看到something.something else
时,它会将其解释为nodename = something
和anchor = 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\y
都X\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] ...
。