我真的很想在我的树的第一个节点周围画一个圆圈,就像你在照片上看到的那样。有可能吗?我刚开始用乳胶,对我来说有很多新东西……谢谢!!
\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 的专用于树的包,它们支持更简洁的树规范。配额树支持类似的语法,但不基于 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}