
나는 '세계'의 다이어그램을 그려야 하는 모달 논리에 관한 논문을 쓰고 있습니다. 모든 세계는 점으로 표시되며 점의 한쪽에는 세계의 이름이, 다른 쪽에는 몇 가지 명제 공식이라는 두 개의 레이블이 있습니다. 화살표는 서로 다른 세계를 연결하며 일부 세계는 자신과 연결될 수 있습니다.
\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$
첫 번째 세계의 경우)에 배치하고 wff 세트를 오른쪽( $\lnot p, q$
)에 배치합니다.
다음의 구성을 수정하여 세계와 레이블의 거리를 설정할 수 있습니다 tikzpicture
.
\begin{tikzpicture}[scale=2, label distance=2pt, shorten >=.5pt, shorten <=.5pt]
scope
또는 필요한 경우 를 사용하여 그림의 특정 부분에 대해 이 작업을 수행할 수 있습니다.
\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}