节点之间的反向平行箭头

节点之间的反向平行箭头

我正在尝试绘制状态机,其中两个状态具有将当前状态相互转移的输入。

以下使用弯曲箭头的表示不适合我的应用程序:

\documentclass[tikz]{standalone}


\usetikzlibrary{automata, positioning, arrows}

\tikzset{
    ->,
    >=stealth',
    every state/.style={
        thick,
    }
}
\begin{document}

\begin{tikzpicture}[
        ->,
        >=stealth',
        node distance=2cm,
        every state/.style={thick}
    ]
    \node[state] (a) {};
    \node[state, right of=a] (b) {};

    \draw
        (a) edge[bend right, below] node{1} (b)
        (b) edge[bend right, above] node{2} (a);
\end{tikzpicture}

\end{document}

两个带有弯曲箭头的国家

我在其他帖子中看到了以下指定箭头离开节点的角度以创建直箭头的技术:

\draw
    (a.-5) edge[below] node{1} (b.185)
    (b.175) edge[above] node{2} (a.5);

两个州都有直箭头,但第三个箭头的来历不明

正如您所看到的,由于某种原因,这会呈现一个额外的箭头。

用来\path绘制边缘似乎可以解决这个问题:

\path (a.-5) edge node [below]{1} (b.185);
\path (b.175) edge node [above]{2} (a.5);

带有直箭头的两个状态

最终,这就是我想要的效果。但是,对于复杂的自动机,我不想浪费时间担心角度,我更希望找到一种解决方案,让我专注于内容而不是交付。

为了澄清起见,我希望能够以简单且不依赖于用例的方式在两个朝相反方向的节点之间指定两条笔直的不同边。

应该能够用双箭头连接两个相对于彼此任意定位的节点,如图所示,就像命令\edge用一条直线连接两个节点一样,该直线会穿过每个节点的中心(尽管双线略有偏移),并停在它们的表面。

有这样的方法吗?

答案1

在此处输入图片描述

我使用装饰back and forth来构造箭头。如图所示,双箭头可向所有方向移动。装饰接受两个参数,即两个标签。

代码

\documentclass[11pt, margin=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc, decorations.pathreplacing}
\usetikzlibrary{automata, positioning, arrows}

\begin{document}

\tikzset{%
  back and forth/.style 2 args={
    decoration={
      show path construction,
      lineto code={
        \path (\tikzinputsegmentfirst) coordinate (I);
        \path (\tikzinputsegmentlast) coordinate (F);
        \draw[->] let
        \p1 = (I.center),
        \p2 = (F.center),
        \n1 = {atan2(\y2 -\y1, \x2 -\x1)},
        \n2 = {\n1 +90}
        in ($(I) +(\n1: 2pt) +(\n2: 3pt)$)
        -- ($(F) +(\n1: -2pt) +(\n2: 3pt)$)
        node[pos=.5, above, scale=.8] {#1};
        \draw[<-] let
        \p1 = (I.center),
        \p2 = (F.center),
        \n1 = {atan2(\y2 -\y1, \x2 -\x1)},
        \n2 = {\n1 -90}
        in ($(I) +(\n1: 2pt) +(\n2: 3pt)$)
        -- ($(F) +(\n1: -2pt) +(\n2: 3pt)$)
        node[pos=.5, below, scale=.8] {#2};
      },
    },
    postaction=decorate
  },
}
\begin{tikzpicture}[node distance=2cm]
  \path
  (0, 0) node[state] (a) {}
  (4, 2) node[state] (b) {}
  (0, -2) node[state] (c) {}
  node[state, right of=c] (d) {};

  \path[back and forth={3}{7}] (a) -- (b);
  \path[back and forth={1}{2}] (c) -- (d);
\end{tikzpicture}

\end{document}

相关内容