在我的工作中,我需要在 LaTeX 中重新创建以下图像
这是我目前所拥有的
我并不想完美地重现上面的树,因为我觉得它很丑。但是,我确实需要重新创建它的主要特征。
- 如何连接树中的 L1 和 R1?
- 有没有什么方法可以让文本位于行的中间(我知道 tikz 有一些 mid 命令可以将文本放置在段的中间,但不确定如何让它与 tikz 一起工作)
- 我怎样才能让名称和 wc 指向一侧?
如能帮助修复上述一个或多个问题,我们将不胜感激。
\documentclass[a4paper, english, 12pt]{article}
\usepackage[linguistics]{forest}
\begin{document}
\begin{forest}
[S1
[left-bank
[L1
[boat
[$1$]
]
[wolf
[$1$]
]
[goat
[$1$]
]
[cabbage
[$1$]
]
]
]
[right-bank
[R1
[boat
[$0$]
]
[wolf
[$0$]
]
[goat
[$0$]
]
[cabbage
[$0$]
]
]
]
[desired
[D1
[right-bank
[DR1
[boat
[$1$]
]
[wolf
[$1$]
]
[goat
[$1$]
]
[cabbage
[$1$]
]
]
]
]
]
]
\end{forest}
\end{document}
答案1
我看到,Zarko 也阐明了我的评论。无论如何,这个版本也回答了你的问题,如何在L1
和之间绘制额外的线(箭头) R1
。我强调,我甚至没有看过 Zarko 的代码,更不用说从那里复制了。我也没有对他的帖子投反对票或赞成票。
\documentclass[a4paper, english, 12pt]{article}
\usepackage[linguistics,edges]{forest}
\usepackage[outline]{contour}
\usetikzlibrary{positioning,shadings,shapes.geometric}
\begin{document}
\tikzset{con/.style={draw=yellow!60!black,line width=2.5pt,-latex},
lbl/.style={pos=0.5,font=\sffamily}}
\begin{forest}
for tree={s sep=0.5cm,l sep=1.2cm,
where n children=0{}{top color=yellow!70!white,bottom color=yellow!80!black,
ellipse,draw=yellow!60!black,thick},
edge path={
\noexpand\path [con, \forestoption{edge}]
(!u) -- (.child anchor)\forestoption{edge label};
},}
[S1,alias=S1
[L1,edge label={node[lbl]{\contour{white}{left-bank}}},alias=L1
[$1$,edge label={node[lbl,xshift=-2mm]{\contour{white}{boat}}}]
[$1$,edge label={node[lbl,yshift=2mm]{\contour{white}{wolf}}}]
[$1$,edge label={node[lbl,yshift=-2mm]{\contour{white}{goat}}}]
[$1$,edge label={node[lbl,xshift=2mm]{\contour{white}{cabbage}}}]
]
[R1,edge label={node[pos=0.5,font=\sffamily]{\contour{white}{right-bank}}},alias=R1
[$0$,edge label={node[lbl,xshift=-2mm]{\contour{white}{boat}}}]
[$0$,edge label={node[lbl,yshift=2mm]{\contour{white}{wolf}}}]
[$0$,edge label={node[lbl,yshift=-2mm]{\contour{white}{goat}}}]
[$0$,edge label={node[lbl,xshift=2mm]{\contour{white}{cabbage}}}]
]
[D1,edge label={node[pos=0.5,font=\sffamily]{\contour{white}{desired}}}
[DR1,edge label={node[pos=0.5,font=\sffamily]{\contour{white}{right-bank}}}
[$1$,edge label={node[lbl,xshift=-2mm]{\contour{white}{boat}}}]
[$1$,edge label={node[lbl,yshift=2mm]{\contour{white}{wolf}}}]
[$1$,edge label={node[lbl,yshift=-2mm]{\contour{white}{goat}}}]
[$1$,edge label={node[lbl,xshift=2mm]{\contour{white}{cabbage}}}]
]
]
]
\draw[con] (L1.20) -- (R1.160) node[midway,above,lbl]{\contour{white}{other-bank}};
\draw[con] (R1.-160) -- (L1.-20) node[midway,below,lbl]{\contour{white}{other-bank}};
\node[right=2.5cm of S1,lbl] (wcg){wcg};
\draw[con] (S1) -- (wcg) node[pos=0.3,above,lbl]{\contour{white}{name}};
\end{forest}
\end{document}
forest
基于tikz
,因此连接两个节点的一个非常方便的方法是给它们命名,或alias
,然后通过一个简单的\draw
命令连接它们:\draw[con] (S1) -- (wcg) node[pos=0.3,above,lbl]{name};
。这里,con
是一个简单的尝试,以复制屏幕截图中的箭头。(编辑:使节点更加时髦,同时也contour
使边缘标签更具可读性。)