将特定的 tikz 树节点垂直对齐到另一树级中的另一个特定节点

将特定的 tikz 树节点垂直对齐到另一树级中的另一个特定节点

我正在尝试制作闪米特语树。在此过程中,我想将第 2 级中的特定树节点与第 1 级中的特定树节点垂直对齐,如图所示。

在此处输入图片描述

该图是通过以下代码获得的。如您所见,间距目前是通过 手动输入的[right=5em],但我希望对齐是自动的。这可能吗?

\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[
    level 1/.style={sibling distance=6em},
    level 2/.style={sibling distance=8em},
        level 3/.style={sibling distance=6em},
    edge from parent fork down,
    align=center
    ]
    \node (topp) {semittiske språk}
        child {node {vestlig}
            child {node {nord-vestlig gruppe}
                child {node {ugarisk}}
                child {node {kanaanittisk/\\fønikisk}}
                child {node {hebraisk}}
                child {node {aramaisk}
                    child {node {vest-aramaisk}}
                    child {node {øst-aramaisk}}
                }
            }
            child {node[right=5em] {sør-vestlig gruppe}
                child {node {etiopisk}}
                child {node {arabisk}}
            }
        }
        child {node {eblaittisk (?)}
        }
        child {node {østlig (akkadisk)}
        };
\end{tikzpicture}
\end{document}

编辑:我的描述似乎太模糊了。我试图让“sør-vestlig gruppe”节点在空间上出现在“østlig (akkadisk)”节点下方(不沿 y 方向移动,只沿 x 方向移动),以便两个节点在垂直方向上对齐。目前,我必须手动移动此节点,使用[right="some distance"]手动操作使它们对齐;我希望对齐是自动的,而不是我尝试不同的手动调整来实现。我并不是想改变层次结构,它应该保持不变,即所有节点都应该具有与我的示例代码相同的连接。

答案1

这是一个替代forest解决方案。

在此处输入图片描述

\documentclass{article}
\usepackage{forest}
\useforestlibrary{edges}

\begin{document}

\begin{forest}
for tree={
    forked edge,
    l sep=10mm,
    fork sep=5mm,
    s sep=5mm
}
[semittiske språk
    [vestlig
        [nord-vestlig gruppe
            [ugarisk]
            [kanaanittisk/\\fønikisk, align=center]
            [hebraisk]
            [aramaisk
                [vest-aramaisk]
                [øst-aramaisk]
            ]
        ]
        [sør-vestlig gruppe, before computing xy={s=s("!uu3")-s("!uu1")}
            [etiopisk]
            [arabisk]
        ]
    ]
    [eblaittisk (?), before drawing tree={x=x("!u")}]
    [østlig (akkadisk)]
]
\end{forest}

\end{document}

答案2

编辑:
编辑问题后,问题更加清晰。似乎您针对以下内容进行了编辑:

在此处输入图片描述

\documentclass{article}
\usepackage[edges]{forest}

\begin{document}
    \begin{forest}
for tree = {align = center,
    forked edge,            % for forked edge
            s sep = 0mm,    % sibling distance
            l sep = 7mm,    % level distance
         fork sep = 4mm,    % distance from parent to branching point
            }
%
[semittiske språk
    [vestlig
        [nord-vestlig gruppe, fit=band
            [ugarisk]
            [kanaanittisk/\\fønikisk]
            [hebraisk]
            [aramaisk
                    [vest-aramaisk]
                    [øst-aramaisk]
            ]
        ]
        [\phantom{eblait},no edge] % <--- determined by trial
        [sør-vestlig gruppe,
            [etiopisk]
            [arabisk]
        ]
    ]
    [eblaittisk (?),before computing xy={s/.average={s}{siblings}}]
    [østlig\\ (akkadisk)]
]
\end{forest}
\end{document}

然而,在我看来,更有吸引力且更节省空间的是下面的树:

\documentclass{article}
\usepackage[edges]{forest}

\begin{document}
    \begin{forest}
for tree = {align = center,
    forked edge,            % for forked edge
            s sep = 2mm,    % sibling distance
            l sep = 8mm,    % level distance
         fork sep = 5mm,    % distance from parent to branching point
            }
%
[semittiske språk 
    [vestlig 
        [nord-vestlig gruppe, fit=band
            [ugarisk]
            [kanaanittisk/\\fønikisk]
            [hebraisk]
            [aramaisk
                    [vest-aramaisk]
                    [øst-aramaisk]
            ]
        ]
        [sør-vestlig gruppe
            [etiopisk]
            [arabisk]
        ]
    ]
    [eblaittisk (?),before computing xy={s/.average={s}{siblings}}]
    [østlig (akkadisk)]
]
\end{forest}
\end{document}

在此处输入图片描述

答案3

这是基于 Zarko 的原始代码。我之所以发布它,是因为我的方法通过移动树的其余部分来保持树的紧凑性。您是否想要这个取决于您的喜好、树的宽度和纸张或显示器的大小。

将树中最右边的节点与前面的子树对齐,向右移动以实现紧凑性

\documentclass[border=5pt]{standalone}
% addaswyd o ateb Zarko: https://tex.stackexchange.com/a/690062/ i gwestiwn Erik B: https://tex.stackexchange.com/q/690058/
\usepackage[edges]{forest}

\begin{document}
\begin{forest}
  for tree = {
    align=center,
    forked edge,            % for forked edge
  }
  [semittiske språk 
    [vestlig 
        [nord-vestlig gruppe
            [ugarisk]
            [kanaanittisk/\\fønikisk]
            [hebraisk]
            [aramaisk
                    [vest-aramaisk]
                    [øst-aramaisk]
            ]
        ]
        [sør-vestlig gruppe, 
        before drawing tree={
          tempdima/.option=x, 
          x/.option={!name=target}.x, 
          for preceding siblings={
            x+/.process={ORw2+d {{!name=target}.x}{tempdima}{#1-#2}},
          },
          delay={for current and siblings=compute xy}
        }
            [etiopisk]
            [arabisk]
        ]
    ]
    [eblaittisk (?), calign with current]
    [østlig (akkadisk), name=target]
  ]
\end{forest}
\end{document}

请注意,如果你尝试对齐的节点有以下兄弟节点,则你将移动它们以避免重叠。

相关内容