在树中的节点之间添加线

在树中的节点之间添加线

在我的工作中,我需要在 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使边缘标签更具可读性。)

相关内容