我正在尝试在 beamer 文档中自下而上地构建一棵树,即从最深嵌入的叶子开始在屏幕上绘制它。我在这个页面和其他地方找到了很多关于如何让树从根部展开的问答和讨论,但我试图做的是相反的,据我所知,许多提出的方法在这种情况下不起作用 - 例如,我似乎无法在标准树中显示子节点时隐藏父节点tikz
。
理想情况下,该方法将使用完整树的大小来计算整个位置,这样图像就不会在幻灯片之间晃动。我之所以使用它,qtree
是因为这是我从小就用到的方法,但我非常乐意接受使用其他具有不同语法的软件包的解决方案。
我想到的是以下几点:
绘制整棵树(内部
qtree
或外部),稍后只显示靠近根的节点和叶子。缺点:树的未标记骨架始终可见。复制粘贴不同大小的树块,并使用套印将它们显示在同一帧的连续幻灯片上。缺点:绘制较小的子树时,无法访问最大完整树的大小,因此需要额外的步骤将较小的树推到右侧和底部,以使它们彼此接近(下面的快照实际上并不完全在那里)。
因此,我正在寻找的是(1)的变体,它使较高的边缘与被抑制的节点一起不可见,或者是(2)的变体,它自动提取最大树的维度并将它们用作较小树的绝对位置的输入,无论哪种方式都行。
以下是两种方法的一些工作代码:
\documentclass[presentation]{beamer}
\usepackage{qtree, tikz}
\usepackage[english]{babel}
\begin{document}
\begin{frame}{\texttt{qtree}}
\Tree
[.\visible<6>{root}
\visible<6>{\alert<6>{leaf 1}}
[.\visible<5->{level1node}
\visible<5->{\alert<5>{leaf 2}}
[.\visible<4->{level2node}
\visible<4->{\alert<4>{leaf 3}}
[.\visible<3->{level3node}
\visible<3->{\alert<3>{leaf 4}}
[.\visible<2->{level4node}
\visible<2->{\alert<2>{leaf 5}}
[.{level5node}
\alert<1>{leaf 6}
{leaf 7}
]
]
]
]
]
]
\end{frame}
\begin{frame}{overprint version}
This is my tree:
\vskip0pt plus 1filll
\begin{flushright}
\begin{overprint}
\onslide<6>
\Tree
[.{root}
{\alert<6>{leaf 1}}
[.{level1node}
{\alert<5>{leaf 2}}
[.{level2node}
{\alert<4>{leaf 3}}
[.{level3node}
{\alert<3>{leaf 4}}
[.{level4node}
{\alert<2>{leaf 5}}
[.{level5node}
\alert<1>{leaf 6}
{leaf 7}
]
]
]
]
]
]
\onslide<5>
\Tree
[.{level1node}
{\alert<5>{leaf 2}}
[.{level2node}
{\alert<4>{leaf 3}}
[.{level3node}
{\alert<3>{leaf 4}}
[.{level4node}
{\alert<2>{leaf 5}}
[.{level5node}
\alert<1>{leaf 6}
{leaf 7}
]
]
]
]
]
\onslide<4>
\Tree
[.{level2node}
{\alert<4>{leaf 3}}
[.{level3node}
{\alert<3>{leaf 4}}
[.{level4node}
{\alert<2>{leaf 5}}
[.{level5node}
\alert<1>{leaf 6}
{leaf 7}
]
]
]
]
\onslide<3>
\Tree
[.{level3node}
{\alert<3>{leaf 4}}
[.{level4node}
{\alert<2>{leaf 5}}
[.{level5node}
\alert<1>{leaf 6}
{leaf 7}
]
]
]
\onslide<2>
\Tree
[.{level4node}
{\alert<2>{leaf 5}}
[.{level5node}
\alert<1>{leaf 6}
{leaf 7}
]
]
\onslide<1>
\Tree
[.{level5node}
\alert<1>{leaf 6}
{leaf 7}
]
\end{overprint}
\end{flushright}
\end{frame}
\end{document}
编辑:
根据 Lay 的回答,我设法创建了以下接近的分支 tikz 树,但我仍然不太满意:连接当前显示的子树与树的其余部分的边缘显示得太早 - 我得到了一个指向尚不存在的树的其余部分的有趣尾巴。如果我调整 -change 的位置tikzstyle
,边缘绘制得太晚了:
\begin{frame}
\begin{tikzpicture}
\tikzstyle{lvl0}=[transparent]
\tikzstyle{lvl1}=[transparent]
\tikzstyle{lvl2}=[transparent]
\tikzstyle{lvl3}=[transparent]
\tikzstyle{lvl4}=[transparent]
\tikzstyle{lvl5}=[opaque]
\only<2->{\tikzstyle{lvl4}=[opaque]}
\only<3->{\tikzstyle{lvl3}=[opaque]}
\only<4->{\tikzstyle{lvl2}=[opaque]}
\only<5->{\tikzstyle{lvl1}=[opaque]}
\only<6->{\tikzstyle{lvl0}=[opaque]}
\node [lvl0] {root}
child [lvl0] { node {leaf 1} }
child [lvl1] { node {lvl1}
child { node [lvl1] {leaf 2} }
child [lvl2]{ node {lvl2}
child { node [lvl2] {leaf 3} }
child [lvl3] { node {lvl3}
child { node [lvl3] {leaf 4} }
child { [lvl4] node {lvl4}
child { node [lvl4] {leaf 5} }
child { [lvl5] node {lvl5}
child { node [lvl5] {leaf 6} }
child { node [lvl5] {leaf 7} }
}
}
}
}
};
\end{tikzpicture}
\end{frame}
答案1
来自(哪里使用投影机叠加森林生成的树木利用各种for …
密钥,人们可以只用一个密钥来实现输出dont show before
,然后beamer
为其他叶子设置适当的替代方案。
这个例子相当短(只有一个兄弟,只有一个大分支),所以您可以调整设置以适应您的用例。
(也许我应该使用而不是设置的奇怪for first
选项,但路线使得可以爬上去,同时突出显示来自其他分支的新叶子。增加第一张幻灯片使用的每个值只会显示然后开始爬上去。)dont show before=0
alert on=1
leaf 6
dont show before
dont show before
leaf 7
代码
\documentclass[presentation]{beamer}
\setbeamertemplate{navigation symbols}{}%Remove navigation bar
\usepackage{forest}
\tikzset{
invisible/.style={opacity=0,text opacity=0},
visible on/.style={alt=#1{}{invisible}},
alt/.code args={<#1>#2#3}{\alt<#1>{\pgfkeysalso{#2}}{\pgfkeysalso{#3}}}}
\forestset{
alert on/.style={
/tikz/alt=<#1>{node options={/tikz/text=alert}}{}},
dont show before/.style={
% for first={alert on=#1},
for ancestors'={
/tikz/visible on={<#1->},
edge={/tikz/visible on={<#1->}}},
for all previous={
for tree={
alert on=\number\numexpr#1+1\relax,
/tikz/visible on={<\number\numexpr#1+1\relax->},
edge={/tikz/visible on={<\number\numexpr#1+1\relax->}}
}},
for children={edge={/tikz/visible on={<#1->}}}}}
\begin{document}
\begin{frame}{\texttt{forest}}
\begin{forest}
[root,dont show before=6
[leaf 1]
[level1node,dont show before=5
[leaf 2]
[level2node,dont show before=4
[leaf 3]
[level3node,dont show before=3
[leaf 4]
[level4node,dont show before=2
[leaf 5]
[level5node,dont show before=1
[leaf 6]
[leaf 7,dont show before=0]
]
]
]
]
]
]
\end{forest}
\end{frame}
\end{document}
输出
答案2
这是一个快速而粗略的答案。我假设一定有更聪明的方法,但我喜欢tikzstyles
在\only<>
命令中定义。
\begin{tikzpicture}
\tikzstyle{lvl0}=[transparent]
\tikzstyle{lvl1}=[transparent]
\tikzstyle{lvl2}=[transparent]
\tikzstyle{lvl3}=[transparent]
\tikzstyle{lvl4}=[transparent]
\tikzstyle{lvl5}=[opaque]
\only<2->{\tikzstyle{lvl4}=[opaque]}
\only<3->{\tikzstyle{lvl3}=[opaque]}
\only<4->{\tikzstyle{lvl2}=[opaque]}
\only<5->{\tikzstyle{lvl1}=[opaque]}
\only<6->{\tikzstyle{lvl0}=[opaque]}
\node [lvl0] {root}
child [lvl0] {
node [lvl1] {child1}
child [lvl1]{
node [lvl2] {child2}
child [lvl2] {
node [lvl3] {child3}
child [lvl3] {
node [lvl4] {child4}
child [lvl4] {
node [lvl5] {child5}
}
}
}
}
};
\end{tikzpicture}
我不知道 qtree 包,但我认为一定有一种方法可以适应我的示例。
与 JakobMST 编辑的代码相匹配的代码:
\begin{frame}
\begin{tikzpicture}
\tikzstyle{lvl0}=[transparent]
\tikzstyle{lvl1}=[transparent]
\tikzstyle{lvl2}=[transparent]
\tikzstyle{lvl3}=[transparent]
\tikzstyle{lvl4}=[transparent]
\tikzstyle{lvl5}=[transparent]
\tikzstyle{lvl6}=[opaque]
\only<2->{\tikzstyle{lvl5}=[opaque]}
\only<3->{\tikzstyle{lvl4}=[opaque]}
\only<4->{\tikzstyle{lvl3}=[opaque]}
\only<5->{\tikzstyle{lvl2}=[opaque]}
\only<6->{\tikzstyle{lvl1}=[opaque]}
\only<7->{\tikzstyle{lvl0}=[opaque]}
\node [lvl0] {root}
child [lvl0] {
node [lvl1] {leaf 1}
}
child [lvl0] {
node {}
child [lvl1] {
node [lvl2] {leaf 2}
}
child [lvl1] {
node {}
child [lvl2] {
node [lvl3] {leaf 3}
}
child [lvl2] {
node {}
child [lvl3] {
node [lvl4] {leaf 4}
}
child [lvl3] {
node {}
child [lvl4] {
node [lvl5] {leaf 5}
}
child [lvl4] {
node {}
child [lvl5] { node [lvl6] {leaf 6} }
child [lvl5] { node [lvl6] {leaf 7} }
}
}
}
}
};
\end{tikzpicture}
\end{frame}