¿Cómo mejorar mi diagrama modal?

¿Cómo mejorar mi diagrama modal?

Estoy escribiendo un artículo sobre lógica modal en el que con frecuencia tendré que dibujar un diagrama de "mundos". Cada mundo está representado por un punto, que tiene dos etiquetas: el nombre del mundo en un lado del punto y algunas fórmulas proposicionales en el otro lado. Las flechas conectan diferentes mundos y algunos mundos pueden estar conectados entre sí.

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

Diagrama

Como novato en TikZ, no creo que mi primer intento sea muy malo, pero seguramente se puede mejorar. Por ejemplo, creo que las etiquetas están demasiado cerca de las flechas y debería haber un pequeño "espacio" entre los puntos y el punto inicial/final de las flechas.

¿Existen algunos trucos para solucionar las deficiencias de mi diagrama? ¿La configuración de mi código es lo suficientemente buena como para utilizarla en futuros diagramas similares?

Respuesta1

En realidad hayesYa hay un espacio entre mundos y flechas porque, creo, estás llenando pero no dibujando los nodos, por lo que el ancho de la línea sigue ahí, pero no lleno. Si no desea que haya espacio, esto se soluciona fácilmente agregando drawmás nodos.

Si por el contrario quieres unmás grandeespacio, entonces puedes usar shorten >y/o shorten <para la imagen (o flechas particulares, pero presumiblemente quieres coherencia aquí).

Por ejemplo, podríamos intentar

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

para agregar .5ptdistancia entre los mundos y cada extremo de las flechas.

Para las distancias de las etiquetas, me inclinaría por crear todas las etiquetas como etiquetas y luego controlar su distancia globalmente usando label distancepara la imagen. De esta manera, garantiza coherencia y flexibilidad, ya que es fácil de cambiar si es necesario.

Para ello, podríamos crear los nodos y las etiquetas en un solo paso usando dos variables en el bucle: una para la posición y otra para la etiqueta. Podemos llevar la cuenta de los mundos que se utilizan county utilizar esto para crear la etiqueta mundial estándar.

Por ejemplo:

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

Aquí \xestá la posición ( (0,0)para el primer mundo) y \jel conjunto de wffs ( $\lnot p, q$para el primer mundo). \xnolleva la cuenta de los mundos ( 1para el primer mundo). Luego, el \node...comando crea el mundo, le asigna un nombre apropiado ( world1para el primer mundo) y coloca el nombre del mundo a la izquierda ( $w_1$para el primer mundo) y el conjunto de wffs a la derecha ( $\lnot p, q$).

Podemos establecer la distancia de las etiquetas a los mundos modificando la configuración de tikzpicture:

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

o podríamos hacer esto para una parte particular de la imagen usando un scopesi es necesario

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

Entonces el resultado se ve así:

mundos mejores

Código completo:

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

información relacionada