Альтернативные стратегии

Альтернативные стратегии

Мне бы очень хотелось сделать круг вокруг первого узла моего дерева, как вы видите на фото. Есть ли такая возможность? Я только начала работать с латексом, и для меня так много нового... Спасибо!!

введите описание изображения здесь

\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метки с краем drehendottedстиля края для самой линии).

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

Связанный контент