![包含两部分的森林节点](https://linux22.com/image/424275/%E5%8C%85%E5%90%AB%E4%B8%A4%E9%83%A8%E5%88%86%E7%9A%84%E6%A3%AE%E6%9E%97%E8%8A%82%E7%82%B9.png)
我正在尝试在基于森林 TikZ 的包中创建以下内容:
方形节点需要两件我不知道如何在森林中做的事情:
- 从视觉上将节点分为两部分,左、右
- 让箭头从其中一个部分的中间出来,指向一个子部分(永远只有一个子部分)
如果有一种方法可以简单地将一个节点放置在另一个节点相邻的位置,这将是一个可能的解决方案。
以下是我目前所掌握的信息:
\begin{forest}
[,draw,circle
[$\lnot B \rvert .$,draw,edge=->
[,draw,circle,edge=->]
]
[$. \rvert C$,draw,edge=->
[,draw,circle,edge=->]
]
[$. \rvert \top$,draw,edge=->
[,draw,circle,edge=->]
]
]
\end{forest}
产生这个:
显然,分割矩形节点的垂直线不够高,最重要的是,从矩形节点出来的箭头不是来自底部中心,而是来自节点的左半部分或右半部分。
答案1
这是一个实现此目的的非常基本的版本。我将其保持为基本版本,但您可以通过使用继承样式的森林键来简化操作。基本内容如下:
- 使用多部分节点进行分割方案;
- 使用
append after command
以便添加项目符号; - 添加
special edge
访问这些项目符号的样式。
实际上,您需要使用s2l
或s2r
,具体取决于文本分别位于左侧单元格还是右侧单元格,并且需要\nodepart{two}
在内容的末尾或开头添加。然后,您需要指定边缘应该从哪个单元格开始special edge=one
或special edge=two
。
\documentclass{article}
\usepackage{amsmath}
\usepackage[edges]{forest}
\usetikzlibrary{shapes.multipart}
\tikzset{s2/.style={rectangle split,rectangle split horizontal,
rectangle split parts=2,draw},
sd/.style={append after command={%
(\tikzlastnode.#1 south|-\tikzlastnode.center)
coordinate[circle,inner sep=1pt,fill,alias=\tikzlastnode-cheat]}},
s2l/.style={s2,sd=two},
s2r/.style={s2,sd=one},
c/.style={circle,draw,fill=gray,minimum size=1em}}
\forestset{special edge/.style={edge path'/.expanded={
(!u.#1 south|-!u.center) -- (.child anchor)
},edge=-stealth}}
\begin{document}
\begin{forest}
[,c
[$\lnot B$\nodepart{two},s2l,
[,c,special edge=two]
]
[\nodepart{two}$C$,s2r
[,c,special edge=one]
]
[\nodepart{two}$\top$,s2r
[,c,special edge=one]
]
]
\end{forest}
\end{document}