Мне бы очень хотелось сделать круг вокруг первого узла моего дерева, как вы видите на фото. Есть ли такая возможность? Я только начала работать с латексом, и для меня так много нового... Спасибо!!
\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. (И естьпстрикс(Также имеются пакеты типа для деревьев.)
\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}