Wie kann ich mein Modaldiagramm verbessern?

Wie kann ich mein Modaldiagramm verbessern?

Ich schreibe eine Arbeit über Modallogik, in der ich ziemlich oft ein Diagramm von „Welten“ zeichnen muss. Jede Welt wird durch einen Punkt dargestellt, der zwei Beschriftungen hat: den Namen der Welt auf der einen Seite des Punkts und einige Aussagenformeln auf der anderen Seite. Pfeile verbinden verschiedene Welten und einige Welten können mit sich selbst verbunden sein.

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

Diagramm

Als TikZ-Neuling finde ich meinen ersten Versuch nicht besonders schlecht, aber er ist sicher noch verbesserungswürdig. Ich finde zum Beispiel, dass die Beschriftungen zu nah an den Pfeilen sind und zwischen den Punkten und dem Start-/Endpunkt der Pfeile eine kleine „Lücke“ sein sollte.

Gibt es Tricks, um die Mängel meines Diagramms zu beheben? Ist der Aufbau meines Codes gut genug, um ihn für zukünftige, ähnliche Diagramme zu verwenden?

Antwort1

Es gibt tatsächlichIsteine Lücke zwischen Welten und Pfeilen, weil Sie, glaube ich, die Knoten ausfüllen, aber nicht zeichnen, sodass die Linienbreite immer noch da ist, aber nicht ausgefüllt. Wenn Sie die Lücke nicht möchten, lässt sich dies leicht beheben, indem Sie drawden Knoten etwas hinzufügen.

Wenn Sie dagegen einegrößerLücke, dann können Sie shorten >und/oder shorten <für das Bild verwenden (oder bestimmte Pfeile, aber vermutlich möchten Sie hier Konsistenz).

Wir könnten zum Beispiel versuchen

\begin{tikzpicture}[scale=2, shorten >=.5pt, shorten <=.5pt]

.5ptum den Abstand zwischen den Welten und jedem Ende der Pfeile hinzuzufügen .

Was die Beschriftungsabstände betrifft, würde ich dazu tendieren, alle Beschriftungen als Beschriftungen zu erstellen und ihren Abstand dann global über label distancedas Bild zu steuern. Auf diese Weise stellen Sie Konsistenz und Flexibilität sicher, da sie bei Bedarf leicht geändert werden können.

Dazu könnten wir die Knoten und Beschriftungen in einem Schritt erstellen, indem wir zwei Variablen in der Schleife verwenden: eine für die Position und eine für die Beschriftung. Wir können die Anzahl der verwendeten Welten zählen countund dies verwenden, um die Standard-Weltbeschriftung zu erstellen.

Zum Beispiel:

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

Hier \xist die Position ( (0,0)für die erste Welt) und \jdie Menge der WFFs ( $\lnot p, q$für die erste Welt). \xnozählt die Welten ( 1für die erste Welt). Dann \node...erstellt der Befehl die Welt, benennt sie entsprechend ( world1für die erste Welt) und setzt den Namen der Welt auf die linke Seite ( $w_1$für die erste Welt) und die Menge der WFFs auf die rechte Seite ( $\lnot p, q$).

Wir können den Abstand der Beschriftungen von den Welten festlegen, indem wir die Konfiguration von ändern tikzpicture:

\begin{tikzpicture}[scale=2, label distance=2pt, shorten >=.5pt, shorten <=.5pt]

oder wir könnten dies für einen bestimmten Teil des Bildes tun, indem wir ein scopeif required

\begin{scope}[label distance=5pt]
   ...
\end{scope}

Das Ergebnis sieht dann so aus:

bessere Welten

Vollständiger Code:

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

verwandte Informationen