为什么通过 foreach 循环对节点进行命名会导致错误消息,尽管这种命名似乎部分有效?

为什么通过 foreach 循环对节点进行命名会导致错误消息,尽管这种命名似乎部分有效?

问题。

为什么

\documentclass{amsart}   
\usepackage{tikz}
\usetikzlibrary{calc}


\begin{document}

\begin{tikzpicture}

\foreach \index in {0,1,2,3}{
  \node (v\index) at (\index cm, \index cm)[]{$v_{\index}$};
    %\draw (v0)--(v1);    
  \draw (v0)--($(v0)+(1 cm,0 cm)$);
 }
\end{tikzpicture}

\end{document}

编译,同时

\documentclass{amsart}   
\usepackage{tikz}
\usetikzlibrary{calc}


\begin{document}

\begin{tikzpicture}

\foreach \index in {0,1,2,3}{
  \node (v\index) at (\index cm, \index cm)[]{$v_{\index}$};
  \draw (v0)--(v1);    
  %\draw (v0)--($(v0)+(1 cm,0 cm)$);
  }
\end{tikzpicture}

\end{document}

导致错误消息

未发现名为 v1 的形状。

评论。

  • 如果目前的建议不值得推荐,我也希望得到关于如何使节点名称取决于循环变量
  • 我只是不明白上述错误消息的原因,无论是重读代码,还是手册,还是阅读有关 TikZ 中命名节点的讨论——节点名称似乎已经定义。我希望这不是一个错误,而是我忽略了一些很容易修复的东西。

答案1

错误消息的原因已在 CarLaTeX 的评论

我假设您想用线连接节点。然后,可以通过选项记住前一个节点。当仅定义一个节点时,remember该构造将排除第一个循环。\if

\documentclass{article}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}

\foreach \index [remember=\index as \lastindex] in {0,1,2,3}{
  \node (v\index) at (\index cm, \index cm)[]{$v_{\index}$};
  \ifnum\index>0
    \draw (v\lastindex) -- (v\index);
  \fi
}

\end{tikzpicture}
\end{document}

结果

不包含以下内容的变体\ifnum

\documentclass{article}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}

\foreach \index in {0, 1, 2, 3} {
  \node (v\index) at (\index cm, \index cm)[]{$v_{\index}$};
}
\draw
  \foreach \index [remember=\index as \lastindex (initially 0)] in {1, 2, 3} {
    (v\lastindex) -- (v\index)
  }
;

\end{tikzpicture}
\end{document}

答案2

一个可能的解决方案是定义循环之外的第一个节点:

\documentclass{amsart}   
\usepackage{tikz}
\usetikzlibrary{calc}

\begin{document}

    \begin{tikzpicture}

    \node (v0) {$v_0$};
    \foreach[evaluate=\index as \indexj using int(\index+1)] \index in {0,1,2}{
        \node (v\indexj) at (\indexj cm, \indexj cm)[]{$v_{\indexj}$};
        \draw (v\index)--(v\indexj);    
    }
    \end{tikzpicture}

\end{document}

在此处输入图片描述

相关内容