Como centralizar títulos em árvores florestais?

Como centralizar títulos em árvores florestais?

Aí vai minha terceira pergunta. Na verdade, estou desenhando árvores da Teoria dos Jogos usando o pacote Forest e tenho um pequeno problema com o título de algumas árvores que não consigo gerenciar. Essencialmente, ordeno ao LaTex que coloque os títulos centralizados, mas seu comportamento é centralizá-los no nó superior da árvore. Isto é bom quando a árvore é simétrica ou quase simétrica, mas parece um tanto estranho quando a árvore não é. Então, fiquei pensando se existe alguma maneira de centralizar o título de forma que fique no centro de toda a árvore e não centralizado no nó superior. Em suma, esta é a árvore que tenho atualmente e gostaria de mover ligeiramente o título para a direita (se possível). insira a descrição da imagem aqui

O código que estou usando é este:

\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: Se alguém souber separar um pouco as letras que designam as ações (D,A,d,a,D,A) para evitar que elas se sobreponham aos galhos da árvore, vai ser simplesmente demais.

Responder1

Isso ocorre porque você está definindo a legenda como um nó, o que também não é a maneira padrão de fazer isso. Legendas são adicionadas às figuras em um documento Latexexternamenteà imagem, ou seja, eles não fazem parte dela.

Além disso, você está atribuindo manualmente um número à sua figura e isso torna o uso do Latex um pouco inútil, pois uma das grandes vantagens de usar o Latex é que as legendas são numeradas automaticamente.

Você pode personalizá-los, mas eles são automáticos, então se você adicionar outra figura, eles serão todos corrigidos automaticamente, enquanto no seu caso você teria que corrigir cada um manualmente. E isso não é bom num documento longo.

Você pode adicionar \renewcommand{\thefigure}{\Roman{figure}}ao seu preâmbulo a numeração das figuras com algarismos romanos maiúsculos e \usepackage[labelfont=bf]{caption}torná-las em negrito.

Saída

insira a descrição da imagem aqui

Código

\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}

Responder2

Alenannoestá totalmente correto sobre como lidar com figurelegendas. No entanto, ainda assim pode ser útil saber como centralizar um nó em relação à árvore.

Isto pode ser feito centralizando o nó em relação à caixa delimitadora atual da imagem, depois que toda a árvore for desenhada, em vez de centralizá-lo em relação a algum nó específico.

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

Zarkotambém está correto, mas sou mais preguiçoso e prefiro lidar com as coisas automaticamente. Então, eu usaria algo que tornasse a especificação da árvore, incluindo os rótulos, um pouco mais simples, modificando um pouco o preâmbulo da árvore.

  \begin{forest}

Primeiro, vamos criar um estilo com as opções comuns a todos edge labelos s. Isto será algo positivo inner sepe midway.

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

Agora, para a configuração da árvore.

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

Atrasaremos um pouco nossas alterações para garantir que as opções estejam definidas.

      before typesetting nodes={

Se o nó for o primeiro filho indo da direita para a esquerda, então quaisquer rótulos de aresta deverão ser definidos à direita, bem como usar o estilo para todos os rótulos de aresta. Além disso, a edge labelespecificação é essencialmente a mesma em todos os casos, então podemos fazer tudo node ...aqui também.

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

Caso contrário, o nó deverá estar à esquerda, porque todos os nós pais têm exatamente zero ou dois filhos. (Ou n=1ou n'=1exceto o nó raiz que não poderia ser edge labelfilho de ninguém.)

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

Todos os nós não terminais obtêm as opções circlee draw, portanto, não precisamos especificar as opções manualmente todas as vezes.

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

Com esta configuração implementada, podemos especificar a árvore da seguinte maneira.

    [$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]
        ]
      ]
    ]

para produzir

especificação de árvore mais preguiçosa

Código completo:

\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}

Responder3

Em relação à distância entre rótulos de arestas e arestas, veja se a seguinte adição ao código de Alenanno dá o que você procura:

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

Coloque isso antes \begin{forest}e depois em vez de edge label={node[midway,left]{...}usar

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

ou

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

dependendo de qual lado da borda a etiqueta deve ficar. Com ele o gráfico fica:

insira a descrição da imagem aqui

Responder4

Outro exemplo de uso doistgamepacote. Você pode simplesmente usar as abreviações [al]ou [ar]obter alguma distância entre os rótulos de ação e as ramificações.

insira a descrição da imagem aqui

\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}

informação relacionada