在这种情况下,我可以沿路径创建节点吗?

在这种情况下,我可以沿路径创建节点吗?

以这个例子为例文档

\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}

但看起来nodes 对 不敏感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

以下所有选项均有效。

edge看起来很特别: 引文

要让箭头按照您绘制的方式从一个节点传递到另一个节点,无论节点在哪里,您都必须先定义它们的坐标,并且\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}

相关内容