diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/animate/animate.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/animate/animate.sty | 249 |
1 files changed, 148 insertions, 101 deletions
diff --git a/Master/texmf-dist/tex/latex/animate/animate.sty b/Master/texmf-dist/tex/latex/animate/animate.sty index 87ce38afa0c..e72ae9635cd 100644 --- a/Master/texmf-dist/tex/latex/animate/animate.sty +++ b/Master/texmf-dist/tex/latex/animate/animate.sty @@ -13,7 +13,7 @@ \NeedsTeXFormat{LaTeX2e} -\def\@anim@version{2018/11/30} +\def\@anim@version{2018/12/19} \ProvidesPackage{animate} [\@anim@version\space PDF & SVG animations from files and inline graphics] @@ -86,6 +86,7 @@ %(remaining package options will be processed near end of this file) \RequirePackage{graphics}%\scalebox, \resizebox, \rotatebox +\RequirePackage{zref-abspage} \if@anim@dvisvgm \setboolean{@anim@export}{false} @@ -437,9 +438,12 @@ ,height=\@anim@animheight,totalheight=\@anim@animtotalheight}% \fi% \fi% - % fingerprint "<file chksum>.<page>.<graphicx opts>" for external graphics - % for preventing re-embedding - \edef\@anim@fingerprint{\@anim@pdfmdfivesum{#3}.#4.\@anim@gropts}% + % fingerprint "<file chksum>.<page>.<graphicx opts>.<current document page>" + % of external graphics to prevent re-embedding + \edef\@anim@fingerprint{% + \@anim@pdfmdfivesum{#3}.#4.\@anim@gropts% + \if@anim@dvisvgm.\@anim@abspage\fi% + }% \edef\@anim@curxform{\@anim@getkeyval{xform:\@anim@fingerprint}}% \ifthenelse{\equal{\@anim@curxform}{}}{% % new "<file chksum>.<page>.<graphicx opts>" @@ -455,8 +459,8 @@ \vrule width \z@ height \@anim@xformnatht{\@anim@curndims} depth \@anim@xformnatdp{\@anim@curndims}% - \@anim@refxform{\@anim@curxform}% - \hss% + \@anim@refxform{\@anim@curxform}% + \hss% }% \global\let\@anim@@lastxform\@anim@curxform% \@anim@xinline{#1}{#2}{\@anim@box}{knownfile}% @@ -465,7 +469,7 @@ %creates Form XObject from box contents \def\@anim@xinline#1#2#3#4{% - \edef\@anim@status{#4}% "newfile", "knownfile" or "inline" (inline graphics) + \def\@anim@status{#4}% "newfile", "knownfile" or "inline" (inline graphics) \edef\@anim@curwd{\the\wd#3}% \edef\@anim@curht{\the\ht#3}% \edef\@anim@curdp{\the\dp#3}% @@ -487,12 +491,18 @@ \@anim@xform{1}{0}{}{}{#3}% `{1}'-->with additional resources (opacity etc.) \global\let\@anim@@lastxform\@anim@lastxform% \def\@anim@status{knownfile}% - \global\setbox#3=\hbox to \@anim@curwd{% - \vrule width \z@ height \@anim@curht depth \@anim@curdp% - \@anim@refxform{\@anim@lastxform}% - \hss% - }% - }{}% + \ifnum\@anim@needresize>\z@\relax% + \global\setbox#3=\hbox to \@anim@curwd{% + \vrule width \z@ height \@anim@curht depth \@anim@curdp% + \@anim@refxform{\@anim@lastxform}% + \hss% + }% + \fi% + }{% + \ifthenelse{\equal{\@anim@status}{knownfile}}{% + \global\let\@anim@lastxform\@anim@@lastxform% + }{}% + }% %adjust size of current frame to final animation dims, if necessary \ifnum\@anim@needresize>\z@\relax% \global\setbox#3=\hbox{% @@ -503,16 +513,14 @@ }% \ifthenelse{\equal{\@anim@status}{knownfile}}{% \@anim@xform{0}{0}{}{}{#3}% without additional Resources - \global\let\@anim@@lastxform\@anim@lastxform% }{}% \fi% %distill box with inline graphics to xobject \ifthenelse{\equal{\@anim@status}{inline}}{% \@anim@xform{1}{0}{}{}{#3}% with additional Resources - \global\let\@anim@@lastxform\@anim@lastxform% }{}% %keep a record of XObject number - \@anim@newkey{img@#2}{\@anim@@lastxform}% + \@anim@newkey{img@#2}{\@anim@lastxform}% \if@anim@timeline\else% \@anim@newkey{frmcontent@#2}{\@anim@getkeyval{img@#2},}% \@anim@makeframe{#1}{#2}% @@ -840,7 +848,7 @@ 11.5 7.5 lineto stroke } - \def\@anim@makebutton#1#2{% #1: name ; #2: current colour combination + \def\@anim@makebutton#1#2{% #1: name ; #2:current colour, alpha, ... \edef\@anim@arg{#1}% \ifx\@anim@EndLeft\@anim@arg% \@anim@xbutton{EndLeft}{% @@ -900,8 +908,8 @@ \@anim@btnstep}{#2}% \fi% } - \def\@anim@xbutton#1#2#3{% #1: name; #2: stroking commands, #3 current colour - \ifcsname btn#1:#3\endcsname\else% % combination + \def\@anim@xbutton#1#2#3{% #1: name; #2: stroking commands, + \ifcsname btn#1:#3\endcsname\else% #3: current colour+alpha+ ... combination % only create if button face doesn't exist yet \global\setbox\@anim@box=\hbox to 15bp {\vbox to 15bp {\vss% \@anim@literal{}{#2}% @@ -1123,7 +1131,7 @@ 115 75 l S } - \def\@anim@makebutton#1#2{% #1: name ; #2: current colour combination + \def\@anim@makebutton#1#2{% #1: name ; #2: current colour, alpha, ... \edef\@anim@arg{#1}% \ifx\@anim@EndLeft\@anim@arg% \@anim@xbutton{EndLeft}{% @@ -1592,7 +1600,18 @@ \fi% \fi% \@anim@reset% to default settings + \if@anim@dvisvgm% + \special{dvisvgm:raw{?nl}% + <!-- animation by LaTeX-package `animate', + https://ctan.org/tex-archive/macros/latex/contrib/animate, + v. \@anim@version\space-->% + }% + \fi% \begingroup% + %store current abs. page num in macro \@anim@abspage + \zref@labelbyprops{anim@abspage\the\@anim@num}{abspage}% + \zref@def@extractdefault{\@anim@abspage}{% + anim@abspage\the\@anim@num}{abspage}{-1}% \@anim@beginLTR% \ifcsname Ginput@path\endcsname% make use of graphic[xs] search path \let\input@path\Ginput@path% @@ -1717,8 +1736,11 @@ \if@anim@export\else% % insert <script> part \if@anim@dvisvgm\@anim@script{\the\@anim@num}\fi% - \@anim@insertwidgets{\the\@anim@num}{\@anim@bgcolour:\@anim@fgcolour:% - \@anim@alpha\if@anim@dvisvgm:\@anim@btnsize\fi\@anim@lscape}% + \@anim@insertwidgets{\the\@anim@num}{% + \@anim@bgcolour:\@anim@fgcolour:\@anim@alpha% + \if@anim@dvisvgm:\@anim@btnsize:\@anim@abspage\fi% + \@anim@lscape% + }% \fi% \fi% \@anim@endLTR% @@ -1731,7 +1753,7 @@ %inserts animation and control button widgets \newboolean{@anim@controls@firstgrp} -\def\@anim@insertwidgets#1#2{%#1:@anim@num, #2 btn colour combination +\def\@anim@insertwidgets#1#2{%#1:@anim@num, #2 btn colour, alpha, ... \vtop{% \offinterlineskip% \hbox{\@anim@animwidget{#1}}% @@ -2019,7 +2041,7 @@ } \else \def\@anim@buttonwidget#1#2#3{%#1:@anim@num, #2:action, - %#3:button face and colour combination + %#3:button face and colour+alpha+... combination \edef\@anim@arg{#2}\@anim@jstrue\@anim@mktrue% \def\@anim@annotflag{/F 0}% visible, but don't print \ifx\@anim@PlayLeft\@anim@arg\@anim@jsfalse\fi% %hidden, don't print | @@ -2078,7 +2100,18 @@ \@anim@endsanitize% \if@anim@export\else\leavevmode\fi% \@anim@reset% to default settings + \if@anim@dvisvgm% + \special{dvisvgm:raw{?nl}% + <!-- animation by LaTeX-package `animate', + https://ctan.org/tex-archive/macros/latex/contrib/animate, + v. \@anim@version\space-->% + }% + \fi% \begingroup% + %store current abs. page num in macro \@anim@abspage + \zref@labelbyprops{anim@abspage\the\@anim@num}{abspage}% + \zref@def@extractdefault{\@anim@abspage}{% + anim@abspage\the\@anim@num}{abspage}{-1}% \@anim@beginLTR% \ifdefined\NoHyper\NoHyper\fi% silently suppress any hyperref specials \ifcsname Ginput@path\endcsname% make use of graphic[xs] search path @@ -2145,8 +2178,11 @@ \if@anim@export\else% % insert <script> part \if@anim@dvisvgm\@anim@script{\the\@anim@num}\fi% - \@anim@insertwidgets{\the\@anim@num}{\@anim@bgcolour:\@anim@fgcolour:% - \@anim@alpha\if@anim@dvisvgm:\@anim@btnsize\fi\@anim@lscape}% + \@anim@insertwidgets{\the\@anim@num}{% + \@anim@bgcolour:\@anim@fgcolour:\@anim@alpha% + \if@anim@dvisvgm:\@anim@btnsize:\@anim@abspage\fi% + \@anim@lscape% + }% \fi% % if last frame used as poster, write frame num to aux file \ifnum\@anim@poster=\@anim@mone\relax% @@ -3532,9 +3568,6 @@ \fi var a#1_fps,a#1_spd;$% frames per second (FPS), speed scaling factor var a#1_setFps;$% function pointer for setting FPS - \if@anim@controls@speed - var a#1_spdIncr,a#1_spdDecr,a#1_spdReset;$% function pointers - \fi% \if@anim@meas % speed measurement var spc=String.fromCharCode(32);$% var a#1_frcnt,% frame counter @@ -3547,8 +3580,17 @@ % array of function pointers to timeline JS actions, indexed by frame number var a#1_usrJS,a#1_curjs;$% \fi - var a#1_seekFrame,a#1_stopFirst,a#1_stopLast,a#1_gotoNext,a#1_gotoPrev,% - a#1_stepBwd,a#1_stepFwd;$% + var a#1_seekFrame,a#1_gotoNext,a#1_gotoPrev;$% + var a#1_stopFirst,a#1_stopLast;$% + \if@anim@controls@play + var a#1_playPauseBwd,a#1_playPauseFwd;$% + \fi% + \if@anim@controls@step + var a#1_stepBwd,a#1_stepFwd;$% + \fi% + \if@anim@controls@speed + var a#1_spdIncr,a#1_spdDecr,a#1_spdReset;$% + \fi% \ifx\empty\@anim@label\empty\else var anim;$% \fi% @@ -3870,6 +3912,14 @@ \fi% \fi% };$% + \if@anim@controls@play + a#1_playPauseBwd=function(){% + if(a#1_playing){a#1_pause();}else{a#1_playBwd();}% + };$% + a#1_playPauseFwd=function(){% + if(a#1_playing){a#1_pause();}else{a#1_playFwd();}% + };$% + \fi% \if@anim@controls@speed a#1_spdIncr=function(){% speed up animation a#1_spd*=1.1;% @@ -4009,6 +4059,7 @@ \@anim@streamobj{}{% % \@anim@consoleshow% % console.clear();% + app.focusRect=false;% \@anim@@jsvardecls{#1}% \@anim@@jsinit{#1}% \@anim@@pojscript{#1}% @@ -4051,9 +4102,6 @@ %other trigger events in the anim widget's AA dictionary \gdef\@anim@wdgtDownJS#1{% - \if@anim@dvisvgm\else - app.focusRect=false;$% disable focus rectangle - \fi% \if@anim@step\else % pause on MouseDown try{if(a#1_playing){a#1_pause();}}catch(e){}$% \fi% @@ -4124,9 +4172,6 @@ %actions for control buttons \gdef\@anim@btnJS#1#2{% - \if@anim@dvisvgm\else - app.focusRect=false;% - \fi% \ifx#2\@anim@EndLeft a#1_stopFirst();% \else% @@ -4134,10 +4179,10 @@ a#1_stepBwd();% \else% \ifx#2\@anim@PlayPauseLeft - if(a#1_playing){a#1_pause();}else{a#1_playBwd();}% + a#1_playPauseBwd();% \else% \ifx#2\@anim@PlayPauseRight - if(a#1_playing){a#1_pause();}else{a#1_playFwd();}% + a#1_playPauseFwd();% \else% \ifx#2\@anim@StepRight a#1_stepFwd();% @@ -4162,73 +4207,75 @@ $<defs>$% <script type="text/javascript">$% <![CDATA[$% - \@anim@@jsvardecls{#1}% - function onload(){$% - \@anim@@jsinit{#1}% - \if@anim@nomouse\else - document.getElementById('anm#1').addEventListener('mouseup',% - onMouseUpWdgt);$% - document.getElementById('anm#1').addEventListener('mousedown',% - onMouseDownWdgt);$% - document.getElementById('anm#1').addEventListener('touchend',% - onTouchEndWdgt);$% - document.getElementById('anm#1').addEventListener('touchstart',% - onTouchStartWdgt);$% - document.getElementById('anm#1').addEventListener('touchmove',% - onTouchMove);$% - \fi% - onvisible();$% in case of `autoplay' option - }$% - function onvisible(){$% - \@anim@@pojscript{#1}% - }$% - function onhidden(){$% - \@anim@@pcjscript{#1}% - }$% - function onVisibilityChange(){$% - if(document.hidden){% - try{onhidden();}catch(e){}% - }else{% - try{onvisible();}catch(e){}% + \@anim@@jsvardecls{#1}% variables that are supposed to be global + (function(){$% IIFE (self-executing anon. function) to limit scope + function onload(){$% + \@anim@@jsinit{#1}% + \if@anim@nomouse\else + document.getElementById('anm#1').addEventListener('mouseup',% + onMouseUpWdgt);$% + document.getElementById('anm#1').addEventListener('mousedown',% + onMouseDownWdgt);$% + document.getElementById('anm#1').addEventListener('touchend',% + onTouchEndWdgt);$% + document.getElementById('anm#1').addEventListener('touchstart',% + onTouchStartWdgt);$% + document.getElementById('anm#1').addEventListener('touchmove',% + onTouchMove);$% + \fi% + onvisible();$% in case of `autoplay' option }$% - }$% - document.addEventListener('visibilitychange',onVisibilityChange);$% - window.addEventListener('load',onload);$% - \if@anim@nomouse\else - var permPause#1=false; - function onWidgetUpAction(event){$% - \@anim@wdgtUpJS{#1}% + function onvisible(){$% + \@anim@@pojscript{#1}% }$% - function onTouchStartWdgt(event){$% - event.preventDefault();$% - event.stopPropagation();$% - permPause#1=false; - \@anim@wdgtDownJS{#1}% + function onhidden(){$% + \@anim@@pcjscript{#1}% }$% - function onTouchEndWdgt(event){$% - event.preventDefault();$% - event.stopPropagation();$% - if(event.targetTouches.length>0){permPause#1=true;}$% - else{$% - if(permPause#1){permPause#1=false;}$% - else{onWidgetUpAction(event);}$% + function onVisibilityChange(){$% + if(document.hidden){% + try{onhidden();}catch(e){}% + }else{% + try{onvisible();}catch(e){}% }$% }$% - function onTouchMove(event){$% - event.preventDefault();$% - event.stopPropagation();$% - }$% - function onMouseDownWdgt(event){$% - event.preventDefault();$% - event.stopPropagation();$% - \@anim@wdgtDownJS{#1}% - }$% - function onMouseUpWdgt(event){$% - event.preventDefault();$% - event.stopPropagation();$% - onWidgetUpAction(event);$% - }$% - \fi% + document.addEventListener('visibilitychange',onVisibilityChange);$% + window.addEventListener('load',onload);$% + \if@anim@nomouse\else + var permPause#1=false; + function onWidgetUpAction(event){$% + \@anim@wdgtUpJS{#1}% + }$% + function onTouchStartWdgt(event){$% + event.preventDefault();$% + event.stopPropagation();$% + permPause#1=false; + \@anim@wdgtDownJS{#1}% + }$% + function onTouchEndWdgt(event){$% + event.preventDefault();$% + event.stopPropagation();$% + if(event.targetTouches.length>0){permPause#1=true;}$% + else{$% + if(permPause#1){permPause#1=false;}$% + else{onWidgetUpAction(event);}$% + }$% + }$% + function onTouchMove(event){$% + event.preventDefault();$% + event.stopPropagation();$% + }$% + function onMouseDownWdgt(event){$% + event.preventDefault();$% + event.stopPropagation();$% + \@anim@wdgtDownJS{#1}% + }$% + function onMouseUpWdgt(event){$% + event.preventDefault();$% + event.stopPropagation();$% + onWidgetUpAction(event);$% + }$% + \fi% + })();$% end of IIFE ]]>$% </script>$% </defs>% |