我希望有一个滚动字幕覆盖整个页面宽度。我打算将其用于 Beamer 演示文稿,但解决方案不一定与 Beamer 有关。我宁愿不使用 Beamer 的内置\animate
命令,因为 (1) 我希望控制帧速率;(2) 我希望幻灯片在 PDF 中显示为单个页面。因此,我开始尝试使用animate
PDF 动画包。棘手的部分是我希望字幕滚动在之上幻灯片上还有一些其他文本/图像。我的第一反应是这样做:
\begin{amimateinline}[autoplay,
begin={\begin{tikzpicture}[overlay]},
end={\end{tikzpicture}}]{10}
\multiframe{20}{rmarqueexpos=1.0+-0.05}{
\node at ($(current page.west)!\rmarqueexpos!(current page.east)$) {The marquee text!};
}
\end{animateinline}
这种方法的问题在于,它animateinline
显然期望其内容是一个非零宽度的框,并且tikzpicture
覆盖层显然没有排版为框(我假设它们像浮点数一样)。
我的第二个更成功的方法是将 放在animateinline
以 为中心的覆盖节点的内部(current page.center)
。 困难在于animateinline
显然还要求动画的每一帧都具有相同的宽度。 因此,我必须用空格填充选框的左右两侧才能使其正常工作。
以下是我目前得到的最接近的答案:
\documentclass{article}
\pagestyle{empty}
\usepackage{tikz}
\usepackage{animate}
\begin{document}
\LARGE Lorem ipsum dolor sit amet, consectetur adipiscing
elit. Vivamus nibh nibh, porttitor eu porttitor ac, tincidunt ut
massa. Nullam quis semper erat. Ut non massa eu est aliquam suscipit
at vel mi. Fusce commodo porttitor metus rhoncus bibendum. Ut
fermentum pharetra lacus, id ornare dolor pretium tempor. Sed
scelerisque mollis nisi quis malesuada. Mauris vitae nisi vitae
augue gravida ultrices et nec metus. Quisque egestas, libero vel
tempor dignissim, dolor tellus lacinia felis, nec imperdiet tortor
ipsum dapibus ipsum. Quisque sodales eleifend molestie. Duis ac
tortor velit. Nullam non justo a nunc tempus dignissim. Praesent
condimentum ullamcorper mi, ut molestie odio placerat at. Duis
consectetur consequat luctus. Nullam neque sem, sodales non porta
ut, commodo vitae justo. Aenean eu facilisis quam. Sed dui nulla,
venenatis a ullamcorper ac, blandit non dolor.
\begin{tikzpicture}[remember picture,overlay]
\node at (current page.center) {
\begin{animateinline}[autoplay]{10}
\multiframe{20}{rmarqueexpos=1.0+-0.05}{
\setbox0=\hbox{\scalebox{2}{\Huge The marquee text!}}
\dimen0=\wd0 % The width of the marquee
\dimen1=\textwidth %% \dimen1 will be the lefthand padding
\advance\dimen1 by \dimen0
\dimen2=\dimen1 %% \dimen2 will be the righthand padding
\advance\dimen2 by -\rmarqueexpos\dimen1
\advance\dimen2 by -\dimen0
\hspace*{-\dimen0}\hspace*{\rmarqueexpos\dimen1}\box0\hbox to \dimen2{}
}
\end{animateinline}
};
\end{tikzpicture}
\end{document}
问题在于边距有点偏离(可能是由于我对填充进行了破解)。
编辑:我解决了这个问题:这只是 for 循环中的一个错误multiframe
。有关详细信息,请参阅我的答案。
我做错了什么(除了疯狂地尝试在 TeX 中制作动画选框之外)?有没有更好的方法可以做到这一点?
答案1
试试这个(已编辑,请参阅下面的评论):
\documentclass{article}
\usepackage{tikz}
\usepackage{animate}
\newlength\diffPos %diff between two positions
\def\markeetext{\scalebox{2}{\Huge+++ The marquee text +++}}
\begin{document}
\LARGE Lorem ipsum dolor sit amet, consectetur adipiscing
elit. Vivamus nibh nibh, porttitor eu porttitor ac, tincidunt ut
massa. Nullam quis semper erat. Ut non massa eu est aliquam suscipit
at vel mi. Fusce commodo porttitor metus rhoncus bibendum. Ut
fermentum pharetra lacus, id ornare dolor pretium tempor. Sed
scelerisque mollis nisi quis malesuada. Mauris vitae nisi vitae
augue gravida ultrices et nec metus. Quisque egestas, libero vel
tempor dignissim, dolor tellus lacinia felis, nec imperdiet tortor
ipsum dapibus ipsum. Quisque sodales eleifend molestie. Duis ac
tortor velit. Nullam non justo a nunc tempus dignissim. Praesent
condimentum ullamcorper mi, ut molestie odio placerat at. Duis
consectetur consequat luctus. Nullam neque sem, sodales non porta
ut, commodo vitae justo. Aenean eu facilisis quam. Sed dui nulla,
venenatis a ullamcorper ac, blandit non dolor.
\begin{tikzpicture}[remember picture, overlay]
\node
at (current page.center) {%
\begin{animateinline}[autoplay,loop]{5}
\setlength{\diffPos}{%
(\textwidth+\widthof\markeetext)*\real{0.025}}%
\multiframe{40}{dTextPos=\textwidth+-\diffPos}{%
\makebox[\textwidth][l]{%
\hspace{\dTextPos}%
\makebox[0pt][l]\markeetext%
}%
}%
\end{animateinline}
};
\end{tikzpicture}
\end{document}
亚历山大
答案2
multiframe
边距问题是由于for 循环中的一次错误造成的。增加到{20}
可以{21}
解决这个问题。我想现在的问题是:有没有更好、更简单的方法来做到这一点?我将暂时搁置这个问题,以防有人能回答。