texlive[64043] Master/texmf-dist: animate (4aug22)

commits+karl at tug.org commits+karl at tug.org
Thu Aug 4 22:32:19 CEST 2022


Revision: 64043
          http://tug.org/svn/texlive?view=revision&revision=64043
Author:   karl
Date:     2022-08-04 22:32:19 +0200 (Thu, 04 Aug 2022)
Log Message:
-----------
animate (4aug22)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/animate/ChangeLog
    trunk/Master/texmf-dist/doc/latex/animate/animate.pdf
    trunk/Master/texmf-dist/source/latex/animate/animate.tex
    trunk/Master/texmf-dist/tex/latex/animate/animate.sty

Modified: trunk/Master/texmf-dist/doc/latex/animate/ChangeLog
===================================================================
--- trunk/Master/texmf-dist/doc/latex/animate/ChangeLog	2022-08-04 20:32:06 UTC (rev 64042)
+++ trunk/Master/texmf-dist/doc/latex/animate/ChangeLog	2022-08-04 20:32:19 UTC (rev 64043)
@@ -1,3 +1,7 @@
+2022-08-04
+	* fix: a few obsolete code lines removed; option processing acc. to new
+	LaTeX format 22-06-01
+
 2022-02-21
 	* improvement: svg clipping code simplified
 

Modified: trunk/Master/texmf-dist/doc/latex/animate/animate.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/source/latex/animate/animate.tex
===================================================================
--- trunk/Master/texmf-dist/source/latex/animate/animate.tex	2022-08-04 20:32:06 UTC (rev 64042)
+++ trunk/Master/texmf-dist/source/latex/animate/animate.tex	2022-08-04 20:32:19 UTC (rev 64043)
@@ -1,5 +1,5 @@
 \listfiles
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
 % Copyright 2007--\today Alexander Grahn
 %
 % This material is subject to the LaTeX Project Public License. See
@@ -10,8 +10,7 @@
 \ifdefined\outputmode\outputmode=0\fi
 \ifdefined\pdfoutput\pdfoutput=0\fi
 %%%%%%% pdfmanagement-testphase %%%%%%
-\RequirePackage{pdfmanagement-testphase} % load the package
-\DeclareDocumentMetadata % activates the PDF management interface
+\DocumentMetadata % activates the PDF management interface
 {
   %uncompress,
 }
@@ -361,7 +360,7 @@
 controls[=all | true | on]
 controls=(none | false | off) | {[play][,step][,stop][,speed]}
 \end{verbatim}
-Inserts control buttons below the animation widget. Visibility of buttons can be fine-tuned through optional keys. By default, if setting `\verb+controls+' alone, all available buttons are shown, while any of `\verb+none+', `\verb+false+' or `\verb+off+' suppresses them altogether. A comma-separated selection from `\verb+play+', `\verb+step+', `\verb+stop+' and `\verb+speed+' enables corresponding pairs or groups of buttons. Such a comma list must be enclosed in braces, i.\,e. \verb+controls={..., ..., ...}+. If all buttons are shown, their meaning is as follows, from left to right: stop \& first frame, step backwards, play backwards, play forwards, step forwards, stop \& last frame, decrease speed, default speed, increase speed. Both `play' buttons are replaced by a large `pause' button while the animation is playing.
+Inserts control buttons below the animation widget. Visibility of buttons can be fine-tuned through optional keys. By default, if setting `\verb+controls+' alone, all available buttons are shown, while any of `\verb+none+', `\verb+false+' or `\verb+off+' suppresses them altogether. A comma-separated selection from `\verb+play+', `\verb+step+', `\verb+stop+' and `\verb+speed+' enables corresponding pairs or groups of buttons. Such a comma list must be enclosed in braces, i.\,e. \verb+controls={play, stop}+. If all buttons are shown, their meaning is as follows, from left to right: stop \& first frame, step backwards, play backwards, play forwards, step forwards, stop \& last frame, decrease speed, default speed, increase speed. Both `play' buttons are replaced by a large `pause' button while the animation is playing.
 \begin{verbatim}
 controlsaligned=left[+<indent>] | center | right[+<indent>]
 \end{verbatim}

Modified: trunk/Master/texmf-dist/tex/latex/animate/animate.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/animate/animate.sty	2022-08-04 20:32:06 UTC (rev 64042)
+++ trunk/Master/texmf-dist/tex/latex/animate/animate.sty	2022-08-04 20:32:19 UTC (rev 64043)
@@ -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 at version{2022/02/21}
+\def\@anim at version{2022/08/04}
 \ProvidesPackage{animate}
 [\@anim at version\space PDF & SVG animations from files and inline graphics]
 
-\RequirePackage{xkeyval}
 \RequirePackage{ifthen}
 \RequirePackage{iftex}
 \RequirePackage{ifdraft}
@@ -25,61 +24,86 @@
 
 %driver options (the only package options we process immediately)
 \newboolean{@anim at dvips}
-\setboolean{@anim at dvips}{false}
 \newboolean{@anim at dvipdfmx}
-\setboolean{@anim at dvipdfmx}{false}
 \newboolean{@anim at dvisvgm}
