
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}
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 draw
den 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]
.5pt
um 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 distance
das 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 count
und 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 \x
ist die Position ( (0,0)
für die erste Welt) und \j
die Menge der WFFs ( $\lnot p, q$
für die erste Welt). \xno
zählt die Welten ( 1
für die erste Welt). Dann \node...
erstellt der Befehl die Welt, benennt sie entsprechend ( world1
fü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 scope
if required
\begin{scope}[label distance=5pt]
...
\end{scope}
Das Ergebnis sieht dann so aus:
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}