我正在尝试在 TikZ 中绘制一棵树,如下图所示。一切都如我所愿,只是我无法弄清楚如何让 LaTeX 在下面的树/图形语法中在边上绘制两个不同的标签:我希望从根顶点出发v1
并结束于 的上边v2
标记为$x$
,下边结束于v3
。$y$
但是,按照我在下面的代码中放置标签的方式放置标签会使两条边都标记为$x$
和$y$
。我尝试将标签放在其他地方(例如,就在子节点v2
和前面v3
),但这会引发错误:LaTeX 似乎不知道[" "]
节点前面是什么意思,需要标记命令位于箭头 之后->
。我也尝试在指定图形后添加标签,但 LaTeX 不记得它们vi
指的是什么。
我阅读了大量 pgf 文档,但没有找到任何关于如何正确组合库引用和图形、图形绘制和树布局的线索。我想我可以拆分我的代码以(v1) -> (v2), (v1) -> (v3), ...
单独指定所有父/子关系,而不是使用嵌套形式(v1) -> {(v2),(v3)}
,然后单独标记边。但这会完全破坏语法的紧凑性——不好,因为这只是一个小的 MWE,最终我想绘制一个更大的树,所有边都以某种方式标记。
问题 1:有没有简单的方法可以做到这一点?如何/在哪里可以按原样将标签放入代码中?
问题 2:为了实现更大的目的,我可以在指定图形结构之前添加几行代码,例如for all children j of node i, label the edge (i,j) by $x_ij$
?如果可以,怎么做?
以下是 MWE:
\documentclass[tikz]{standalone}
\usetikzlibrary{graphs,graphdrawing,quotes}
\usegdlibrary{trees}
\begin{document}
\begin{tikzpicture}[tree layout,
grow'=right,
sibling distance=5mm]
\foreach \i in {1,...,5}
\node (v\i) [draw, circle, inner sep=0pt] {$v_{\i}$};
\foreach \j in {1,...,6}
\node (l\j) [draw, circle, inner sep=2pt] {};
\graph{
(v1) -> ["$x$","$y$"'] {(v2) -> {(v4) -> {(l1),(l2)},
(v5) -> {(l3),(l4)}},
(v3) -> {(l5),(l6)}}
};
\end{tikzpicture}
\end{document}
答案1
以下是可能的解决方案:
\documentclass[tikz]{standalone}
\usetikzlibrary{graphs,graphdrawing,quotes}
\usegdlibrary{trees}
\begin{document}
\begin{tikzpicture}[tree layout,
grow'=right,
sibling distance=5mm]
\foreach \i in {1,...,5}
\node (v\i) [draw, circle, inner sep=0pt] {$v_{\i}$};
\foreach \j in {1,...,6}
\node (l\j) [draw, circle, inner sep=2pt] {};
\graph{
(v1) -> ["$x$"] {(v2) -> {(v4) -> {(l1),(l2)},
(v5) -> {(l3),(l4)}}},
(v1) -> ["$y$"'] {(v3) -> {(l5),(l6)}}
};
\end{tikzpicture}
\end{document}
答案2
可以通过以下方式实现:
- 转向
[tree layout, ...]
传递给命令的选项\graph
,而不是将它们作为选项传递给环境tikzpicture
。 - 使用语法应用所需的边缘标签
>
。使用'
将标签移至边缘下方。边缘标签(例如)x
也可以写为>"$x$",>pos=0.5,>inner sep=0pt
将标签、定位和从边缘分离到此特定边缘标签。
\documentclass[tikz,border=3pt]{standalone}
\usetikzlibrary{graphs,graphdrawing,quotes}
\usegdlibrary{trees}
\tikzset{%
every node/.style={draw, circle, inner sep=0pt},
node_a/.style={minimum size=1.5mm},
every edge quotes/.append style={draw=none,inner sep=0pt}
}
\begin{document}
\begin{tikzpicture}
\graph[tree layout,
grow'=right,
sibling distance=5mm]{%
v1 [as={$v_1$}] -> v2 [as={$v_2$},>"$x$"]; % use > to apply the label to the edge
v1 -> v3 [as={$v_3$},>"$y$"']; % use > to apply the label to the edge and ' to shift below
v2 -> v4 [as={$v_4$}];
v2 -> v5 [as={$v_5$}];
v3 -> v6 [as={},node_a];
v3 -> v7 [as={},node_a];
v4 -> v8 [as={},node_a];
v4 -> v9 [as={},node_a];
};
\end{tikzpicture}
\end{document}