tikz を使用して有向グラフをタイプセットしようとしています。
これまでに得たものは次のとおりです:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows}
\tikzset{
net node/.style = {draw, circle, minimum size=8mm},
net edge/.style = {->, >=triangle 45}, % triangle 45 arrow is bigger than latex arrow % auto,
net cut/.style = {shorten >=-10mm, shorten <=-10mm, rounded corners=10mm, color=red},
net cross/.style = {sloped, allow upside down, pos=.3},
}
\begin{document}
\begin{tikzpicture}
\newcommand{\edge}[5][]{\draw[net edge, #1] (#3) -- coordinate[net cross, name=#2] node[pos=.7, auto]{#5} (#4);}
\node[net node, name=s ] at ( 0, 0) {$s$};
\node[net node, name=n1] at (-2,-2) {$n_1$};
\node[net node, name=n2] at ( 2,-2) {$n_2$};
\node[net node, name=t] at ( 0,-4) {$t$};
\edge[swap] {e1} {s} {n1} {1}
\edge {e2} {s} {n2} {1}
\edge[swap] {e3} {n1} {n2} {1}
\edge {e4} {n1} {t} {1}
\edge {e5} {n2} {t} {1}
\draw[net cut] (e1) -- (e2);
\draw[net cut] (e4) -- (e3) -- (e2);
\draw[net cut] (e4) -- (e5);
\draw[net cut] (e5) -- (e3) -- (e2); % Just a test!
\end{tikzpicture}
\end{document}
ただし、改善の余地はあります。
どういうわけか、1つのカットに鋭い曲がりがあります。 を使用することでこれを回避できることに気付きましたが
net cross/.style = {}
、そうすると交差点がエッジの真ん中になり、それは望ましくありません。カットがエッジを90度で横切ると素晴らしいでしょう。私はすでにクロスを作成し
sloped
、とを使用してdraw
試しto
ましたin
がout
、ノードまたは座標の方向に対する角度を指定できないようです。
グラフ コードはできるだけ高レベルにしておきたいので、たとえば「エッジ e1、e2、e4 を横切るカットを作成したい」などと記述できれば便利です。
何か案は?
答え1
申し訳ありませんが、あなたの質問を正しく理解していません。いずれにせよ、次の解決策が、少なくとも一部はあなたが望む結果に近い結果をもたらすかどうかを確認してください。
コードを完全に書き直しましたが、質問を誤解したために省略した部分を復元することはできます。
\documentclass[tikz, margin=3mm]{standalone}
\usetikzlibrary{arrows, quotes}
\begin{document}
\begin{tikzpicture}[
xs/.style = {xshift=#1 mm},
ys/.style = {yshift=#1 mm},
every edge quotes/.style = {auto, pos=0.5, % <-- =.3?
inner sep=2pt, font=\footnotesize}
]
\begin{scope}[every node/.style={circle, draw, minimum size=8mm}]
\node (s) at ( 0, 0) {$s$};
\node (n1) at (-2,-2) {$n_1$};
\node (n2) at ( 2,-2) {$n_2$};
\node (t) at ( 0,-4) {$t$};
\end{scope}
\draw[-triangle 45]
(s) edge ["1"] (n1)
(s) edge ["1"] (n2)
(n1) edge ["1"] (n2)
(n1) edge ["1"] (t)
(n2) edge ["1"] (t);
\draw[rounded corners=10mm, red, densely dashed]
([xs=-11] s.west) -- ([ys=-11] s.south) -- ([xs= 11] s.east)
([xs=-11] t.west) -- ([ys= 11] t.north) -- ([xs= 11] t.east)
([ys= 11] n1.north) -- ([xs= 11] n1.east) -- ([ys=-11] n1.south)
([ys= 11] n2.north) -- ([xs=-11] n2.west) -- ([ys=-11] n2.south);
\end{tikzpicture}
\end{document}
ご覧のとおり、quoetes
ノード間のエッジにラベルを付けるには TikZ ライブラリを使用します。「カット」には破線を使用しますが、実線に簡単に変更できます。一部のカットを直線で行う必要がある場合、余分な破線を追加または削除するのは難しくありません。