
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}
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 draw
má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 .5pt
distancia 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 distance
para 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 count
y 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í \x
está la posición ( (0,0)
para el primer mundo) y \j
el conjunto de wffs ( $\lnot p, q$
para el primer mundo). \xno
lleva la cuenta de los mundos ( 1
para el primer mundo). Luego, el \node...
comando crea el mundo, le asigna un nombre apropiado ( world1
para 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 scope
si es necesario
\begin{scope}[label distance=5pt]
...
\end{scope}
Entonces el resultado se ve así:
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}