TikZ 图片元素的范围是什么?

TikZ 图片元素的范围是什么?

我知道命名元素tikzpicture在定义之前不能被引用;但我对命名元素持续多久感到困惑。似乎一旦命名,元素就会继续存在,即使在不包含该元素的(后续)图片中

例如,代码

\draw[bluearrow](e)--(r);

如果在“e”和“r”的定义之前使用,则会生成预期的“未定义元素”错误,但是一旦我创建包含定义这些元素的代码的图片,后续包含上述代码的图形将不再产生错误,而是会绘制请求的箭头,在该图中对应于原始图中定义“e”和“r”的位置的位置之间:

enter image description here

元素名称的默认范围是什么tikzpicture?有没有办法控制它们的范围?(明显的)默认行为似乎可能在图形中产生难以调试的行为。


\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{positioning}
\usetikzlibrary{arrows}
\usetikzlibrary{petri}

\begin{document}

\tikzset{
    bluearrow/.style={->, blue, fill=none,>=stealth', thick},
    state/.style={circle,draw=black,inner sep=0pt,minimum size=7mm,label=center:$#1$,name=#1}}

\begin{center}

% This fails here ...
%\begin{tikzpicture}
%\draw[bluearrow](e)--(a);\draw[bluearrow](a)--(a^2);\draw[bluearrow](a^2)--(a^3);\draw[bluearrow](a^3)--(e);
%\end{tikzpicture}

\begin{tikzpicture}
\def\nodes{0/{e},1/{r},2/{r^2},3/{r^3}};\def\dim{4};
\foreach \n\lab in \nodes{
    \node[state={\lab}]at({cos(90+\n*(360/\dim))},{sin(90+\n*(360/\dim))}){};}
\draw[bluearrow](e)--(r);\draw[bluearrow](r)--(r^2);\draw[bluearrow](r^2)--(r^3);\draw[bluearrow](r^3)--(e);
\end{tikzpicture}

\vspace{10 mm}

% ... but it works fine here.
\begin{tikzpicture}
\draw[bluearrow](e)--(r);\draw[bluearrow](r)--(r^2);\draw[bluearrow](r^2)--(r^3);\draw[bluearrow](r^3)--(e);
\end{tikzpicture}

\end{center}

\end{document}

答案1

TikZ 本身添加了很多内部组,例如每个\path ...;命令都是一个 TeX 组。因为\node基本上只是\path node节点名称无法在本地定义,因为它无法在自己的定义范围内生存!虽然有一些技术可以使用这样的方法将宏从范围中移出每个节点(定义为一组几个宏)每个组内部tikzpicture是不可行。因此节点等全局定义,这使得它们可供文档的其余部分访问,甚至在其他 中也是如此tikzpictures。节点相对于当前原点的位置应该仍然有效,因此您可以\coordinate (my offset) at (1,1);在一个中定义tikzpicture,而在其他中仍然使用它。但是,如果您想直接绘制到原来的remember picture,overlay那么就需要坐标/节点。

相关内容