使用 foreach 结构绘制节点数组

使用 foreach 结构绘制节点数组

我有时需要使用 tikz 可视化类似数组的结构。我使用节点作为数组元素,并将下一个节点定位在前right of一个节点上,即:

 \node[draw,rectangle] (n0) {element 1};
 \node[draw,rectangle] (n1) [right of=n0] {element 2};
 \node[draw,rectangle] (n2) [right of=n1] {element 3};
 % many more nodes

换句话说:我总是将下一个节点定位right of在前一个节点上。我想简化该代码,例如,通过使用循环,理想情况下希望有这样的代码:

\foreach \id in {1,...,9}
        \draw let \p0 = {\id-1} in node[draw,rectangle] (n\id) {element \id};

这有两个问题:

  • 该子句{\id-1}不是“求值”的,而是作为字符串,即“1-1”、“2-1”等。我该怎么做?或者,如果这不可能或不方便,我能否以某种方式指定right of = latest defined id

  • 第一个元素是特殊的,因为它与任何其他节点都无关。特殊情况总是乏味的,所以我想知道是否有办法定义right of = none?最好用循环绘制所有节点,而不必将第一个元素视为特殊情况。

答案1

另一个版本的evaluate用途remember

输出

图1

代码

\documentclass[margin=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning}

\begin{document}
\begin{tikzpicture}

\node[draw, rectangle] (n0) {0};
\foreach \x [remember=\x as \lastx (initially 0)] in {1,...,4}{
    \node [draw, rectangle, right =of n\lastx] (n\x) {\x};
}
\end{tikzpicture}
\end{document}

答案2

这就是 chains 库的作用,它会自动命名你喜欢的节点。你还可以自动连接它们、改变方向等。

\documentclass[tikz]{standalone}
\usetikzlibrary{chains}
\begin{document}
\begin{tikzpicture}
\begin{scope}[start chain=my chain]
\foreach \i in {0,...,6}{\node [on chain] {element \i};}
\end{scope}
\draw[->] (my chain-2) to[bend left] (my chain-5);
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案3

\coordinate您可以拥有一个带有 id 的锚点0。然后,至少有三种类似的方法可以完成您想要的操作。

  1. 自己维护最后一个节点的名称。

    \coordinate (n0);
    \xdef\mylastnode{0}
    \foreach \id in {1,...,9} {
      \node[draw,rectangle,right=of n\mylastnode] (n\id) {\id};
      \xdef\mylastnode{\id}
    }
    

    这比仅仅计算更灵活i - 1

  2. 在诸如此类的简单情况下(编号节点),请执行以下数字:

    \coordinate (n0);
    \foreach \id in {1,...,9} {
      \pgfmathparse{\id-1}
      \node[draw,rectangle,right=of n\pgfmathresult] (n\id) {\id};
    }
    
  3. 您也可以让它foreach进行计算。

    \coordinate (n0);
    \foreach \id [evaluate=\id as \last using \id-1] in {1,...,9} {
      \node[draw,rectangle,right=of n\last] (n\id) {\id};
    }
    

相关内容