我想用forest
投影机展示一棵树,但一部分接一部分,从从底部,然后攀升至顶部。
因此让我们考虑如下简单的树:
\documentclass{beamer}
\usepackage{forest}
\begin{document}
\begin{frame}
\begin{forest}
[VP, calign=last
[{[ajout]}\\\textit{rapidement},
align=center,
base=top]
[VP, calign=first
[VP, calign=first
[V\\\textit{mange}, align=center,base=top]
[{[compl]}\\\textit{une orange}, align=center,base=top]
]
[{[ajout]}\\\textit{dans la cuisine}, align=center,base=top]
]
]
\end{forest}
\end{frame}
\end{document}
我想先展示树的底部(基本上就是“T”下面有“mange”)。然后是上面的分支(VP 右边有子节点),然后是上面的级别,依此类推,直到树的顶部(我希望我说得清楚)。
基于这次讨论,我知道如何反过来做(从上到下)。但我该怎么做才能像我描述的那样实现它呢?
答案1
您可以使用visible on
Qrrbrbirlbel 定义的样式但是,不要使用它,而是for tree
这样做for ancestors'
。for ancestors'
样式应用于实际节点和父节点,因此visible on=<1->
意味着此节点和父节点以及它们之间的边将从幻灯片 1 开始可见,但应用于visible on=<2->
父节点时它们直到幻灯片 2 才可见。
节点和父节点之间的边也是可见的,但我不知道如何在样式定义中更改幻灯片值。我能提供的解决方案是仅在显示祖先时显示边,方法是手动修复边的可见性
[{[ajout]}\\\textit{dans la cuisine}, align=center, visible on=<2->,edge={/tikz/visible on=<3->}]
以下是完整的代码
\documentclass{beamer}
\usepackage{forest}
\setbeamertemplate{navigation symbols}{} %Remove navigation bar
\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}} % \pgfkeysalso doesn't change the path
},
}
\forestset{
visible on/.style={
for ancestors'={
/tikz/visible on={#1},
edge={/tikz/visible on={#1}}}}}
\begin{document}
\begin{frame}[plain]{Same with forest}
\begin{forest}
[VP, calign=last, visible on=<4->
[{[ajout]}\\\textit{rapidement},
align=center,
base=top, visible on=<3->, ]
[VP, calign=first, visible on=<3->,
[VP, calign=first, visible on=<2->,
[V\\\textit{mange}, align=center,base=top, visible on=<1->, ]
[{[compl]}\\\textit{une orange}, align=center,base=top, visible on=<1->, ]
]
[{[ajout]}\\\textit{dans la cuisine}, align=center, visible on=<2->,]
]
]
\end{forest}
\end{frame}
\end{document}
笔记:因为forest v2.0
,键for ancestors'
应该更改为for current and ancestors
。
答案2
以下是Ignasi 的回答它提供了一种show up tree
向上逐步显示树的样式。此样式还说明了一种在传递单个覆盖规范时使边与其父级一起显示而不是与其子级一起显示的方法,Ignasi 建议通过传递两个不同的覆盖规范来处理。
\documentclass{beamer}
\usepackage{forest}
\setbeamertemplate{navigation symbols}{} %Remove navigation bar
\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}} % \pgfkeysalso doesn't change the path
},
}
\forestset{
show up tree/.style={
before typesetting nodes={
tempcounta/.max={level}{tree},
tempcounta'+=1,
for tree={
/tikz/visible on/.process={ ROw2+nw {tempcounta}{level}{##1-##2}{<##1->} },
edge+/.process={ ROw2+nw {tempcounta}{level}{(##1-##2)+1} {/tikz/visible on={ {<##1->} } }},
}
}
}
}
\begin{document}
\begin{frame}[plain]{Same with forest}
\begin{forest}
show up tree
[VP, calign=last,
[{[ajout]}\\\textit{rapidement},
align=center,
base=top, ]
[VP, calign=first,
[VP, calign=first,
[V\\\textit{mange}, align=center,base=top, ]
[{[compl]}\\\textit{une orange}, align=center,base=top, ]
]
[{[ajout]}\\\textit{dans la cuisine}, align=center, ]
]
]
\end{forest}
\end{frame}
\end{document}