如何讓森林中的標題居中?

如何讓森林中的標題居中?

這是我的第三個問題。我實際上是使用 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 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}

相關內容