在以下示例文档中,
\documentclass[tikz]{standalone}
\usetikzlibrary{chains}
\begin{document}
\begin{tikzpicture}
%circle
\draw[black, thick] (0,0) circle (5);
%binding sites
\begin{scope}[start chain=bindingchain]
\foreach \a/\c in {150/green, 270/red, 390/blue}
\draw[gray] (0,0) -- (\a:5) coordinate[\c, midway, thick, draw, circle, minimum width=25, on chain];
\end{scope}
\end{tikzpicture}
\end{document}
我希望蓝色、红色和绿色圆圈位于线的中间。但是,蓝色和红色圆圈偏离了:
有人能解释为什么会发生这种情况,以及如何解决它吗?
编辑:虽然 Stefan Pinnow 的回答解决了我最初的问题,因为它避免了对库的依赖,但我仍然对为什么以这种方式交互chains
感兴趣。chains
midway
答案1
Acoordinate
是观点。对于有尺寸的东西来说,使用这个是没有意义的。这些应该是节点。我有点惊讶代码居然能编译通过。
纠正这个问题实际上并不会改变输出:
\draw[gray] (0,0) -- (\a:5) node [\c, midway, thick, draw, circle, minimum width=25, on chain] {};
但它更有意义。
Achain
有方向。默认情况下,链是going right
。这意味着链上的每个节点都设置在前一个节点的右侧。
可能发生的情况如下:
- TikZ 移动到原点和 之间的中点
(\a:5)
。 on chain
然后,它通过按标准向右移动来添加效果node distance
,但保留默认center
锚点。
这是一张显示蓝色圆圈和两个黑色圆圈的图片。第一个圆圈在 (1) 处绘制,第二个圆圈在 (2) 处绘制,这些圆圈均来自上述指定的动作:
通常情况下,的效果going right
是用作west
锚点,但center
这里似乎保留了默认值。
如果要向链中添加节点,但又不希望链决定节点的位置,则不要使用on chain
。而是先创建节点,然后使用\chainin ();
。
例如,scopes
为了方便添加库:
\begin{tikzpicture}
\draw[black, thick] (0,0) circle (5);
{[start chain=bindingchain]
\foreach \a/\c in {150/green, 270/red, 390/blue}
{
\draw[gray] (0,0) -- (\a:5) node (\c) [\c, midway, thick, draw, circle, minimum width=25] {};
\chainin (\c);
}
}
\end{tikzpicture}
如果您想使用该join
选项,您可以在\chainin
节点时添加它。例如:
\begin{tikzpicture}
\draw[black, thick] (0,0) circle (5);
{[start chain=bindingchain]
\foreach \a/\c in {150/green, 270/red, 390/blue}
{
\draw[gray] (0,0) -- (\a:5) node (\c) [\c, midway, thick, draw, circle, minimum width=25] {};
\chainin (\c) [join];
}
}
\end{tikzpicture}
可以按照类似的方式添加其他链条选项。
完整代码:
\documentclass[tikz,multi,border=10pt]{standalone}
\usetikzlibrary{chains,scopes}
\begin{document}
\begin{tikzpicture}
\draw[black, thick] (0,0) circle (5);
{[start chain=bindingchain]
\foreach \a/\c in {150/green, 270/red, 390/blue}
{
\draw[gray] (0,0) -- (\a:5) node (\c) [\c, midway, thick, draw, circle, minimum width=25] {};
\chainin (\c);
}
}
\end{tikzpicture}
\begin{tikzpicture}
\draw[black, thick] (0,0) circle (5);
{[start chain=bindingchain]
\foreach \a/\c in {150/green, 270/red, 390/blue}
{
\draw[gray] (0,0) -- (\a:5) node (\c) [\c, midway, thick, draw, circle, minimum width=25] {};
\chainin (\c) [join];
}
}
\end{tikzpicture}
\begin{tikzpicture}
\draw[black, thick] (0,0) circle (5);
{[start chain=first]
\node [on chain, thick, double, draw, circle, minimum width=25] at (270:2.5) {};
\node [on chain, thick, double, draw, circle, minimum width=25, anchor=center] {};
\node (s) [thick, double, draw, circle, minimum width=25] at (390:2.5) {};
\chainin (s);
\node [on chain, thick, double, draw, circle, minimum width=25, anchor=center] {};
}
\begin{scope}[start chain=bindingchain]
\foreach \a/\c in {150/green, 270/red, 390/blue}
\draw[gray] (0,0) -- (\a:5) node [\c, midway, thick, draw, circle, minimum width=25, on chain] {};
\end{scope}
\end{tikzpicture}
\end{document}
答案2
这一切都可以在没有图书馆的情况下完成chains
......
\documentclass[border=2mm]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
%circle
\draw[black, thick] (0,0) circle (5);
\foreach \a/\c/\name in {150/green/a, 270/red/b, 390/blue/c}
\draw[gray] (0,0) -- (\a:5)
node [\c, midway, thick, draw, circle, minimum size=25]
(\name) {}
;
\draw (a) -- (b) -- (c);
\end{tikzpicture}
\end{document}