フォレストツリーでタイトルを中央に配置するにはどうすればよいでしょうか?

フォレストツリーでタイトルを中央に配置するにはどうすればよいでしょうか?

3 つ目の質問です。私は実際に Forest パッケージを使用してゲーム理論のツリーを描画していますが、いくつかのツリーのタイトルに管理できない小さな問題があります。基本的に、LaTex にタイトルを中央に配置するように指示しますが、その動作はツリーの最上位ノードでタイトルを中央に配置することです。ツリーが対称またはほぼ対称の場合は問題ありませんが、ツリーがそうでない場合はかなり奇妙に見えます。次に、タイトルをツリー全体の中央に配置し、最上位ノードで中央に配置しないようにする方法があるかどうか疑問に思っていました。要約すると、これが現在持っているツリーであり、タイトルを少し右に移動したいと思います (可能であれば)。 ここに画像の説明を入力してください

私が使用しているコードは次のとおりです:

\begin{center}
\begin{forest} for tree={l sep=4em, s sep=8em, anchor=center}
[$P_1$, circle, draw,
    [{2, 2}, edge label={node[midway,left]{$D$}}]
    [$P_2$, edge label={node[midway,right]{$A$}}, circle, draw, 
        [{1, 1}, edge label={node[midway,left]{$d$}}] 
        [$P_1$, edge label={node[midway,right]{$a$}}, circle, draw,
            [{0, 0}, edge label={node[midway,left]{$D$}}]
            [{3, 3}, edge label={node[midway,right]{$A$}}]]]]
\node[above=30pt,align=center,anchor=center] {\textbf{Figure IV.} Extensive Form of a Centipede Game Variant};
\end{forest}
\end{center}

PS: アクションを指定する文字 (D、A、d、a、D、A) を少しずつ離して、ツリーの枝と重ならないようにする方法を知っている人がいたら、とても助かります。

答え1

これは、キャプションをノードとして設定しているためであり、これも標準的な方法ではありません。キャプションはLaTeXドキュメントの図に追加されます。外部的につまり、それらは写真の一部ではないのです。

また、図に手動で番号を割り当てるため、Latex を使用する意味が少しなくなります。Latex を使用する大きな利点の 1 つは、キャプションに自動的に番号が付けられることです。

これらはカスタマイズできますが、自動なので、別の図を追加するとすべて自動的に修正されますが、あなたの場合は、1 つ 1 つを手動で修正する必要があります。これは、長いドキュメントでは好ましくありません。

\renewcommand{\thefigure}{\Roman{figure}}序文に追加して、図の番号を大文字のローマ数字にしたり、\usepackage[labelfont=bf]{caption}太字にしたりすることができます。

出力

ここに画像の説明を入力してください

コード

\documentclass{article}
\usepackage{forest}
\usepackage[labelfont=bf]{caption}

\renewcommand{\thefigure}{\Roman{figure}}

\begin{document}  
\begin{figure}
\centering
\caption{Extensive Form of a Centipede Game Variant}
\medskip
\begin{forest} for tree={l sep=4em, s sep=8em, anchor=center}
[$P_1$, circle, draw,
    [{2, 2}, edge label={node[midway,left]{$D$}}]
    [$P_2$, edge label={node[midway,right]{$A$}}, circle, draw, 
        [{1, 1}, edge label={node[midway,left]{$d$}}] 
        [$P_1$, edge label={node[midway,right]{$a$}}, circle, draw,
            [{0, 0}, edge label={node[midway,left]{$D$}}]
            [{3, 3}, edge label={node[midway,right]{$A$}}]]]]
\end{forest}
\end{figure}  
\end{document}

答え2

アレナンノキャプションの扱い方については完全に正しいですfigure。ただし、ツリーに対してノードを中央に配置する方法を知っておくと役立つかもしれません。

これは、ツリー全体を描画した後、特定のノードを基準にノードを中央に配置するのではなく、画像の現在の境界ボックスを基準にノードを中央に配置することによって実行できます。

    \node at ([yshift=10pt]current bounding box.north) {Centred within Tree: Extensive Form of a Centipede Game Variant};

ザルコもまったく正しいのですが、私は怠け者なので、自動的に処理することを好みます。そのため、ツリーのプリアンブルを少し変更することで、ラベルを含むツリーの指定を少し簡単にする何かを使います。

  \begin{forest}

