![使用 foreach 结构绘制节点数组](https://linux22.com/image/314951/%E4%BD%BF%E7%94%A8%20foreach%20%E7%BB%93%E6%9E%84%E7%BB%98%E5%88%B6%E8%8A%82%E7%82%B9%E6%95%B0%E7%BB%84.png)
我有时需要使用 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
。
输出
代码
\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
。然后,至少有三种类似的方法可以完成您想要的操作。
自己维护最后一个节点的名称。
\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
。在诸如此类的简单情况下(编号节点),请执行以下数字:
\coordinate (n0); \foreach \id in {1,...,9} { \pgfmathparse{\id-1} \node[draw,rectangle,right=of n\pgfmathresult] (n\id) {\id}; }
您也可以让它
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}; }