我正在使用 Osborne 的 egameps 包创建一个大型游戏的游戏树。我怎样才能将第一运动中树枝的右侧分支仅着色为红色。我尝试使用\iiib[][][linecolor=red]{$X$}{$Y$}{$Z$}
,因为我要处理双分支的情况,但它没有着色任何东西,并且扰乱了整个游戏树。我该怎么办?
以下是代码:
\documentclass[12pt]{scrartcl}
\usepackage{pstricks,egameps}
\usepackage{pst-3d}% Above two packages are for extensive games
\begin{figure}[htb]%
\hspace*{\fill}%
\begin{egame}(810,290)
\putbranch(360,250)(3,1){360}
\egalvshift=5
\iiib[][][linecolor=red]{1}{$X$}{$Y$}{$Z$}
\putbranch(0,130)(1,1){90}
\egalhshift=18
\iib{2}{$Y$}{$Z$}[$0,2$][$1,1$]
\putbranch(360,130)(1,1){90}
\egalhshift=18
\iib{2}{$X$}{$Z$}[$0,2$][$2,0$]
\putbranch(720,130)(1,1){90}
\egalhshift=18
\iib[linecolor=red][]{2}{$Z$}{$Y$}[$1,1$][$2,0$]
\end{egame}
\hspace*{\fill}%
\caption[]{An extensive game.}\label{f:se1}
\end{figure}
答案1
收到补充信息后的版本。
\documentclass{article}
\usepackage{pstricks}
\usepackage{egameps}
\begin{document}
\begin{figure}[\htb]%
\hspace*{\fill}%
\begin{egame}(810,290)
\putbranch(360,250)(3,1){360}
\egalvshift=5
%\iiib[][][linecolor=red]{1}{$X$}{$Y$}{$Z$}
\iiib{1}{$X$}{$Y$}{$Z$}
\ib[linecolor=red]{1}{}
\putbranch(0,130)(1,1){90}
\egalhshift=18
\iib{2}{$Y$}{$Z$}[$0,2$][$1,1$]
\putbranch(360,130)(1,1){90}
\egalhshift=18
\iib{2}{$X$}{$Z$}[$0,2$][$2,0$]
\putbranch(720,130)(1,1){90}
\egalhshift=18
\iib[linecolor=red][]{2}{$Z$}{$Y$}[$1,1$][$2,0$]
\end{egame}
\hspace*{\fill}%
\caption[]{An extensive game.}\label{f:se1}
\end{figure}
\end{document}
答案2
我认为,该egameps
包是pstricks
绘制游戏树的最佳工具。另一个解决方案是使用包istgame
,它基于TikZ
。
\documentclass{standalone}
\usepackage{istgame}
\begin{document}
\begin{istgame}[line width=.8pt]
\xtdistance{15mm}{40mm}
\istroot(0){1}
\istb{X}[al]
\istb{Y}[r]
\istb[draw=red]{Z}[ar]
\endist
\xtdistance{10mm}{20mm}
\istroot(1)(0-1){2}
\istb{Y}[al]{0,2}
\istb{Z}[ar]{1,1}
\endist
\istroot(2)(0-2)<135>{2}
\istb{X}[al]{0,2}
\istb{Z}[ar]{2,0}
\endist
\istroot(3)(0-3){2}
\istb[draw=red]{Z}[al]{1,1}
\istb{Y}[ar]{2,0}
\endist
\end{istgame}
\end{document}
答案3
可能可以forest
直接获取最后一级(至少对于一棵简单的树而言),但是现在,您需要手动提供它。
样式egame
仅为这棵树设置了一些样式。代码中注释。
代码
\documentclass[tikz]{standalone}
\usepackage{forest}
\tikzset{
edge label style/.style={text=.,font=\scriptsize,inner sep=+.1667em,midway,yshift=+1mm}}
\forestset{
label position/.code=\forestoset{label position}{#1},
last level/.initial=-1, % set it!
egame/.style={
/tikz/every label/.append style={inner sep=+.1em,font=\scriptsize},
el/.style={% short for "edge label"
if={n()<=\forestOve{\forestove{@parent}}{n children}/2}
{edge label={node[edge label style, left] {$##1$}}}
{edge label={node[edge label style, right]{$##1$}}}},
for tree={
label position=above,% default label position
if={level==\pgfkeysvalueof{/forest/last level}}{% last level?
delay={content/.expanded={$\forestov{content}$}}% put content in math
}{
node options={% a black dot
shape=circle,
fill, draw, inner sep=+0pt,
minimum size=+2pt},
delay={
label/.expanded=% level as label
{\forestove{label position}:\noexpand\pgfmathprint{int(level()+1)}}}
}}}}
\begin{document}
\begin{forest} last level=2, egame
[
[, el=X,
[{0,2}, el=Y]
[{1,1}, el=Z] ]
[, el=Y, label position=above right
[{0,2}, el=X]
[{2,0}, el=Z] ]
[, el=Z, edge=red
[{1,1}, el=Z, edge=red]
[{2,0}, el=Y] ]
]
\end{forest}
\end{document}
输出
答案4
推荐使用 PSTricks 的解决方案。
\documentclass[preview,border=12pt]{standalone}
\usepackage{pst-tree}
\psset{labelsep=5pt,radius=3pt}
\def\red{\ncline[linecolor=red]}
\def\lbl#1#2{\nput{#1}{\pssucc}{$#2$}}% \nput will not update the bounding box!
\begin{document}
\psTree{\TC*~[tnpos=a]{1}}
\psset{levelsep=1}
\psTree{\TC*\lbl{135}{2}\tlput{$X$}}
\Tp*~{$0,2$}\tlput{$Y$}
\Tp*~{$1,1$}\trput{$Y$}
\endpsTree
\psTree{\TC*\lbl{45}{2}\trput{$Y$}}
\Tp*~{$0,2$}\tlput{$X$}
\Tp*~{$2,0$}\trput{$Z$}
\endpsTree
\psTree{\TC*[edge=\red]\lbl{45}{2}\trput{$Z$}}
\Tp*[edge=\red]~{$1,1$}\tlput{$Z$}
\Tp*~{$2,0$}\trput{$Y$}
\endpsTree
\endpsTree
\end{document}
笔记
\nput
可用于标记树节点。不幸的是,它不会更新边界框。不应使用它。~[]{}
是另一种标记树节点的语法。它将更新边界框。但不幸的是,它tnpos
只能接受 4 个预设值:a
用于上方、b
用于下方、l
用于左侧和r
用于右侧。它不支持任意角度,例如45
度。一个令人悲伤的消息!