我真的很想在樹的第一個節點周圍有一個圓圈,就像你在照片上看到的那樣。有可能嗎?我只從乳膠開始,對我來說有很多新東西......謝謝!
\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 的專用於樹的包,它們支援更簡潔的樹規範。q樹支援類似的語法,但不基於 TikZ。 (並且有普斯特里克斯也適用於樹木的類型包。
\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
上面總是匹配下面的六分之五。
kein schuss/.style={
edge above=kein Schuss,
edge below=$\tfrac{5}{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}