我正在尝试使用visible on
Qrrbrbirlbel 定义的样式使用自动增量覆盖<-+>
。但是,当我这样做时,节点和边分别增加。我把责任归咎于线条
/tikz/visible on={#1},
edge={/tikz/visible on={#1}}
将传递的范围分别应用于边缘和节点。但是,我不知道如何同时向它们发送相同的自动增量。另一种方法可能是减少计数器,但我对 beamer 覆盖不熟悉,不知道要调整哪些部分。
我怎样才能实现这样的努力?
我拿了此代码展示我描述的行为。我试图让树一次出现一个节点(及其对应的边)。
\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 children={
/tikz/visible on={#1},
edge={/tikz/visible on={#1}}}}}
\begin{document}
\begin{frame}[plain]{Same with forest}
\begin{forest}
[VP, calign=last, visible on=<+->
[{[ajout]}\\\textit{rapidement},
align=center,
base=top, visible on=<+->, ]
[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}
答案1
我不确定您到底想要实现什么,但我了解节点及其边缘同步出现背后的问题。正如 key 文档draw tree
(第 3.3.7 节)中所承诺的那样,首先绘制节点,然后绘制边缘,最后绘制额外的 tikz 代码。这种顺序背后的想法是边缘和 tikz 代码应该能够引用任何节点,但显然这会在使用 beamer 的增量叠加规范时产生问题<+->
。
beamerpauses
解决方案。这个想法是在开始绘制边缘之前重置计数器的值。现在,由于forest
那里没有提供钩子(嗯......一个想法:)我们必须发挥创造力。
我们将代码放在根节点
beamerpauses
内以保存计数器。(在这个特定情况下,在选项处理期间简单地保存它也行得通,但变体更强大,即使树被绘制多次,它也行得通)。node options
node options
我们将代码压缩到
beamerpauses
将要绘制的第一条边中,从而恢复计数器。一个细节很简单:由于根节点没有边,我们将计数器加一。另一个细节不会自动解决:森林不知道哪条边是第一个将被绘制,因此for first
是手动指定的。
这是代码,希望对您有所帮助。
\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 children={
/tikz/visible on={#1},
edge={/tikz/visible on={#1}}
% }
}
}
\begin{document}
\begin{frame}[plain]{Same with forest}
\begin{forest}
node options={/utils/exec={\xdef\mybeamerpauses{\thebeamerpauses}}},
for first={edge={/utils/exec={\setcounter{beamerpauses}{\numexpr1+\mybeamerpauses}}}},
[VP, calign=last, visible on=<+->
[{[ajout]}\\\textit{rapidement},
align=center,
base=top, visible on=<+->, ]
[VP, calign=first, visible on=<+->,
[VP, calign=first, visible on=<+->,
[V\\\textit{mange}, align=center,base=top, visible on=<+->, ]
[{[compl]}\\\textit{une orange}, align=center,base=top, visible on=<+->, ]
]
[{[ajout]}\\\textit{dans la cuisine}, align=center, visible on=<+->,]
]
]
\end{forest}
\end{frame}
\end{document}
实际上,由于给出 时没有区别visible on=<+->
,因此这里还有一个使用 的较短版本for tree
。
\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 children={
/tikz/visible on={#1},
edge={/tikz/visible on={#1}}
% }
}
}
\begin{document}
\begin{frame}[plain]{Same with forest}
\begin{forest}
node options={/utils/exec={\xdef\mybeamerpauses{\thebeamerpauses}}},
for first={edge={/utils/exec={\setcounter{beamerpauses}{\numexpr1+\mybeamerpauses}}}},
for tree={visible on=<+->},
[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}