Вот мой третий вопрос. На самом деле я рисую деревья 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 label
s. Это будут некоторые положительные 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
Еще один пример использованияistgame
package. Вы можете просто использовать сокращения [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}