写真のように、ツリーの最初のノードの周りに円を描きたいのですが、可能ですか? ラテックスを使い始めたばかりで、新しいことがたくさんあります... ありがとうございます!!
\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
最初のノードに追加のスタイルを定義できます (または、ノードが 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ベースではありません。(そして、pstricks さんツリー用の -type パッケージも同様です。
\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}
代替戦略
これは、ツリーをより効率的かつ柔軟に描画するための、上で述べた方法の 1 つを示したものです。これは、入力回数を減らすこと (それも関係しますが) の問題ではなく、統一された書式、一貫した間隔、および調整のしやすさを確保することです。つまり、コードに大きな手を加えることなく、ツリーの外観を簡単に変更したり、ノードを追加または削除したりできる必要があります。
このソリューションでは森たまたまそれが好きだから。
まずは、上で定義したノードの標準的な3つのスタイルから始めます。森は 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
。これには、ラベルの位置 (例above
) とコンテンツ (例passen
) の 2 つの引数が必要です。
my edge label/.style n args=2{
+edge label/.wrap value={node [sloped, midway, font=\footnotesize, #1] {#2}},
},
ここで、これを使用して、エッジの上と下のエッジ ラベルに 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 と 6 分の 1 についても同様です。
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
の 2 つのラベルが付きます。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}