여기에 세 번째 질문이 있습니다. 저는 실제로 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
. 이것은 긍정적 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$} }
그렇지 않은 경우 모든 상위 노드에는 정확히 0개 또는 2개의 하위 노드가 있으므로 노드는 왼쪽에 있어야 합니다. ( 어느 누구의 자식도 될 수 없는 루트 노드를 제외하고 둘 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
가장자리 레이블과 가장자리 사이의 거리와 관련하여 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}