替代策略

替代策略

我真的很想在我的树的第一个节点周围画一个圆圈,就像你在照片上看到的那样。有可能吗?我刚开始用乳胶,对我来说有很多新东西……谢谢!!

在此处输入图片描述

\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 的专用于树的包,它们支持更简洁的树规范。配额树支持类似的语法,但不基于 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},
  },

由于给定的标签总是出现在上面或总是出现在下面,我们可以设置简单称为的样式passendrehen等等。

  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

现在来看看左分支。这个分支的根得到一个pindot格式和我们想要的一个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 schussdot

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

相关内容