我正在尝试制作闪米特语树。在此过程中,我想将第 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}
请注意,如果你尝试对齐的节点有以下兄弟节点,则你将有移动它们以避免重叠。