
Я пишу статью о модальной логике, в которой мне довольно часто нужно будет рисовать диаграмму «миров». Каждый мир представлен точкой, которая имеет две метки: имя мира с одной стороны точки и некоторые пропозициональные формулы с другой стороны. Стрелки соединяют разные миры, и некоторые миры могут быть связаны сами с собой.
\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}
Как новичок в TikZ, я не думаю, что моя первая попытка очень плоха, но ее, безусловно, можно улучшить. Например, я думаю, что метки слишком близко к стрелкам, и должен быть небольшой «зазор» между точками и начальной/конечной точкой стрелок.
Есть ли какие-то приемы для устранения недостатков моей диаграммы? Достаточно ли хороша настройка моего кода, чтобы использовать его для будущих, похожих диаграмм?
решение1
Там на самом делеявляетсязазор между мирами и стрелками уже есть, потому что, я думаю, вы заполняете, но не рисуете узлы, и поэтому ширина линии все еще есть, но не заполнена. Если вам не нужен зазор, это легко исправить, добавив draw
узлы.
Если, с другой стороны, вы хотитебольшепробел, затем вы можете использовать shorten >
и/или shorten <
для изображения (или конкретных стрелок, но, по-видимому, вы хотите здесь последовательности).
Например, мы могли бы попробовать
\begin{tikzpicture}[scale=2, shorten >=.5pt, shorten <=.5pt]
чтобы добавить .5pt
расстояние между мирами и каждым концом стрел.
Для расстояний между метками я бы склонился к созданию всех меток как меток, а затем бы глобально контролировал их расстояние, используя label distance
для изображения. Таким образом, вы обеспечиваете согласованность и гибкость, поскольку его легко изменить при необходимости.
Для этого мы могли бы создать узлы и метки за один шаг, используя две переменные в цикле: одну для позиции и одну для метки. Мы можем вести подсчет миров, используя count
и использовать это для создания стандартной метки мира.
Например:
\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 {};
};
Здесь \x
— позиция ( (0,0)
для первого мира), а \j
— набор wffs ( $\lnot p, q$
для первого мира). \xno
ведет подсчет миров ( 1
для первого мира). Затем \node...
команда создает мир, дает ему соответствующее имя ( world1
для первого мира) и помещает имя мира слева ( $w_1$
для первого мира), а набор wffs справа ( $\lnot p, q$
).
Мы можем установить расстояние между метками и мирами, изменив конфигурацию tikzpicture
:
\begin{tikzpicture}[scale=2, label distance=2pt, shorten >=.5pt, shorten <=.5pt]
или мы могли бы сделать это для определенной части изображения, используя функцию scope
if required
\begin{scope}[label distance=5pt]
...
\end{scope}
Тогда результат будет выглядеть так:
Полный код:
\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}