Как улучшить мою модальную диаграмму?

Как улучшить мою модальную диаграмму?

Я пишу статью о модальной логике, в которой мне довольно часто нужно будет рисовать диаграмму «миров». Каждый мир представлен точкой, которая имеет две метки: имя мира с одной стороны точки и некоторые пропозициональные формулы с другой стороны. Стрелки соединяют разные миры, и некоторые миры могут быть связаны сами с собой.

\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— набор 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]

или мы могли бы сделать это для определенной части изображения, используя функцию scopeif required

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

Связанный контент