Estrategias alternativas

Estrategias alternativas

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!!

ingrese la descripción de la imagen aquí

\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:

punto anillado

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 treesbiblioteca 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, drehenetc.

  passen/.style={%
    edge above=passen,
  },

drehensiempre obtiene una dottedventaja.

  drehen/.style={%
    edge={dotted},
    edge above=drehen,
  },

kein Schussarriba 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 forestentorno.

\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 stagede magia. Los nodos terminales siempre tienen una etiqueta debajo y siempre tienen un dotestilo. 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 dotestilo.

  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 dotestilo. También obtiene un pin.

  [, ringed dot, pin=Spieler 1

Ahora por la rama izquierda. La raíz de esta rama obtiene un pinformato doty queremos una passenetiqueta 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 ringetiqueta con borde drehen(y el dottedestilo de borde de la línea misma).

    [, drehen, ring

Continuamos especificando los nodos en esta rama de la misma manera.

El schussestilo 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 schussestilo y el dotformato.

      [, 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 forestentorno.

\end{forest}

Aquí está el resultado. Aumente l sep+y s sep+si lo desea para un árbol más espaciado.

árbol con **bosque**

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}

información relacionada