
私は様相論理に関する論文を書いていますが、その中では「世界」の図を描く必要が頻繁に生じます。すべての世界はドットで表され、ドットには 2 つのラベルがあります。ドットの片側には世界の名前、もう片側には命題式があります。矢印は異なる世界を接続し、一部の世界は互いに接続している場合があります。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning,calc}
\begin{document}
\begin{tikzpicture}[scale=2]
\coordinate (1) at (0,0);
\coordinate (2) at (1,0);
\coordinate (3) at (-60:1);
\foreach\x in {1,2,3}{
\node[fill,circle,inner sep=1pt, label=left:$w_\x$] (world\x) at (\x) {};
}
\node[right] at (1) {$\neg p, q$};
\node[right] at (2) {$p, q$};
\node[right] at (3) {$p, q$};
\draw[->] (world2) to (world3);
\draw[->] (world3) to (world1);
\draw[->,min distance=10,in=60,out=120] (world2) to (world2);
\end{tikzpicture}
\end{document}
TikZ 初心者として、私の最初の試みはそれほど悪くないと思いますが、確実に改善できます。たとえば、ラベルが矢印に近すぎるため、点と矢印の始点/終点の間に小さな「隙間」があるべきだと思います。
私の図の欠点を解決するコツはありますか? 私のコードの設定は、今後の同様の図に使用できるほど十分ですか?
答え1
実際にははワールドと矢印の間にすでに隙間ができているのは、ノードを塗りつぶしているが描画していないためだと思います。そのため、線の幅は残っていますが、塗りつぶされていません。隙間が不要な場合は、draw
ノードを追加することで簡単に修正できます。
一方、もしあなたが大きいギャップがある場合は、画像にshorten >
and/orを使用できます (または特定の矢印を使用できますが、ここでは一貫性が求められると思われます)。shorten <
例えば、
\begin{tikzpicture}[scale=2, shorten >=.5pt, shorten <=.5pt]
.5pt
世界と矢印の両端の間に距離を追加します。
ラベルの距離については、すべてのラベルをラベルとして作成し、label distance
画像を使用してそれらの距離を全体的に制御することをお勧めします。この方法では、必要に応じて簡単に変更できるため、一貫性と柔軟性が確保されます。
これを行うには、ループ内の 2 つの変数 (位置用とラベル用) を使用して、ノードとラベルを 1 つのステップで作成できます。 を使用してワールドの数を保持しcount
、これを使用して標準のワールド ラベルを作成できます。
例えば:
\foreach \x/\j [count=\xno] in {(0,0)/{$\lnot p, q$},(1,0)/{$p, q$},(-60:1)/{$p, q$}}{
\node [fill, circle, inner sep=1pt, label=left:$w_\xno$, label=right:\j] (world\xno) at \x {};
};
ここで、\x
は位置 ((0,0)
最初のワールドの場合) であり、 は\j
wffs のセット ($\lnot p, q$
最初のワールドの場合) です。\xno
はワールドの数を保持します (1
最初のワールドの場合)。 次に、\node...
コマンドはワールドを作成し、それに適切な名前を付け (world1
最初のワールドの場合)、ワールドの名前を左側 ($w_1$
最初のワールドの場合) に、wffs のセットを右側 ( $\lnot p, q$
) に配置します。
設定を変更することで、ラベルとワールドの距離を設定できますtikzpicture
。
\begin{tikzpicture}[scale=2, label distance=2pt, shorten >=.5pt, shorten <=.5pt]
scope
あるいは、必要に応じて、画像の特定の部分に対してこれを行うこともできます。
\begin{scope}[label distance=5pt]
...
\end{scope}
結果は次のようになります。
完全なコード:
\documentclass[tikz,multi,border=10pt]{standalone}
\begin{document}
\begin{tikzpicture}[scale=2, label distance=2pt, shorten >=.5pt, shorten <=.5pt]
\foreach \x/\j [count=\xno] in {(0,0)/{$\lnot p, q$},(1,0)/{$p, q$},(-60:1)/{$p, q$}}{
\node [fill, circle, inner sep=1pt, label=left:$w_\xno$, label=right:\j] (world\xno) at \x {};
};
\draw [->] (world2) to (world3);
\draw [->] (world3) to (world1);
\draw [->, min distance=10,in=60,out=120] (world2) to (world2);
\end{tikzpicture}
\end{document}