Как центрировать заголовки в Forest Trees?

Как центрировать заголовки в Forest Trees?

Вот мой третий вопрос. На самом деле я рисую деревья Game Theory с помощью пакета 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 является автоматическая нумерация подписей.

Вы можете настроить их, но они автоматические, так что если вы добавите еще одну цифру, они все автоматически исправятся, в то время как в вашем случае вам придется исправлять каждую вручную. А это нехорошо в длинном документе.

Вы можете добавить \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 labels. Это будут некоторые положительные inner sepи midway.

    /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$} }

Если нет, узел должен быть слева, поскольку все родительские узлы имеют ровно ноль или двух дочерних узлов. (Или n=1за n'=1исключением корневого узла, который 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

Что касается расстояния между метками краев и краями, посмотрите, дает ли следующее дополнение к коду Аленанно то, что вы ищете:

\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

Еще один пример использованияistgamepackage. Вы можете просто использовать сокращения [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}

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