
Estou escrevendo um artigo sobre lógica modal no qual muitas vezes precisarei desenhar um diagrama de 'mundos'. Cada mundo é representado por um ponto, que possui dois rótulos: o nome do mundo de um lado do ponto e algumas fórmulas proposicionais do outro lado. As setas conectam mundos diferentes e alguns mundos podem estar conectados a si mesmos.
\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 no TikZ, não acho que minha primeira tentativa seja muito ruim, mas certamente pode ser melhorada. Por exemplo, acho que os rótulos estão muito próximos das setas e deve haver uma pequena 'lacuna' entre os pontos e o ponto inicial/final das setas.
Existem alguns truques para resolver as deficiências do meu diagrama? A configuração do meu código é boa o suficiente para ser usada em diagramas semelhantes futuros?
Responder1
Na verdadeéjá existe uma lacuna entre mundos e setas porque, eu acho, você está preenchendo, mas não desenhando os nós e, portanto, a largura da linha ainda está lá, mas não preenchida. Se você não quiser a lacuna, isso pode ser facilmente remediado adicionando draw
nós.
Se, por outro lado, você quiser ummaiorlacuna, então você pode usar shorten >
e/ou shorten <
para a imagem (ou setas específicas, mas provavelmente você deseja consistência aqui).
Por exemplo, poderíamos tentar
\begin{tikzpicture}[scale=2, shorten >=.5pt, shorten <=.5pt]
para adicionar .5pt
distância entre os mundos e cada extremidade das setas.
Para as distâncias dos rótulos, eu estaria inclinado a criar todos os rótulos como rótulos e depois controlar sua distância globalmente usando label distance
para a imagem. Dessa forma, você garante consistência e flexibilidade, pois é fácil de alterar, se necessário.
Para fazer isso, poderíamos criar os nós e rótulos em uma única etapa usando duas variáveis no loop: uma para a posição e outra para o rótulo. Podemos contar os mundos usando count
e usar isso para criar o rótulo mundial padrão.
Por exemplo:
\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 {};
};
Aqui \x
está a posição ( (0,0)
para o primeiro mundo) e \j
é o conjunto de fbfs ( $\lnot p, q$
para o primeiro mundo). \xno
mantém a contagem dos mundos ( 1
para o primeiro mundo). Em seguida, o \node...
comando cria o mundo, nomeia-o apropriadamente ( world1
para o primeiro mundo) e coloca o nome do mundo à esquerda ( $w_1$
para o primeiro mundo) e o conjunto de wffs à direita ( $\lnot p, q$
).
Podemos definir a distância dos rótulos dos mundos modificando a configuração de tikzpicture
:
\begin{tikzpicture}[scale=2, label distance=2pt, shorten >=.5pt, shorten <=.5pt]
ou poderíamos fazer isso para uma parte específica da imagem usando um, scope
se necessário
\begin{scope}[label distance=5pt]
...
\end{scope}
Então o resultado fica assim:
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}