我正在写一篇关于模态逻辑的论文,其中我经常需要绘制“世界”图。每个世界都用一个点表示,它有两个标签:点的一侧是世界的名称,另一侧是一些命题公式。箭头连接不同的世界,有些世界可能与它们自身相连。
\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 >
和/或shorten <
图片(或特定箭头,但大概您希望在这里保持一致性)。
例如,我们可以尝试
\begin{tikzpicture}[scale=2, shorten >=.5pt, shorten <=.5pt]
增加.5pt
世界和箭头两端之间的距离。
对于标签距离,我倾向于将所有标签创建为标签,然后使用label distance
图片全局控制它们的距离。这样,您可以确保一致性和灵活性,因为如果需要,可以轻松更改。
为此,我们可以在循环中使用两个变量一次性创建节点和标签:一个用于位置,一个用于标签。我们可以计算使用的世界数,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
是 wff 的集合($\lnot p, q$
对于第一个世界)。\xno
保持世界的数量(1
对于第一个世界)。然后该\node...
命令创建世界,为其命名(world1
对于第一个世界),并将世界的名称放在左侧($w_1$
对于第一个世界),将 wff 的集合放在右侧($\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}