我正在尝试绘制状态机,其中两个状态具有将当前状态相互转移的输入。
以下使用弯曲箭头的表示不适合我的应用程序:
\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}