TikZ:foreach循环中的节点定位

TikZ:foreach循环中的节点定位

我想在彼此下方绘制多个节点。因此,我使用带有节点别名的相对定位。绘制的节点越多,位置似乎越不对齐。这是我尝试过的:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}

\begin{document}

\begin{tikzpicture}[
  unit/.style={draw, circle, inner sep=0pt, minimum size=10mm}
]

\draw[black!10, very thin] (0, -4) grid [step=1mm] +(4, 8);
\draw[help lines] (0, -4) grid [step=10mm] +(4, 8);
\filldraw (0,0) circle [radius=2pt];

\node[unit] (c1) at (0,3) [alias=last] {};

\foreach \i in {2,...,5}
  \node[unit] (c\i) [alias=last, below=5mm of last] {};

\filldraw[gray!50] (c3) circle [radius=2pt];

\end{tikzpicture}

\end{document}

它看起来是这样的(注意黄色标记的斑点):

节点

我想让圆圈与网格对齐。有什么办法可以解决这个问题吗?

答案1

如果你包括outer sep=0pt

unit/.style={draw, circle, inner sep=0pt, minimum size=10mm, outer sep=0pt,}

结果如愿以偿。

在此处输入图片描述

代码:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}

\begin{document}

\begin{tikzpicture}[
  unit/.style={draw, circle, inner sep=0pt, minimum size=10mm, 
      outer sep=0pt,% <-- added
  }
]

\draw[black!10, very thin] (0, -4) grid [step=1mm] +(4, 8);
\draw[help lines] (0, -4) grid [step=10mm] +(4, 8);
\filldraw (0,0) circle [radius=2pt];

\node[unit] (c1) at (0,3) [alias=last] {};

\foreach \i in {2,...,5}
  \node[unit] (c\i) [alias=last, below=5mm of last] {};

\filldraw[gray!50] (c3) circle [radius=2pt];

\end{tikzpicture}
\end{document}

答案2

@PeterGrill早些时候回答过但我正在准备插图。;-) 因此,重要的是:节点锚点outer sep位于中线节点边界。

圆的边界中线的c1高点和低点的纵坐标是 5 的倍数(从 处的原点开始(0,0),使用1mm作为单位长度)。这是一个没有厚度的理想圆。当 TiZ 绘制边框,两边都有墨水,厚度相等:

\documentclass[tikz,border=2mm]{standalone}
\usetikzlibrary{positioning}

\begin{document}

\begin{tikzpicture}[line width=3pt, draw opacity=0.3]

\draw[black!10, very thin] (0, -4) grid [step=1mm] +(4, 8);
\draw[help lines] (0, -4) grid [step=10mm] +(4, 8);
\filldraw (0,0) circle [radius=2pt];

\node (c1) at (0,3)
  [draw=blue, alias=last, circle, inner sep=0pt, minimum size=10mm, draw] {};
\fill[red!90!black] (c1.south) circle[radius=0.4pt]
  node[inner sep=0pt, below=0pt of c1.south, line width=0pt] {c1.south};
\end{tikzpicture}

\end{document}

在此处输入图片描述

为什么c1.south这里正是墨水的下限?因为默认情况下,/pgf/outer sep是线宽的一半。如果我们在此示例中设置outer sep=3pt(与线宽相同)draw opacity=0.3,则会得到以下结果,因为这是从中线蓝色条纹的宽度为线宽:

在此处输入图片描述

如果我们使用outer sep=0ptc1.south就是位于这条中线上的点(纵坐标是 5 的倍数)。这足以解决您的移位问题。

在此处输入图片描述

答案3

一些解释Peter Grill 的回答

假设\i2,则得到的坐标和\node[unit] (c\i) [alias=last, below=5mm of last] {};之间的距离为last.centerc2.center

半径_最后 + 外_分离_最后 + 5mm + 外_分离_c2 + 半径_c2 = 15mm + .4pt

其中

  • radius_last = radius_c2 = 5mm 并且
  • outer_sep_last = outer_sep_c2 = 线宽 / 2 = .2pt

这里 outer_sep 由键控制outer sep最初是线宽的一半。line_width 由键控制line width最初为 .4pt。

相关内容