대체 전략

대체 전략

사진에서 볼 수 있듯이 내 트리의 첫 번째 노드 주위에 원을 만들고 싶습니다. 가능성이 있나요? 저는 라텍스로만 시작했는데 새로운 것이 너무 많아요... 감사합니다!!

여기에 이미지 설명을 입력하세요

\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 기반이 아닙니다. (그리고 거기에pstricks-나무에 대한 유형 패키지도 마찬가지입니다.)

\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위의 값은 항상 아래의 5/6과 일치합니다.

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

Schuss와 1/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가장자리 레이블 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}

관련 정보