以这个例子为例文档:
\begin{tikzpicture}
\node foreach \name/\angle in {a/0,b/90,c/180,d/270}
(\name) at (\angle:1.5) {$\name$};
\path[->] (b) edge node[above right] {$5$} (a)
edge (c)
edge [-,dotted] node[below,sloped] {missing} (d)
(c) edge (a)
edge (d)
(d) edge [red] node[above,sloped] {very}
node[below,sloped] {bad} (a);
\end{tikzpicture}
我想知道我是否可以使它适应我的用例,其中节点相对于彼此定位,因此如果我可以使用语法那就太理想了++(x, y)
。
我在想这样的事情:
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw[help lines] (0, 0) grid (4,8);
\path[->] (0, 0) edge +(1, 2) node[at end] (a) {a}
++(1, 2) edge +(1, 2) node[at end] (b) {b}
++(1, 2) edge +(1, 2) node[at end] (c) {c}
++(1, 2) edge +(1, 2) node[at end] (d) {d}
;
\end{tikzpicture}
\end{document}
但看起来node
s 对 不敏感at end
;如果我输入at start
任何内容似乎也不会发生任何变化。
我的想法是,它们应该位于一个箭头的末端和下一个箭头的起点之间,但箭头的头部和尾部与节点之间有足够的间距,就像在链接的示例中发生的情况一样。
我感兴趣的是是否可以仅使用命令来执行此操作\path
。
Fwiw,最终的目标是能够做这样的事情,让所有箭头保持在一条线上并“穿过”节点的框。
(It's upside down, but I can't bother re-doing the ascii art, sorry.)
\
\
\
\/|
\|
+----------+
| foo |
+----------+
\
\
\
\/|
\|
+----------+
| bar |
+----------+
\
\
\
\/|
\|
+----------+
| baz |
+----------+
答案1
边缘节点需要位于edge[<options>]
其目标坐标之间:
\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\draw[help lines] (0, 0) grid (4,8);
\path[at end, ->] (0, 0) edge node (a) {a} +(1, 2)
++(1, 2) edge node (b) {b} +(1, 2)
++(1, 2) edge node (c) {c} +(1, 2)
++(1, 2) edge node (d) {d} +(1, 2);
\end{tikzpicture}
\end{document}
(我删除了多余的at end
语句。)
但我不认为这是你想要的。
节点独立于其所在路径,不会中断其所在路径。您需要先创建一个节点,然后使用常规方法将路径连接到该节点。
由于您需要多个箭头,因此您还需要连接节点的多条路径。(路径edge
操作在内部创建额外的路径。)
是的,\path
如果需要的话,你可以在一个设备上完成所有操作:
\documentclass[tikz]{standalone}
\begin{document}
\tikz
\node (a) {a}
++(1,2) node (b) {b}
++(1,2) node (c) {c}
++(1,2) node (d) {d}
[->] (a) edge (b)
(b) edge (c)
(c) edge (d);
\end{document}
相对放置可以采用不同的方式。
另外,除了三条边之外,graphs
还可以使用该库:
\graph[use existing nodes, path, ->] {a, b, c, d};
% or
\graph[use existing nodes, path, ->] {\foreach \n in {a, ..., d}{\n}};
对于这个简单的例子来说,这有点多,但对于更复杂的版本它可能会派上用场。
答案2
以下所有选项均有效。
要让箭头按照您绘制的方式从一个节点传递到另一个节点,无论节点在哪里,您都必须先定义它们的坐标,并且\draw[->]
每个节点都有一个语句:箭头添加到路径的末尾,而不是中间的停止点。这就是为什么您在我的代码中只看到一个箭头的原因。
\documentclass[10pt,border=3mm,tikz]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw[help lines] (0, 0) grid (4,8);
\draw[->] (0,0)
to node[at end] {a} (1,2)
to node[pos=.3] {b} (2,4)
to node[at start] {c} (3,6);
\end{tikzpicture}
\begin{tikzpicture}
\draw[help lines] (0, 0) grid (4,8);
\draw[->] (0,0)
to node[at end] {a} ++(1,2)
to node[pos=.3] {b} ++(1,2)
to node[at start] {c} ++(1,2);
\end{tikzpicture}
\begin{tikzpicture}
\draw[help lines] (0, 0) grid (4,8);
\draw[->] (0, 0) -- +(1, 2) node[at end] (a) {a}
++(1, 2) -- +(1, 2) node[midway] (b) {b}
++(1, 2) -- +(1, 2) node[at start] (c) {c}
++(1, 2) -- +(1, 2) node[pos=.3] (d) {d}
;
\end{tikzpicture}
\end{document}