答案1
为了好玩,练习并测试一些如何绘制平行箭头的想法:
\documentclass[tikz, margin=3mm]{standalone}
\usetikzlibrary{arrows.meta,
calc, chains,
positioning,
quotes}
\begin{document}
\begin{tikzpicture}[
node distance = 12mm and 21mm,
start chain = going right,
box/.style = {rounded corners, draw, fill=green!30,
minimum width=9ex, minimum height=1em,
inner sep=1ex, on chain},
tcs/.style = {transform canvas={yshift=#1}},
every edge quotes/.style = {font=\footnotesize, inner sep=1pt, auto}
]
\node (n1) [box] {bereit};
\node (n2) [box] {aktiv};
\node (n3) [box] {beendet};
\node (n4) [box, below=of $(n1)!0.5!(n2)$] {blockiert};
\draw[-Triangle] (n1) edge ["(1)",tcs=+1mm] (n2)
(n2) edge ["(2)",tcs=-1mm] (n1)
(n2) edge ["(5)"] (n3)
(n2) edge ["(3)"] (n4)
(n4) edge ["(5)"] (n1);
\end{tikzpicture}
\end{document}
答案2
使用 TikZ graphdrawing
。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{graphs,graphdrawing,quotes}
\usegdlibrary{force}
\begin{document}
\begin{tikzpicture}
\graph[
spring electrical layout,
horizontal=bereit to beendet,
node distance=3cm,
nodes = {rounded corners,draw,fill=green!70!blue}
] {
bereit ->[bend left,"(1)"] aktiv,
aktiv ->[bend left,"(2)"] bereit,
aktiv ->["(3)"] blockiert ->["(4)"] bereit,
aktiv ->["(5)"] beendet
};
\end{tikzpicture}
\end{document}
答案3
只是为了好玩,一些肮脏的技巧。我并不提倡用这种方式来编码这个特定的图形,但它们在其他情况下很有用。
使用矩阵而不是链或相对定位。为了将“blockiert”框放置在“bereit”和“aktiv”框的中间,避免它们之间有额外的间隙,所有这些节点都是类型的,因此它们不占用任何空间。因此,间距不取决于这些节点的大小,而是通过 中的和选项
overlay
固定。column sep
row sep
\matrix
由于节点大小为零,tikz 无法正确计算图形的边界框。通过使用
fit
库(以及none
绘图颜色,使其保持不可见)“绘制”由所有其他节点组成的额外节点来解决此问题。使用循环绘制所有箭头和数字。要获得平行箭头,诀窍是使用 形式的锚点
nodename.number
。数字被解释为一个角度,锚点位于节点形状与从节点中心投射的具有该角度的射线的交点处(例如:ber.5
)
所以代码是:
\documentclass[margin=2pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix, fit}
\tikzset{
proc/.style={rectangle, rounded corners,
draw=black!50, fill=green!20,
inner sep=1pt, minimum height=0.7cm, minimum width=1.6cm,
align=center, overlay
}
}
\begin{document}
\begin{tikzpicture}
\matrix (m) [matrix of nodes, every node/.style=proc, column sep=1.5cm, row sep=1.5cm] {
|(ber)| bereit & & |(akt)| aktiv & & |(bee)| beendet \\
& |(blo)| blockiert \\
};
\foreach \start/\ending [count=\n] in {ber.5/akt.175, akt.185/ber.-5, akt/blo, blo/ber, akt/bee}
{
\draw[-latex] (\start) -- (\ending) node[auto, midway, inner sep=1pt] {\scriptsize (\n)};
}
\node[fit=(ber) (blo) (bee), draw=none] {}; % Fix bounding box
\end{tikzpicture}
\end{document}
结果如下:
答案4
明白了,我想:
\begin{tikzpicture}
[proc/.style={
rectangle,
draw=blue!50,
fill=white,
thick,
inner sep=1pt,
%minimum size=12mm,
minimum height=0.5cm,
minimum width=1.6cm,
align=center
}]
\node[proc] (bereit) {bereit};
\node[proc] (aktiv) [right=of bereit] {aktiv};
\node[proc] (blockiert) [below right=0.5cm and -0.3cm of bereit] {blockiert};
\node[proc] (beendet) [right=of aktiv] {beendet};
\path ([yshift=1mm]bereit.east) edge [->] ([yshift=1mm]aktiv.west)
([yshift=-1mm]aktiv.west) edge [->] ([yshift=-1mm]bereit.east)
(aktiv) edge [->] (beendet)
(aktiv) edge [->] (blockiert)
(blockiert) edge [->] (bereit);
\end{tikzpicture}
还有更好的办法吗?