Alternative Strategien

Alternative Strategien

Ich hätte wirklich gern einen Kreis um den ersten Knoten meines Baums, wie man ihn auf dem Foto sehen kann. Ist das möglich? Ich habe gerade erst mit Latex angefangen und es gibt so viel Neues für mich... Danke!!

Bildbeschreibung hier eingeben

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

Antwort1

Wir können einen zusätzlichen Stil für den ersten Knoten definieren (oder, wenn es nur ein Knoten ist, können Sie die Einstellungen direkt auf den Knoten anwenden). Beispiel:

    ringed dot/.style={circle, fill=black, draw, ultra thick, inner sep=1.95pt, double distance=1.5pt, minimum size=7pt}

wird dieses Ergebnis erzeugen:

Ringelpunkt

Beachten Sie, dass dies eine äußerst ineffiziente Methode zum Zeichnen des Baums ist und nur wenig Flexibilität bietet. Es wäre viel einfacher, ein spezielles Paket zum Zeichnen von Bäumen zu verwenden. TikZ hat einige dieser Funktionen integriert und eine zusätzliche treesBibliothek, die sie erweitert.tikz-qtreeUndWaldsind andere TikZ-basierte Pakete speziell für Bäume, die eine präzisere Spezifikation von Bäumen unterstützen.qtreeunterstützt eine ähnliche Syntax, basiert aber nicht auf TikZ. (Und es gibtAbonnieren-Typ-Pakete auch für Bäume.)

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

Alternative Strategien

Hier ist eine Illustration einer der oben genannten Möglichkeiten, den Baum effizienter und flexibler zu zeichnen. Es geht nicht darum, weniger zu tippen (obwohl das relevant ist), sondern darum, einheitliche Formatierung, konsistente Abstände und einfache Anpassung sicherzustellen. Das heißt, es sollte möglich sein, das Erscheinungsbild des Baums einfach zu ändern, Knoten hinzuzufügen oder zu entfernen usw., ohne größere Eingriffe in den Code vornehmen zu müssen.

Diese Lösung verwendetWaldweil es mir zufällig gefällt.

Wir beginnen mit den drei Standardstilen für Knoten, die oben definiert wurden. DaWaldbasiert auf TikZ, wir können diese direkt im Baum verwenden, um die einzelnen Knoten nach Belieben zu gestalten.

\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},
}

Nun zu einigenWald-spezifische Stile.

\forestset{%

Der Baum enthält sich häufig wiederholende Kantenbeschriftungen. Lassen Sie uns daher einige Stile für diese Beschriftungen erstellen, um die Duplizierung von Code zu reduzieren.

Lassen Sie uns zunächst einen speziellen Stil namens zum Formatieren aller Kantenbeschriftungen festlegen my edge label. Dieser benötigt zwei Argumente: die Position der Beschriftung (z. B. above) und den Inhalt (z. B. passen).

  my edge label/.style n args=2{
    +edge label/.wrap value={node [sloped, midway, font=\footnotesize, #1] {#2}},
  },

Jetzt verwenden wir dies, um zwei spezielle Stile für Kantenbeschriftungen oberhalb und unterhalb der Kante zu erstellen.

  edge above/.style={
    my edge label={above}{#1},
  },
  edge below/.style={
    my edge label={below}{#1},
  },

Da eine bestimmte Bezeichnung immer oben oder immer unten vorkommt, können wir Stile einrichten, die einfach usw. genannt werden passen.drehen

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

drehenbekommt immer einen dottedVorteil.

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

kein Schussoben entspricht immer fünf Sechsteln unten.

  kein schuss/.style={
    edge above=kein Schuss,
    edge below=$\tfrac{5}{6}$,
  },

Gleiches gilt für Schuss und ein Sechstel.

  schuss/.style={%
    edge above=Schuss,
    edge below=$\tfrac{1}{6}$,
  },
}

Nun zum Baum selbst. Dieser wird in der forestUmgebung angegeben.

\begin{forest}

Wir beginnen mit der Anpassung des Abstands: l sep+vergrößert den Abstand zwischen den Ebenen. s sep+vergrößert den Abstand zwischen Geschwistern.

  for tree={
    s sep+=25mm,
    l sep+=20mm,
  },

Jetzt ein bisschen stageMagie. Endknoten haben immer eine Beschriftung darunter und sind immer ein dotStil. Was wir also tun können, ist, den Inhalt der Beschriftung im Knoten selbst anzugeben, wenn wir den Baum schreiben. Dann, bevor die Knoten gesetzt werden, verwenden wir diesen Inhalt, um eine Beschriftung unter dem Knoten zu erstellen, löschen den Inhalt des Knotens selbst und geben ihm den dotStil.

  before typesetting nodes={
    where n children=0{
      label/.wrap pgfmath arg={below:$(#1)$}{content()},
      content=,
      dot,

Mit den nicht-terminalen Knoten machen wir nichts: Wir formatieren diese direkt, da es kein (für mich offensichtliches) Muster gibt.

    }{}
  }

Nun wird der Baum selbst mitWald's Klammersyntax. Der Stammknoten kommt zuerst und verwendet den ringed dotStil. Er erhält auch ein pin.

  [, ringed dot, pin=Spieler 1

Nun zum linken Zweig. Die Wurzel dieses Zweigs erhält ein pin, das dotFormat und wir wollen eine passenKantenbeschriftung.

    [, passen, dot, pin=135:Spieler 2

Hier ist ein Endknoten. Wir setzen also das Label in den Knoten selbst und der obige Code kümmert sich darum. Nur das Kantenlabel muss zusätzlich angegeben werden.

      [{0,0}, passen]

Auf die gleiche Weise verfahren wir mit der rechten Seite des linken Astes.

      [, drehen, ring
        [{1,-1}, schuss]
        [{-2,2}, kein schuss]
      ]
    ]

Nun zum rechten Hauptzweig des Baums, beginnend mit einer ringKantenbeschriftung drehen(und dem dottedKantenstil für die Linie selbst).

    [, drehen, ring

Wir fahren mit der Spezifizierung der Knoten in diesem Zweig auf die gleiche Weise fort.

Der schussStil platziert eine Beschriftung über und unter der Kante, während der Inhalt dieses Knotens für die Beschriftung verwendet wird, da es sich bei dem Knoten um einen Terminalknoten handelt.

      [{1,-1}, schuss]

Dieses erhält ein pin, die beiden Labels für den kein schussStil und das dotFormat.

      [, kein schuss, dot, pin=50:Spieler 2
        [, drehen, ring
          [{1,-1}, schuss]
          [{0,0}, kein schuss]
        ]
        [{0.5,-0.5}, passen]
      ]
    ]
  ]

Nachdem wir die eckigen Klammern geschlossen haben, die mit dem Stammknoten begonnen haben, können wir die forestUmgebung beenden.

\end{forest}

Hier ist das Ergebnis. Erhöhen Sie es l sep+, s sep+falls gewünscht, um einen weiter auseinander liegenden Baum zu erhalten.

Baum mit **Wald**

Vollständiger Code:

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

verwandte Informationen