我尝试\multiframes
使用进行多次\multido
。但以下最小示例程序(应产生不断增大的旋转楔形的动画)给出了错误:
! Package animate Error: Content of first frame must not have zero width.
代码如下所示
\documentclass{article}
\usepackage{pst-sigsys}
\usepackage{multido}
\usepackage[final]{animate}
\newcommand{\mywedge}[2]{%
\pspicture*(-5,-5)(5,5)
\degrees[4]
\pscircle(0,0){#2}
\pswedge[linestyle=solid,fillcolor=teal,fillstyle=solid]{#2}{#1}{\inteval{#1+1}}
\endpspicture
}
\begin{document}
\begin{animateinline}[controls={play,step}]{2}
\multido{\iradius=1+1}{4}{%
\multiframe{4}{iangle=0+1}{%
\mywedge{\iangle}{\iradius}
}
\newframe
}
\end{animateinline}
\end{document}
省略\multido
和 则无用\newframe
(并提供一个数字而不是\iradius
作为 的第二个参数\mywedge
)会给出预期结果(但楔形当然不会再增长)。为什么这不起作用?我该如何让它起作用?
答案1
\multido
带有嵌入式 \newframe
在里面不能很好地工作animateinline
。\newframe
关闭一个 TeX 组,从而隐藏\iradius
由 本地定义的组\multido
。
为解决这个问题,我会使用 LaTeX3 步进函数之一,例如 \int_step_inline:nnnn
。(请参阅texdoc interface3
。)此外,最后一次循环迭代不应插入\newframe
。否则,将在动画末尾插入一个空帧。使用整数条件来防止这种情况。
\documentclass{article}
\usepackage{pst-sigsys}
\usepackage[final]{animate}
\ExplSyntaxOn
\let\intStepInlinennnn\int_step_inline:nnnn
\let\intComparenT\int_compare:nT
\ExplSyntaxOff
\newcommand{\mywedge}[2]{%
\pspicture*(-5,-5)(5,5)
\degrees[4]
\pscircle(0,0){#2}
\pswedge[linestyle=solid,fillcolor=teal,fillstyle=solid]{#2}{#1}{\inteval{#1+1}}
\endpspicture
}
\begin{document}
\begin{animateinline}[controls={play,step}]{2}
\intStepInlinennnn{1}{1}{4}{%
\multiframe{4}{iangle=0+1}{%
\mywedge{\iangle}{#1}
}
\intComparenT{#1<4}{\newframe}
}
\end{animateinline}
\end{document}
答案2
\begin{animateinline}[controls={play,step}]{2}
\psLoop{4}{%
\multiframe{4}{iangle=0+1}{%
\mywedge{\iangle}{\psLoopIndex}
}
\newframe
}
\end{animateinline}