summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryanimations.code.tex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryanimations.code.tex')
-rw-r--r--Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryanimations.code.tex904
1 files changed, 904 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryanimations.code.tex b/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryanimations.code.tex
new file mode 100644
index 00000000000..f4dd1716932
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryanimations.code.tex
@@ -0,0 +1,904 @@
+% Copyright 2016 by Till Tantau
+%
+% This file may be distributed and/or modified
+%
+% 1. under the LaTeX Project Public License and/or
+% 2. under the GNU Public License.
+%
+% See the file doc/generic/pgf/licenses/LICENSE for more details.
+
+\ProvidesFileRCS{tikzlibraryanimations.code.tex}
+
+\usepgfmodule{animations}%
+
+
+
+% Scope syntax extension:
+
+\def\tikz@collect@scope@anims#1{%
+ \let\tikz@scope@anims\pgfutil@empty%
+ \let\tikz@collect@command#1%
+ \tikz@collect@scope@anims@parse%
+}%
+\def\tikz@collect@scope@anims@parse{%
+ \pgfutil@ifnextchar[{\tikz@collect@scope@anims@opt}{%
+ \pgfutil@ifnextchar:{\tikz@collect@scope@anims@go}{%
+ \tikz@collect@scope@anims@done}}%]
+}%
+\def\tikz@collect@scope@anims@done{%
+ \expandafter\tikz@collect@command\expandafter[\tikz@scope@anims]%
+}%
+\def\tikz@collect@scope@anims@opt[{%]
+ \expandafter\tikz@collect@command\expandafter[\tikz@scope@anims%]
+}%
+\def\tikz@collect@scope@anims@go:#1=#2{%
+ \expandafter\def\expandafter\tikz@scope@anims\expandafter{\tikz@scope@anims animate={myself:={:{#1}={#2}}},}%
+ \tikz@collect@scope@anims@parse%
+}%
+
+
+
+
+%
+% The main keys:
+%
+
+\def\tikzanimateset{\pgfqkeys{/tikz/animate}}%
+\tikzanimateset{
+ .code={
+ \pgfkeys{/handlers/first char syntax=true}
+ \pgfkeyssetvalue{/handlers/first char syntax/the character "}{\tikz@animation@value}%
+ \def\tikz@anim@t{0}%
+ \def\tikz@anim@t@base{0}%
+ \def\tikz@anim@t@current{0}%
+ \tikzanimateset{#1}
+ },
+ scope/.code=\tikz@anim@scope{#1}{}{},
+ sync/.code=\tikz@anim@sync@scope{#1}{}{},
+ entry/.code=\tikz@anim@make@entry,
+ object/.code=\tikz@anim@set@object{#1},
+ attribute/.code=\tikz@anim@set@attr{#1},
+ id/.code=\tikz@anim@set@id{#1},
+ time/.code=\tikz@anim@set@time{#1},
+ value/.code=\tikz@anim@add{\tikz@anim@value{#1}},%
+ remember/.code=\pgfmathadd@{\tikz@anim@t}{\tikz@anim@t@base}\global\let#1\pgfmathresult,
+ resume/.code=\tikz@anim@resume{#1},
+ fork/.code={\tikz@anim@parse@time{#1}\pgfmathadd@\tikz@anim@t\tikz@anim@t@base\let\tikz@anim@t@base\pgfmathresult\def\tikz@anim@t{0}},
+ fork/.default = 0later,
+ base/.style={scope={/utils/exec=\let\tikz@animation@time\tikz@anim@base@text,#1,entry}},
+}%
+
+\tikzset{
+ make snapshot of/.code=\edef\tikz@temp{#1}\ifx\tikz@temp\pgfutil@empty\else\pgfsnapshot{#1}\fi,
+ make snapshot after/.code=\edef\tikz@temp{#1}\ifx\tikz@temp\pgfutil@empty\else\pgfsnapshotafter{#1}\fi,
+ make snapshot if necessary/.code=\ifpgfsysanimationsupported\else\pgfsnapshot{#1}\fi,
+ make snapshot if necessary/.default=0s,
+}%
+
+\def\tikz@anim@scope#1#2#3{%
+ {#2\tikzanimateset{#1}#3}%
+}%
+\def\tikz@anim@sync@scope#1#2#3{%
+ {%
+ #2%
+ \tikzanimateset{#1}%
+ #3%
+ \pgfmathadd@{\tikz@anim@t}{\tikz@anim@t@base}%
+ \expandafter%
+ }\expandafter\pgfmathsubtract@\expandafter{\pgfmathresult}{\tikz@anim@t@base}%
+ \tikz@anim@set@time{\pgfmathresult}%
+}%
+
+\def\tikz@anim@set@time#1{%
+ \tikz@anim@parse@time{#1}%
+ \let\tikz@anim@t@current\tikz@anim@t%
+ \pgfmathadd@\tikz@anim@t\tikz@anim@t@base%
+ \let\tikz@animation@time\pgfmathresult%
+}%
+
+\def\tikz@anim@value#1{%
+ \def\tikz@anim@result{#1}
+ \ifx\tikz@anim@result\pgf@special@current@text%
+ \else%
+ \ifx\tikz@animation@parser\relax%
+ \else%
+ \tikz@animation@parser{#1}%
+ \fi%
+ \fi%
+}%
+
+
+\def\tikz@anim@resume#1{%
+ \pgfparsetime{#1}%
+ \pgfmathsubtract@{\pgftimeresult}{\tikz@anim@t@base}%
+ \tikz@anim@set@time{\pgfmathresult}%
+}%
+
+
+% The object--attribute entries are of the following forms:
+%
+% objects:attributes
+% objects:attributes_id
+%
+
+\def\tikz@animation@syntax@check#1#2{%
+ \def\tikz@animation@rest{#1}%
+ \expandafter\pgfutil@in@\expandafter:\expandafter{\tikz@key}%
+ \ifpgfutil@in@%
+ \expandafter\tikz@anim@parse@colon\tikz@key\pgf@stop%
+ \else%
+ #2%
+ \fi%
+}%
+
+\def\tikz@anim@parse@colon#1:#2\pgf@stop{%
+ \expandafter\tikz@anim@sync@scope\expandafter{\tikz@animation@rest}{%
+ \tikz@anim@set@object{#1}%
+ \pgfutil@in@_{#2}%
+ \ifpgfutil@in@%
+ \tikz@anim@parse@under#2\pgf@stop%
+ \else%
+ \tikz@anim@parse@under#2_\pgf@stop%
+ \fi%
+ }{\tikz@anim@make@entry}%
+}%
+
+\def\tikz@anim@parse@under#1_#2\pgf@stop{%
+ \tikz@anim@set@attr{#1}%
+ \tikz@anim@set@id{#2}%
+}%
+
+\def\tikz@anim@set@attr#1{%
+ \pgfkeys@spdef\tikz@anim@a{#1}%
+ \ifx\tikz@anim@a\pgfutil@empty%
+ \else%
+ \let\tikz@anim@tl@attributes\tikz@anim@a%
+ \fi%
+}%
+
+\def\tikz@anim@set@id#1{%
+ \pgfkeys@spdef\tikz@anim@a{#1}%
+ \ifx\tikz@anim@a\pgfutil@empty%
+ \else%
+ \let\tikz@anim@tl@id\tikz@anim@a%
+ \fi%
+}%
+
+\def\tikz@anim@set@object#1{%
+ \pgfkeys@spdef\tikz@anim@a{#1}%
+ \ifx\tikz@anim@a\pgfutil@empty%
+ \else%
+ \let\tikz@anim@tl@objects\tikz@anim@a%
+ \fi%
+}%
+
+
+%
+% Parsing of values
+%
+
+\def\tikz@animation@value#1{%
+ \tikz@animation@value@parser#1\pgf@stop%
+}%
+
+\def\tikz@animation@value@parser"#1"{%
+ \def\tikz@animation@value@head{#1}%
+ \pgfutil@ifnextchar\pgf@stop{\tikz@animation@value@rest=}{%
+ \pgfutil@ifnextchar b\tikz@animation@value@rest@base\tikz@animation@value@rest%
+ }%
+}%
+\def\tikz@animation@value@rest=#1\pgf@stop{%
+ \tikz@anim@sync@scope{#1}{\expandafter\tikz@anim@add\expandafter{\expandafter\tikz@anim@value\expandafter{\tikz@animation@value@head}}}{\tikz@anim@make@entry}%
+}%
+
+\def\tikz@animation@value@rest@base base{%
+ \tikz@anim@sync@scope{}{/utils/exec=\let\tikz@animation@time\tikz@anim@base@text\expandafter\tikz@anim@add\expandafter{\expandafter\tikz@anim@value\expandafter{\tikz@animation@value@head}}}{\tikz@anim@make@entry}%
+ \pgfutil@ifnextchar\pgf@stop{\tikz@animation@value@rest=}{\tikz@animation@value@rest}%
+}%
+
+
+
+
+%
+% The parsers
+%
+
+\def\tikz@anim@simple@parse#1{} % nothing to do, \def\tikz@anim@result{#1} is already done
+
+\def\tikz@anim@slant@parse#1{\pgfmathsetmacro\tikz@anim@result{atan(#1)}}%
+
+\def\tikz@anim@dashpattern@parse#1{%
+ \pgfmathsetmacro\tikz@anim@dash@phase{\tikz@dashphase}%
+ \def\tikz@dashpattern{}%
+ \expandafter\tikz@scandashon\pgfutil@gobble#1o\@nil%
+ \edef\tikz@anim@result{{\tikz@dashpattern}{\tikz@anim@dash@phase pt}}%
+}%
+\def\tikz@anim@dashoffset@parse#1{%
+ \pgfmathparse{#1}%
+ \edef\tikz@anim@result{{\tikz@dashpattern}{\pgfmathresult pt}}%
+}%
+\def\tikz@anim@dash@parse#1{%
+ \tikz@anim@dash@parse@#1\pgf@stop%
+}%
+\def\tikz@anim@dash@parse@#1phase#2\pgf@stop{%
+ \pgfmathsetmacro\tikz@anim@dash@phase{#2}%
+ \def\tikz@dashpattern{}%
+ \expandafter\tikz@scandashon\pgfutil@gobble#1o\@nil%
+ \edef\tikz@anim@result{{\tikz@dashpattern}{\tikz@anim@dash@phase pt}}%
+}%
+
+\def\tikz@anim@xshift@parse#1{\pgfmathparse{#1}\edef\tikz@anim@result{\noexpand\pgfqpoint{\pgfmathresult pt}{0pt}}}%
+\def\tikz@anim@yshift@parse#1{\pgfmathparse{#1}\edef\tikz@anim@result{\noexpand\pgfqpoint{0pt}{\pgfmathresult pt}}}%
+
+\def\tikz@anim@xscale@parse#1{\pgfmathparse{#1}\edef\tikz@anim@result{\pgfmathresult,1}}%
+\def\tikz@anim@yscale@parse#1{\pgfmathparse{#1}\edef\tikz@anim@result{1,\pgfmathresult}}%
+
+\def\tikz@anim@shift@parse#1{\tikz@scan@one@point\tikz@anim@do@shift#1}%
+\def\tikz@anim@do@shift#1{\def\tikz@anim@result{#1}}%
+
+\def\tikz@anim@position@parse#1{%
+ \begingroup%
+ \let\tikz@transform=\relax%
+ \pgf@xc-\pgf@pt@x%
+ \pgf@yc-\pgf@pt@y%
+ \pgfsettransform\tikz@anim@saved@transform%
+ \tikz@scan@one@point\tikz@anim@do@position#1}%
+\def\tikz@anim@do@position#1{%
+ \pgf@process{\pgfpointtransformed{#1}}%
+ \advance\pgf@x by\pgf@xc%
+ \advance\pgf@y by\pgf@yc%
+ \xdef\tikz@anim@temp{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
+ \endgroup%
+ \let\tikz@anim@result\tikz@anim@temp%
+}%
+
+\def\tikz@anim@view@parse#1{\tikz@anim@view@parse@#1\pgf@stop}%
+\def\tikz@anim@view@parse@{%
+ \pgfutil@ifnextchar({\tikz@scan@one@point\tikz@anim@view@parse@a}{\tikz@anim@view@node}%
+}%
+\def\tikz@anim@view@parse@a#1{%
+ \def\tikz@anim@result{{#1}}%
+ \pgfutil@ifnextchar r{\tikz@anim@view@parsed@rec}{\tikz@scan@one@point\tikz@anim@view@parse@b}%
+}%
+\def\tikz@anim@view@parsed@rec rectangle{\tikz@scan@one@point\tikz@anim@view@parse@b}%
+\def\tikz@anim@view@parse@b#1{%
+ \expandafter\def\expandafter\tikz@anim@result\expandafter{\tikz@anim@result{#1}}%
+ \pgfutil@ifnextchar\pgf@stop\pgfutil@gobble{\tikzerror{Wrong view syntax}}%
+}%
+\def\tikz@anim@view@node#1\pgf@stop{%
+ \expandafter\ifx\csname pgf@sh@ns@#1\endcsname\relax%
+ \tikzerror{Undefined node '#1'}%
+ \else%
+ % Compute a bounding box for the node:
+ {%
+ \pgf@process{\pgfpointanchor{#1}{west}}%
+ \pgf@xa\pgf@x \pgf@ya\pgf@y
+ \pgf@xb\pgf@x \pgf@yb\pgf@y
+ \pgf@process{\pgfpointanchor{#1}{north}}%
+ \ifdim\pgf@x<\pgf@xa \pgf@xa=\pgf@x\fi%
+ \ifdim\pgf@x>\pgf@xb \pgf@xb=\pgf@x\fi%
+ \ifdim\pgf@y<\pgf@ya \pgf@ya=\pgf@y\fi%
+ \ifdim\pgf@y>\pgf@yb \pgf@yb=\pgf@y\fi%
+ \pgf@process{\pgfpointanchor{#1}{south}}%
+ \ifdim\pgf@x<\pgf@xa \pgf@xa=\pgf@x\fi%
+ \ifdim\pgf@x>\pgf@xb \pgf@xb=\pgf@x\fi%
+ \ifdim\pgf@y<\pgf@ya \pgf@ya=\pgf@y\fi%
+ \ifdim\pgf@y>\pgf@yb \pgf@yb=\pgf@y\fi%
+ \pgf@process{\pgfpointanchor{#1}{east}}%
+ \ifdim\pgf@x<\pgf@xa \pgf@xa=\pgf@x\fi%
+ \ifdim\pgf@x>\pgf@xb \pgf@xb=\pgf@x\fi%
+ \ifdim\pgf@y<\pgf@ya \pgf@ya=\pgf@y\fi%
+ \ifdim\pgf@y>\pgf@yb \pgf@yb=\pgf@y\fi%
+ \xdef\tikz@anim@result{{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}{\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}}
+ }%
+ \fi%
+}%
+
+\def\tikz@anim@path@parse#1{%
+ {%
+ \setbox0=\hbox{{% protext against side effects
+ \pgfinterruptpath%
+ \expandafter\tikz@scan@next@command#1\pgf@stop%
+ \pgfsyssoftpath@getcurrentpath\tikz@anim@result%
+ \pgfprocessround{\tikz@anim@result}{\tikz@anim@result}%
+ \global\let\tikz@anim@result\tikz@anim@result%
+ \endpgfinterruptpath%
+ }}%
+ }%
+}%
+
+% The special along parser
+
+
+\def\tikz@anim@along#1#2{%
+ % Parse the path...
+ {%
+ \setbox0=\hbox{{% protect against side effects
+ \pgfinterruptpath%
+ \pgf@relevantforpicturesizefalse%
+ \iftikz@anim@is@position%
+ \let\tikz@transform=\relax%
+ \pgf@x-\pgf@pt@x%
+ \pgf@y-\pgf@pt@y%
+ \edef\tikz@anim@along@shift{\pgf@xc\the\pgf@x\pgf@yc\the\pgf@y}%
+ \pgfsettransformentries#1%
+ \else%
+ \pgftransformreset%
+ \fi
+ \tikz@scan@next@command#2\pgf@stop%
+ \pgfsyssoftpath@getcurrentpath\tikz@anim@parsed@path%
+ \pgfprocessround{\tikz@anim@parsed@path}{\tikz@anim@parsed@path}%
+ \iftikz@anim@is@position%
+ \tikz@anim@shift@path%
+ \global\let\tikz@anim@parsed@path\tikz@anim@patched@path%
+ \else%
+ \global\let\tikz@anim@parsed@path\tikz@anim@parsed@path%
+ \fi%
+ \endpgfinterruptpath%
+ }}%
+ }%
+ \pgfanimationset{along softpath/.expand once=\tikz@anim@parsed@path}%
+}%
+
+\def\tikz@anim@shift@path{%
+ \let\tikz@anim@patched@path\pgfutil@empty%
+ \tikz@anim@along@shift%
+ \expandafter\tikz@anim@shift@path@\tikz@anim@parsed@path\pgf@stop%
+}%
+\def\tikz@anim@shift@path@{%
+ \pgfutil@ifnextchar\pgf@stop\pgfutil@gobble{%
+ \pgfutil@ifnextchar\bgroup\tikz@anim@shift@path@sub\tikz@anim@shift@path@copy}%
+}%
+\def\tikz@anim@shift@path@copy#1{%
+ \expandafter\def\expandafter\tikz@anim@patched@path\expandafter{\tikz@anim@patched@path#1}%
+ \tikz@anim@shift@path@%
+}%
+\def\tikz@anim@shift@path@sub#1#2{%
+ \pgf@x#1%
+ \pgf@y#2%
+ \advance\pgf@x by\pgf@xc%
+ \advance\pgf@y by\pgf@yc%
+ \edef\tikz@temp{{\the\pgf@x}{\the\pgf@y}}%
+ \expandafter\tikz@anim@shift@path@copy\expandafter{\tikz@temp}%
+}%
+
+
+
+\def\tikz@anim@parse@origin#1{%
+ \tikz@scan@one@point\tikz@anim@parse@origin@#1\relax%
+}%
+\def\tikz@anim@parse@origin@#1{\tikz@anim@add{\pgfanimationset{origin={#1}}}}%
+
+
+% Internals
+
+\def\tikz@anim@tl@objects{}%
+\def\tikz@anim@tl@attributes{}%
+\def\tikz@anim@tl@id{default}%
+
+\let\tikz@anim@tl@exec@options\pgfutil@empty
+\let\tikz@anim@tl@early@options\pgfutil@empty
+
+\def\tikz@anim@add@early#1{\expandafter\def\expandafter\tikz@anim@tl@early@options\expandafter{\tikz@anim@tl@early@options#1}}%
+\def\tikz@anim@add@once@early#1{%
+ \global\advance\tikz@anim@once@count by1\relax%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\tikz@anim@tl@early@options%
+ \expandafter\expandafter\expandafter{\expandafter\tikz@anim@tl@early@options\expandafter\tikz@anim@exec@once\expandafter{\the\tikz@anim@once@count}{#1}}%
+}%
+\def\tikz@anim@add#1{\expandafter\def\expandafter\tikz@anim@tl@exec@options\expandafter{\tikz@anim@tl@exec@options#1}}%
+\def\tikz@anim@add@once#1{%
+ \global\advance\tikz@anim@once@count by1\relax%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\tikz@anim@tl@exec@options%
+ \expandafter\expandafter\expandafter{\expandafter\tikz@anim@tl@exec@options\expandafter\tikz@anim@exec@once\expandafter{\the\tikz@anim@once@count}{#1}}%
+}%
+\newcount\tikz@anim@once@count%
+\def\tikz@anim@exec@once#1#2{%
+ \expandafter\ifx\csname tikz@anim@once@#1\endcsname\pgf@stop%
+ \else%
+ \expandafter\let\csname tikz@anim@once@#1\endcsname\pgf@stop%
+ #2%
+ \fi%
+}%
+
+\newif\iftikz@anim@do@entry
+
+\def\tikz@anim@make@entry{%
+ \tikz@anim@do@entrytrue%
+ \ifx\tikz@anim@tl@objects\pgfutil@empty\tikz@anim@do@entryfalse\fi%
+ \ifx\tikz@anim@tl@attributes\pgfutil@empty\tikz@anim@do@entryfalse\fi%
+ \ifx\tikz@anim@tl@exec@options\pgfutil@empty\ifx\tikz@anim@tl@early@options\pgfutil@empty\tikz@anim@do@entryfalse\fi\fi%
+ \iftikz@anim@do@entry%
+ \foreach\tikz@anim@tl@object in\tikz@anim@tl@objects{%
+ \expandafter\tikzanimationattributesset\expandafter{\tikz@anim@tl@attributes}%
+ }%
+ \fi%
+}%
+
+\def\tikzanimationattributesset#1{\pgfqkeys{/tikz/animate/attributes}{#1}}%
+
+\tikzanimationattributesset{
+ .unknown/.code={
+ \let\tikz@anim@attribute@name\pgfkeyscurrentname
+ \expandafter\let\expandafter\pgf@temp\csname tikz@anim@def@pgf@attr@\tikz@anim@attribute@name\endcsname%
+ \ifx\pgf@temp\relax%
+ \tikzerror{Unknown animation attribute '\tikz@anim@attribute@name'}%
+ \else%
+ \expandafter\tikz@timeline@config\expandafter\tikz@anim@tl@object\expandafter\tikz@anim@attribute@name\expandafter\tikz@anim@tl@id\expandafter{\tikz@anim@configs}%
+ \edef\pgf@marshal{\noexpand\tikz@timeline@entry{\tikz@anim@tl@object}{\tikz@anim@attribute@name}{\tikz@anim@tl@id}}%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgf@marshal\expandafter\expandafter\expandafter{\expandafter\pgf@marshal\expandafter{\tikz@anim@tl@early@options}}%
+ \expandafter\expandafter\expandafter\pgf@marshal\expandafter\expandafter\expandafter{\expandafter\expandafter\expandafter\tikz@anim@entry\expandafter\expandafter\expandafter{\expandafter\tikz@anim@tl@exec@options\expandafter\def\expandafter\tikz@animation@time\expandafter{\tikz@animation@time}}}%
+ \fi%
+ }
+}%
+\let\tikz@anim@configs\pgfutil@empty
+
+\def\tikz@anim@entry#1{%
+ % Reset splines and value:
+ \let\tikz@anim@result\pgfutil@empty%
+ \pgf@anim@reset@linear%
+ #1%
+ \ifx\tikz@anim@result\pgfutil@empty%
+ \else%
+ \ifx\tikz@animation@time\pgfutil@empty%
+ \else%
+ \ifx\tikz@animation@time\tikz@anim@base@text%
+ \expandafter\pgf@anim@base\expandafter{\tikz@anim@result}%
+ \else%
+ \expandafter\expandafter\expandafter\pgf@anim@entry%
+ \expandafter\expandafter\expandafter{\expandafter\tikz@animation@time\expandafter}\expandafter{\tikz@anim@result}%
+ \fi%
+ \fi%
+ \fi%
+}%
+\let\tikz@animation@time\pgfutil@empty%
+\def\tikz@anim@base@text{base}%
+
+\tikzanimateset{
+ .unknown/.code={%
+ \let\tikz@key\pgfkeyscurrentname%
+ \tikz@animation@syntax@check{#1}{\tikz@anim@options{#1}}%
+ }
+}%
+
+
+\def\tikz@anim@options#1{
+ \let\tikz@anim@key\pgfkeyscurrentname%
+ \pgfqkeys{/tikz/animate/options}{\tikz@anim@key/.try={#1}}%
+ \ifpgfkeyssuccess%
+ \else%
+ \def\tikz@anim@unparsed@value{#1}%
+ \expandafter\tikz@anim@time@test\tikz@anim@key\pgf@stop%
+ \fi%
+}%
+
+\tikzanimateset{
+ options/.cd,
+ name/.code=\tikz@anim@add{\pgfanimationset{name={#1}}},
+ forever/.code=\tikz@anim@add{\pgfanimationset{freeze at end}},
+ freeze/.code=\tikz@anim@add{\pgfanimationset{freeze at end}},
+ restart/.code=\tikz@anim@add{\pgfanimationset{restart={#1}}},
+ repeats/.code=\tikz@anim@add{\pgfanimationset{repeats={#1}}},
+ repeats/.default=,
+ repeat/.code=\tikz@anim@add{\pgfanimationset{repeats={#1}}},
+ repeat/.default=,
+ begin/.code=\tikz@anim@add@once{\pgfanimationset{begin={#1}}},
+ end/.code=\tikz@anim@add@once{\pgfanimationset{end={#1}}},
+ begin on/.code=\tikz@anim@event{begin}{#1},
+ end on/.code=\tikz@anim@event{begin}{#1},
+ begin snapshot/.code=\tikz@anim@add{\pgfanimationset{begin snapshot={#1}}},
+ origin/.code=\tikz@anim@parse@origin{#1},
+ transform/.code=\tikz@anim@add{\pgfanimationset{transform={\let\tikz@transform\relax\tikzset{#1}}}},
+ along/.code=\tikz@anim@handle@along#1\pgf@stop,
+ entry control/.code=\tikz@anim@add{\pgfanimationset{entry control=#1}},
+ exit control/.code=\tikz@anim@add{\pgfanimationset{exit control=#1}},
+ stay/.code=\tikz@anim@add{\pgfanimationset{stay}},
+ jump/.code=\tikz@anim@add{\pgfanimationset{jump}},
+ ease/.style={
+ entry control={1-(#1)}{1},
+ exit control={#1}{0}
+ },
+ ease/.default=0.5,
+ ease in/.style={
+ entry control={1-(#1)}{1},
+ },
+ ease in/.default=0.5,
+ ease out/.style={
+ exit control={#1}{0},
+ },
+ ease out/.default=0.5,
+ arrows/.code=\tikz@anim@add@early{\pgfanimationset{arrows={#1}}},
+ shorten >/.code=\tikz@anim@add@early{\pgfanimationset{shorten >={#1}}},
+ shorten </.code=\tikz@anim@add@early{\pgfanimationset{snorten <={#1}}},
+}%
+\newif\iftikz@anim@along
+
+\def\tikz@anim@t{0}%
+
+\def\tikz@anim@handle@along#1{%
+ \pgfutil@ifnextchar s{\tikz@anim@handle@sloped{#1}}{\tikz@anim@handle@upright{#1}}%
+}%
+\def\tikz@anim@handle@sloped#1sloped{%
+ \pgfgettransform\tikz@anim@trans@pre%
+ \expandafter\tikz@anim@add@once%
+ \expandafter{%
+ \expandafter\tikz@anim@along\expandafter{\tikz@anim@trans@pre}{#1}%
+ \pgfsysanimkeycanvastransform{%
+ \pgf@xc\pgf@pt@x%
+ \pgf@yc\pgf@pt@y%
+ \pgftransformreset%
+ \pgf@pt@x\pgf@xc%
+ \pgf@pt@y\pgf@yc%
+ {\pgflowlevelsynccm}%
+ }{\pgftransforminvert\pgflowlevelsynccm}%
+ \pgfanimationset{rotate along=true}%
+ }%
+ \def\tikz@anim@configs{\tikz@anim@alongtrue}%
+ \tikz@anim@handle@in%
+}%
+\def\tikz@anim@handle@upright#1upright{%
+ \pgfgettransform\tikz@anim@trans@pre%
+ \expandafter\tikz@anim@add@once%
+ \expandafter{%
+ \expandafter\tikz@anim@along\expandafter{\tikz@anim@trans@pre}{#1}%
+ \pgfsysanimkeycanvastransform{}{}%
+ }%
+ \def\tikz@anim@configs{\tikz@anim@alongtrue}%
+ \tikz@anim@handle@in%
+}%
+\def\tikz@anim@handle@in{%
+ \pgfutil@ifnextchar i{\tikz@anim@handle@in@yes}{\tikz@anim@handle@in@no}%
+}%
+\def\tikz@anim@handle@in@no\pgf@stop{}%
+\def\tikz@anim@handle@in@yes in#1\pgf@stop{%
+ \tikzanimateset{scope={time=0,value=0,entry,time=#1,value=1,entry}}%
+}%
+
+
+
+\def\tikz@anim@event#1#2{%
+ {%
+ % evaluate #2 once to determine the id now
+ \let\pgf@anim@id\pgfutil@empty%
+ \pgfqkeys{/pgf/animation/events}{#2}%
+ \expandafter}%
+ \expandafter\def\expandafter\tikz@anim@temp@id\expandafter{\pgf@anim@id}%
+ \ifx\tikz@anim@temp@id\pgfutil@empty%
+ \def\tikz@temp{#1 on={of id=\tikz@anim@current@id,#2}}%
+ \else
+ \expandafter\tikz@anim@event@setter\expandafter{\tikz@anim@temp@id}{#1}{#2}%
+ \fi%
+ \expandafter\tikz@anim@add@once\expandafter{\expandafter\pgfanimationset\expandafter{\tikz@temp}}%
+}%
+\def\tikz@anim@event@setter#1#2#3{%
+ \def\tikz@temp{#2 on={#3,of id=#1}}%
+}%
+
+\def\tikz@anim@time@test#1#2\pgf@stop{%
+ \edef\tikz@temp{\meaning#1}%
+ \expandafter\ifx\csname tikz@anim@test@\tikz@temp\endcsname\relax%
+ \tikzerror{I do not know the timing key '#1#2' to which you passed '\tikz@anim@unparsed@value'}%
+ \else%
+ \expandafter\tikz@anim@sync@scope\expandafter{\tikz@anim@unparsed@value}{\tikz@anim@set@time{#1#2}}{\tikz@anim@make@entry}%
+ \fi%
+}%
+
+\def\tikz@anim@parse@time#1{%
+ \pgfutil@in@{later\pgf@stop}{#1\pgf@stop}%
+ \ifpgfutil@in@%
+ \tikz@anim@parse@later#1\pgf@stop%
+ \else%
+ \pgfparsetime{#1}\let\tikz@anim@t\pgftimeresult%
+ \fi%
+}%
+\def\tikz@anim@parse@later#1later\pgf@stop{%
+ \pgfparsetime{#1+\tikz@anim@t@current}\let\tikz@anim@t\pgftimeresult%
+}%
+
+\expandafter\let\csname tikz@anim@test@the character 0\endcsname\pgfutil@empty
+\expandafter\let\csname tikz@anim@test@the character 1\endcsname\pgfutil@empty
+\expandafter\let\csname tikz@anim@test@the character 2\endcsname\pgfutil@empty
+\expandafter\let\csname tikz@anim@test@the character 3\endcsname\pgfutil@empty
+\expandafter\let\csname tikz@anim@test@the character 4\endcsname\pgfutil@empty
+\expandafter\let\csname tikz@anim@test@the character 5\endcsname\pgfutil@empty
+\expandafter\let\csname tikz@anim@test@the character 6\endcsname\pgfutil@empty
+\expandafter\let\csname tikz@anim@test@the character 7\endcsname\pgfutil@empty
+\expandafter\let\csname tikz@anim@test@the character 8\endcsname\pgfutil@empty
+\expandafter\let\csname tikz@anim@test@the character 9\endcsname\pgfutil@empty
+\expandafter\let\csname tikz@anim@test@the character -\endcsname\pgfutil@empty
+\expandafter\let\csname tikz@anim@test@the character +\endcsname\pgfutil@empty
+\expandafter\let\csname tikz@anim@test@the character .\endcsname\pgfutil@empty
+\expandafter\let\csname tikz@anim@test@the character (\endcsname\pgfutil@empty
+
+
+
+
+
+% Configure an animation attribute
+%
+% #1 = tikz attribute name
+% #2 = configuration
+%
+% Description:
+%
+% Sets up internals for the tikz attribute.
+
+\def\tikzanimationdefineattribute#1#2{%
+ \expandafter\def\csname tikz@anim@def@pgf@attr@#1\endcsname{#1}%
+ \expandafter\let\csname tikz@anim@def@no@node@#1\endcsname\pgfutil@empty
+ \expandafter\let\csname tikz@anim@def@is@node@#1\endcsname\pgfutil@empty
+ \expandafter\let\csname tikz@anim@def@code@#1\endcsname\pgfutil@empty
+ \expandafter\let\csname tikz@anim@def@parser@#1\endcsname\tikz@anim@simple@parse
+ \def\tikz@anim@attr{#1}%
+ \pgfkeys{/tikz/animate/@attrdef/.cd,#2}%
+}%
+
+\pgfkeys{/tikz/animate/@attrdef/.cd,
+ pgf attribute name/.code=\expandafter\def\csname tikz@anim@def@pgf@attr@\tikz@anim@attr\endcsname{#1},
+ pgf attribute name scope/.code=\expandafter\def\csname tikz@anim@def@pgf@attr@@scope@\tikz@anim@attr\endcsname{#1},
+ pgf attribute name node/.code=\expandafter\def\csname tikz@anim@def@pgf@attr@@node@\tikz@anim@attr\endcsname{#1},
+ scope type/.code=\expandafter\def\csname tikz@anim@def@no@node@\tikz@anim@attr\endcsname{#1},
+ node type/.code=\expandafter\def\csname tikz@anim@def@is@node@\tikz@anim@attr\endcsname{#1},
+ code/.code=\expandafter\def\csname tikz@anim@def@code@\tikz@anim@attr\endcsname{#1},
+ setup/.code=\expandafter\def\csname tikz@anim@def@setup@\tikz@anim@attr\endcsname{#1},
+ parser/.code=\expandafter\def\csname tikz@anim@def@parser@\tikz@anim@attr\endcsname{#1},
+}%
+
+
+% Configure an animation attribute list
+%
+% #1 = tikz attribute list name
+% #2 = list of tikz attributes
+%
+% Description:
+%
+% Sets up internals for the tikz attribute.
+
+\def\tikzanimationdefineattributelist#1#2{%
+ \tikzanimationattributesset{#1/.style={#2}}%
+}%
+
+
+
+
+% Definition of the tikz attributes
+
+
+\tikzanimationdefineattributelist{color}{@color,text}%
+\tikzanimationdefineattribute{@color}{pgf attribute name=color,node type=.background}%
+\tikzanimationdefineattribute{dash pattern}{pgf attribute name=dash,parser=dashpattern, node type=.background}%
+\tikzanimationdefineattribute{dash phase}{pgf attribute name=dash,parser=dashoffset, node type=.background}%
+\tikzanimationdefineattribute{dash}{parser=dash, node type=.background}%
+\tikzanimationdefineattribute{draw opacity}{pgf attribute name=stroke opacity}%
+\tikzanimationdefineattribute{draw}{pgf attribute name=stroke, node type=.background}%
+\tikzanimationdefineattribute{fill opacity}{}%
+\tikzanimationdefineattribute{fill}{node type=.background}%
+\tikzanimationdefineattribute{line width}{node type=.background}%
+\tikzanimationdefineattribute{path}{pgf attribute name=softpath, scope type=.path, node type=.background.path, parser=path}%
+\tikzanimationdefineattribute{opacity}{}%
+\tikzanimationdefineattribute{position}{%
+ pgf attribute name=\iftikz@anim@along motion\else translate\fi,
+ parser=\iftikz@anim@along simple\else position\fi,
+ setup=\tikz@anim@position@setup,
+}%
+\tikzanimationdefineattribute{rotate}{}%
+\tikzanimationdefineattribute{scale}{}%
+\tikzanimationdefineattribute{shift}{
+ pgf attribute name=\iftikz@anim@along motion\else translate\fi,
+ parser=\iftikz@anim@along simple\else shift\fi
+}%
+\tikzanimationdefineattribute{stage}{}%
+\tikzanimationdefineattribute{text opacity}{pgf attribute name=fill opacity, node type=.text, pgf attribute name scope=none}%
+\tikzanimationdefineattribute{text}{pgf attribute name=color, node type=.text, pgf attribute name scope=none}%
+\tikzanimationdefineattribute{view}{scope type=.view, parser=view}%
+\tikzanimationdefineattribute{visible}{}%
+\tikzanimationdefineattribute{xshift}{pgf attribute name=translate, parser=xshift}%
+\tikzanimationdefineattribute{xscale}{pgf attribute name=scale, parser=xscale}%
+\tikzanimationdefineattribute{xskew}{}%
+\tikzanimationdefineattribute{xslant}{pgf attribute name=xskew, parser=slant}%
+\tikzanimationdefineattribute{yshift}{pgf attribute name=translate, parser=yshift}%
+\tikzanimationdefineattribute{yskew}{}%
+\tikzanimationdefineattribute{yslant}{pgf attribute name=yskew, parser=slant}%
+\tikzanimationdefineattribute{yscale}{pgf attribute name=scale, parser=yscale}%
+
+
+\def\tikz@anim@position@setup{%
+ \pgfgettransform\tikz@anim@saved@transform%
+ \expandafter\def\expandafter\tikz@temp\expandafter{%
+ \expandafter\def\expandafter\tikz@anim@saved@transform\expandafter{\tikz@anim@saved@transform}%
+ \pgfsysanimkeycanvastransform{}{}%
+ \tikz@anim@is@positiontrue%
+ }%
+ \expandafter\expandafter\expandafter\def%
+ \expandafter\expandafter\expandafter\tikz@anim@initial@options%
+ \expandafter\expandafter\expandafter{\expandafter\tikz@temp\tikz@anim@initial@options}%
+}%
+\newif\iftikz@anim@is@position
+
+
+% The TikZ animation callbacks
+%
+% Description:
+%
+% The callbacks called by tikz.code.tex whenever an object is
+% created. These callbacks will add the accumulated animation code.
+
+\def\tikz@anim@id@hook{%
+ \expandafter\ifx\csname tikz@anim@att@\tikz@id@name\endcsname\relax%
+ % No named animation:
+ % Now, check for auto animation:
+ \expandafter\ifx\csname tikz@anim@att@\tikz@auto@id\endcsname\relax%
+ \else%
+ % Auto animation%
+ \ifx\tikz@id@name\pgfutil@empty% Id set?
+ % No, so set it
+ \def\tikz@id@name{@auto}%
+ \fi%
+ \pgfidrefnextuse\tikz@anim@current@id\tikz@id@name%
+ \csname tikz@anim@att@\tikz@auto@id\endcsname%
+ \expandafter\global\expandafter\let\csname tikz@anim@att@\tikz@auto@id\endcsname\relax%
+ \fi%
+ \else%
+ % Named animation:
+ \pgfidrefnextuse\tikz@anim@current@id\tikz@id@name%
+ \csname tikz@anim@att@\tikz@id@name\endcsname%
+ \csname tikz@anim@att@\tikz@auto@id\endcsname% and unnamed animation
+ \expandafter\global\expandafter\let\csname tikz@anim@att@\tikz@id@name\endcsname\relax%
+ \expandafter\global\expandafter\let\csname tikz@anim@att@\tikz@auto@id\endcsname\relax%
+ \fi%
+}%
+
+% Add hook:
+\expandafter\def\expandafter\tikz@id@hook\expandafter{\tikz@id@hook\tikz@anim@id@hook}%
+
+
+
+% Attaches an animation to a named object (named in tikz)
+%
+% #1 = name of the object. If equal to the special text "myself", the
+% next created object is meant.
+% #2 = Animation code. When this code is executed, the following
+% things will be setup:
+%
+% \iftikz@is@node will be set to true or false
+% depending on whether the name references a node.
+%
+% \tikz@id@name will be set to the name of the object,
+% typically #1, except when #1 was ".", in this case another
+% name may have been used by the user, which will be used
+% instead.
+%
+% Description:
+%
+% After the call, the next time an object named #1 is created in TikZ
+% (using name=#1), the code #2 will be executed inside a scope to
+% create an animation of the object.
+
+\def\tikzanimationattachto#1#2{%
+ {%
+ \def\tikz@anim@name{#1}%
+ \ifx\tikz@anim@name\pgfutil@empty%
+ \tikzerror{Trying to attach an animation to an unnamed object. This should not happen.}%
+ \else%
+ \expandafter\ifx\csname tikz@anim@att@\tikz@anim@name\endcsname\relax%
+ \expandafter\gdef\csname tikz@anim@att@\tikz@anim@name\endcsname{#2}%
+ \else%
+ \expandafter\let\expandafter\tikz@temp\csname tikz@anim@att@\tikz@anim@name\endcsname%
+ \expandafter\def\expandafter\tikz@temp\expandafter{\tikz@temp#2}%
+ \expandafter\global\expandafter\let\csname tikz@anim@att@\tikz@anim@name\endcsname\tikz@temp%
+ \fi%
+ \fi%
+ }%
+}%
+\def\tikz@auto@id{myself}%
+\expandafter\let\csname tikz@anim@att@\tikz@auto@id\endcsname\relax%
+
+
+% Add config code to a timeline
+%
+% #1 = The object (may be "myself")
+% #2 = The attribute (see pgfanimateattribute)
+% #3 = Timeline sequence identifier
+% #4 = code
+%
+% Description:
+%
+% This commands adds the code to the timeline configuration, which is
+% code that gets executed before the rest of entries of the timeline
+% are executed.
+
+\def\tikz@timeline@config#1#2#3#4{%
+ \expandafter\def\expandafter\tikz@temp\expandafter{\csname tikz@a@conf@#1@#2@#3\endcsname}%
+ \expandafter\ifx\tikz@temp\relax%
+ \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\gdef\expandafter\expandafter\expandafter\tikz@temp\expandafter\expandafter\expandafter{\expandafter\expandafter\expandafter\global\expandafter\let\tikz@temp\relax}%
+ \fi%
+ \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\gdef\expandafter\expandafter\expandafter\tikz@temp\expandafter\expandafter\expandafter{\tikz@temp#4}%
+}%
+
+
+
+% Add a timeline entry
+%
+% #1 = The object (may be "myself")
+% #2 = The attribute (see pgfanimateattribute)
+% #3 = Timeline sequence identifier
+% #4 = early code
+% #5 = later code
+%
+% Description:
+%
+% This command stores an option with a timeline of an object. For each
+% object--attribute--identifier tuple a timeline can be created, for
+% which the values of #4 and #5 are collected. Later on, \pgfanimateattribute
+% will be called for the pgf attribute associated with tikz attribute,
+% the type associated with it and initial code, followed by the
+% accumulated values of #4 and then the accumulated values of #5.
+
+\def\tikz@timeline@entry#1#2#3#4#5{%
+ % First, does the object have an animation already attached?
+ \expandafter\ifx\csname tikz@a@tlo@#1\endcsname\relax%
+ % No, first entry!
+ % Create call:
+ \edef\pgf@marshal{\noexpand\tikzanimationattachto{#1}{\expandafter\noexpand\csname tikz@a@tlo@#1\endcsname}}%
+ \pgf@marshal%
+ \expandafter\gdef\csname tikz@a@tlo@#1\endcsname{\tikz@anim@cleanup{#1}}%
+ \fi%
+ % Second, does the timeline exist?
+ \expandafter\ifx\csname tikz@a@tlc@#1@#2@#3\endcsname\relax%
+ % No, first entry!
+ \def\tikz@anim@initial@early@options{#4}%
+ \def\tikz@anim@initial@options{#5}%
+ \csname tikz@anim@def@setup@#2\endcsname%
+ % Create timeline...
+ \expandafter\global\expandafter\let\csname tikz@a@tlc@#1@#2@#3\endcsname\tikz@anim@initial@options%
+ \expandafter\global\expandafter\let\csname tikz@a@tld@#1@#2@#3\endcsname\tikz@anim@initial@early@options%
+ % ...and add to calls
+ \expandafter\let\expandafter\pgf@temp\csname tikz@a@tlo@#1\endcsname%
+ \expandafter\def\expandafter\pgf@temp@name\expandafter{\tikz@anim@create{#1}{#2}{#3}}%
+ \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\pgf@temp\expandafter\expandafter\expandafter{\expandafter\pgf@temp\pgf@temp@name}%
+ \expandafter\global\expandafter\let\csname tikz@a@tlo@#1\endcsname\pgf@temp%
+ \else%
+ % Add to timeline:
+ \expandafter\let\expandafter\pgf@temp\csname tikz@a@tld@#1@#2@#3\endcsname%
+ \expandafter\def\expandafter\pgf@temp\expandafter{\pgf@temp#4}%
+ \expandafter\global\expandafter\let\csname tikz@a@tld@#1@#2@#3\endcsname\pgf@temp%
+ \expandafter\let\expandafter\pgf@temp\csname tikz@a@tlc@#1@#2@#3\endcsname%
+ \expandafter\def\expandafter\pgf@temp\expandafter{\pgf@temp#5}%
+ \expandafter\global\expandafter\let\csname tikz@a@tlc@#1@#2@#3\endcsname\pgf@temp%
+ \fi%
+}%
+
+
+\def\tikz@anim@cleanup#1{%
+ \expandafter\global\expandafter\let\csname tikz@a@tlo@#1\endcsname\relax%
+}%
+
+\def\tikz@anim@create#1#2#3{%
+ \csname tikz@a@conf@#1@#2@#3\endcsname%
+ \iftikz@is@node%
+ \expandafter\let\expandafter\tikz@temp\csname tikz@anim@def@pgf@attr@@node@#2\endcsname%
+ \else%
+ \expandafter\let\expandafter\tikz@temp\csname tikz@anim@def@pgf@attr@@scope@#2\endcsname%
+ \fi%
+ \ifx\tikz@temp\relax%
+ \expandafter\let\expandafter\tikz@temp\csname tikz@anim@def@pgf@attr@#2\endcsname%
+ \fi%
+ \expandafter\pgfanimateattributecode\expandafter{\tikz@temp}{%
+ \iftikz@is@node%
+ \edef\tikz@anim@whom{\tikz@id@name\csname tikz@anim@def@is@node@#2\endcsname}%
+ \else%
+ \edef\tikz@anim@whom{\tikz@id@name\csname tikz@anim@def@no@node@#2\endcsname}%
+ \fi%
+ \pgfanimationset{whom=\tikz@anim@whom}%
+ \expandafter\let\expandafter\tikz@animation@parser\csname tikz@anim@\csname tikz@anim@def@parser@#2\endcsname @parse\endcsname%
+ \csname tikz@anim@def@code@#2\endcsname%
+ \csname tikz@a@tld@#1@#2@#3\endcsname%
+ \csname tikz@a@tlc@#1@#2@#3\endcsname%
+ }%
+ \expandafter\global\expandafter\let\csname tikz@a@tlc@#1@#2@#3\endcsname\relax%
+ \expandafter\global\expandafter\let\csname tikz@a@tld@#1@#2@#3\endcsname\relax%
+}%
+
+
+
+
+\endinput