使用 TikZ,如何让箭头自动延伸以容纳其上方和下方的文本? 这是我的代码:
\documentclass{article}
\usepackage{amsmath}
\usepackage[edges]{forest}
\begin{document}
\begin{forest}
for tree={forked edge, anchor=west}
[a, for tree={grow'=east}
[b]
[c]
[d, name=out1
[, name=in1, l sep=6pt, inner sep=-0.6pt
[x, fork sep=0pt]
[y, fork sep=0pt]
[z, fork sep=0pt]
]
]
[e]
]
\draw [->] (out1) -- (in1) node[midway, above] {now} node [midway, below]{united};
\end{forest}
\end{document}
答案1
如果要自动将箭头拉伸到其上方和下方标签文本的大小,则不能先绘制树,然后再绘制箭头,因为在绘制箭头时,子树已经绘制好了。相反,您需要以某种方式告诉 Ti钾Z 在箭头指向的子树被画出来之前,箭头应该有多长。
您可以使用以下自定义样式来实现此目的connect
,该样式有三个参数:绘制箭头的节点的名称、箭头上方标签的文本以及箭头下方标签的文本。该样式计算箭头上方和下方标签中的文本长度(以最长者为基准),添加一些填充(您可能需要更改它,它恰好20pt
适合此示例),并自动将l
相关子节点的选项设置为计算的长度。然后绘制箭头和标签。
\documentclass{article}
\usepackage{amsmath}
\usepackage[edges]{forest}
\forestset{
connect/.style n args={3}{
l={((max(width("#2"), width("#3"))+20)*1pt},
append after command={
\pgfextra{
\draw[->] (#1) -- (\tikzlastnode)
node[midway, above] {#2}
node[midway, below] {#3};
}
}
}
}
\begin{document}
\begin{forest}
for tree={forked edge, anchor=west}
[a, for tree={grow'=east}
[b]
[c]
[d, name=out1
[, name=in1, l sep=6pt, inner sep=-0.6pt, connect={out1}{now}{united}
[x, fork sep=0pt]
[y, fork sep=0pt]
[z, fork sep=0pt]
]
]
[e]
]
\end{forest}
\begin{forest}
for tree={forked edge, anchor=west}
[a, for tree={grow'=east}
[b]
[c]
[d, name=out1
[, name=in1, l sep=6pt, inner sep=-0.6pt, connect={out1}{now}{united in harmony}
[x, fork sep=0pt]
[y, fork sep=0pt]
[z, fork sep=0pt]
]
]
[e]
]
\end{forest}
\end{document}
答案2
因为您是在绘制箭头并在绘制完树木后添加箭头,所以 tikz 无法自动知道需要扩大距离才能容纳您的文本。假设您想让箭头保持在森林环境之外,您必须自己设置距离。
您想使用l
参数来设置级别之间的距离:
\documentclass[tikz]{standalone}
\usepackage[edges]{forest}
\begin{document}
\begin{forest}
for tree={forked edge, anchor=west}
[a, for tree={grow'=east}
[b]
[c]
[d, name=out1
[, name=in1, l=1in, inner sep=-0.6pt
[x, fork sep=0pt]
[y, fork sep=0pt]
[z, fork sep=0pt]
]
]
[e]
]
\draw [->] (out1) -- (in1) node[midway, above] {now} node [midway, below]{united};
\end{forest}
\end{document}
参见图 22https://texdoc.org/serve/forest/0以获得类似的例子和更多的解释。