summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/animate/animate.sty
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/animate/animate.sty')
-rw-r--r--macros/latex/contrib/animate/animate.sty1393
1 files changed, 682 insertions, 711 deletions
diff --git a/macros/latex/contrib/animate/animate.sty b/macros/latex/contrib/animate/animate.sty
index 6964db89a1..408cf967f3 100644
--- a/macros/latex/contrib/animate/animate.sty
+++ b/macros/latex/contrib/animate/animate.sty
@@ -11,13 +11,12 @@
% Supports LaTeX->dvips->ps2pdf, (Xe)LaTeX->(x)dvipdfmx, LuaLaTeX,
% pdfLaTeX and LaTeX->dvisvgm workflows.
-\NeedsTeXFormat{LaTeX2e}[2020-10-01]
+\NeedsTeXFormat{LaTeX2e}[2022-06-01]
-\def\@anim@version{2022/02/21}
+\def\@anim@version{2022/08/04}
\ProvidesPackage{animate}
[\@anim@version\space PDF & SVG animations from files and inline graphics]
-\RequirePackage{xkeyval}
\RequirePackage{ifthen}
\RequirePackage{iftex}
\RequirePackage{ifdraft}
@@ -25,60 +24,85 @@
%driver options (the only package options we process immediately)
\newboolean{@anim@dvips}
-\setboolean{@anim@dvips}{false}
\newboolean{@anim@dvipdfmx}
-\setboolean{@anim@dvipdfmx}{false}
\newboolean{@anim@dvisvgm}
-\setboolean{@anim@dvisvgm}{false}
-\ifpdf\else
- \setboolean{@anim@dvips}{true}% default dvi mode
- \setboolean{@anim@dvipdfmx}{false}
- \DeclareOptionX{dvips}{%
- \setboolean{@anim@dvips}{true}
- \setboolean{@anim@dvipdfmx}{false}
- }
- \DeclareOptionX{dvipdfmx}{%
- \setboolean{@anim@dvipdfmx}{true}
- \setboolean{@anim@dvips}{false}
+\newboolean{@anim@xetex}
+\newboolean{@anim@export}%exporting animation frames
+
+\ExplSyntaxOn
+\DeclareKeys[anim@pkg]{
+ pdftex.code:n = {},
+ pdftex.value_forbidden:n = true,
+
+ luatex.code:n = {},
+ luatex.value_forbidden:n = true,
+
+ xetex.code:n = {},
+ xetex.value_forbidden:n = true,
+
+ dvips.code:n = {},
+ dvips.value_forbidden:n = true,
+
+ dvipdfmx.code:n = {
\PassOptionsToPackage{dvipdfmx}{pdfbase}
+ \PassOptionsToPackage{dvipdfmx}{ocgbase}
\PassOptionsToPackage{dvipdfmx}{graphics}
- }
- \DeclareOptionX{xetex}{%
- \setboolean{@anim@dvipdfmx}{true}
- \setboolean{@anim@dvips}{false}
- \PassOptionsToPackage{xetex}{pdfbase}
- }
- \DeclareOptionX{dvisvgm}{%
- \setboolean{@anim@dvisvgm}{true}
- \setboolean{@anim@dvips}{false}
+ },
+ dvipdfmx.value_forbidden:n = true,
+
+ dvisvgm.code:n = {
\PassOptionsToPackage{dvisvgm}{pdfbase}
\PassOptionsToPackage{dvisvgm}{graphics}
- }
+ },
+ dvisvgm.value_forbidden:n = true,
+
+ export.legacy_if_gset:n = @anim@export,
+ export.default:n = true,
+}
+\ExplSyntaxOff
+\DeclareUnknownKeyHandler[anim@pkg]{}
+
+\ProcessKeyOptions[anim@pkg]
+% remaining package options to be processed near end of this file
+
+\RequirePackage{pdfbase}
+\@ifpackagelater{pdfbase}{2022/08/04}{}{
+ \PackageError{animate}{%
+ Support package `pdfbase.sty' too old.%
+ }{%
+ Please install an up to date version of `pdfbase.sty'.\MessageBreak%
+ Aborting.%
+ }%
+}
+
+\ifpdf\else
+ \setboolean{@anim@dvips}{true}% default dvi mode
\fi
-\newboolean{@anim@xetex}
-\setboolean{@anim@xetex}{false}
-\ifxetex
- \setboolean{@anim@xetex}{true}
+
+\ExplSyntaxOn
+\bool_if:NT\g_pbs_dvipdfmx_bool{
\setboolean{@anim@dvipdfmx}{true}
\setboolean{@anim@dvips}{false}
-\fi
-%exporting animation frames
-\newboolean{@anim@export}
-\setboolean{@anim@export}{false}
+}
+\bool_if:NT\g_pbs_dvisvgm_bool{
+ \setboolean{@anim@dvisvgm}{true}
+ \setboolean{@anim@dvips}{false}
+}
+\sys_if_engine_xetex:T{
+ \bool_if:NT\g_pbs_dvipdfmx_bool{\setboolean{@anim@xetex}{true}}
+ \setboolean{@anim@dvips}{false}
+}
+\ExplSyntaxOff
+
+\RequirePackage{graphics}%\scalebox, \resizebox, \rotatebox
+\RequirePackage{zref-abspage}
+
\newboolean{@anim@insideexport}
-\setboolean{@anim@insideexport}{false}
\newenvironment{anim@export}{%
\global\@anim@insideexporttrue%
}{%
\global\@anim@insideexportfalse%
}
-\DeclareOptionX{export}{\setboolean{@anim@export}{true}}
-
-\DeclareOptionX*{}\ProcessOptionsX*\relax %allow anything as an option
-%(remaining package options will be processed near end of this file)
-
-\RequirePackage{graphics}%\scalebox, \resizebox, \rotatebox
-\RequirePackage{zref-abspage}
% get number of pages in file given as #1 (file basename); #2 extension;
% store result into macro given as #3
@@ -148,7 +172,7 @@
\if@anim@export
\@ifclassloaded{standalone}{}{
\PackageError{animate}{%
- Option `export' requires `standalone' document class.\MessageBreak%
+ Option `export' requires the `standalone' document class.\MessageBreak%
Replace current document class with `standalone'%
}{%
Put the line\MessageBreak%
@@ -162,16 +186,6 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% low level PDF/SVG operations
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\RequirePackage{pdfbase}
-\@ifpackagelater{pdfbase}{2017/09/29}{}{
- \PackageError{animate}{%
- Support package `pdfbase.sty' too old.%
- }{%
- Please install an up to date version of `pdfbase.sty'.\MessageBreak%
- Aborting.%
- }%
-}
-
\ExplSyntaxOn
\let\@anim@literal\pbs_literal:nn
@@ -193,8 +207,6 @@
\ExplSyntaxOff
\if@anim@dvisvgm
- \setboolean{@anim@export}{false}
-
\def\@anim@updatebbox#1#2#3{\special{dvisvgm:bbox #1 #2 #3 transform}}
%approach similar to OCGs, that is, putting the frame content in an svg group,
@@ -226,8 +238,6 @@
\pbs_pdfannot:nnnn{#1}{#2}{#3}{#4}
\pbs_appendtofields:n{\pbs_pdflastann:}
}
-
- \let\@anim@pdfcatalog\pbs_pdfcatalog:n
\ExplSyntaxOff
\RequirePackage{ocgbase} %OCG generating and configuration macros
@@ -356,7 +366,7 @@
}%
\edef\@anim@curxform{\@anim@getkeyval{xform:\@anim@fingerprint}}%
\ifthenelse{\equal{\@anim@curxform}{}}{%
- % new "<file chksum>.<page>.<graphicx opts>"
+ % new file
\@anim@filebox{#3}{#4}{#5}{\@anim@box}% store file in a box
\edef\@anim@natdims{{\the\wd\@anim@box}{\the\ht\@anim@box}{\the\dp\@anim@box}}%
\@anim@xinline{#1}{#2}{\@anim@box}{newfile}% Form XObject creation
@@ -415,7 +425,7 @@
\fi%
\ifthenelse{\equal{#4}{newfile}\OR\equal{#4}{inline}}{%
\@anim@xform{1}{1}{}{}{#3}%
- %keep a record of XObject number, needed when timeline is built
+ %keep a record of XObject number
\@anim@newkey{img@#2}{\@anim@lastxform}%
}{%
%known file
@@ -496,11 +506,9 @@
\hss%
}%
% rotate content on lscape pages
- \ifnum\@anim@method>\@ne\else%
- \ifx\@anim@lscape\@anim@@lscape%
+ \ifnum\@anim@method>\@ne\else\ifx\@anim@lscape\@anim@@lscape%
\setbox\@anim@box=\hbox{\rotatebox{90}{\box\@anim@box}}%
- \fi%
- \fi%
+ \fi\fi%
\fi%
\ifcase\@anim@method% icon based
\if@anim@singleref\else%
@@ -1577,7 +1585,7 @@
\ifcsname Ginput@path\endcsname% make use of graphic[xs] search path
\let\input@path\Ginput@path%
\fi%
- \setkeys{anim@user}{#1}%
+ \SetKeys[anim@user]{#1}%
\ifx\empty\@anim@bg\empty\xdef\@anim@alpha{}\fi%
\xdef\@anim@btnsize{\the\dimexpr\@anim@btnsize\relax}%
%correct wrong option combination; totalheight overrides height
@@ -2108,7 +2116,7 @@
\ifcsname Ginput@path\endcsname% make use of graphic[xs] search path
\let\input@path\Ginput@path%
\fi%
- \setkeys{anim@user}{#1}%
+ \SetKeys[anim@user]{#1}%
\ifx\empty\@anim@bg\empty\xdef\@anim@alpha{}\fi%
\xdef\@anim@btnsize{\the\dimexpr\@anim@btnsize\relax}%
%correct wrong option combination; totalheight overrides height
@@ -2848,171 +2856,27 @@
}
%command options
-\define@key{anim@user}{label}{%
- \gdef\@anim@label{#1}%
- \ifcsname @anim@#1\endcsname%
- \PackageWarning{animate}{Label #1 multiply defined}
- \ifdefined\@anim@multlabel\else
- \gdef\@anim@multlabel{}%
- \AtEndDocument{%
- \PackageWarningNoLine{animate}{%
- @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\MessageBreak
- @ There are multiply-defined labels! @\MessageBreak
- @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@}%
- }%
- \fi%
- \fi%
- \expandafter\gdef\csname @anim@#1\endcsname{}%
-}
-%setting the widget size
-\define@key{anim@user}{width}{%
- \gdef\@anim@widtharg{#1}%
- \ifdefined\@anim@usrwd\else%
- \global\advance\@anim@resizeflags by 4%
- \def\@anim@usrwd{}%
- \fi%
-}
-\define@key{anim@user}{height}{%
- \gdef\@anim@heightarg{#1}%
- \ifdefined\@anim@usrht\else%
- \global\advance\@anim@resizeflags by 2%
- \def\@anim@usrht{}%
- \fi%
-}
-\define@key{anim@user}{totalheight}{%
- \gdef\@anim@totheightarg{#1}%
- \ifdefined\@anim@usrtht\else%
- \global\advance\@anim@resizeflags by \@ne%
- \def\@anim@usrtht{}%
- \fi%
-}
-\define@key{anim@user}{depth}{%
- \PackageWarning{animate}{Ignoring obsolete `depth' option.}%
-}
\newboolean{@anim@iso}
-\define@key{anim@user}{keepaspectratio}[true]{%
- \setboolean{@anim@iso}{#1}%
-}
-\define@key{anim@user}{bb}{%
- \xdef\@anim@bb{bb=#1}%
-}
-\define@key{anim@user}{viewport}{%
- \xdef\@anim@viewport{viewport=#1}%
-}
-\define@key{anim@user}{trim}{%
- \xdef\@anim@trim{trim=#1}%
-}
-\define@key{anim@user}{angle}{%
- \xdef\@anim@angle{angle=#1}%
-}
-\define@key{anim@user}{clip}[true]{%
- %no-op, as embedded graphics are always clipped to widget box
-}
\newboolean{@anim@hiresbb}
-\define@key{anim@user}{hiresbb}[true]{%
- \setboolean{@anim@hiresbb}{#1}%
-}
\newboolean{@anim@interpolate}
-\define@key{anim@user}{interpolate}[true]{%
- \setboolean{@anim@interpolate}{#1}%
-}
-\define@key{anim@user}{pagebox}{%
- \xdef\@anim@pagebox{pagebox=#1}%
-}
-\define@key{anim@user}{scale}{%
- \xdef\@anim@boxscale{#1}%
-}
-\define@key{anim@user}{buttonsize}{%
- \gdef\@anim@btnsize{#1}%
-}
-\def\@anim@colours#1:#2\@nil{% helper macro to get number of colour components
- \xdef\@anim@colour{\@anim@colour\space #1}% and to replace : by ` ' in the arg
- \ifthenelse{\equal{#2}{}}{}{%
- \global\advance\@anim@tmpcnt by \@ne%
- \@anim@colours#2\@nil%
- }%
-}
-\define@key{anim@user}{buttonbg}{%background colour of buttons
- \global\@anim@tmpcnt=\@ne%
- \gdef\@anim@colour{}%
- \@anim@colours#1:\@nil%
- \global\let\@anim@bgcolour\@anim@colour%
- \ifnum\if@anim@dvips 1\else\if@anim@dvisvgm 1\else0\fi\fi=1%
- \ifnum\@anim@tmpcnt=\@ne\relax%
- \xdef\@anim@bg{\@anim@colour\space setgray}%
- \else%
- \ifnum\@anim@tmpcnt=3\relax%
- \xdef\@anim@bg{\@anim@colour\space setrgbcolor}%
- \else%
- \ifnum\@anim@tmpcnt=4\relax%
- \xdef\@anim@bg{\@anim@colour\space setcmykcolor}%
- \fi%
- \fi%
- \fi%
- \else% pdftex and dvipdfmx
- \ifnum\@anim@tmpcnt=\@ne\relax%
- \xdef\@anim@bg{\@anim@colour\space g}%
- \else%
- \ifnum\@anim@tmpcnt=3\relax%
- \xdef\@anim@bg{\@anim@colour\space rg}%
- \else%
- \ifnum\@anim@tmpcnt=4\relax%
- \xdef\@anim@bg{\@anim@colour\space k}%
- \fi%
- \fi%
- \fi%
- \fi%
-}
-\define@key{anim@user}{buttonfg}{%stroking colour of buttons
- \global\@anim@tmpcnt=\@ne%
- \gdef\@anim@colour{}%
- \@anim@colours#1:\@nil%
- \global\let\@anim@fgcolour\@anim@colour%
- \ifnum\if@anim@dvips 1\else\if@anim@dvisvgm 1\else0\fi\fi=1%
- \ifnum\@anim@tmpcnt=\@ne\relax%
- \xdef\@anim@fg{\@anim@colour\space setgray}%
- \else%
- \ifnum\@anim@tmpcnt=3\relax%
- \xdef\@anim@fg{\@anim@colour\space setrgbcolor}%
- \else%
- \ifnum\@anim@tmpcnt=4\relax%
- \xdef\@anim@fg{\@anim@colour\space setcmykcolor}%
- \fi%
- \fi%
- \fi%
- \else% pdftex and dvipdfmx
- \ifnum\@anim@tmpcnt=\@ne\relax%
- \xdef\@anim@fg{\@anim@colour\space G}%
- \xdef\@anim@@@fg{\@anim@colour\space g}%
- \else%
- \ifnum\@anim@tmpcnt=3\relax%
- \xdef\@anim@fg{\@anim@colour\space RG}%
- \xdef\@anim@@@fg{\@anim@colour\space rg}%
- \else%
- \ifnum\@anim@tmpcnt=4\relax%
- \xdef\@anim@fg{\@anim@colour\space K}%
- \xdef\@anim@@@fg{\@anim@colour\space k}%
- \fi%
- \fi%
- \fi%
- \fi%
-}
-\define@key{anim@user}{buttonalpha}{%button opacity
- \xdef\@anim@alpha{#1}%
-}
-\define@key{anim@user}{alttext}{%
- \ifthenelse{\equal{#1}{none}}{%
- \gdef\@anim@alttext{}%
- }{%
- \xdef\@anim@alttext{/Contents (#1)}%
- }%
-}
-
\newboolean{@anim@controls}
\newboolean{@anim@controls@play}
\newboolean{@anim@controls@step}
\newboolean{@anim@controls@stop}
\newboolean{@anim@controls@speed}
+\newboolean{@anim@ctrlleft}
+\newboolean{@anim@ctrlright}
+\newboolean{@anim@ctrlcentre}
+\newboolean{@anim@loop}
+\newboolean{@anim@autoplay}
+\newboolean{@anim@autoresume}
+\newboolean{@anim@autopause}
+\newboolean{@anim@palindrome}
+\newboolean{@anim@step}
+\newboolean{@anim@meas}
+\setboolean{@anim@nomouse}{false}
+\newboolean{@anim@draft}
+\def\@anim@mone{-1}\def\@anim@mtwo{-2}
\def\@anim@user@controls@all{%
\setboolean{@anim@controls}{true}%
\setboolean{@anim@controls@play}{true}%
@@ -3027,185 +2891,333 @@
\setboolean{@anim@controls@stop}{false}%
\setboolean{@anim@controls@speed}{false}%
}
-\define@key{anim@user}{controls}[all]{%
- \@anim@user@controls@none%
- \setkeys{anim@user@controls}{#1}%
-}
-\define@key{anim@user@controls}{all}[]{\@anim@user@controls@all}
-\define@key{anim@user@controls}{true}[]{\@anim@user@controls@all}
-\define@key{anim@user@controls}{on}[]{\@anim@user@controls@all}
-\define@key{anim@user@controls}{none}[]{\@anim@user@controls@none}
-\define@key{anim@user@controls}{false}[]{\@anim@user@controls@none}
-\define@key{anim@user@controls}{off}[]{\@anim@user@controls@none}
-\define@key{anim@user@controls}{play}[]{%
- \setboolean{@anim@controls}{true}%
- \setboolean{@anim@controls@play}{true}%
-}
-\define@key{anim@user@controls}{step}[]{%
- \setboolean{@anim@controls}{true}%
- \setboolean{@anim@controls@step}{true}%
-}
-\define@key{anim@user@controls}{stop}[]{%
- \setboolean{@anim@controls}{true}%
- \setboolean{@anim@controls@stop}{true}%
-}
-\define@key{anim@user@controls}{speed}[]{%
- \setboolean{@anim@controls}{true}%
- \setboolean{@anim@controls@speed}{true}%
-}
-
\def\@anim@parse@ctrlsalignarg#1#2#3+#4\@nil{%
\ifthenelse{\equal{#3}{}}{}{\def#1{#3}}%
\ifthenelse{\equal{#4}{}}{#2=\z@}{\@anim@getalignindent#2#4\@nil}%
}
\def\@anim@getalignindent#1#2+\@nil{#1=#2}
-
-\newboolean{@anim@ctrlleft}
-\newboolean{@anim@ctrlright}
-\newboolean{@anim@ctrlcentre}
-\define@key{anim@user}{controlsaligned}{%
- \@anim@parse@ctrlsalignarg\@anim@tmpvar\@anim@tmpdima#1+\@nil%
- \ifthenelse{\equal{\@anim@tmpvar}{left}}{%
- \setboolean{@anim@ctrlleft}{true}%
- \setboolean{@anim@ctrlright}{false}%
- \setboolean{@anim@ctrlcentre}{false}%
- \xdef\@anim@ctrlsindent{\the\@anim@tmpdima}%
- }{%
- \ifthenelse{\equal{\@anim@tmpvar}{right}}{%
- \setboolean{@anim@ctrlleft}{false}%
- \setboolean{@anim@ctrlright}{true}%
- \setboolean{@anim@ctrlcentre}{false}%
- \xdef\@anim@ctrlsindent{\the\@anim@tmpdima}%
- }{%
- \ifthenelse{\equal{\@anim@tmpvar}{center}}{%
- \setboolean{@anim@ctrlleft}{false}%
- \setboolean{@anim@ctrlright}{false}%
- \setboolean{@anim@ctrlcentre}{true}%
- \xdef\@anim@ctrlsindent{\z@}%
- }{}%
- }%
+% helper macro to get number of colour components
+\def\@anim@colours#1{\@anim@@colours#1:\@nil}
+\def\@anim@@colours#1:#2\@nil{% helper macro to get number of colour components
+ \xdef\@anim@colour{\@anim@colour\space #1}% and to replace : by ` ' in the arg
+ \ifthenelse{\equal{#2}{}}{}{%
+ \global\advance\@anim@tmpcnt by \@ne%
+ \@anim@@colours#2\@nil%
}%
}
-\newboolean{@anim@loop}
-\define@key{anim@user}{loop}[true]{%
- \setboolean{@anim@loop}{#1}%
-}
-\newboolean{@anim@autoplay}
-\define@key{anim@user}{autoplay}[true]{%
- \setboolean{@anim@autoplay}{#1}%
- \if@anim@autoplay%
- \setboolean{@anim@autoresume}{false}%
- \fi%
-}
-\newboolean{@anim@autoresume}
-\define@key{anim@user}{autoresume}[true]{%
- \setboolean{@anim@autoresume}{#1}%
- \if@anim@autoresume%
- \setboolean{@anim@autoplay}{false}%
- \fi%
-}
-\newboolean{@anim@autopause}
-\define@key{anim@user}{autopause}[true]{%
- \setboolean{@anim@autopause}{#1}%
-}
-\newboolean{@anim@palindrome}
-\define@key{anim@user}{palindrome}[true]{%
- \setboolean{@anim@palindrome}{#1}%
-}
-\def\@anim@mone{-1}\def\@anim@mtwo{-2}
-\define@key{anim@user}{poster}[first]{% <num> | first | last | none
- \ifthenelse{%
- \equal{#1}{first}%
- }{%
- \gdef\@anim@poster{0}%
- }{%
- \ifthenelse{%
- \equal{#1}{last}%
- }{%
- \gdef\@anim@poster{-1}%
- }{%
- \ifthenelse{%
- \equal{#1}{none}%
- }{%
- \gdef\@anim@poster{-2}%
- }{%
- \ifnum#1<\z@\relax%
- \PackageError{animate}{%
- Poster frame `#1' is out-of-bounds on\MessageBreak%
- input line \the\inputlineno.\MessageBreak%
- Try one of `poster=first' or `poster=none'%
- }{}%
- \fi%
- \gdef\@anim@poster{#1}%
- }%
- }%
- }%
-}
-\newboolean{@anim@step}
-\define@key{anim@user}{step}[true]{%
- \setboolean{@anim@step}{#1}%
-}
-\newboolean{@anim@draft}
-\define@key{anim@user}{draft}[true]{%
- \setboolean{@anim@draft}{#1}%
-}
-\define@key{anim@user}{final}[true]{%
- \ifthenelse{\equal{#1}{true}}{%
- \setboolean{@anim@draft}{false}%
- }{%
- \setboolean{@anim@draft}{true}%
- }%
-}
-\setboolean{@anim@nomouse}{false}
-\define@key{anim@user}{nomouse}[true]{%
- \setboolean{@anim@nomouse}{#1}%
-}
-\define@key{anim@user}{timeline}{%
- \IfFileExists{#1}{%
- \xdef\@anim@tmlnfile{\expandafter\zap@finalspace\@filef@und\@nil}%
- \setboolean{@anim@timeline}{true}%
- }{%
- \PackageError{animate}{timeline file `#1' cannot be opened for reading%
- }{%
- Make sure file `#1' exists and is readable!%
- }%
- }%
-}
-\define@key{anim@user}{begin}{%
- \gdef\@anim@begin{#1}%
-}
-\define@key{anim@user}{end}{%
- \gdef\@anim@end{#1}%
-}
-\define@key{anim@user}{every}{% embed every #1th frame
- \ifnum#1<\@ne\relax\gdef\@anim@every{1}\else\gdef\@anim@every{#1}\fi%
-}
-\newboolean{@anim@meas}
-\define@key{anim@user}{measure}[true]{%
- \setboolean{@anim@meas}{#1}%
-}
-\define@key{anim@user}{method}{%
- \ifthenelse{\equal{#1}{icon}}{%
- \def\@anim@method{\z@}%
- }{%
- \ifthenelse{\equal{#1}{widget}}{%
- \def\@anim@method{\@ne}%
- }{%
- \ifthenelse{\equal{#1}{ocg}}{%
- \def\@anim@method{\tw@}%
- }{}%
- }%
- }%
-}
-\define@key{anim@user}{useocg}[]{%
- \PackageError{animate}{%
- Option `useocg' has been removed.\MessageBreak%
- Use `method=ocg' instead%
- }{}%
-}
+\ExplSyntaxOn
+\DeclareKeys[anim@user]{
+ label.code:n = {
+ \gdef\@anim@label{#1}
+ \ifcsname @anim@#1\endcsname
+ \PackageWarning{animate}{Label~#1~multiply~defined}
+ \ifdefined\@anim@multlabel\else
+ \gdef\@anim@multlabel{}
+ \AtEndDocument{
+ \PackageWarningNoLine{animate}{
+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\MessageBreak
+ @~There~are~multiply-defined~labels!~@\MessageBreak
+ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@}
+ }
+ \fi
+ \fi
+ \expandafter\gdef\csname @anim@#1\endcsname{}
+ },
+ label.value_required:n = true,
+
+ width.code:n = {
+ \gdef\@anim@widtharg{#1}
+ \ifdefined\@anim@usrwd\else
+ \global\advance\@anim@resizeflags by 4
+ \def\@anim@usrwd{}
+ \fi
+ },
+ width.value_required:n = true,
+
+ height.code:n = {
+ \gdef\@anim@heightarg{#1}
+ \ifdefined\@anim@usrht\else
+ \global\advance\@anim@resizeflags by 2
+ \def\@anim@usrht{}
+ \fi
+ },
+ height.value_required:n = true,
+
+ totalheight.code:n = {
+ \gdef\@anim@totheightarg{#1}
+ \ifdefined\@anim@usrtht\else
+ \global\advance\@anim@resizeflags by \@ne
+ \def\@anim@usrtht{}
+ \fi
+ },
+ totalheight.value_required:n = true,
+
+ keepaspectratio.legacy_if_gset:n = @anim@iso,
+ keepaspectratio.default:n = true,
+
+ bb.code:n = {\xdef\@anim@bb{bb=#1}},
+ bb.value_required:n = true,
+
+ viewport.code:n = {\xdef\@anim@viewport{viewport=#1}},
+ viewport.value_required:n = true,
-\define@key{anim@user}{type}{\gdef\@anim@ftype{#1}}%
+ trim.code:n = {\xdef\@anim@trim{trim=#1}},
+ trim.value_required:n = true,
+
+ angle.code:n = {\xdef\@anim@angle{angle=#1}},
+ angle.value_required:n = true,
+
+ pagebox.code:n = {\xdef\@anim@pagebox{pagebox=#1}},
+ pagebox.value_required:n = true,
+
+ clip.code:n = {}, % no-op, as embedded graphics are always
+ clip.default:n = true, % clipped to widget box
+
+ hiresbb.legacy_if_gset:n = @anim@hiresbb,
+ hiresbb.default:n = true,
+
+ interpolate.legacy_if_gset:n = @anim@interpolate,
+ interpolate.default:n = true,
+
+ scale.tl_gset_x:N = \@anim@boxscale,
+ scale.value_required:n = true,
+
+ buttonsize.tl_gset:N = \@anim@btnsize,
+ buttonsize.value_required:n = true,
+
+ buttonbg.code:n = {
+ \global\@anim@tmpcnt=\@ne
+ \gdef\@anim@colour{}
+ \@anim@colours{#1}
+ \global\let\@anim@bgcolour\@anim@colour
+ \ifnum\if@anim@dvips 1\else\if@anim@dvisvgm 1\else0\fi\fi=1
+ \ifnum\@anim@tmpcnt=\@ne\relax
+ \xdef\@anim@bg{\@anim@colour\space setgray}
+ \else
+ \ifnum\@anim@tmpcnt=3\relax
+ \xdef\@anim@bg{\@anim@colour\space setrgbcolor}
+ \else
+ \ifnum\@anim@tmpcnt=4\relax
+ \xdef\@anim@bg{\@anim@colour\space setcmykcolor}
+ \fi
+ \fi
+ \fi
+ \else% pdftex and dvipdfmx
+ \ifnum\@anim@tmpcnt=\@ne\relax
+ \xdef\@anim@bg{\@anim@colour\space g}
+ \else
+ \ifnum\@anim@tmpcnt=3\relax
+ \xdef\@anim@bg{\@anim@colour\space rg}
+ \else
+ \ifnum\@anim@tmpcnt=4\relax
+ \xdef\@anim@bg{\@anim@colour\space k}
+ \fi
+ \fi
+ \fi
+ \fi
+ },
+ buttonbg.value_required:n = true,
+
+ buttonfg.code:n = {
+ \global\@anim@tmpcnt=\@ne
+ \gdef\@anim@colour{}
+ \@anim@colours{#1}
+ \global\let\@anim@fgcolour\@anim@colour
+ \ifnum\if@anim@dvips 1\else\if@anim@dvisvgm 1\else0\fi\fi=1
+ \ifnum\@anim@tmpcnt=\@ne\relax
+ \xdef\@anim@fg{\@anim@colour\space setgray}
+ \else
+ \ifnum\@anim@tmpcnt=3\relax
+ \xdef\@anim@fg{\@anim@colour\space setrgbcolor}
+ \else
+ \ifnum\@anim@tmpcnt=4\relax
+ \xdef\@anim@fg{\@anim@colour\space setcmykcolor}
+ \fi
+ \fi
+ \fi
+ \else% pdftex and dvipdfmx
+ \ifnum\@anim@tmpcnt=\@ne\relax
+ \xdef\@anim@fg{\@anim@colour\space G}
+ \xdef\@anim@@@fg{\@anim@colour\space g}
+ \else
+ \ifnum\@anim@tmpcnt=3\relax
+ \xdef\@anim@fg{\@anim@colour\space RG}
+ \xdef\@anim@@@fg{\@anim@colour\space rg}
+ \else
+ \ifnum\@anim@tmpcnt=4\relax
+ \xdef\@anim@fg{\@anim@colour\space K}
+ \xdef\@anim@@@fg{\@anim@colour\space k}
+ \fi
+ \fi
+ \fi
+ \fi
+ },
+ buttonfg.value_required:n = true,
+
+ buttonalpha.tl_gset_x:N = \@anim@alpha,
+ buttonalpha.value_required:n = true,
+
+ alttext.code:n = {
+ \ifthenelse{\equal{#1}{none}}{
+ \gdef\@anim@alttext{}
+ }{
+ \xdef\@anim@alttext{/Contents~(#1)}
+ }
+ },
+ alttext.value_required:n = true,
+
+ controls.multichoice:,
+ controls / all.code:n = {\@anim@user@controls@all},
+ controls / true.code:n = {\@anim@user@controls@all},
+ controls / on.code:n = {\@anim@user@controls@all},
+ controls / none.code:n = {\@anim@user@controls@none},
+ controls / false.code:n = {\@anim@user@controls@none},
+ controls / off.code:n = {\@anim@user@controls@none},
+ controls / play.code:n = {
+ \setboolean{@anim@controls}{true}
+ \setboolean{@anim@controls@play}{true}
+ },
+ controls / step.code:n = {
+ \setboolean{@anim@controls}{true}
+ \setboolean{@anim@controls@step}{true}
+ },
+ controls / stop.code:n = {
+ \setboolean{@anim@controls}{true}
+ \setboolean{@anim@controls@stop}{true}
+ },
+ controls / speed.code:n = {
+ \setboolean{@anim@controls}{true}
+ \setboolean{@anim@controls@speed}{true}
+ },
+ controls.default:n = all,
+
+ controlsaligned.code:n = {
+ \@anim@parse@ctrlsalignarg\@anim@tmpvar\@anim@tmpdima#1+\@nil
+ \ifthenelse{\equal{\@anim@tmpvar}{left}}{
+ \setboolean{@anim@ctrlleft}{true}
+ \setboolean{@anim@ctrlright}{false}
+ \setboolean{@anim@ctrlcentre}{false}
+ \xdef\@anim@ctrlsindent{\the\@anim@tmpdima}
+ }{
+ \ifthenelse{\equal{\@anim@tmpvar}{right}}{
+ \setboolean{@anim@ctrlleft}{false}
+ \setboolean{@anim@ctrlright}{true}
+ \setboolean{@anim@ctrlcentre}{false}
+ \xdef\@anim@ctrlsindent{\the\@anim@tmpdima}
+ }{
+ \ifthenelse{\equal{\@anim@tmpvar}{center}}{
+ \setboolean{@anim@ctrlleft}{false}
+ \setboolean{@anim@ctrlright}{false}
+ \setboolean{@anim@ctrlcentre}{true}
+ \xdef\@anim@ctrlsindent{\z@}
+ }{}
+ }
+ }
+ },
+ controlsaligned.value_required:n = true,
+
+ loop.legacy_if_gset:n = @anim@loop,
+ loop.default:n = true,
+
+ autoplay.code:n = {
+ \setboolean{@anim@autoplay}{#1}
+ \if@anim@autoplay\setboolean{@anim@autoresume}{false}\fi
+ },
+ autoplay.default:n = true,
+
+ autoresume.code:n = {
+ \setboolean{@anim@autoresume}{#1}
+ \if@anim@autoresume\setboolean{@anim@autoplay}{false}\fi
+ },
+ autoresume.default:n = true,
+
+ autopause.legacy_if_gset:n = @anim@autopause,
+ autopause.default:n = true,
+
+ palindrome.legacy_if_gset:n = @anim@palindrome,
+ palindrome.default:n = true,
+
+ poster.choice:, % <num> | first | last | none
+ poster / first.code:n = {\gdef\@anim@poster{0}},
+ poster / last.code:n = {\gdef\@anim@poster{-1}},
+ poster / none.code:n = {\gdef\@anim@poster{-2}},
+ poster / unknown.code:n = {% frame <num>
+ \ifnum#1<\z@\relax
+ \PackageError{animate}{
+ Poster~frame~`#1'~is~out-of-bounds~on\MessageBreak
+ input~line~\the\inputlineno.\MessageBreak
+ Try~one~of~`poster=first'~or~`poster=none'
+ }{}
+ \fi
+ \gdef\@anim@poster{#1}
+ },
+ poster.default:n = first,
+
+ step.legacy_if_gset:n = @anim@step,
+ step.default:n = true,
+
+ draft.legacy_if_gset:n = @anim@draft,
+ draft.default:n = true,
+
+ final.code:n = {
+ \ifthenelse{\equal{#1}{true}}{
+ \setboolean{@anim@draft}{false}
+ }{
+ \setboolean{@anim@draft}{true}
+ }
+ },
+ final.default:n = true,
+
+ nomouse.legacy_if_gset:n = @anim@nomouse,
+ nomouse.default:n = true,
+
+ timeline.code:n = {
+ \IfFileExists{#1}{
+ \xdef\@anim@tmlnfile{\expandafter\zap@finalspace\@filef@und\@nil}
+ \setboolean{@anim@timeline}{true}
+ }{
+ \PackageError{animate}{timeline~file~`#1'~cannot~be~opened~for~reading
+ }{
+ Make~sure~file~`#1'~exists~and~is~readable!
+ }
+ }
+ },
+ timeline.value_required:n = true,
+
+ begin.tl_gset:N = \@anim@begin,
+ begin.value_required:n = true,
+
+ end.tl_gset:N = \@anim@end,
+ end.value_required:n = true,
+
+ every.code:n = {
+ \ifnum#1<\@ne\relax\gdef\@anim@every{1}\else\gdef\@anim@every{#1}\fi
+ },
+ every.value_required:n = true,
+
+ measure.legacy_if_gset:n = @anim@meas,
+ measure.default:n = true,
+
+ method.choices:nn = {icon,widget,ocg} {
+ \ifthenelse{\equal{#1}{icon}}{
+ \def\@anim@method{\z@}
+ }{
+ \ifthenelse{\equal{#1}{widget}}{
+ \def\@anim@method{\@ne}
+ }{
+ \ifthenelse{\equal{#1}{ocg}}{
+ \def\@anim@method{\tw@}
+ }{}
+ }
+ }
+ },
+ method.value_required:n = true,
+
+ type.tl_gset_x:N = \@anim@ftype,
+ type.value_required:n = true,
+}
+\ExplSyntaxOff
%macro to reset macros and booleans
\def\@anim@reset{%
@@ -3274,197 +3286,25 @@
}
%package options
-\define@key{anim@pkg}{dvips}[]{%
- \ifthenelse{\equal{#1}{}}{}{%
- \PackageError{animate}{%
- Package option `dvips' does not accept arguments%
- }{}%
- }%
-}%
-\define@key{anim@pkg}{dvipdfmx}[]{
- \ifthenelse{\equal{#1}{}}{}{%
- \PackageError{animate}{%
- Package option `dvipdfmx' does not accept arguments%
- }{}%
- }%
-}%
-\define@key{anim@pkg}{dvisvgm}[]{
- \ifthenelse{\equal{#1}{}}{}{%
- \PackageError{animate}{%
- Package option `dvisvgm' does not accept arguments%
- }{}%
- }%
-}%
-\define@key{anim@pkg}{xetex}[]{
- \ifthenelse{\equal{#1}{}}{}{%
- \PackageError{animate}{%
- Package option `xetex' does not accept arguments%
- }{}%
- }%
-}%
-\define@key{anim@pkg}{export}[]{
- \ifthenelse{\equal{#1}{}}{}{%
- \PackageError{animate}{%
- Package option `export' does not accept arguments%
- }{}%
- }%
-}%
-\def\@anim@@bg{}
-\def\@anim@@bgcolour{}
-\define@key{anim@pkg}{buttonbg}{%background colour of buttons
- \global\@anim@tmpcnt=\@ne%
- \gdef\@anim@colour{}%
- \@anim@colours#1:\@nil%
- \global\let\@anim@@bgcolour\@anim@colour%
- \ifnum\if@anim@dvips 1\else\if@anim@dvisvgm 1\else0\fi\fi=1%
- \ifnum\@anim@tmpcnt=\@ne\relax%
- \xdef\@anim@@bg{\@anim@colour\space setgray}%
- \else%
- \ifnum\@anim@tmpcnt=3\relax%
- \xdef\@anim@@bg{\@anim@colour\space setrgbcolor}%
- \else%
- \ifnum\@anim@tmpcnt=4\relax%
- \xdef\@anim@@bg{\@anim@colour\space setcmykcolor}%
- \fi%
- \fi%
- \fi%
- \else% pdftex and dvipdfmx
- \ifnum\@anim@tmpcnt=\@ne\relax%
- \xdef\@anim@@bg{\@anim@colour\space g}%
- \else%
- \ifnum\@anim@tmpcnt=3\relax%
- \xdef\@anim@@bg{\@anim@colour\space rg}%
- \else%
- \ifnum\@anim@tmpcnt=4\relax%
- \xdef\@anim@@bg{\@anim@colour\space k}%
- \fi%
- \fi%
- \fi%
- \fi%
-}
-
-\ifnum\if@anim@dvips 1\else\if@anim@dvisvgm 1\else0\fi\fi=1
- %dvips .OR. dvisvgm
- \def\@anim@@fg{0 setgray}\def\@anim@@@@fg{}
-\else% pdftex and dvipdfmx
- \def\@anim@@fg{0 G}\def\@anim@@@@fg{0 g}
-\fi
-\def\@anim@@fgcolour{}
-\define@key{anim@pkg}{buttonfg}{%stroking colour of buttons
- \global\@anim@tmpcnt=\@ne%
- \gdef\@anim@colour{}%
- \@anim@colours#1:\@nil%
- \global\let\@anim@@fgcolour\@anim@colour%
- \ifnum\if@anim@dvips 1\else\if@anim@dvisvgm 1\else0\fi\fi=1%
- \ifnum\@anim@tmpcnt=\@ne\relax%
- \xdef\@anim@@fg{\@anim@colour\space setgray}%
- \else%
- \ifnum\@anim@tmpcnt=3\relax%
- \xdef\@anim@@fg{\@anim@colour\space setrgbcolor}%
- \else%
- \ifnum\@anim@tmpcnt=4\relax%
- \xdef\@anim@@fg{\@anim@colour\space setcmykcolor}%
- \fi%
- \fi%
- \fi%
- \else% pdftex and dvipdfmx
- \ifnum\@anim@tmpcnt=\@ne\relax%
- \xdef\@anim@@fg{\@anim@colour\space G}%
- \xdef\@anim@@@@fg{\@anim@colour\space g}%
- \else%
- \ifnum\@anim@tmpcnt=3\relax%
- \xdef\@anim@@fg{\@anim@colour\space RG}%
- \xdef\@anim@@@@fg{\@anim@colour\space rg}%
- \else%
- \ifnum\@anim@tmpcnt=4\relax%
- \xdef\@anim@@fg{\@anim@colour\space K}%
- \xdef\@anim@@@@fg{\@anim@colour\space k}%
- \fi%
- \fi%
- \fi%
- \fi%
-}
-\def\@anim@@alpha{}
-\define@key{anim@pkg}{buttonalpha}{%button opacity
- \xdef\@anim@@alpha{#1}%
-}
\newcount\@anim@@resizeflags
-\def\@anim@@widtharg{\width}%
-\define@key{anim@pkg}{width}{%
- \def\@anim@@widtharg{#1}%
- \ifdefined\@anim@pkgwd\else%
- \advance\@anim@@resizeflags by 4%
- \def\@anim@pkgwd{}%
- \fi%
-}
-\def\@anim@@heightarg{\height}%
-\define@key{anim@pkg}{height}{%
- \def\@anim@@heightarg{#1}%
- \ifdefined\@anim@pkght\else%
- \advance\@anim@@resizeflags by 2%
- \def\@anim@pkght{}%
- \fi%
-}
-\def\@anim@@totheightarg{\totalheight}%
-\define@key{anim@pkg}{totalheight}{%
- \def\@anim@@totheightarg{#1}%
- \ifdefined\@anim@pkgtht\else%
- \advance\@anim@@resizeflags by \@ne%
- \def\@anim@pkgtht{}%
- \fi%
-}
+\def\@anim@@widtharg{\width}
+\def\@anim@@heightarg{\height}
+\def\@anim@@totheightarg{\totalheight}
\newboolean{@anim@@iso}
-\define@key{anim@pkg}{keepaspectratio}[true]{%
- \setboolean{@anim@@iso}{#1}%
-}
\def\@anim@@bb{}
-\define@key{anim@pkg}{bb}{%
- \xdef\@anim@bb{bb=#1}%
-}
\def\@anim@@viewport{}
-\define@key{anim@pkg}{viewport}{%
- \xdef\@anim@@viewport{viewport=#1}%
-}
\def\@anim@@trim{}
-\define@key{anim@pkg}{trim}{%
- \xdef\@anim@@trim{trim=#1}%
-}
\def\@anim@@angle{}
-\define@key{anim@pkg}{angle}{%
- \xdef\@anim@@angle{angle=#1}%
-}
-\define@key{anim@pkg}{clip}[true]{%
- %no-op, as embedded graphics are always clipped to widget box
-}
+\def\@anim@@pagebox{}
\newboolean{@anim@@hiresbb}
-\define@key{anim@pkg}{hiresbb}[true]{%
- \setboolean{@anim@@hiresbb}{#1}%
-}
\newboolean{@anim@@interpolate}
-\define@key{anim@pkg}{interpolate}[true]{%
- \setboolean{@anim@@interpolate}{#1}%
-}
-\def\@anim@@pagebox{}
-\define@key{anim@pkg}{pagebox}{%
- \xdef\@anim@@pagebox{pagebox=#1}%
-}
-\def\@anim@@boxscale{1}%
-\define@key{anim@pkg}{scale}{%
- \def\@anim@@boxscale{#1}%
-}
-\def\@anim@@btnsize{1.44em}%
-\define@key{anim@pkg}{buttonsize}{%
- \gdef\@anim@@btnsize{#1}%
-}
+\def\@anim@@boxscale{1}
+\def\@anim@@btnsize{1.44em}
+\def\@anim@@bg{}
+\def\@anim@@bgcolour{}
+\def\@anim@@fgcolour{}
+\def\@anim@@alpha{}
\edef\@anim@@alttext{/Contents (animation by animate, v. \@anim@version)}
-\define@key{anim@pkg}{alttext}{%
- \ifthenelse{\equal{#1}{none}}{%
- \gdef\@anim@@alttext{}%
- }{%
- \xdef\@anim@@alttext{/Contents (#1)}%
- }%
-}
-
\newboolean{@anim@@controls}
\newboolean{@anim@@controls@play}
\newboolean{@anim@@controls@step}
@@ -3484,170 +3324,301 @@
\setboolean{@anim@@controls@stop}{false}%
\setboolean{@anim@@controls@speed}{false}%
}
-\define@key{anim@pkg}{controls}[all]{%
- \@anim@pkg@controls@none%
- \setkeys{anim@pkg@controls}{#1}%
-}
-\define@key{anim@pkg@controls}{all}[]{\@anim@pkg@controls@all}
-\define@key{anim@pkg@controls}{true}[]{\@anim@pkg@controls@all}
-\define@key{anim@pkg@controls}{on}[]{\@anim@pkg@controls@all}
-\define@key{anim@pkg@controls}{none}[]{\@anim@pkg@controls@none}
-\define@key{anim@pkg@controls}{false}[]{\@anim@pkg@controls@none}
-\define@key{anim@pkg@controls}{off}[]{\@anim@pkg@controls@none}
-\define@key{anim@pkg@controls}{play}[]{%
- \setboolean{@anim@@controls}{true}%
- \setboolean{@anim@@controls@play}{true}%
-}
-\define@key{anim@pkg@controls}{step}[]{%
- \setboolean{@anim@@controls}{true}%
- \setboolean{@anim@@controls@step}{true}%
-}
-\define@key{anim@pkg@controls}{stop}[]{%
- \setboolean{@anim@@controls}{true}%
- \setboolean{@anim@@controls@stop}{true}%
-}
-\define@key{anim@pkg@controls}{speed}[]{%
- \setboolean{@anim@@controls}{true}%
- \setboolean{@anim@@controls@speed}{true}%
-}
-
\newboolean{@anim@@ctrlleft}
\newboolean{@anim@@ctrlright}
\newboolean{@anim@@ctrlcentre}
\setboolean{@anim@@ctrlcentre}{true}
\def\@anim@@ctrlsindent{\z@}
-\define@key{anim@pkg}{controlsaligned}{%
- \@anim@parse@ctrlsalignarg\@anim@tmpvar\@anim@tmpdima#1+\@nil%
- \setboolean{@anim@@ctrlcentre}{false}%
- \ifthenelse{\equal{\@anim@tmpvar}{left}}{%
- \setboolean{@anim@@ctrlleft}{true}%
- \edef\@anim@@ctrlsindent{\the\@anim@tmpdima}%
- }{%
- \ifthenelse{\equal{\@anim@tmpvar}{right}}{%
- \setboolean{@anim@@ctrlright}{true}%
- \edef\@anim@@ctrlsindent{\the\@anim@tmpdima}%
- }{\setboolean{@anim@@ctrlcentre}{true}}%
- }%
-}
-
\newboolean{@anim@@loop}
-\setboolean{@anim@@loop}{false}%
-\define@key{anim@pkg}{loop}[true]{%
- \setboolean{@anim@@loop}{#1}%
-}
\newboolean{@anim@@autoplay}
-\setboolean{@anim@@autoplay}{false}
-\define@key{anim@pkg}{autoplay}[true]{%
- \setboolean{@anim@@autoplay}{#1}%
- \if@anim@@autoplay\setboolean{@anim@@autoresume}{false}\fi%
-}
\newboolean{@anim@@autoresume}
-\setboolean{@anim@@autoresume}{false}
-\define@key{anim@pkg}{autoresume}[true]{%
- \setboolean{@anim@@autoresume}{#1}%
- \if@anim@@autoresume\setboolean{@anim@@autoplay}{false}\fi%
-}
\newboolean{@anim@@autopause}
-\setboolean{@anim@@autopause}{false}
-\define@key{anim@pkg}{autopause}[true]{%
- \setboolean{@anim@@autopause}{#1}%
-}
\newboolean{@anim@@palindrome}
-\setboolean{@anim@@palindrome}{false}
-\define@key{anim@pkg}{palindrome}[true]{%
- \setboolean{@anim@@palindrome}{#1}%
-}
\gdef\@anim@@poster{0}%
-\define@key{anim@pkg}{poster}[first]{%
- \ifthenelse{%
- \equal{#1}{first}%
- }{%
- \gdef\@anim@@poster{0}%
- }{%
- \ifthenelse{%
- \equal{#1}{last}%
- }{%
- \gdef\@anim@@poster{-1}%
- }{%
- \ifthenelse{%
- \equal{#1}{none}%
- }{%
- \gdef\@anim@@poster{-2}%
- }{%
- \ifnum#1<\z@\relax%
- \PackageError{animate}{%
- Poster frame `#1' is out-of-bounds on\MessageBreak%
- input line \the\inputlineno.\MessageBreak%
- Try one of `poster=first' or `poster=none'%
- }{}%
- \fi%
- \gdef\@anim@@poster{#1}%
- }%
- }%
- }%
-}
\newboolean{@anim@@step}
-\setboolean{@anim@@step}{false}
-\define@key{anim@pkg}{step}[true]{%
- \setboolean{@anim@@step}{#1}%
-}
\newboolean{@anim@@draft}
\ifdraft{%globally set by document class
\setboolean{@anim@@draft}{true}%
}{%
\setboolean{@anim@@draft}{false}%
-}%
-\define@key{anim@pkg}{draft}[true]{%
- \setboolean{@anim@@draft}{#1}%
- \if@anim@export%
- \setboolean{@anim@@draft}{false}%
- \fi%
-}
-\define@key{anim@pkg}{final}[true]{%
- \ifthenelse{\equal{#1}{true}}{%
- \setboolean{@anim@@draft}{false}%
- }{%
- \setboolean{@anim@@draft}{true}%
- }%
}
\newboolean{@anim@@nomouse}
-\setboolean{@anim@@nomouse}{false}
-\define@key{anim@pkg}{nomouse}[true]{%
- \setboolean{@anim@@nomouse}{#1}%
-}
+\def\@anim@@method{\z@}%default animation method is `icon'
+\def\@anim@@ftype{}% file type (extension) of graphics
+
+\ExplSyntaxOn
+\DeclareKeys[anim@pkg]{
+ width.code:n = {
+ \gdef\@anim@@widtharg{#1}
+ \ifdefined\@anim@pkgwd\else
+ \advance\@anim@@resizeflags by 4
+ \def\@anim@pkgwd{}%
+ \fi%
+ },
+ width.value_required:n = true,
-%file type (extension) of graphics files to be embedded
-\def\@anim@@ftype{}%
-\define@key{anim@pkg}{type}{\def\@anim@@ftype{#1}}%
+ height.code:n = {
+ \gdef\@anim@@heightarg{#1}
+ \ifdefined\@anim@pkght\else
+ \advance\@anim@@resizeflags by 2
+ \def\@anim@pkght{}
+ \fi
+ },
+ height.value_required:n = true,
-% animation method: icon vs. widget vs. ocg based
-\define@key{anim@pkg}{method}{%
- \ifthenelse{\equal{#1}{icon}}{%
- \def\@anim@@method{\z@}%
- }{%
- \ifthenelse{\equal{#1}{widget}}{%
- \def\@anim@@method{\@ne}%
+ totalheight.code:n = {
+ \gdef\@anim@@totheightarg{#1}
+ \ifdefined\@anim@pkgtht\else
+ \advance\@anim@@resizeflags by \@ne
+ \def\@anim@pkgtht{}
+ \fi
+ },
+ totalheight.value_required:n = true,
+
+ keepaspectratio.legacy_if_gset:n = @anim@@iso,
+ keepaspectratio.default:n = true,
+
+ bb.code:n = {\xdef\@anim@@bb{bb=#1}},
+ bb.value_required:n = true,
+
+ viewport.code:n = {\xdef\@anim@@viewport{viewport=#1}},
+ viewport.value_required:n = true,
+
+ trim.code:n = {\xdef\@anim@@trim{trim=#1}},
+ trim.value_required:n = true,
+
+ angle.code:n = {\xdef\@anim@@angle{angle=#1}},
+ angle.value_required:n = true,
+
+ pagebox.code:n = {\xdef\@anim@@pagebox{pagebox=#1}},
+ pagebox.value_required:n = true,
+
+ clip.code:n = {}, % no-op, as embedded graphics are always
+ clip.default:n = true, % clipped to widget box
+
+ hiresbb.legacy_if_gset:n = @anim@@hiresbb,
+ hiresbb.default:n = true,
+
+ interpolate.legacy_if_gset:n = @anim@@interpolate,
+ interpolate.default:n = true,
+
+ scale.tl_gset_x:N = \@anim@@boxscale,
+ scale.value_required:n = true,
+
+ buttonsize.tl_gset:N = \@anim@@btnsize,
+ buttonsize.value_required:n = true,
+
+ buttonbg.code:n = {
+ \global\@anim@tmpcnt=\@ne
+ \gdef\@anim@colour{}
+ \@anim@colours{#1}
+ \global\let\@anim@@bgcolour\@anim@colour
+ \ifnum\if@anim@dvips 1\else\if@anim@dvisvgm 1\else0\fi\fi=1
+ \ifnum\@anim@tmpcnt=\@ne\relax
+ \xdef\@anim@@bg{\@anim@colour\space setgray}
+ \else
+ \ifnum\@anim@tmpcnt=3\relax
+ \xdef\@anim@@bg{\@anim@colour\space setrgbcolor}
+ \else
+ \ifnum\@anim@tmpcnt=4\relax
+ \xdef\@anim@@bg{\@anim@colour\space setcmykcolor}
+ \fi
+ \fi
+ \fi
+ \else% pdftex and dvipdfmx
+ \ifnum\@anim@tmpcnt=\@ne\relax
+ \xdef\@anim@@bg{\@anim@colour\space g}
+ \else
+ \ifnum\@anim@tmpcnt=3\relax
+ \xdef\@anim@@bg{\@anim@colour\space rg}
+ \else
+ \ifnum\@anim@tmpcnt=4\relax
+ \xdef\@anim@@bg{\@anim@colour\space k}
+ \fi
+ \fi
+ \fi
+ \fi
+ },
+ buttonbg.value_required:n = true,
+
+ buttonfg.code:n = {
+ \global\@anim@tmpcnt=\@ne
+ \gdef\@anim@colour{}
+ \@anim@@colours#1:\@nil
+ \global\let\@anim@@fgcolour\@anim@colour
+ \ifnum\if@anim@dvips 1\else\if@anim@dvisvgm 1\else0\fi\fi=1
+ \ifnum\@anim@tmpcnt=\@ne\relax
+ \xdef\@anim@@fg{\@anim@colour\space setgray}
+ \else
+ \ifnum\@anim@tmpcnt=3\relax
+ \xdef\@anim@@fg{\@anim@colour\space setrgbcolor}
+ \else
+ \ifnum\@anim@tmpcnt=4\relax
+ \xdef\@anim@@fg{\@anim@colour\space setcmykcolor}
+ \fi
+ \fi
+ \fi
+ \else% pdftex and dvipdfmx
+ \ifnum\@anim@tmpcnt=\@ne\relax
+ \xdef\@anim@@fg{\@anim@colour\space G}
+ \xdef\@anim@@@@fg{\@anim@colour\space g}
+ \else
+ \ifnum\@anim@tmpcnt=3\relax
+ \xdef\@anim@@fg{\@anim@colour\space RG}
+ \xdef\@anim@@@@fg{\@anim@colour\space rg}
+ \else
+ \ifnum\@anim@tmpcnt=4\relax
+ \xdef\@anim@@fg{\@anim@colour\space K}
+ \xdef\@anim@@@@fg{\@anim@colour\space k}
+ \fi
+ \fi
+ \fi
+ \fi
+ },
+ buttonfg.value_required:n = true,
+
+ buttonalpha.tl_gset_x:N = \@anim@@alpha,
+ buttonalpha.value_required:n = true,
+
+ alttext.code:n = {
+ \ifthenelse{\equal{#1}{none}}{
+ \gdef\@anim@@alttext{}
+ }{
+ \xdef\@anim@@alttext{/Contents~(#1)}
+ }
+ },
+ alttext.value_required:n = true,
+
+ controls.multichoice:,
+ controls / all.code:n = {\@anim@pkg@controls@all},
+ controls / true.code:n = {\@anim@pkg@controls@all},
+ controls / on.code:n = {\@anim@pkg@controls@all},
+ controls / none.code:n = {\@anim@pkg@controls@none},
+ controls / false.code:n = {\@anim@pkg@controls@none},
+ controls / off.code:n = {\@anim@pkg@controls@none},
+ controls / play.code:n = {
+ \setboolean{@anim@@controls}{true}
+ \setboolean{@anim@@controls@play}{true}
+ },
+ controls / step.code:n = {
+ \setboolean{@anim@@controls}{true}
+ \setboolean{@anim@@controls@step}{true}
+ },
+ controls / stop.code:n = {
+ \setboolean{@anim@@controls}{true}
+ \setboolean{@anim@@controls@stop}{true}
+ },
+ controls / speed.code:n = {
+ \setboolean{@anim@@controls}{true}
+ \setboolean{@anim@@controls@speed}{true}
+ },
+ controls.default:n = all,
+
+ controlsaligned.code:n = {
+ \@anim@parse@ctrlsalignarg\@anim@tmpvar\@anim@tmpdima#1+\@nil
+ \setboolean{@anim@@ctrlcentre}{false}
+ \ifthenelse{\equal{\@anim@tmpvar}{left}}{
+ \setboolean{@anim@@ctrlleft}{true}
+ \edef\@anim@@ctrlsindent{\the\@anim@tmpdima}
+ }{
+ \ifthenelse{\equal{\@anim@tmpvar}{right}}{
+ \setboolean{@anim@@ctrlright}{true}
+ \edef\@anim@@ctrlsindent{\the\@anim@tmpdima}
+ }{
+ \setboolean{@anim@@ctrlcentre}{true}
+ \xdef\@anim@@ctrlsindent{\z@}
+ }
+ }
+ },
+ controlsaligned.value_required:n = true,
+
+ loop.legacy_if_gset:n = @anim@@loop,
+ loop.default:n = true,
+
+ autoplay.code:n = {
+ \setboolean{@anim@@autoplay}{#1}
+ \if@anim@@autoplay\setboolean{@anim@@autoresume}{false}\fi
+ },
+ autoplay.default:n = true,
+
+ autoresume.code:n = {
+ \setboolean{@anim@@autoresume}{#1}
+ \if@anim@@autoresume\setboolean{@anim@@autoplay}{false}\fi
+ },
+ autoresume.default:n = true,
+
+ autopause.legacy_if_gset:n = @anim@@autopause,
+ autopause.default:n = true,
+
+ palindrome.legacy_if_gset:n = @anim@@palindrome,
+ palindrome.default:n = true,
+
+ poster.choice:, % <num> | first | last | none
+ poster / first.code:n = {\gdef\@anim@@poster{0}},
+ poster / last.code:n = {\gdef\@anim@@poster{-1}},
+ poster / none.code:n = {\gdef\@anim@@poster{-2}},
+ poster / unknown.code:n = {% frame <num>
+ \ifnum#1<\z@\relax
+ \PackageError{animate}{
+ Poster~frame~`#1'~is~out-of-bounds~on\MessageBreak
+ input~line~\the\inputlineno.\MessageBreak
+ Try~one~of~`poster=first'~or~`poster=none'
+ }{}
+ \fi
+ \gdef\@anim@@poster{#1}
+ },
+ poster.default:n = first,
+
+ step.legacy_if_gset:n = @anim@@step,
+ step.default:n = true,
+
+ draft.code:n = {
+ \setboolean{@anim@@draft}{#1}
+ \if@anim@export\setboolean{@anim@@draft}{false}\fi
+ },
+ draft.default:n = true,
+
+ final.code:n = {
+ \ifthenelse{\equal{#1}{true}}{
+ \setboolean{@anim@@draft}{false}
}{%
- \ifthenelse{\equal{#1}{ocg}}{%
- \def\@anim@@method{\tw@}%
- }{}% ignoring wrong input
+ \setboolean{@anim@@draft}{true}
}%
- }%
-}
-\define@key{anim@pkg}{useocg}[]{%
- \PackageError{animate}{%
- Package option `useocg' has been removed.\MessageBreak%
- Use `method=ocg' instead%
- }{}%
+ },
+ final.default:n = true,
+
+ nomouse.legacy_if_gset:n = @anim@@nomouse,
+ nomouse.default:n = true,
+
+ method.choices:nn = {icon,widget,ocg} {
+ \ifthenelse{\equal{#1}{icon}}{
+ \def\@anim@@method{\z@}
+ }{
+ \ifthenelse{\equal{#1}{widget}}{
+ \def\@anim@@method{\@ne}
+ }{
+ \ifthenelse{\equal{#1}{ocg}}{
+ \def\@anim@@method{\tw@}
+ }{}% ignoring wrong input
+ }
+ }
+ },
+ method.value_required:n = true,
+
+ type.tl_gset_x:N = \@anim@@ftype,
+ type.value_required:n = true,
}
+\ExplSyntaxOff
-%default animation method is Icon based
-\def\@anim@@method{\z@}
+\ifnum\if@anim@dvips 1\else\if@anim@dvisvgm 1\else0\fi\fi=1
+ %dvips .OR. dvisvgm
+ \def\@anim@@fg{0 setgray}\def\@anim@@@@fg{}
+\else% pdftex and dvipdfmx
+ \def\@anim@@fg{0 G}\def\@anim@@@@fg{0 g}
+\fi
%process package options
-\def\@anim@setpkgkeys#1{\setkeys{anim@pkg}{#1}}
-\edef\@anim@pkgopts{{\@ptionlist{\@currname.\@currext}}}
-\expandafter\@anim@setpkgkeys\@anim@pkgopts
+\ProcessKeyOptions[anim@pkg]
%%%%%%%%%%%%%%%%%%%%%%%%
% JavaScript part