사진에서 볼 수 있듯이 내 트리의 첫 번째 노드 주위에 원을 만들고 싶습니다. 가능성이 있나요? 저는 라텍스로만 시작했는데 새로운 것이 너무 많아요... 감사합니다!!
\documentclass[a4paper, fontsize=11pt]{scrbook}
\usepackage{geometry} \geometry{a4paper, top=25mm, left=25mm, right=25mm, bottom=20mm, headsep=10mm, footskip=12mm} % Seitenlayout
\usepackage[ngerman]{babel} % Deutsche Sprachanpassung
\usepackage[T1]{fontenc} % Silbentrennung bei Sonderzeichen
\usepackage[latin1]{inputenc} % Direkte Angabe von Umlauten im Dokument
\usepackage[onehalfspacing]{setspace} % Zeilenabstand
\usepackage{amsmath} % Mathematik
\usepackage{amssymb} % Mathematik
\usepackage{multirow,array} % Auszahlungsmatrix
\usepackage{arydshln} % vertikale und horizontale Linien in Tabelle
\dashlinegap=1pt % gestrichelte Linie in Tabelle
\usepackage{qtree} % Spielbaum
\usepackage{tikz} % Spielbaum
\usetikzlibrary{fit} % Spielbaum
\usepackage{acronym} % Spielbaum
\usepackage{anyfontsize} %Spielbaum
\usepackage{float} % Positionierung von Grafiken
%mit Befehl [h] wird versucht, das Objekt dort zu platzieren, wo du angegeben hast
%mit Befehl [t] am oberen Rand der nächsten Seite, auf der es passt
%mit Befehl [b] am unteren Rand analog zu t
%mit Befehl [p] auf einer eigenen Seite
\begin{document}
\begin{center}
\begin{tikzpicture}[
dot/.style={circle, fill=black, inner sep=0pt, minimum size=7pt},
ring/.style={circle, draw, inner sep=0pt, minimum size=7pt}]
\node[dot,pin=90:{Spieler 1}] (n11) at (0,0) {};
\node[dot,pin=135:{Spieler 2}] (n21) at (-4,-1) {};
\node[ring] (n22) at (4,-1) {};
\node[dot,label=-90:{$(0,0)$}] (n31) at (-6,-4) {};
\node[ring] (n32) at (-2,-4) {};
\node[dot,label=-90:{$(-1,1)$}] (n33) at (2,-4) {};
\node[dot,pin=50:{Spieler 2}] (n34) at (6,-4) {};
\node[dot,label=-90:{$(1,-1)$}] (n41) at (-4,-7) {};
\node[dot,label=-90:{$(-2,2)$}] (n42) at (0,-7) {};
\node[ring] (n43) at (4,-7) {};
\node[dot,label=-90:{$(0.5,-0.5)$}] (n44) at (8,-7) {};
\node[dot,label=-90:{$(1,-1)$}] (n51) at (2,-10) {};
\node[dot,label=-90:{$(0,0)$}] (n52) at (6,-10) {};
\begin{scope}[every node/.style={above,sloped,font=\footnotesize}]
\draw (n11) -- node {passen} (n21);
\draw[dotted] (n11) -- node {drehen} (n22);
\draw (n21) -- node {passen} (n31);
\draw (n21) -- node {drehen} (n32);
\draw (n22) -- node {Schuss} node[below,sloped]{$\tfrac{1}{6}$} (n33);
\draw (n22) -- node {kein Schuss} node[below,sloped]{$\tfrac{5}{6}$} (n34);
\draw (n32) -- node {Schuss} node[below,sloped]{$\tfrac{1}{6}$} (n41);
\draw (n32) -- node {kein Schuss} node[below,sloped]{$\tfrac{5}{6}$} (n42);
\draw[dotted] (n34) -- node {drehen} (n43);
\draw (n34) -- node {passen} (n44);
\draw (n43) -- node {Schuss} node[below,sloped]{$\tfrac{1}{6}$} (n51);
\draw (n43) -- node {kein Schuss} node[below,sloped]{$\tfrac{5}{6}$} (n52);
\end{scope}
\end{tikzpicture}
\end{center}
\end{document}
답변1
첫 번째 노드에 대해 추가 스타일을 정의할 수 있습니다(또는 노드가 하나인 경우 해당 노드에 직접 설정을 적용할 수도 있습니다). 예를 들어:
ringed dot/.style={circle, fill=black, draw, ultra thick, inner sep=1.95pt, double distance=1.5pt, minimum size=7pt}
다음과 같은 결과가 생성됩니다.
이는 트리를 그리는 데 있어 매우 비효율적이며 유연성도 거의 없습니다. 전용 나무 그리기 패키지를 사용하는 것이 훨씬 간단합니다. TikZ에는 이러한 내장 기능 중 일부와 trees
이를 확장하는 추가 라이브러리가 있습니다.tikz-qtree그리고숲보다 간결한 트리 사양을 지원하는 트리 전용의 다른 TikZ 기반 패키지입니다.qtree유사한 구문을 지원하지만 TikZ 기반이 아닙니다. (그리고 거기에pstricks-나무에 대한 유형 패키지도 마찬가지입니다.)
\documentclass[tikz, border=10pt, multi]{standalone}
\usepackage[ngerman]{babel} % Deutsche Sprachanpassung
\usepackage[T1]{fontenc} % Silbentrennung bei Sonderzeichen
\usepackage[utf8]{inputenc} % Direkte Angabe von Umlauten im Dokument
\usepackage{amsmath}
\usetikzlibrary{fit} % Spielbaum
\begin{document}
\begin{tikzpicture}
[
dot/.style={circle, fill=black, inner sep=0pt, minimum size=7pt},
ring/.style={circle, draw, inner sep=0pt, minimum size=7pt},
ringed dot/.style={circle, fill=black, draw, ultra thick, inner sep=1.95pt, double distance=1.5pt, minimum size=7pt}
]
\node[ringed dot,pin=90:{Spieler 1}] (n11) at (0,0) {};
\node[dot,pin=135:{Spieler 2}] (n21) at (-4,-1) {};
\node[ring] (n22) at (4,-1) {};
\node[dot,label=-90:{$(0,0)$}] (n31) at (-6,-4) {};
\node[ring] (n32) at (-2,-4) {};
\node[dot,label=-90:{$(-1,1)$}] (n33) at (2,-4) {};
\node[dot,pin=50:{Spieler 2}] (n34) at (6,-4) {};
\node[dot,label=-90:{$(1,-1)$}] (n41) at (-4,-7) {};
\node[dot,label=-90:{$(-2,2)$}] (n42) at (0,-7) {};
\node[ring] (n43) at (4,-7) {};
\node[dot,label=-90:{$(0.5,-0.5)$}] (n44) at (8,-7) {};
\node[dot,label=-90:{$(1,-1)$}] (n51) at (2,-10) {};
\node[dot,label=-90:{$(0,0)$}] (n52) at (6,-10) {};
\begin{scope}[every node/.style={above,sloped,font=\footnotesize}]
\draw (n11) -- node {passen} (n21);
\draw[dotted] (n11) -- node {drehen} (n22);
\draw (n21) -- node {passen} (n31);
\draw (n21) -- node {drehen} (n32);
\draw (n22) -- node {Schuss} node[below,sloped]{$\tfrac{1}{6}$} (n33);
\draw (n22) -- node {kein Schuss} node[below,sloped]{$\tfrac{5}{6}$} (n34);
\draw (n32) -- node {Schuss} node[below,sloped]{$\tfrac{1}{6}$} (n41);
\draw (n32) -- node {kein Schuss} node[below,sloped]{$\tfrac{5}{6}$} (n42);
\draw[dotted] (n34) -- node {drehen} (n43);
\draw (n34) -- node {passen} (n44);
\draw (n43) -- node {Schuss} node[below,sloped]{$\tfrac{1}{6}$} (n51);
\draw (n43) -- node {kein Schuss} node[below,sloped]{$\tfrac{5}{6}$} (n52);
\end{scope}
\end{tikzpicture}
\end{document}
대체 전략
다음은 트리를 보다 효율적이고 유연하게 그리기 위해 위에서 언급한 방법 중 하나를 보여줍니다. 타이핑을 줄이는 것이 문제가 아니라(비록 관련이 있지만) 균일한 서식, 일관된 간격 및 조정 용이성을 보장하는 것입니다. 즉, 코드에 큰 수술을 가할 필요 없이 트리의 모양을 쉽게 변경하고 노드를 추가하거나 제거하는 등의 작업이 가능해야 합니다.
이 솔루션은숲왜냐하면 내가 그것을 좋아하기 때문입니다.
위에서 정의한 노드에 대한 표준 세 가지 스타일로 시작합니다. 부터숲TikZ를 기반으로 하므로 이를 트리에서 직접 사용하여 원하는 대로 개별 노드의 스타일을 지정할 수 있습니다.
\tikzset{%
dot/.style={fill=black, ring},
ring/.style={circle, draw, inner sep=0pt, minimum size=7pt},
ringed dot/.style={dot, ultra thick, inner sep=1.95pt, double distance=1.5pt},
}
이제 일부에게는숲- 특정 스타일.
\forestset{%
트리에는 자주 반복되는 가장자리 레이블이 포함되므로 코드 중복을 줄이기 위해 해당 레이블에 대한 몇 가지 스타일을 만들어 보겠습니다.
먼저 모든 가장자리 레이블의 형식을 지정하기 위한 특수 스타일을 지정해 보겠습니다 my edge label
. 이는 2개의 인수, 즉 라벨 위치(예: above
)와 내용(예: passen
)을 사용합니다.
my edge label/.style n args=2{
+edge label/.wrap value={node [sloped, midway, font=\footnotesize, #1] {#2}},
},
이제 이를 사용하여 가장자리 위와 아래의 가장자리 레이블에 대한 두 가지 특정 스타일을 만듭니다.
edge above/.style={
my edge label={above}{#1},
},
edge below/.style={
my edge label={below}{#1},
},
passen
주어진 라벨은 항상 위에 나타나거나 항상 아래에 나타나기 때문에 간단히 , drehen
등 으로 불리는 스타일을 설정할 수 있습니다 .
passen/.style={%
edge above=passen,
},
drehen
항상 dotted
우위를 점합니다.
drehen/.style={%
edge={dotted},
edge above=drehen,
},
kein Schuss
위의 값은 항상 아래의 5/6과 일치합니다.
kein schuss/.style={
edge above=kein Schuss,
edge below=$\tfrac{5}{6}$,
},
Schuss와 1/6도 마찬가지입니다.
schuss/.style={%
edge above=Schuss,
edge below=$\tfrac{1}{6}$,
},
}
이제 나무 자체를 살펴보겠습니다. 이는 forest
환경에 지정됩니다.
\begin{forest}
간격을 사용자 정의하는 것부터 시작합니다. l sep+
레벨 사이의 거리를 추가합니다. s sep+
형제간의 거리를 더해 줍니다.
for tree={
s sep+=25mm,
l sep+=20mm,
},
이제 약간의 stage
마법이 필요합니다. 터미널 노드에는 항상 아래 레이블이 있으며 항상 스타일입니다 dot
. 따라서 우리가 할 수 있는 일은 트리를 작성할 때 노드 자체에 레이블 내용을 지정하는 것입니다. 그런 다음 노드가 조판되기 전에 해당 콘텐츠를 가져와 노드 아래에 레이블을 만들고 노드 자체의 콘텐츠를 삭제하고 스타일을 지정합니다 dot
.
before typesetting nodes={
where n children=0{
label/.wrap pgfmath arg={below:$(#1)$}{content()},
content=,
dot,
터미널이 아닌 노드에는 아무 작업도 수행하지 않습니다. (나에게 명백한) 패턴이 없기 때문에 직접 스타일을 지정합니다.
}{}
}
이제 트리 자체를 사용하여숲의 대괄호 구문. 루트 노드가 먼저 나오고 ringed dot
스타일을 사용합니다. 또한 pin
.
[, ringed dot, pin=Spieler 1
이제 왼쪽 가지입니다. 이 분기의 루트는 형식을 가지며 pin
가장자리 레이블이 dot
필요합니다 passen
.
[, passen, dot, pin=135:Spieler 2
여기에 터미널 노드가 있습니다. 따라서 노드 자체에 레이블을 넣으면 위의 코드가 이를 처리합니다. 추가로 가장자리 레이블만 지정하면 됩니다.
[{0,0}, passen]
같은 방식으로 왼쪽 가지의 오른쪽을 계속 진행합니다.
[, drehen, ring
[{1,-1}, schuss]
[{-2,2}, kein schuss]
]
]
이제 트리의 오른쪽 기본 가지에 대해 ring
가장자리 레이블 drehen
(및 dotted
선 자체의 가장자리 스타일)로 시작합니다.
[, drehen, ring
우리는 계속해서 동일한 방식으로 이 분기의 노드를 지정합니다.
스타일은 schuss
가장자리 위와 아래에 레이블을 배치하는 반면, 이 노드의 내용은 노드가 터미널 노드이므로 레이블로 사용됩니다.
[{1,-1}, schuss]
이것은 스타일과 형식 pin
의 두 레이블을 가져옵니다 .kein schuss
dot
[, kein schuss, dot, pin=50:Spieler 2
[, drehen, ring
[{1,-1}, schuss]
[{0,0}, kein schuss]
]
[{0.5,-0.5}, passen]
]
]
]
루트 노드로 시작하는 대괄호를 닫았으므로 환경을 종료할 준비가 되었습니다 forest
.
\end{forest}
결과는 다음과 같습니다. 더 간격을 둔 트리를 원할 경우 l sep+
및 를 늘리십시오 .s sep+
전체 코드:
\documentclass[tikz, border=10pt, multi]{standalone}
\usepackage[ngerman]{babel} % Deutsche Sprachanpassung
\usepackage[T1]{fontenc} % Silbentrennung bei Sonderzeichen
\usepackage[utf8]{inputenc} % Direkte Angabe von Umlauten im Dokument
\usepackage{amsmath,forest}
\begin{document}
\tikzset{%
dot/.style={fill=black, ring},
ring/.style={circle, draw, inner sep=0pt, minimum size=7pt},
ringed dot/.style={dot, ultra thick, inner sep=1.95pt, double distance=1.5pt},
}
\forestset{%
passen/.style={%
edge above=passen,
},
drehen/.style={%
edge={dotted},
edge above=drehen,
},
kein schuss/.style={
edge above=kein Schuss,
edge below=$\tfrac{5}{6}$,
},
schuss/.style={%
edge above=Schuss,
edge below=$\tfrac{1}{6}$,
},
my edge label/.style n args=2{
+edge label/.wrap value={node [sloped, midway, font=\footnotesize, #1] {#2}},
},
edge above/.style={
my edge label={above}{#1},
},
edge below/.style={
my edge label={below}{#1},
},
}
\begin{forest}
for tree={
s sep+=25mm,
l sep+=20mm,
},
before typesetting nodes={
where n children=0{
label/.wrap pgfmath arg={below:$(#1)$}{content()},
content=,
dot,
}{}
}
[, ringed dot, pin=Spieler 1
[, passen, dot, pin=135:Spieler 2
[{0,0}, passen]
[, drehen, ring
[{1,-1}, schuss]
[{-2,2}, kein schuss]
]
]
[, drehen, ring
[{1,-1}, schuss]
[, kein schuss, dot, pin=50:Spieler 2
[, drehen, ring
[{1,-1}, schuss]
[{0,0}, kein schuss]
]
[{0.5,-0.5}, passen]
]
]
]
\end{forest}
\end{document}