我想在两个节点之间绘制几个顶点。假设在下面的代码中我想绘制
- 树的起点和其子节点 O 之间有 3 个顶点,
- 第一个 R 和其子 T 之间有四个。
这是一张丑陋的图片,显示了想要的输出。我画这么一棵奇怪的树只是为了教学目的。
似乎forest
无法做到这一点。那么如何使用tikz
的功能来实现这一点呢?
\documentclass{article}
\usepackage{forest}
\useforestlibrary{linguistics}
\begin{document}
\pagestyle{empty}
\begin{forest}
for tree = {
sn edges,
grow'=0,
l=2.5cm,
s sep=0.2cm,
anchor=west,
child anchor=west}
[
[O
[R
[T]
]
[T
[R]
]
]
[R
[O
[T]
]
[T
[O]
]
]
[T
[O
[R]
]
[R
[O]
]
]
]
\end{forest}
\end{document}
答案1
从一个节点到其子节点的路径edge path
可以是简单或复杂的,只要你喜欢。只要你能画出来,你就可以使用它:曲线、直线,等等。
请注意,据我所知,这些不是任何类型的“顶点”。如果是的话,那么用法就非常技术性,任何不熟悉相关学科语言的人都会误解。
如果connections
设置的大于1
,则该图涉及从单个顶点绘制多条线,但仍然只有一个点是这些线在父节点的相交点.parent anchor
。如果它们没有在那里相交,那么根本就没有顶点。
\documentclass[border=10pt,multi,tikz]{standalone}
\usepackage{forest}
\useforestlibrary{linguistics}
\forestset{%
declare count={connections}{1},
}
\begin{document}
\begin{forest}
for tree={%
sn edges,
grow'=0,
l=2.5cm,
s sep=0.2cm,
anchor=parent,
},
before typesetting nodes={%
where connections=1{}{%
if={isodd(connections())}{%
edge path'={%
foreach \i [count=\j from 0, evaluate=\noexpand\j as \noexpand\k using \noexpand { (\j==0) ? 0pt :((isodd(\j)) ? (\j*2.5pt) : ((-\j+1)*2.5pt)) }
]
in {1,...,\foresteoption{connections}} { (!u.parent anchor) -- ([yshift=\noexpand\k].child anchor) }
},
}{%
edge path'={%
foreach \i [count=\j, evaluate=\noexpand\j as \noexpand\k using \noexpand { (isodd(\j)) ? (\j*2.5pt) : ((-\j+1)*2.5pt) }
]
in {1,...,\foresteoption{connections}} { (!u.parent anchor) -- ([yshift=\noexpand\k].child anchor) }
},
},
},
},
[
[O, connections=3
[R
[T]
]
[T
[R]
]
]
[R
[O
[T]
]
[T, connections=4
[O]
]
]
[T
[O
[R]
]
[R
[O]
]
]
]
\end{forest}
\end{document}