TikZ foreach 和相对节点定位

TikZ foreach 和相对节点定位

我想使用foreach循环将 tikz 节点定位在彼此下方。

\documentclass[tikz]{standalone}
\usetikzlibrary[positioning]
\begin{document}
\begin{tikzpicture}
  \node (n1){First};
  \foreach \x in {2,...,6}{%
    \pgfmathparse{\x-1}%
    \node [below = of n\pgfmathresult](n\x)  {\x};
  }
\end{tikzpicture}
\end{document}

数字向右漂移

为什么数字会向右边漂移!?

答案1

\pgfmathparse计算结果为浮点数:1.0, 2.0, ... 然后,您将得到below = of n1.0.0是边框锚点,即边框的角度为 0°,与 相同n.east。 这解释了向右的偏移。 下部节点的中心位于上部节点右侧下方。

可以.0通过 来剥离\pgfmathtruncatemacro,例如:

\documentclass[tikz]{standalone}
\usetikzlibrary[positioning]
\begin{document}
\begin{tikzpicture}
  \node (n1){First};
  \foreach \x in {2,...,6}{%
    \pgfmathtruncatemacro{\lastx}{\x - 1}
    \node [below = of n\lastx](n\x)  {\x};
  }
\end{tikzpicture}
\end{document}

另一种方法是remember\foreach循环中使用 key 来记住先前的值,而无需计算它:

\documentclass[tikz]{standalone}
\usetikzlibrary[positioning]
\begin{document}
\begin{tikzpicture}
  \node (n1){First};
  \foreach \x [remember=\x as \lastx (initially 1)] in {2,...,6}{%
    \node [below = of n\lastx](n\x)  {\x};
  }
\end{tikzpicture}
\end{document}

答案2

扎尔科海科·奥伯迪克并解释了问题的原因(\pgfmathparse除非另有说明,否则产生浮点结果;.0被解释为 TiZ 锚点规格:0°=east锚点)。

以下是一些不依赖于\node不覆盖的其他可能性\pgfmathresult

\documentclass[tikz]{standalone}
\usetikzlibrary{positioning}

\begin{document}
\begin{tikzpicture}
  \node (n1) {First};
  \foreach \x in {2,...,6}
    {
      \pgfmathtruncatemacro{\xMinusOne}{\x-1}
      \node [below = of n\xMinusOne] (n\x) {\x};
    }
\end{tikzpicture}
\end{document}

\documentclass[tikz]{standalone}
\usetikzlibrary{positioning}

\begin{document}
\begin{tikzpicture}
  \node (n1) {First}
    foreach[evaluate=\x as \xMinusOne using int(\x - 1)] \x in {2,...,6}
      { node[below = of n\xMinusOne] (n\x) {\x} };
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案3

以下是使用 tikz 库的另一种可能性chains

\documentclass[tikz]{standalone}
\usetikzlibrary{chains}

\begin{document}
\begin{tikzpicture}
  \begin{scope}[start chain=1 going below, nodes={on chain=1}]
    \node (n1) {First}
      foreach \x in {2,...,6}
        { node (n\x) {\x} };
  \end{scope}
\end{tikzpicture}
\end{document}

答案4

您需要将节点位置计算为\pgfmathparse{int(\x-1)}%,而没有坐标的int格式n1.0在您的情况下不是有效格式(小数点后的数字确定节点边界上的锚点),用于在图像中定位节点。

完成 MWE:

\documentclass[tikz]{standalone}
\usetikzlibrary[positioning]
\begin{document}
\begin{tikzpicture}[node distance=1ex]
  \node (n1) {First};
  \foreach \x in {2,...,6}{%
    \pgfmathparse{int(\x-1)}%
    \node [below = of n\pgfmathresult] (n\x)  {\x};
  }
\end{tikzpicture}
\end{document}

在此处输入图片描述

您可以通过定义新的计数器来确定节点的位置:

\documentclass[tikz]{standalone}
\usetikzlibrary[positioning]
\begin{document}
\begin{tikzpicture}[node distance=1ex]
  \node (n1) {First};
  \foreach \x [count=\y] in {2,...,6}{%
    \node [below = of n\y] (n\x)  {\x};
  }
\end{tikzpicture}
\end{document}

结果和以前一样。

相关内容