-\setboolean{@anim at dvisvgm}{false}
-\ifpdf\else
-  \setboolean{@anim at dvips}{true}% default dvi mode
-  \setboolean{@anim at dvipdfmx}{false}
-  \DeclareOptionX{dvips}{%
-    \setboolean{@anim at dvips}{true}
-    \setboolean{@anim at dvipdfmx}{false}
-  }
-  \DeclareOptionX{dvipdfmx}{%
-    \setboolean{@anim at dvipdfmx}{true}
-    \setboolean{@anim at dvips}{false}
+\newboolean{@anim at xetex}
+\newboolean{@anim at export}%exporting animation frames
+
+\ExplSyntaxOn
+\DeclareKeys[anim at 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 at dvipdfmx}{true}
-    \setboolean{@anim at dvips}{false}
-    \PassOptionsToPackage{xetex}{pdfbase}
-  }
-  \DeclareOptionX{dvisvgm}{%
-    \setboolean{@anim at dvisvgm}{true}
-    \setboolean{@anim at 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 at export,
+  export.default:n = true,
+}
+\ExplSyntaxOff
+\DeclareUnknownKeyHandler[anim at pkg]{}
+
+\ProcessKeyOptions[anim at 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 at dvips}{true}% default dvi mode
 \fi
-\newboolean{@anim at xetex}
-\setboolean{@anim at xetex}{false}
-\ifxetex
-  \setboolean{@anim at xetex}{true}
+
+\ExplSyntaxOn
+\bool_if:NT\g_pbs_dvipdfmx_bool{
   \setboolean{@anim at dvipdfmx}{true}
   \setboolean{@anim at dvips}{false}
-\fi
-%exporting animation frames
-\newboolean{@anim at export}
-\setboolean{@anim at export}{false}
+}
+\bool_if:NT\g_pbs_dvisvgm_bool{
+  \setboolean{@anim at dvisvgm}{true}
+  \setboolean{@anim at dvips}{false}
+}
+\sys_if_engine_xetex:T{
+  \bool_if:NT\g_pbs_dvipdfmx_bool{\setboolean{@anim at xetex}{true}}
+  \setboolean{@anim at dvips}{false}
+}
+\ExplSyntaxOff
+
+\RequirePackage{graphics}%\scalebox, \resizebox, \rotatebox
+\RequirePackage{zref-abspage}
+
 \newboolean{@anim at insideexport}
-\setboolean{@anim at insideexport}{false}
 \newenvironment{anim at export}{%
   \global\@anim at insideexporttrue%
 }{%
   \global\@anim at insideexportfalse%
 }
-\DeclareOptionX{export}{\setboolean{@anim at 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
 \ifpdf %pdflatex/lualatex
@@ -148,7 +172,7 @@
 \if at 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 at literal\pbs_literal:nn
 
@@ -193,8 +207,6 @@
 \ExplSyntaxOff
 
 \if at anim@dvisvgm
-  \setboolean{@anim at export}{false}
-
   \def\@anim at 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 at pdfcatalog\pbs_pdfcatalog:n
   \ExplSyntaxOff
 
   \RequirePackage{ocgbase} %OCG generating and configuration macros
@@ -356,7 +366,7 @@
   }%
   \edef\@anim at curxform{\@anim at getkeyval{xform:\@anim at fingerprint}}%
   \ifthenelse{\equal{\@anim at curxform}{}}{%
-    % new "<file chksum>.<page>.<graphicx opts>"
+    % new file
     \@anim at filebox{#3}{#4}{#5}{\@anim at box}% store file in a box
     \edef\@anim at natdims{{\the\wd\@anim at box}{\the\ht\@anim at box}{\the\dp\@anim at box}}%
     \@anim at xinline{#1}{#2}{\@anim at box}{newfile}% Form XObject creation
@@ -415,7 +425,7 @@
   \fi%
   \ifthenelse{\equal{#4}{newfile}\OR\equal{#4}{inline}}{%
     \@anim at xform{1}{1}{}{}{#3}%
-    %keep a record of XObject number, needed when timeline is built
+    %keep a record of XObject number
     \@anim at newkey{img@#2}{\@anim at lastxform}%
   }{%
     %known file
@@ -496,11 +506,9 @@
       \hss%
     }%
     % rotate content on lscape pages
-    \ifnum\@anim at method>\@ne\else%
-      \ifx\@anim at lscape\@anim@@lscape%
+    \ifnum\@anim at method>\@ne\else\ifx\@anim at lscape\@anim@@lscape%
         \setbox\@anim at box=\hbox{\rotatebox{90}{\box\@anim at box}}%
-      \fi%
-    \fi%
+    \fi\fi%
   \fi%
   \ifcase\@anim at method% icon based
     \if at anim@singleref\else%
@@ -1577,7 +1585,7 @@
   \ifcsname Ginput at path\endcsname% make use of graphic[xs] search path
     \let\input at path\Ginput at path%
   \fi%
-  \setkeys{anim at user}{#1}%
+  \SetKeys[anim at user]{#1}%
   \ifx\empty\@anim at bg\empty\xdef\@anim at alpha{}\fi%
   \xdef\@anim at btnsize{\the\dimexpr\@anim at btnsize\relax}%
   %correct wrong option combination; totalheight overrides height
@@ -2108,7 +2116,7 @@
   \ifcsname Ginput at path\endcsname% make use of graphic[xs] search path
     \let\input at path\Ginput at path%
   \fi%
-  \setkeys{anim at user}{#1}%
+  \SetKeys[anim at user]{#1}%
   \ifx\empty\@anim at bg\empty\xdef\@anim at alpha{}\fi%
   \xdef\@anim at btnsize{\the\dimexpr\@anim at btnsize\relax}%
   %correct wrong option combination; totalheight overrides height
@@ -2848,171 +2856,27 @@
 }
 
 %command options
-\define at key{anim at user}{label}{%
-  \gdef\@anim at label{#1}%
-  \ifcsname @anim@#1\endcsname%
-    \PackageWarning{animate}{Label #1 multiply defined}
-    \ifdefined\@anim at multlabel\else
-      \gdef\@anim at multlabel{}%
-      \AtEndDocument{%
-        \PackageWarningNoLine{animate}{%
-        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\MessageBreak
-        @ There are multiply-defined labels! @\MessageBreak
-        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@}%
-      }%
-    \fi%
-  \fi%
-  \expandafter\gdef\csname  @anim@#1\endcsname{}%
-}
-%setting the widget size
-\define at key{anim at user}{width}{%
-  \gdef\@anim at widtharg{#1}%
-  \ifdefined\@anim at usrwd\else%
-    \global\advance\@anim at resizeflags by 4%
-    \def\@anim at usrwd{}%
-  \fi%
-}
-\define at key{anim at user}{height}{%
-  \gdef\@anim at heightarg{#1}%
-  \ifdefined\@anim at usrht\else%
-    \global\advance\@anim at resizeflags by 2%
-    \def\@anim at usrht{}%
-  \fi%
-}
-\define at key{anim at user}{totalheight}{%
-  \gdef\@anim at totheightarg{#1}%
-  \ifdefined\@anim at usrtht\else%
-    \global\advance\@anim at resizeflags by \@ne%
-    \def\@anim at usrtht{}%
-  \fi%
-}
-\define at key{anim at user}{depth}{%
-  \PackageWarning{animate}{Ignoring obsolete `depth' option.}%
-}
 \newboolean{@anim at iso}
-\define at key{anim at user}{keepaspectratio}[true]{%
-  \setboolean{@anim at iso}{#1}%
-}
-\define at key{anim at user}{bb}{%
-  \xdef\@anim at bb{bb=#1}%
-}
-\define at key{anim at user}{viewport}{%
-  \xdef\@anim at viewport{viewport=#1}%
-}
-\define at key{anim at user}{trim}{%
-  \xdef\@anim at trim{trim=#1}%
-}
-\define at key{anim at user}{angle}{%
-  \xdef\@anim at angle{angle=#1}%
-}
-\define at key{anim at user}{clip}[true]{%
-  %no-op, as embedded graphics are always clipped to widget box
-}
 \newboolean{@anim at hiresbb}
-\define at key{anim at user}{hiresbb}[true]{%
-  \setboolean{@anim at hiresbb}{#1}%
-}
 \newboolean{@anim at interpolate}
-\define at key{anim at user}{interpolate}[true]{%
-  \setboolean{@anim at interpolate}{#1}%
-}
-\define at key{anim at user}{pagebox}{%
-  \xdef\@anim at pagebox{pagebox=#1}%
-}
-\define at key{anim at user}{scale}{%
-  \xdef\@anim at boxscale{#1}%
-}
-\define at key{anim at user}{buttonsize}{%
-  \gdef\@anim at btnsize{#1}%
-}
-\def\@anim at colours#1:#2\@nil{% helper macro to get number of colour components
-  \xdef\@anim at colour{\@anim at colour\space #1}% and to replace : by ` ' in the arg
-  \ifthenelse{\equal{#2}{}}{}{%
-    \global\advance\@anim at tmpcnt by \@ne%
-    \@anim at colours#2\@nil%
-  }%
-}
-\define at key{anim at user}{buttonbg}{%background colour of buttons
-  \global\@anim at tmpcnt=\@ne%
-  \gdef\@anim at colour{}%
-  \@anim at colours#1:\@nil%
-  \global\let\@anim at bgcolour\@anim at colour%
-  \ifnum\if at anim@dvips 1\else\if at anim@dvisvgm 1\else0\fi\fi=1%
-    \ifnum\@anim at tmpcnt=\@ne\relax%
-      \xdef\@anim at bg{\@anim at colour\space setgray}%
-    \else%
-      \ifnum\@anim at tmpcnt=3\relax%
-        \xdef\@anim at bg{\@anim at colour\space setrgbcolor}%
-      \else%
-        \ifnum\@anim at tmpcnt=4\relax%
-          \xdef\@anim at bg{\@anim at colour\space setcmykcolor}%
-        \fi%
-      \fi%
-    \fi%
-  \else% pdftex and dvipdfmx
-    \ifnum\@anim at tmpcnt=\@ne\relax%
-      \xdef\@anim at bg{\@anim at colour\space g}%
-    \else%
-      \ifnum\@anim at tmpcnt=3\relax%
-        \xdef\@anim at bg{\@anim at colour\space rg}%
-      \else%
-        \ifnum\@anim at tmpcnt=4\relax%
-          \xdef\@anim at bg{\@anim at colour\space k}%
-        \fi%
-      \fi%
-    \fi%
-  \fi%
-}
-\define at key{anim at user}{buttonfg}{%stroking colour of buttons
-  \global\@anim at tmpcnt=\@ne%
-  \gdef\@anim at colour{}%
-  \@anim at colours#1:\@nil%
-  \global\let\@anim at fgcolour\@anim at colour%
-  \ifnum\if at anim@dvips 1\else\if at anim@dvisvgm 1\else0\fi\fi=1%
-    \ifnum\@anim at tmpcnt=\@ne\relax%
-      \xdef\@anim at fg{\@anim at colour\space setgray}%
-    \else%
-      \ifnum\@anim at tmpcnt=3\relax%
-        \xdef\@anim at fg{\@anim at colour\space setrgbcolor}%
-      \else%
-        \ifnum\@anim at tmpcnt=4\relax%
-          \xdef\@anim at fg{\@anim at colour\space setcmykcolor}%
-        \fi%
-      \fi%
-    \fi%
-  \else% pdftex and dvipdfmx
-    \ifnum\@anim at tmpcnt=\@ne\relax%
-      \xdef\@anim at fg{\@anim at colour\space G}%
-      \xdef\@anim@@@fg{\@anim at colour\space g}%
-    \else%
-      \ifnum\@anim at tmpcnt=3\relax%
-        \xdef\@anim at fg{\@anim at colour\space RG}%
-        \xdef\@anim@@@fg{\@anim at colour\space rg}%
-      \else%
-        \ifnum\@anim at tmpcnt=4\relax%
-          \xdef\@anim at fg{\@anim at colour\space K}%
-          \xdef\@anim@@@fg{\@anim at colour\space k}%
-        \fi%
-      \fi%
-    \fi%
-  \fi%
-}
-\define at key{anim at user}{buttonalpha}{%button opacity
-  \xdef\@anim at alpha{#1}%
-}
-\define at key{anim at user}{alttext}{%
-  \ifthenelse{\equal{#1}{none}}{%
-    \gdef\@anim at alttext{}%
-  }{%
-    \xdef\@anim at alttext{/Contents (#1)}%
-  }%
-}
-
 \newboolean{@anim at controls}
 \newboolean{@anim at controls@play}
 \newboolean{@anim at controls@step}
 \newboolean{@anim at controls@stop}
 \newboolean{@anim at controls@speed}
+\newboolean{@anim at ctrlleft}
+\newboolean{@anim at ctrlright}
+\newboolean{@anim at ctrlcentre}
+\newboolean{@anim at loop}
+\newboolean{@anim at autoplay}
+\newboolean{@anim at autoresume}
+\newboolean{@anim at autopause}
+\newboolean{@anim at palindrome}
+\newboolean{@anim at step}
+\newboolean{@anim at meas}
+\setboolean{@anim at nomouse}{false}
+\newboolean{@anim at draft}
+\def\@anim at mone{-1}\def\@anim at mtwo{-2}
 \def\@anim at user@controls at all{%
   \setboolean{@anim at controls}{true}%
   \setboolean{@anim at controls@play}{true}%
@@ -3027,186 +2891,334 @@
   \setboolean{@anim at controls@stop}{false}%
   \setboolean{@anim at controls@speed}{false}%
 }
-\define at key{anim at user}{controls}[all]{%
-  \@anim at user@controls at none%
-  \setkeys{anim at user@controls}{#1}%
-}
-\define at key{anim at user@controls}{all}[]{\@anim at user@controls at all}
-\define at key{anim at user@controls}{true}[]{\@anim at user@controls at all}
-\define at key{anim at user@controls}{on}[]{\@anim at user@controls at all}
-\define at key{anim at user@controls}{none}[]{\@anim at user@controls at none}
-\define at key{anim at user@controls}{false}[]{\@anim at user@controls at none}
-\define at key{anim at user@controls}{off}[]{\@anim at user@controls at none}
-\define at key{anim at user@controls}{play}[]{%
-  \setboolean{@anim at controls}{true}%
-  \setboolean{@anim at controls@play}{true}%
-}
-\define at key{anim at user@controls}{step}[]{%
-  \setboolean{@anim at controls}{true}%
-  \setboolean{@anim at controls@step}{true}%
-}
-\define at key{anim at user@controls}{stop}[]{%
-  \setboolean{@anim at controls}{true}%
-  \setboolean{@anim at controls@stop}{true}%
-}
-\define at key{anim at user@controls}{speed}[]{%
-  \setboolean{@anim at controls}{true}%
-  \setboolean{@anim at controls@speed}{true}%
-}
-
 \def\@anim at parse@ctrlsalignarg#1#2#3+#4\@nil{%
   \ifthenelse{\equal{#3}{}}{}{\def#1{#3}}%
   \ifthenelse{\equal{#4}{}}{#2=\z@}{\@anim at getalignindent#2#4\@nil}%
 }
 \def\@anim at getalignindent#1#2+\@nil{#1=#2}
-
-\newboolean{@anim at ctrlleft}
-\newboolean{@anim at ctrlright}
-\newboolean{@anim at ctrlcentre}
-\define at key{anim at user}{controlsaligned}{%
-  \@anim at parse@ctrlsalignarg\@anim at tmpvar\@anim at tmpdima#1+\@nil%
-  \ifthenelse{\equal{\@anim at tmpvar}{left}}{%
-    \setboolean{@anim at ctrlleft}{true}%
-    \setboolean{@anim at ctrlright}{false}%
-    \setboolean{@anim at ctrlcentre}{false}%
-    \xdef\@anim at ctrlsindent{\the\@anim at tmpdima}%
-  }{%
-    \ifthenelse{\equal{\@anim at tmpvar}{right}}{%
-      \setboolean{@anim at ctrlleft}{false}%
-      \setboolean{@anim at ctrlright}{true}%
-      \setboolean{@anim at ctrlcentre}{false}%
-      \xdef\@anim at ctrlsindent{\the\@anim at tmpdima}%
-    }{%
-      \ifthenelse{\equal{\@anim at tmpvar}{center}}{%
-        \setboolean{@anim at ctrlleft}{false}%
-        \setboolean{@anim at ctrlright}{false}%
-        \setboolean{@anim at ctrlcentre}{true}%
-        \xdef\@anim at ctrlsindent{\z@}%
-      }{}%
-    }%
+% helper macro to get number of colour components
+\def\@anim at colours#1{\@anim@@colours#1:\@nil}
+\def\@anim@@colours#1:#2\@nil{% helper macro to get number of colour components
+  \xdef\@anim at colour{\@anim at colour\space #1}% and to replace : by ` ' in the arg
+  \ifthenelse{\equal{#2}{}}{}{%
+    \global\advance\@anim at tmpcnt by \@ne%
+    \@anim@@colours#2\@nil%
   }%
 }
 
-\newboolean{@anim at loop}
-\define at key{anim at user}{loop}[true]{%
-  \setboolean{@anim at loop}{#1}%
+\ExplSyntaxOn
+\DeclareKeys[anim at user]{
+  label.code:n = {
+    \gdef\@anim at label{#1}
+    \ifcsname @anim@#1\endcsname
+      \PackageWarning{animate}{Label~#1~multiply~defined}
+      \ifdefined\@anim at multlabel\else
+        \gdef\@anim at 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 at widtharg{#1}
+    \ifdefined\@anim at usrwd\else
+      \global\advance\@anim at resizeflags by 4
+      \def\@anim at usrwd{}
+    \fi
+  },
+  width.value_required:n = true,
+
+  height.code:n = {
+    \gdef\@anim at heightarg{#1}
+    \ifdefined\@anim at usrht\else
+      \global\advance\@anim at resizeflags by 2
+      \def\@anim at usrht{}
+    \fi
+  },
+  height.value_required:n = true,
+
+  totalheight.code:n = {
+    \gdef\@anim at totheightarg{#1}
+    \ifdefined\@anim at usrtht\else
+      \global\advance\@anim at resizeflags by \@ne
+      \def\@anim at usrtht{}
+    \fi
+  },
+  totalheight.value_required:n = true,
+
+  keepaspectratio.legacy_if_gset:n = @anim at iso,
+  keepaspectratio.default:n = true,
+
+  bb.code:n = {\xdef\@anim at bb{bb=#1}},
+  bb.value_required:n = true,
+
+  viewport.code:n = {\xdef\@anim at viewport{viewport=#1}},
+  viewport.value_required:n = true,
+
+  trim.code:n = {\xdef\@anim at trim{trim=#1}},
+  trim.value_required:n = true,
+
+  angle.code:n = {\xdef\@anim at angle{angle=#1}},
+  angle.value_required:n = true,
+
+  pagebox.code:n = {\xdef\@anim at 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 at hiresbb,
+  hiresbb.default:n = true,
+
+  interpolate.legacy_if_gset:n = @anim at interpolate,
+  interpolate.default:n = true,
+
+  scale.tl_gset_x:N = \@anim at boxscale,
+  scale.value_required:n = true,
+
+  buttonsize.tl_gset:N = \@anim at btnsize,
+  buttonsize.value_required:n = true,
+
+  buttonbg.code:n = {
+    \global\@anim at tmpcnt=\@ne
+    \gdef\@anim at colour{}
+    \@anim at colours{#1}
+    \global\let\@anim at bgcolour\@anim at colour
+    \ifnum\if at anim@dvips 1\else\if at anim@dvisvgm 1\else0\fi\fi=1
+      \ifnum\@anim at tmpcnt=\@ne\relax
+        \xdef\@anim at bg{\@anim at colour\space setgray}
+      \else
+        \ifnum\@anim at tmpcnt=3\relax
+          \xdef\@anim at bg{\@anim at colour\space setrgbcolor}
+        \else
+          \ifnum\@anim at tmpcnt=4\relax
+            \xdef\@anim at bg{\@anim at colour\space setcmykcolor}
+          \fi
+        \fi
+      \fi
+    \else% pdftex and dvipdfmx
+      \ifnum\@anim at tmpcnt=\@ne\relax
+        \xdef\@anim at bg{\@anim at colour\space g}
+      \else
+        \ifnum\@anim at tmpcnt=3\relax
+          \xdef\@anim at bg{\@anim at colour\space rg}
+        \else
+          \ifnum\@anim at tmpcnt=4\relax
+            \xdef\@anim at bg{\@anim at colour\space k}
+          \fi
+        \fi
+      \fi
+    \fi
+  },
+  buttonbg.value_required:n = true,
+
+  buttonfg.code:n = {
+    \global\@anim at tmpcnt=\@ne
+    \gdef\@anim at colour{}
+    \@anim at colours{#1}
+    \global\let\@anim at fgcolour\@anim at colour
+    \ifnum\if at anim@dvips 1\else\if at anim@dvisvgm 1\else0\fi\fi=1
+      \ifnum\@anim at tmpcnt=\@ne\relax
+        \xdef\@anim at fg{\@anim at colour\space setgray}
+      \else
+        \ifnum\@anim at tmpcnt=3\relax
+          \xdef\@anim at fg{\@anim at colour\space setrgbcolor}
+        \else
+          \ifnum\@anim at tmpcnt=4\relax
+            \xdef\@anim at fg{\@anim at colour\space setcmykcolor}
+          \fi
+        \fi
+      \fi
+    \else% pdftex and dvipdfmx
+      \ifnum\@anim at tmpcnt=\@ne\relax
+        \xdef\@anim at fg{\@anim at colour\space G}
+        \xdef\@anim@@@fg{\@anim at colour\space g}
+      \else
+        \ifnum\@anim at tmpcnt=3\relax
+          \xdef\@anim at fg{\@anim at colour\space RG}
+          \xdef\@anim@@@fg{\@anim at colour\space rg}
+        \else
+          \ifnum\@anim at tmpcnt=4\relax
+            \xdef\@anim at fg{\@anim at colour\space K}
+            \xdef\@anim@@@fg{\@anim at colour\space k}
+          \fi
+        \fi
+      \fi
+    \fi
+  },
+  buttonfg.value_required:n = true,
+
+  buttonalpha.tl_gset_x:N = \@anim at alpha,
+  buttonalpha.value_required:n = true,
+
+  alttext.code:n = {
+    \ifthenelse{\equal{#1}{none}}{
+      \gdef\@anim at alttext{}
+    }{
+      \xdef\@anim at alttext{/Contents~(#1)}
+    }
+  },
+  alttext.value_required:n = true,
+
+  controls.multichoice:,
+  controls / all.code:n = {\@anim at user@controls at all},
+  controls / true.code:n = {\@anim at user@controls at all},
+  controls / on.code:n = {\@anim at user@controls at all},
+  controls / none.code:n = {\@anim at user@controls at none},
+  controls / false.code:n = {\@anim at user@controls at none},
+  controls / off.code:n = {\@anim at user@controls at none},
+  controls / play.code:n = {
+    \setboolean{@anim at controls}{true}
+    \setboolean{@anim at controls@play}{true}
+  },
+  controls / step.code:n = {
+    \setboolean{@anim at controls}{true}
+    \setboolean{@anim at controls@step}{true}
+  },
+  controls / stop.code:n = {
+    \setboolean{@anim at controls}{true}
+    \setboolean{@anim at controls@stop}{true}
+  },
+  controls / speed.code:n = {
+    \setboolean{@anim at controls}{true}
+    \setboolean{@anim at controls@speed}{true}
+  },
+  controls.default:n = all,
+
+  controlsaligned.code:n = {
+    \@anim at parse@ctrlsalignarg\@anim at tmpvar\@anim at tmpdima#1+\@nil
+    \ifthenelse{\equal{\@anim at tmpvar}{left}}{
+      \setboolean{@anim at ctrlleft}{true}
+      \setboolean{@anim at ctrlright}{false}
+      \setboolean{@anim at ctrlcentre}{false}
+      \xdef\@anim at ctrlsindent{\the\@anim at tmpdima}
+    }{
+      \ifthenelse{\equal{\@anim at tmpvar}{right}}{
+        \setboolean{@anim at ctrlleft}{false}
+        \setboolean{@anim at ctrlright}{true}
+        \setboolean{@anim at ctrlcentre}{false}
+        \xdef\@anim at ctrlsindent{\the\@anim at tmpdima}
+      }{
+        \ifthenelse{\equal{\@anim at tmpvar}{center}}{
+          \setboolean{@anim at ctrlleft}{false}
+          \setboolean{@anim at ctrlright}{false}
+          \setboolean{@anim at ctrlcentre}{true}
+          \xdef\@anim at ctrlsindent{\z@}
+        }{}
+      }
+    }
+  },
+  controlsaligned.value_required:n = true,
+
+  loop.legacy_if_gset:n = @anim at loop,
+  loop.default:n = true,
+
+  autoplay.code:n = {
+    \setboolean{@anim at autoplay}{#1}
+    \if at anim@autoplay\setboolean{@anim at autoresume}{false}\fi
+  },
+  autoplay.default:n = true,
+
+  autoresume.code:n = {
+    \setboolean{@anim at autoresume}{#1}
+    \if at anim@autoresume\setboolean{@anim at autoplay}{false}\fi
+  },
+  autoresume.default:n = true,
+
+  autopause.legacy_if_gset:n = @anim at autopause,
+  autopause.default:n = true,
+
+  palindrome.legacy_if_gset:n = @anim at palindrome,
+  palindrome.default:n = true,
+
+  poster.choice:, % <num> | first | last | none
+  poster / first.code:n = {\gdef\@anim at poster{0}},
+  poster / last.code:n = {\gdef\@anim at poster{-1}},
+  poster / none.code:n = {\gdef\@anim at 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 at poster{#1}
+  },
+  poster.default:n = first,
+
+  step.legacy_if_gset:n = @anim at step,
+  step.default:n = true,
+
+  draft.legacy_if_gset:n = @anim at draft,
+  draft.default:n = true,
+
+  final.code:n = {
+    \ifthenelse{\equal{#1}{true}}{
+      \setboolean{@anim at draft}{false}
+    }{
+      \setboolean{@anim at draft}{true}
+    }
+  },
+  final.default:n = true,
+
+  nomouse.legacy_if_gset:n = @anim at nomouse,
+  nomouse.default:n = true,
+
+  timeline.code:n = {
+    \IfFileExists{#1}{
+      \xdef\@anim at tmlnfile{\expandafter\zap at finalspace\@filef at und\@nil}
+      \setboolean{@anim at 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 at begin,
+  begin.value_required:n = true,
+
+  end.tl_gset:N = \@anim at end,
+  end.value_required:n = true,
+
+  every.code:n = {
+    \ifnum#1<\@ne\relax\gdef\@anim at every{1}\else\gdef\@anim at every{#1}\fi
+  },
+  every.value_required:n = true,
+
+  measure.legacy_if_gset:n = @anim at meas,
+  measure.default:n = true,
+
+  method.choices:nn = {icon,widget,ocg} {
+    \ifthenelse{\equal{#1}{icon}}{
+      \def\@anim at method{\z@}
+    }{
+      \ifthenelse{\equal{#1}{widget}}{
+        \def\@anim at method{\@ne}
+      }{
+        \ifthenelse{\equal{#1}{ocg}}{
+          \def\@anim at method{\tw@}
+        }{}
+      }
+    }
+  },
+  method.value_required:n = true,
+
+  type.tl_gset_x:N = \@anim at ftype,
+  type.value_required:n = true,
 }
-\newboolean{@anim at autoplay}
-\define at key{anim at user}{autoplay}[true]{%
-  \setboolean{@anim at autoplay}{#1}%
-  \if at anim@autoplay%
-    \setboolean{@anim at autoresume}{false}%
-  \fi%
-}
-\newboolean{@anim at autoresume}
-\define at key{anim at user}{autoresume}[true]{%
-  \setboolean{@anim at autoresume}{#1}%
-  \if at anim@autoresume%
-    \setboolean{@anim at autoplay}{false}%
-  \fi%
-}
-\newboolean{@anim at autopause}
-\define at key{anim at user}{autopause}[true]{%
-  \setboolean{@anim at autopause}{#1}%
-}
-\newboolean{@anim at palindrome}
-\define at key{anim at user}{palindrome}[true]{%
-  \setboolean{@anim at palindrome}{#1}%
-}
-\def\@anim at mone{-1}\def\@anim at mtwo{-2}
-\define at key{anim at user}{poster}[first]{% <num> | first | last | none
-  \ifthenelse{%
-    \equal{#1}{first}%
-  }{%
-    \gdef\@anim at poster{0}%
-  }{%
-    \ifthenelse{%
-      \equal{#1}{last}%
-    }{%
-      \gdef\@anim at poster{-1}%
-    }{%
-      \ifthenelse{%
-        \equal{#1}{none}%
-      }{%
-        \gdef\@anim at 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 at poster{#1}%
-      }%
-    }%
-  }%
-}
-\newboolean{@anim at step}
-\define at key{anim at user}{step}[true]{%
-  \setboolean{@anim at step}{#1}%
-}
-\newboolean{@anim at draft}
-\define at key{anim at user}{draft}[true]{%
-  \setboolean{@anim at draft}{#1}%
-}
-\define at key{anim at user}{final}[true]{%
-  \ifthenelse{\equal{#1}{true}}{%
-    \setboolean{@anim at draft}{false}%
-  }{%
-    \setboolean{@anim at draft}{true}%
-  }%
-}
-\setboolean{@anim at nomouse}{false}
-\define at key{anim at user}{nomouse}[true]{%
-  \setboolean{@anim at nomouse}{#1}%
-}
-\define at key{anim at user}{timeline}{%
-  \IfFileExists{#1}{%
-    \xdef\@anim at tmlnfile{\expandafter\zap at finalspace\@filef at und\@nil}%
-    \setboolean{@anim at timeline}{true}%
-  }{%
-    \PackageError{animate}{timeline file `#1' cannot be opened for reading%
-    }{%
-      Make sure file `#1' exists and is readable!%
-    }%
-  }%
-}
-\define at key{anim at user}{begin}{%
-  \gdef\@anim at begin{#1}%
-}
-\define at key{anim at user}{end}{%
-  \gdef\@anim at end{#1}%
-}
-\define at key{anim at user}{every}{% embed every #1th frame
-  \ifnum#1<\@ne\relax\gdef\@anim at every{1}\else\gdef\@anim at every{#1}\fi%
-}
-\newboolean{@anim at meas}
-\define at key{anim at user}{measure}[true]{%
-  \setboolean{@anim at meas}{#1}%
-}
-\define at key{anim at user}{method}{%
-  \ifthenelse{\equal{#1}{icon}}{%
-    \def\@anim at method{\z@}%
-  }{%
-    \ifthenelse{\equal{#1}{widget}}{%
-      \def\@anim at method{\@ne}%
-    }{%
-      \ifthenelse{\equal{#1}{ocg}}{%
-        \def\@anim at method{\tw@}%
-      }{}%
-    }%
-  }%
-}
-\define at key{anim at user}{useocg}[]{%
-  \PackageError{animate}{%
-    Option `useocg' has been removed.\MessageBreak%
-    Use `method=ocg' instead%
-  }{}%
-}
+\ExplSyntaxOff
 
-\define at key{anim at user}{type}{\gdef\@anim at ftype{#1}}%
-
 %macro to reset macros and booleans
 \def\@anim at reset{%
   \gdef\@anim at label{}%
@@ -3274,197 +3286,25 @@
 }
 
 %package options
-\define at key{anim at pkg}{dvips}[]{%
-  \ifthenelse{\equal{#1}{}}{}{%
-    \PackageError{animate}{%
-      Package option `dvips' does not accept arguments%
-    }{}%
-  }%
-}%
-\define at key{anim at pkg}{dvipdfmx}[]{
-  \ifthenelse{\equal{#1}{}}{}{%
-    \PackageError{animate}{%
-      Package option `dvipdfmx' does not accept arguments%
-    }{}%
-  }%
-}%
-\define at key{anim at pkg}{dvisvgm}[]{
-  \ifthenelse{\equal{#1}{}}{}{%
-    \PackageError{animate}{%
-      Package option `dvisvgm' does not accept arguments%
-    }{}%
-  }%
-}%
-\define at key{anim at pkg}{xetex}[]{
-  \ifthenelse{\equal{#1}{}}{}{%
-    \PackageError{animate}{%
-      Package option `xetex' does not accept arguments%
-    }{}%
-  }%
-}%
-\define at key{anim at pkg}{export}[]{
-  \ifthenelse{\equal{#1}{}}{}{%
-    \PackageError{animate}{%
-      Package option `export' does not accept arguments%
-    }{}%
-  }%
-}%
-\def\@anim@@bg{}
-\def\@anim@@bgcolour{}
-\define at key{anim at pkg}{buttonbg}{%background colour of buttons
-  \global\@anim at tmpcnt=\@ne%
-  \gdef\@anim at colour{}%
-  \@anim at colours#1:\@nil%
-  \global\let\@anim@@bgcolour\@anim at colour%
-  \ifnum\if at anim@dvips 1\else\if at anim@dvisvgm 1\else0\fi\fi=1%
-    \ifnum\@anim at tmpcnt=\@ne\relax%
-      \xdef\@anim@@bg{\@anim at colour\space setgray}%
-    \else%
-      \ifnum\@anim at tmpcnt=3\relax%
-        \xdef\@anim@@bg{\@anim at colour\space setrgbcolor}%
-      \else%
-        \ifnum\@anim at tmpcnt=4\relax%
-          \xdef\@anim@@bg{\@anim at colour\space setcmykcolor}%
-        \fi%
-      \fi%
-    \fi%
-  \else% pdftex and dvipdfmx
-    \ifnum\@anim at tmpcnt=\@ne\relax%
-      \xdef\@anim@@bg{\@anim at colour\space g}%
-    \else%
-      \ifnum\@anim at tmpcnt=3\relax%
-        \xdef\@anim@@bg{\@anim at colour\space rg}%
-      \else%
-        \ifnum\@anim at tmpcnt=4\relax%
-          \xdef\@anim@@bg{\@anim at colour\space k}%
-        \fi%
-      \fi%
-    \fi%
-  \fi%
-}
-
-\ifnum\if at anim@dvips 1\else\if at 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 at key{anim at pkg}{buttonfg}{%stroking colour of buttons
-  \global\@anim at tmpcnt=\@ne%
-  \gdef\@anim at colour{}%
-  \@anim at colours#1:\@nil%
-  \global\let\@anim@@fgcolour\@anim at colour%
-  \ifnum\if at anim@dvips 1\else\if at anim@dvisvgm 1\else0\fi\fi=1%
-    \ifnum\@anim at tmpcnt=\@ne\relax%
-      \xdef\@anim@@fg{\@anim at colour\space setgray}%
-    \else%
-      \ifnum\@anim at tmpcnt=3\relax%
-        \xdef\@anim@@fg{\@anim at colour\space setrgbcolor}%
-      \else%
-        \ifnum\@anim at tmpcnt=4\relax%
-          \xdef\@anim@@fg{\@anim at colour\space setcmykcolor}%
-        \fi%
-      \fi%
-    \fi%
-  \else% pdftex and dvipdfmx
-    \ifnum\@anim at tmpcnt=\@ne\relax%
-      \xdef\@anim@@fg{\@anim at colour\space G}%
-      \xdef\@anim@@@@fg{\@anim at colour\space g}%
-    \else%
-      \ifnum\@anim at tmpcnt=3\relax%
-        \xdef\@anim@@fg{\@anim at colour\space RG}%
-        \xdef\@anim@@@@fg{\@anim at colour\space rg}%
-      \else%
-        \ifnum\@anim at tmpcnt=4\relax%
-          \xdef\@anim@@fg{\@anim at colour\space K}%
-          \xdef\@anim@@@@fg{\@anim at colour\space k}%
-        \fi%
-      \fi%
-    \fi%
-  \fi%
-}
-\def\@anim@@alpha{}
-\define at key{anim at pkg}{buttonalpha}{%button opacity
-  \xdef\@anim@@alpha{#1}%
-}
 \newcount\@anim@@resizeflags
-\def\@anim@@widtharg{\width}%
-\define at key{anim at pkg}{width}{%
-  \def\@anim@@widtharg{#1}%
-  \ifdefined\@anim at pkgwd\else%
-    \advance\@anim@@resizeflags by 4%
-    \def\@anim at pkgwd{}%
-  \fi%
-}
-\def\@anim@@heightarg{\height}%
-\define at key{anim at pkg}{height}{%
-  \def\@anim@@heightarg{#1}%
-  \ifdefined\@anim at pkght\else%
-    \advance\@anim@@resizeflags by 2%
-    \def\@anim at pkght{}%
-  \fi%
-}
-\def\@anim@@totheightarg{\totalheight}%
-\define at key{anim at pkg}{totalheight}{%
-  \def\@anim@@totheightarg{#1}%
-  \ifdefined\@anim at pkgtht\else%
-    \advance\@anim@@resizeflags by \@ne%
-    \def\@anim at pkgtht{}%
-  \fi%
-}
+\def\@anim@@widtharg{\width}
+\def\@anim@@heightarg{\height}
+\def\@anim@@totheightarg{\totalheight}
 \newboolean{@anim@@iso}
-\define at key{anim at pkg}{keepaspectratio}[true]{%
-  \setboolean{@anim@@iso}{#1}%
-}
 \def\@anim@@bb{}
-\define at key{anim at pkg}{bb}{%
-  \xdef\@anim at bb{bb=#1}%
-}
 \def\@anim@@viewport{}
-\define at key{anim at pkg}{viewport}{%
-  \xdef\@anim@@viewport{viewport=#1}%
-}
 \def\@anim@@trim{}
-\define at key{anim at pkg}{trim}{%
-  \xdef\@anim@@trim{trim=#1}%
-}
 \def\@anim@@angle{}
-\define at key{anim at pkg}{angle}{%
-  \xdef\@anim@@angle{angle=#1}%
-}
-\define at key{anim at pkg}{clip}[true]{%
-  %no-op, as embedded graphics are always clipped to widget box
-}
+\def\@anim@@pagebox{}
 \newboolean{@anim@@hiresbb}
-\define at key{anim at pkg}{hiresbb}[true]{%
-  \setboolean{@anim@@hiresbb}{#1}%
-}
 \newboolean{@anim@@interpolate}
-\define at key{anim at pkg}{interpolate}[true]{%
-  \setboolean{@anim@@interpolate}{#1}%
-}
-\def\@anim@@pagebox{}
-\define at key{anim at pkg}{pagebox}{%
-  \xdef\@anim@@pagebox{pagebox=#1}%
-}
-\def\@anim@@boxscale{1}%
-\define at key{anim at pkg}{scale}{%
-  \def\@anim@@boxscale{#1}%
-}
-\def\@anim@@btnsize{1.44em}%
-\define at key{anim at 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 at version)}
-\define at key{anim at pkg}{alttext}{%
-  \ifthenelse{\equal{#1}{none}}{%
-    \gdef\@anim@@alttext{}%
-  }{%
-    \xdef\@anim@@alttext{/Contents (#1)}%
-  }%
-}
-
 \newboolean{@anim@@controls}
 \newboolean{@anim@@controls at play}
 \newboolean{@anim@@controls at step}
@@ -3484,170 +3324,301 @@
   \setboolean{@anim@@controls at stop}{false}%
   \setboolean{@anim@@controls at speed}{false}%
 }
-\define at key{anim at pkg}{controls}[all]{%
-  \@anim at pkg@controls at none%
-  \setkeys{anim at pkg@controls}{#1}%
-}
-\define at key{anim at pkg@controls}{all}[]{\@anim at pkg@controls at all}
-\define at key{anim at pkg@controls}{true}[]{\@anim at pkg@controls at all}
-\define at key{anim at pkg@controls}{on}[]{\@anim at pkg@controls at all}
-\define at key{anim at pkg@controls}{none}[]{\@anim at pkg@controls at none}
-\define at key{anim at pkg@controls}{false}[]{\@anim at pkg@controls at none}
-\define at key{anim at pkg@controls}{off}[]{\@anim at pkg@controls at none}
-\define at key{anim at pkg@controls}{play}[]{%
-  \setboolean{@anim@@controls}{true}%
-  \setboolean{@anim@@controls at play}{true}%
-}
-\define at key{anim at pkg@controls}{step}[]{%
-  \setboolean{@anim@@controls}{true}%
-  \setboolean{@anim@@controls at step}{true}%
-}
-\define at key{anim at pkg@controls}{stop}[]{%
-  \setboolean{@anim@@controls}{true}%
-  \setboolean{@anim@@controls at stop}{true}%
-}
-\define at key{anim at pkg@controls}{speed}[]{%
-  \setboolean{@anim@@controls}{true}%
-  \setboolean{@anim@@controls at speed}{true}%
-}
-
 \newboolean{@anim@@ctrlleft}
 \newboolean{@anim@@ctrlright}
 \newboolean{@anim@@ctrlcentre}
 \setboolean{@anim@@ctrlcentre}{true}
 \def\@anim@@ctrlsindent{\z@}
-\define at key{anim at pkg}{controlsaligned}{%
-  \@anim at parse@ctrlsalignarg\@anim at tmpvar\@anim at tmpdima#1+\@nil%
-  \setboolean{@anim@@ctrlcentre}{false}%
-  \ifthenelse{\equal{\@anim at tmpvar}{left}}{%
-    \setboolean{@anim@@ctrlleft}{true}%
-    \edef\@anim@@ctrlsindent{\the\@anim at tmpdima}%
-  }{%
-    \ifthenelse{\equal{\@anim at tmpvar}{right}}{%
-      \setboolean{@anim@@ctrlright}{true}%
-      \edef\@anim@@ctrlsindent{\the\@anim at tmpdima}%
-    }{\setboolean{@anim@@ctrlcentre}{true}}%
-  }%
-}
-
 \newboolean{@anim@@loop}
-\setboolean{@anim@@loop}{false}%
-\define at key{anim at pkg}{loop}[true]{%
-  \setboolean{@anim@@loop}{#1}%
-}
 \newboolean{@anim@@autoplay}
-\setboolean{@anim@@autoplay}{false}
-\define at key{anim at pkg}{autoplay}[true]{%
-  \setboolean{@anim@@autoplay}{#1}%
-  \if at anim@@autoplay\setboolean{@anim@@autoresume}{false}\fi%
-}
 \newboolean{@anim@@autoresume}
-\setboolean{@anim@@autoresume}{false}
-\define at key{anim at pkg}{autoresume}[true]{%
-  \setboolean{@anim@@autoresume}{#1}%
-  \if at anim@@autoresume\setboolean{@anim@@autoplay}{false}\fi%
-}
 \newboolean{@anim@@autopause}
-\setboolean{@anim@@autopause}{false}
-\define at key{anim at pkg}{autopause}[true]{%
-  \setboolean{@anim@@autopause}{#1}%
-}
 \newboolean{@anim@@palindrome}
-\setboolean{@anim@@palindrome}{false}
-\define at key{anim at pkg}{palindrome}[true]{%
-  \setboolean{@anim@@palindrome}{#1}%
-}
 \gdef\@anim@@poster{0}%
-\define at key{anim at 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 at key{anim at 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 at key{anim at pkg}{draft}[true]{%
-  \setboolean{@anim@@draft}{#1}%
-  \if at anim@export%
-    \setboolean{@anim@@draft}{false}%
-  \fi%
 }
-\define at key{anim at pkg}{final}[true]{%
-  \ifthenelse{\equal{#1}{true}}{%
-    \setboolean{@anim@@draft}{false}%
-  }{%
-    \setboolean{@anim@@draft}{true}%
-  }%
-}
 \newboolean{@anim@@nomouse}
-\setboolean{@anim@@nomouse}{false}
-\define at key{anim at pkg}{nomouse}[true]{%
-  \setboolean{@anim@@nomouse}{#1}%
-}
+\def\@anim@@method{\z@}%default animation method is `icon'
+\def\@anim@@ftype{}% file type (extension) of graphics
 
-%file type (extension) of graphics files  to be embedded
-\def\@anim@@ftype{}%
-\define at key{anim at pkg}{type}{\def\@anim@@ftype{#1}}%
+\ExplSyntaxOn
+\DeclareKeys[anim at pkg]{
+  width.code:n = {
+    \gdef\@anim@@widtharg{#1}
+    \ifdefined\@anim at pkgwd\else
+      \advance\@anim@@resizeflags by 4
+      \def\@anim at pkgwd{}%
+    \fi%
+  },
+  width.value_required:n = true,
 
-% animation method: icon vs. widget vs. ocg based
-\define at key{anim at pkg}{method}{%
-  \ifthenelse{\equal{#1}{icon}}{%
-    \def\@anim@@method{\z@}%
-  }{%
-    \ifthenelse{\equal{#1}{widget}}{%
-      \def\@anim@@method{\@ne}%
+  height.code:n = {
+    \gdef\@anim@@heightarg{#1}
+    \ifdefined\@anim at pkght\else
+      \advance\@anim@@resizeflags by 2
+      \def\@anim at pkght{}
+    \fi
+  },
+  height.value_required:n = true,
+
+  totalheight.code:n = {
+    \gdef\@anim@@totheightarg{#1}
+    \ifdefined\@anim at pkgtht\else
+      \advance\@anim@@resizeflags by \@ne
+      \def\@anim at 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 at tmpcnt=\@ne
+    \gdef\@anim at colour{}
+    \@anim at colours{#1}
+    \global\let\@anim@@bgcolour\@anim at colour
+    \ifnum\if at anim@dvips 1\else\if at anim@dvisvgm 1\else0\fi\fi=1
+      \ifnum\@anim at tmpcnt=\@ne\relax
+        \xdef\@anim@@bg{\@anim at colour\space setgray}
+      \else
+        \ifnum\@anim at tmpcnt=3\relax
+          \xdef\@anim@@bg{\@anim at colour\space setrgbcolor}
+        \else
+          \ifnum\@anim at tmpcnt=4\relax
+            \xdef\@anim@@bg{\@anim at colour\space setcmykcolor}
+          \fi
+        \fi
+      \fi
+    \else% pdftex and dvipdfmx
+      \ifnum\@anim at tmpcnt=\@ne\relax
+        \xdef\@anim@@bg{\@anim at colour\space g}
+      \else
+        \ifnum\@anim at tmpcnt=3\relax
+          \xdef\@anim@@bg{\@anim at colour\space rg}
+        \else
+          \ifnum\@anim at tmpcnt=4\relax
+            \xdef\@anim@@bg{\@anim at colour\space k}
+          \fi
+        \fi
+      \fi
+    \fi
+  },
+  buttonbg.value_required:n = true,
+
+  buttonfg.code:n = {
+    \global\@anim at tmpcnt=\@ne
+    \gdef\@anim at colour{}
+    \@anim@@colours#1:\@nil
+    \global\let\@anim@@fgcolour\@anim at colour
+    \ifnum\if at anim@dvips 1\else\if at anim@dvisvgm 1\else0\fi\fi=1
+      \ifnum\@anim at tmpcnt=\@ne\relax
+        \xdef\@anim@@fg{\@anim at colour\space setgray}
+      \else
+        \ifnum\@anim at tmpcnt=3\relax
+          \xdef\@anim@@fg{\@anim at colour\space setrgbcolor}
+        \else
+          \ifnum\@anim at tmpcnt=4\relax
+            \xdef\@anim@@fg{\@anim at colour\space setcmykcolor}
+          \fi
+        \fi
+      \fi
+    \else% pdftex and dvipdfmx
+      \ifnum\@anim at tmpcnt=\@ne\relax
+        \xdef\@anim@@fg{\@anim at colour\space G}
+        \xdef\@anim@@@@fg{\@anim at colour\space g}
+      \else
+        \ifnum\@anim at tmpcnt=3\relax
+          \xdef\@anim@@fg{\@anim at colour\space RG}
+          \xdef\@anim@@@@fg{\@anim at colour\space rg}
+        \else
+          \ifnum\@anim at tmpcnt=4\relax
+            \xdef\@anim@@fg{\@anim at colour\space K}
+            \xdef\@anim@@@@fg{\@anim at 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 at pkg@controls at all},
+  controls / true.code:n = {\@anim at pkg@controls at all},
+  controls / on.code:n = {\@anim at pkg@controls at all},
+  controls / none.code:n = {\@anim at pkg@controls at none},
+  controls / false.code:n = {\@anim at pkg@controls at none},
+  controls / off.code:n = {\@anim at pkg@controls at none},
+  controls / play.code:n = {
+    \setboolean{@anim@@controls}{true}
+    \setboolean{@anim@@controls at play}{true}
+  },
+  controls / step.code:n = {
+    \setboolean{@anim@@controls}{true}
+    \setboolean{@anim@@controls at step}{true}
+  },
+  controls / stop.code:n = {
+    \setboolean{@anim@@controls}{true}
+    \setboolean{@anim@@controls at stop}{true}
+  },
+  controls / speed.code:n = {
+    \setboolean{@anim@@controls}{true}
+    \setboolean{@anim@@controls at speed}{true}
+  },
+  controls.default:n = all,
+
+  controlsaligned.code:n = {
+    \@anim at parse@ctrlsalignarg\@anim at tmpvar\@anim at tmpdima#1+\@nil
+    \setboolean{@anim@@ctrlcentre}{false}
+    \ifthenelse{\equal{\@anim at tmpvar}{left}}{
+      \setboolean{@anim@@ctrlleft}{true}
+      \edef\@anim@@ctrlsindent{\the\@anim at tmpdima}
+    }{
+      \ifthenelse{\equal{\@anim at tmpvar}{right}}{
+        \setboolean{@anim@@ctrlright}{true}
+        \edef\@anim@@ctrlsindent{\the\@anim at 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 at anim@@autoplay\setboolean{@anim@@autoresume}{false}\fi
+  },
+  autoplay.default:n = true,
+
+  autoresume.code:n = {
+    \setboolean{@anim@@autoresume}{#1}
+    \if at 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 at 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}
     }%
-  }%
+  },
+  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,
 }
-\define at key{anim at pkg}{useocg}[]{%
-  \PackageError{animate}{%
-    Package option `useocg' has been removed.\MessageBreak%
-    Use `method=ocg' instead%
-  }{}%
-}
+\ExplSyntaxOff
 
-%default animation method is Icon based
-\def\@anim@@method{\z@}
+\ifnum\if at anim@dvips 1\else\if at 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 at setpkgkeys#1{\setkeys{anim at pkg}{#1}}
-\edef\@anim at pkgopts{{\@ptionlist{\@currname.\@currext}}}
-\expandafter\@anim at setpkgkeys\@anim at pkgopts
+\ProcessKeyOptions[anim at pkg]
 
 %%%%%%%%%%%%%%%%%%%%%%%%
 % JavaScript part



More information about the tex-live-commits mailing list.