我正在使用词源树进行绘制forest
,我想知道是否可以以某种方式将分叉的树枝与主“线”重新组合在一起。
本质上,问题也可能是:一个子节点可以有两个父节点吗?如果不能,那么我很乐意\draw
,但最好将其对称对齐(见附图)。我正在使用LuaLaTeX
。
这是我目前的代码:
\documentclass[11pt]{article}
\usepackage[a4paper, margin=3cm]{geometry}
\usepackage[edges, linguistics]{forest}
\begin{document}
\begin{forest}
for tree={align=center,calign=center}
[paprika\\{English},tier=a,baseline
[paprika\\{Hungarian},tier=b
[paprika\\{Serbian-Croatian-Bosnian},tier=c
[*pĭpĭrĭ\\{Proto-Slavic},tier=d
[piper\\{Latin},tier=e
[péperi\\{Ancient Greek},name=AG,tier=f
[?\\{Pahlavi},tier=g
[pipparī\\{Middle Indo-Aryan},tier=h
[pippalī\\{Sanskrit},tier=i]]]]]]
[piperi\\{Modern Greek},name=MG]]]]
\draw[-] (AG.north) to (MG.south);
\end{forest}
\end{document}
答案1
恐怕节点只能有一个正式父节点。\draw
原则上是这样。但是,由于我经常需要自己伪造一个额外的父节点(或子节点),所以我编写了edge to/from
您可以在代码中看到的样式。
关于主要的重新对齐问题,一种方法是覆盖s
Forest 的打包算法计算的值。 (s
是节点相对于其父节点的位置,在垂直于树生长的维度上;请参阅手册第 3.7.2 节。)在示例中,拉丁语是一个(正式)子节点,因此 Forest 将其设置为。但拉丁语的父节点原始斯拉夫语相对于 SCBs=0
有自己的(负) 。因此,如果我们将拉丁语的设置为 PS 的负数,我们将有效地使其与 SCB 对齐。这是通过实现的。s
s
s
s=-s("!u")
我们必须在恰当的时间执行此分配:在 Forest 计算出值之后s
(即“打包”之后),但在将 ls 坐标转换为 xy 坐标之前(请参阅手册第 3.4.1 节关于阶段的内容)。因此我们得出before computing xy={s=-s("!u")
。
\documentclass[11pt]{article}
\usepackage[a4paper, margin=3cm]{geometry}
\usepackage[edges, linguistics]{forest}
% Easy extra edges
\forestset{
% From an "extra parent" to the node:
edge to'/.style 2 args={% #1 = the extra parent, #2 = the edge style
tikz+={\path[#2](#1.parent anchor)--(.child anchor);}
},
% From an "extra parent" to the node
% using the current edge style:
% (If the )
edge to/.style={% #1 = the extra parent
edge to'/.expanded={\unexpanded{#1}}{\forestoption{edge}},
},
% From the node to an "extra child":
edge from'/.style 2 args={% #1 = the extra child, #2 = the edge style
tikz+={\path[#2](.parent anchor)--(#1.child anchor);}
},
% From the node to an "extra child"
% using the current edge style (of the extra child):
edge from/.style={% #1 = the extra child
edge from'/.process=_O{#1}{#1.edge},
},
}
% The "extra parent/child" may be given as a relative node name.
% So in the example below, we could replace
% "edge to=MG" with "edge to=!uus" (uus=up,up,sibling).
\begin{document}
\begin{forest}
for tree={align=center,calign=center}
[paprika\\{English},tier=a,baseline
[paprika\\{Hungarian},tier=b
[paprika\\{Serbian-Croatian-Bosnian},tier=c
[*pĭpĭrĭ\\{Proto-Slavic},tier=d
[piper\\{Latin},tier=e, before computing xy={s=-s("!u")},
[péperi\\{Ancient Greek},name=AG,tier=f, edge to=MG,
[?\\{Pahlavi},tier=g
[pipparī\\{Middle Indo-Aryan},tier=h
[pippalī\\{Sanskrit},tier=i]]]]]]
[piperi\\{Modern Greek},name=MG]]]]
\end{forest}
\end{document}