Realmente me gustaría tener un círculo alrededor del primer nodo de mi árbol como puedes ver en la foto. ¿Existe una posibilidad? Sólo empiezo con látex y hay muchas cosas nuevas para mí... ¡¡Gracias!!
\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}
Respuesta1
Podemos definir un estilo adicional para el primer nodo (o, si es solo un nodo, puede aplicar la configuración directamente al nodo). Por ejemplo:
ringed dot/.style={circle, fill=black, draw, ultra thick, inner sep=1.95pt, double distance=1.5pt, minimum size=7pt}
producirá este resultado:
Tenga en cuenta que esta es una forma extremadamente ineficiente de dibujar el árbol y mínimamente flexible. Sería mucho más sencillo utilizar un paquete dedicado a dibujar árboles. TikZ tiene algo de esto integrado y una trees
biblioteca adicional que lo amplía.tikz-qtreeybosqueHay otros paquetes basados en TikZ dedicados a los árboles, que admiten una especificación más concisa de los árboles.qtreeadmite una sintaxis similar, pero no está basado en TikZ. (Y aquí estántrucos-tipo paquetes para árboles, también.)
\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}
Estrategias alternativas
Aquí hay una ilustración de una de las formas que mencioné anteriormente para dibujar el árbol de manera más eficiente y flexible. No se trata de escribir menos (aunque eso es relevante), sino de garantizar un formato uniforme, un espaciado consistente y facilidad de ajuste. Es decir, debería ser posible alterar fácilmente la apariencia del árbol, agregar o eliminar nodos, etc. sin necesidad de realizar una cirugía mayor en el código.
Esta solución utilizabosqueporque resulta que me gusta.
Comenzamos con los tres estilos estándar para nodos definidos anteriormente. Desdebosqueestá basado en TikZ, podemos usarlos directamente en el árbol para diseñar los nodos individuales como deseemos.
\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},
}
ahora para algunosbosque-estilos específicos.
\forestset{%
El árbol implica la repetición frecuente de etiquetas de borde, así que creemos algunos estilos para esas etiquetas para reducir la duplicación de código.
Primero, especifiquemos un estilo especial para formatear todas las etiquetas de borde llamado my edge label
. Esto requiere 2 argumentos: la ubicación de la etiqueta (p. ej. above
) y el contenido (p. ej. passen
).
my edge label/.style n args=2{
+edge label/.wrap value={node [sloped, midway, font=\footnotesize, #1] {#2}},
},
Ahora usaremos esto para crear dos estilos específicos para etiquetas de borde encima y debajo del borde.
edge above/.style={
my edge label={above}{#1},
},
edge below/.style={
my edge label={below}{#1},
},
Dado que una etiqueta determinada siempre aparece arriba o siempre aparece debajo, podemos configurar estilos llamados simplemente passen
, drehen
etc.
passen/.style={%
edge above=passen,
},
drehen
siempre obtiene una dotted
ventaja.
drehen/.style={%
edge={dotted},
edge above=drehen,
},
kein Schuss
arriba siempre coincide con cinco sextos abajo.
kein schuss/.style={
edge above=kein Schuss,
edge below=$\tfrac{5}{6}$,
},
Lo mismo ocurre con Schuss y un sexto.
schuss/.style={%
edge above=Schuss,
edge below=$\tfrac{1}{6}$,
},
}
Ahora el árbol en sí. Esto está especificado en el forest
entorno.
\begin{forest}
Empezamos personalizando el espaciado: l sep+
aumenta la distancia entre los niveles. s sep+
aumenta la distancia entre hermanos.
for tree={
s sep+=25mm,
l sep+=20mm,
},
Ahora un poco stage
de magia. Los nodos terminales siempre tienen una etiqueta debajo y siempre tienen un dot
estilo. Entonces, lo que podemos hacer es especificar el contenido de la etiqueta en el propio nodo al escribir el árbol. Luego, antes de componer los nodos, tomaremos ese contenido para crear una etiqueta debajo del nodo, eliminando el contenido del nodo y dándole el dot
estilo.
before typesetting nodes={
where n children=0{
label/.wrap pgfmath arg={below:$(#1)$}{content()},
content=,
dot,
No hacemos nada con los nodos no terminales: les daremos estilo directamente porque no hay ningún patrón (obvio para mí).
}{}
}
Ahora el árbol mismo usandobosqueSintaxis de corchetes. El nodo raíz es lo primero y usa el ringed dot
estilo. También obtiene un pin
.
[, ringed dot, pin=Spieler 1
Ahora por la rama izquierda. La raíz de esta rama obtiene un pin
formato dot
y queremos una passen
etiqueta de borde.
[, passen, dot, pin=135:Spieler 2
Aquí hay un nodo terminal. Entonces colocamos la etiqueta en el nodo y el código anterior se encargará de ello. Sólo es necesario especificar adicionalmente la etiqueta del borde.
[{0,0}, passen]
Seguimos con el lado derecho de la rama izquierda de la misma forma.
[, drehen, ring
[{1,-1}, schuss]
[{-2,2}, kein schuss]
]
]
Ahora, para la rama principal derecha del árbol, comenzando con una ring
etiqueta con borde drehen
(y el dotted
estilo de borde de la línea misma).
[, drehen, ring
Continuamos especificando los nodos en esta rama de la misma manera.
El schuss
estilo colocará una etiqueta encima y debajo del borde, mientras que el contenido de este nodo se utilizará para la etiqueta ya que el nodo es terminal.
[{1,-1}, schuss]
Este obtiene un pin
, las dos etiquetas del kein schuss
estilo y el dot
formato.
[, kein schuss, dot, pin=50:Spieler 2
[, drehen, ring
[{1,-1}, schuss]
[{0,0}, kein schuss]
]
[{0.5,-0.5}, passen]
]
]
]
Habiendo cerrado los corchetes que comenzaban con el nodo raíz, estamos listos para finalizar el forest
entorno.
\end{forest}
Aquí está el resultado. Aumente l sep+
y s sep+
si lo desea para un árbol más espaciado.
Código completo:
\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}