如何使用森林包将树结构的分支返回/重新调整/重新统一到原始父系?

如何使用森林包将树结构的分支返回/重新调整/重新统一到原始父系?

我正在使用词源树进行绘制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您可以在代码中看到的样式。

关于主要的重新对齐问题,一种方法是覆盖sForest 的打包算法计算的值。 (s是节点相对于其父节点的位置,在垂直于树生长的维度上;请参阅手册第 3.7.2 节。)在示例中,拉丁语是一个(正式)子节点,因此 Forest 将其设置为。但拉丁语的父节点原始斯拉夫语相对于 SCBs=0有自己的(负) 。因此,如果我们将拉丁语的设置为 PS 的负数,我们将有效地使其与 SCB 对齐。这是通过实现的。ssss=-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}

编译结果

相关内容