まず、すべての に共通するオプションを使用してスタイルを作成しましょう。これは、いくつかの肯定的なおよびedge labelになります。inner sepmidway

    /tikz/my edge label/.style={inner sep=5pt, midway},

次にツリーの構成について説明します。

    for tree={
      l sep=4em,
      s sep=8em,
      anchor=center,

オプションが確実に設定されるよう、変更を少し遅らせます。

      before typesetting nodes={

ノードが右から左に進む最初の子である場合、すべてのエッジ ラベルにスタイルを使用するだけでなく、エッジ ラベルも右側に設定する必要があります。また、仕様は基本的にすべてのケースで同じなので、ここでもedge labelすべて実行したほうがよいでしょう。node ...

        if n'=1{
          edge label/.wrap value={\noexpand node [my edge label,right] {$#1$} }

そうでない場合、すべての親ノードには 0 個または 2 個の子ノードがあるため、ノードは左側にある必要があります。(ルート ノードは例外n=1で、n'=1ルート ノードには nobody の子ノードはまったく存在できませんedge label。)

        }{
          edge label/.wrap value={\noexpand node [my edge label,left] {$#1$} }
        },
      },

すべての非終端ノードはオプションcircleとを取得するdrawため、毎回オプションを手動で指定する必要はありません。

      if n children=0{}{
        circle,
        draw,
      }
    }

この構成では、次の方法でツリーを指定できます。

    [$P_1$
      [{2, 2}, edge label=D]
      [$P_2$, edge label=A
        [{1, 1}, edge label=d]
        [$P_1$, edge label=a
          [{0, 0}, edge label=D]
          [{3, 3}, edge label=A]
        ]
      ]
    ]

生産する

レイジーツリー仕様

完全なコード:

\documentclass{article}
\usepackage{forest}
\usepackage[labelfont=bf]{caption}

\renewcommand{\thefigure}{\Roman{figure}}

\begin{document}
\begin{figure}
  \centering
  \caption{Extensive Form of a Centipede Game Variant}
  \medskip
  \begin{forest}
    /tikz/my edge label/.style={inner sep=5pt, midway},
    for tree={
      l sep=4em,
      s sep=8em,
      anchor=center,
      before typesetting nodes={
        if n'=1{
          edge label/.wrap value={\noexpand node [my edge label,right] {$#1$} }
        }{
          edge label/.wrap value={\noexpand node [my edge label,left] {$#1$} }
        },
      },
      if n children=0{}{
        circle,
        draw,
      }
    }
    [$P_1$
      [{2, 2}, edge label=D]
      [$P_2$, edge label=A
        [{1, 1}, edge label=d]
        [$P_1$, edge label=a
          [{0, 0}, edge label=D]
          [{3, 3}, edge label=A]
        ]
      ]
    ]
    \node at ([yshift=10pt]current bounding box.north) {Centred within Tree: Extensive Form of a Centipede Game Variant};
  \end{forest}
\end{figure}
\end{document}

答え3

エッジ ラベルとエッジ間の距離に関しては、Alenanno のコードに次のものを追加すると、目的の結果が得られるか確認してください。

\tikzset{el/.style = {% edge label
    midway, outer sep=1.5mm, #1} % <--- #1: for position (left, right)
        }

使用\begin{forest}の代わりにこれを前と後に置くedge label={node[midway,left]{...}

edge label={node[el=left]{...}

または

edge label={node[el=right]{...}

ラベルをエッジのどちら側に配置すべきかによって異なります。これにより、グラフは次のようになります。

ここに画像の説明を入力してください

答え4

もう一つの使用例istgameパッケージ。アクション ラベルとブランチの間に距離を置くには、略語を使用する[al]か、単に を使用します。[ar]

ここに画像の説明を入力してください

\documentclass{article}
\usepackage{istgame}
\begin{document}

\begin{figure}
\centering
\caption{Extensive Form of a Centipede Game Variant}
\bigskip
\begin{istgame}
\setistEllipseNodeStyle{7mm}
\setistmathTF111
\xtdistance{6em}{10em}
\istrooto(0){P_1}
  \istb{D}[al]{2,2} \istb{A}[ar] \endist
\istrooto(1)(0-2){P_2}
  \istb{d}[al]{1,1} \istb{a}[ar] \endist
\istrooto(2)(1-2){P_1}
  \istb{D}[al]{0,0} \istb{A}[ar]{3,3} \endist
\end{istgame}
\end{figure}
\end{document}

関連情報