如何将标题置于森林树木的中心?

如何将标题置于森林树木的中心?

这是我的第三个问题。我实际上是使用 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}

附言:如果有人知道如何稍微分开表示动作的字母(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}

首先,让我们创建一个具有所有 s 共有选项的样式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$} }

如果不是,则节点必须在左侧,因为所有父节点都恰好有零个或两个子节点。(除了根节点n=1之外n'=1,根节点不可能有edge label任何子节点。)

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

所有非终端节点都获得选项circledraw,因此我们不需要每次手动指定选项。

      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}

相关内容