我想使用 beamer 的\only
里面森林树木。想象一下这样的 MWE:
\documentclass{beamer}
\usepackage{forest}
\begin{document}
\frame{\frametitle{test}
\only<1>{
\Forest{
[,phantom
[S [NP [N [I]]]]
[S [V [wrote]]]]
}}
\only<2>{
\Forest{
[S
[NP [N [I]]]
[V [wrote]]]
}}
}
\end{document}
其结果为两个覆盖:
相反,我想嵌入\only
如下\Forest
代码来做同样的事情:
\Forest{
[,phantom
[S,only=<1> [NP [N [I]]]]
[S,only=<1> [V [wrote]]]
[S,only=<2>
[NP [N [I]]]
[V [wrote]]]]
}
是否可以?
答案1
我不确定这是否是明智的做法:是一棵树还是两棵树?如果你要用一棵树替换另一棵树,我会使用两棵树;如果不是,我会尝试保持一棵树的公共部分是公共的。
尽管如此,用你想要的语法实现一种风格还是相当简单的。因此,作为一个假设的练习,我不建议在现实世界中应用,这里有一种方法可以做到这一点。
\documentclass{beamer}
\usepackage{forest}
\forestset{%
only/.code args={<#1>}{%
\alt<#1>{}{\pgfkeysalso{before typesetting nodes={remove}}}
},
}
\begin{document}
\begin{frame}{Another test}
\Forest{
[,phantom
[S,only=<1> [NP [N [I]]]]
[S,only=<1> [V [wrote]]]
[S,only=<2>
[NP [N [I]]]
[V [wrote]]]]
}
\end{frame}
\end{document}
编辑
这里有另一种选择,我认为它允许您以更清晰的方式指定树。
\begin{frame}<1-2>{Yet Another test}
\Forest{
[S, adopt grandchildren=<2>
[S [NP [N [I]]]]
[S [V [wrote]]]
]
}
\end{frame}
adopt grandchildren
,如这里所述,收养所有孙辈,消灭所有子女(在深夜)并切换到phantom
收养之前。
这是否正是您想要的还值得怀疑,但我认为,允许代码反映树的结构的方法是更好的选择,即使需要花更多的心思来为您的工作流程精确地设计正确的工具。
\documentclass{beamer}
\usepackage{forest}
\forestset{%
alt/.code args={<#1>#2#3}{%
\alt<#1>{\pgfkeysalso{#2}}{\pgfkeysalso{#3}} % \pgfkeysalso doesn't change the path
},
define long step={grandchildren}{style}{branch={children,children}},
adopt grandchildren/.style args={<#1>}{
alt=<#1>{
before typesetting nodes={
tempkeylista=,
for grandchildren={tempkeylista+/.option=name},
split register={tempkeylista}{,}{append},
for children=remove,
},
}{phantom}
},
}
\begin{document}
\begin{frame}<1-2>{Yet Another test}
\Forest{
[S, adopt grandchildren=<2>
[S [NP [N [I]]]]
[S [V [wrote]]]
]
}
\end{frame}
\end{document}