¿Cómo centrar títulos en árboles forestales?

¿Cómo centrar títulos en árboles forestales?

Aquí va mi tercera pregunta. De hecho, estoy dibujando árboles de teoría de juegos usando el paquete Forest y tengo un pequeño problema con el título de algunos árboles que no puedo gestionar. Básicamente, le ordeno a LaTex que coloque los títulos centrados, pero su comportamiento es centrarlos en el nodo superior del árbol. Esto está bien cuando el árbol es simétrico o casi simétrico, pero parece bastante extraño cuando el árbol no lo es. Entonces, me preguntaba si hay alguna forma de centrar el título de modo que esté en el centro de todo el árbol y no centrado en el nodo superior. En resumen, este es el árbol que tengo actualmente y me gustaría mover ligeramente el título hacia la derecha (si es posible). ingrese la descripción de la imagen aquí

El código que estoy usando es 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}

PD: Si alguien sabe cómo separar ligeramente las letras que designan acciones (D,A,d,a,D,A) para evitar que se superpongan con las ramas del árbol, sería simplemente genial.

Respuesta1

Esto se debe a que estás configurando el título como un nodo, lo cual tampoco es la forma estándar de hacerlo. Se agregan títulos a las figuras en un documento de Latex.externamentea la imagen, es decir, no forman parte de ella.

Además, estás asignando manualmente un número a tu figura y esto hace que el uso de Latex sea un poco inútil, porque una de las grandes ventajas de usar Latex es que los subtítulos se numeran automáticamente.

Puedes personalizarlos, pero son automáticos, por lo que si añades otra figura, automáticamente se arreglan todos, mientras que en tu caso tendrías que arreglar cada uno manualmente. Y eso no es bueno en un documento largo.

Puede agregar \renewcommand{\thefigure}{\Roman{figure}}a su preámbulo hacer la numeración de las figuras con números romanos en mayúsculas y \usepackage[labelfont=bf]{caption}ponerlas en negrita.

Producción

ingrese la descripción de la imagen aquí

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}

Respuesta2

Alenannotiene toda la razón sobre cómo manejar figurelos subtítulos. Sin embargo, podría resultar útil saber cómo centrar un nodo con respecto al árbol.

Esto se puede hacer centrando el nodo en relación con el cuadro delimitador actual de la imagen, después de dibujar todo el árbol, en lugar de centrarlo en relación con algún nodo en particular.

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

zarkoTambién es bastante correcto, pero soy más vago y prefiero manejar las cosas automáticamente. Así que usaría algo que simplificara un poco la especificación del árbol, incluidas las etiquetas, modificando un poco el preámbulo del árbol.

  \begin{forest}

Primero, creemos un estilo con las opciones comunes a todos edge labellos s. Esto será algo positivo inner sepy midway.

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

Ahora para la configuración del árbol.

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

Retrasaremos un poco nuestros cambios para asegurarnos de que las opciones estén configuradas.

      before typesetting nodes={

Si el nodo es el primer hijo que va de derecha a izquierda, entonces cualquier etiqueta de borde debe establecerse a la derecha, además de usar el estilo para todas las etiquetas de borde. Además, la edge labelespecificación es esencialmente la misma en todos los casos, por lo que también podríamos hacer todo node ...aquí.

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

De lo contrario, el nodo debe estar a la izquierda, porque todos los nodos principales tienen exactamente cero o dos hijos. (Ya sea n=1o n'=1excepto el nodo raíz que no podría ser edge labelhijo de nadie en absoluto).

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

Todos los nodos no terminales obtienen las opciones circley draw, por lo que no necesitamos especificar las opciones manualmente cada vez.

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

Con esta configuración implementada, podemos especificar el árbol de la siguiente manera.

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

especificación de árbol más perezoso

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}

Respuesta3

Con respecto a la distancia entre las etiquetas de los bordes y los bordes, vea si la siguiente adición al código de Alenanno le brinda lo que busca:

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

Pon esto antes \begin{forest}y después en lugar de edge label={node[midway,left]{...}usarlo.

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

o

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

dependiendo de qué lado del borde debe ir la etiqueta. Con esto la gráfica queda:

ingrese la descripción de la imagen aquí

Respuesta4

Otro ejemplo de uso de laistgamepaquete. Puedes simplemente usar las abreviaturas [al]o [ar]para obtener cierta distancia entre las etiquetas de acción y las ramas.

ingrese la descripción de la imagen aquí

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

información relacionada