手册中有一些关于避免跳跃的内容,这里进行了解释避免投影机跳帧也一样。但我在树中的情况可能有所不同。有没有办法避免以下代码中两个图形之间的跳跃?
\documentclass{beamer}
\usepackage{forest}
% http://tex.stackexchange.com/questions/167690/presenting-a-forest-tree-from-bottom-to-top-in-beamer
% showing and hiding nodes and edges in 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}} % \pgfkeysalso doesn't change the path
},
}
\forestset{
visible on/.style={
for tree={
/tikz/visible on={#1},
edge={/tikz/visible on={#1}}}}}
\newcommand{\sliste}[1]{%
\mbox{%
$\left\langle\mbox{\upshape\scshape #1}\right\rangle$}%
}
% specification for all trees, "default preamble" appends to existing specification.
% The version with apostrophe replaces it.
\forestset{default preamble'={
for tree={align=center,parent anchor=south, child anchor=north,anchor=north,base=bottom},
before drawing tree={
sort by=y,
for min={tree}{baseline}
}
}}
\forestset{
declare dimen={child anchor yshift}{0pt},
adjust childrens child anchors/.style={
if n children>=2{
before packing={
tempdima/.max={max_y}{children},
for children={
child anchor yshift=tempdima()-max_y()
},
}
}{}
},
default preamble={
for tree={
edge path'={(!u.parent anchor)--([yshift=\forestoption{child anchor yshift}].child anchor)},
adjust childrens child anchors
}
},
}
\begin{document}
\frame{
\begin{forest}
[S
[\alt<1>{XP}{NP1234}]
[\alt<1>{YP}{NP1234}]
[\alt<1>{ZP}{NP1234}]
[\ldots, visible on=<1>]
[{\alt<1>{H}{V} \sliste{ \alt<1>{XP}{NP}, \alt<1>{YP}{NP}, \alt<1>{ZP}{NP}\visible<1>{, \ldots} }}
[{V \sliste{ NP, NP, NP }}, visible on=<1>,no edge]]]
\end{forest}
\pause
}
\end{document}
编辑:通过添加 1234 使 NPs 更长,以便跳跃更加明显。
答案1
这可能是解决问题的第一步。我添加了一个min width
可以传递两个不同文本的键。是的,如果可以更改\alt
为自动执行此操作会更好,但由于扩展问题,我无法做到这一点。(我甚至不知道我在与谁的扩展作斗争,beamer
或者forest
。)
\documentclass{beamer}
\usepackage{forest}
% http://tex.stackexchange.com/questions/167690/presenting-a-forest-tree-from-bottom-to-top-in-beamer
% showing and hiding nodes and edges in 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}} % \pgfkeysalso doesn't change the path
},
}
\forestset{
visible on/.style={
for tree={
/tikz/visible on={#1},
edge={/tikz/visible on={#1}}}}}
\newcommand{\sliste}[1]{%
\mbox{%
$\left\langle\mbox{\upshape\scshape #1}\right\rangle$}%
}
% specification for all trees, "default preamble" appends to existing specification.
% The version with apostrophe replaces it.
\forestset{default preamble'={
for tree={align=center,parent anchor=south, child anchor=north,anchor=north,base=bottom},
before drawing tree={
sort by=y,
for min={tree}{baseline}
}
}}
\forestset{
declare dimen={child anchor yshift}{0pt},
adjust childrens child anchors/.style={
if n children>=2{
before packing={
tempdima/.max={max_y}{children},
for children={
child anchor yshift=tempdima()-max_y()
},
}
}{}
},
default preamble={
for tree={
edge path'={(!u.parent anchor)--([yshift=\forestoption{child anchor yshift}].child anchor)},
adjust childrens child anchors
}
},
}
\begin{document}
\tikzset{min width/.style n args={2}{/utils/exec={\pgfmathparse{max(width("#1"),width("#2"))}
\edef\mywidth{\pgfmathresult}},
text width={\mywidth pt}}}
\frame{
\begin{forest}
[S
[\alt<1>{XP}{NP1234},min width={XP}{NP1234}]
[\alt<1>{YP}{NP1234},min width={YP}{NP1234}]
[\alt<1>{ZP}{NP1234},min width={ZP}{NP1234}]
[\ldots, visible on=<1>]
[{\alt<1>{H}{V} \sliste{ \alt<1>{XP}{NP}, \alt<1>{YP}{NP}, \alt<1>{ZP}{NP}\visible<1>{, \ldots} }}
[{V \sliste{ NP, NP, NP }}, visible on=<1>,no edge]]]
\end{forest}
\begin{tikzpicture}[overlay,remember picture]
\draw[red] (current page.south west) grid (current page.north east);
\end{tikzpicture}
\pause
}
\end{document}
红色网格仅用于引导视线。