如何改进我的模态图?

如何改进我的模态图?

我正在写一篇关于模态逻辑的论文,其中我经常需要绘制“世界”图。每个世界都用一个点表示,它有两个标签:点的一侧是世界的名称,另一侧是一些命题公式。箭头连接不同的世界,有些世界可能与它们自身相连。

\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}

相关内容