% Copyright 2019 by Till Tantau % Copyright 2019 by Jonathan P. Spratte % % 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{pgflibrarysvg.path.code.tex} \usepgfmodule{parser}% % Scan an SVG-Path % % #1 = the path % % Description: % % This command takes a path in the compressed SVG-syntax. It then % issues a sequences of appropriate \pgfpath commands for this % path. For a description of the compressed svg path syntax, see a % book on svg. % % The notion of a pixel used by svg makes no sense in pgf (actually % it does not really make sense in svg either, but never mind), and % instead of pixels "pt" is used as the basic unit. Use coordinate % transformation to change this. % % Example: % % \pgfpathsvg{M10 20 L 30-20 0 1} % % % this has the same effect as % % \pgfpathmoveto{\pgfpoint{10pt}{20pt}} % \pgfpathlineto{\pgfpint{30pt}{-20pt}} % \pgfpathlineto{\pgfpint{0pt}{1pt}} % \def\pgfpathsvg#1{% \let\pgf@lib@svg@finish@prev\relax% {% \pgftransforminvert% \pgf@process{\pgfpointtransformed{\pgfqpoint{\pgf@path@lastx}{\pgf@path@lasty}}}% }% \pgf@lib@svg@last@x\pgf@x% \pgf@lib@svg@last@y\pgf@y% \let\pgf@lib@svg@num=\pgfutil@empty% \let\pgf@lib@svg@exp=\pgfutil@empty% \pgfparserparse{svgpath}#1"% }% \newdimen\pgf@lib@svg@last@x \newdimen\pgf@lib@svg@last@y \newdimen\pgf@lib@svg@last@c@x \newdimen\pgf@lib@svg@last@c@y \newcount\pgf@lib@svg@count \newcount\pgf@lib@svg@max@num \newif\pgf@lib@svg@relative % For the smooth commands (S, s, T, t) we need to keep track of the % previous control points. This is done in the following two % variables. If they are empty, there was no previous control point of % the desired kind, in which case the specification prescribes that % the start point is used. \def\pgf@lib@svg@clear@bezier@quad{% \let\pgf@lib@svg@bezier@last=\pgfutil@empty \let\pgf@lib@svg@quad@last=\pgfutil@empty }% \pgf@lib@svg@clear@bezier@quad % % Here comes the DFA: % % Handle a moveto: \pgfparserdef{svgpath}{all}{the letter M} {% \pgf@lib@svg@finish@prev \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@moveto}% }% \def\pgf@lib@svg@moveto{% \pgf@lib@svg@clear@bezier@quad% \pgf@lib@svg@last@x=\pgf@lib@svg@get@num{0}pt% \pgf@lib@svg@last@y=\pgf@lib@svg@get@num{1}pt% \pgfpathmoveto{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}% \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@lineto}% }% % Handle a relative moveto: \pgfparserdef{svgpath}{all}{the letter m} {% \pgf@lib@svg@finish@prev \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@moveto@rel}% }% \def\pgf@lib@svg@moveto@rel{% \pgf@lib@svg@clear@bezier@quad% \advance\pgf@lib@svg@last@x by\pgf@lib@svg@get@num{0}pt% \advance\pgf@lib@svg@last@y by\pgf@lib@svg@get@num{1}pt% \pgfpathmoveto{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}% \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@lineto@rel}% }% % Handle a lineto: \pgfparserdef{svgpath}{all}{the letter L} {% \pgf@lib@svg@finish@prev% \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@lineto}% }% \def\pgf@lib@svg@lineto{% \ifnum\pgf@lib@svg@count=0\relax% nothing read \else% \pgf@lib@svg@clear@bezier@quad% \pgf@lib@svg@last@x=\pgf@lib@svg@get@num{0}pt% \pgf@lib@svg@last@y=\pgf@lib@svg@get@num{1}pt% \pgfpathlineto{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}% \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@lineto}% \fi }% % Handle a relative lineto: \pgfparserdef{svgpath}{all}{the letter l} {% \pgf@lib@svg@finish@prev \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@lineto@rel}% }% \def\pgf@lib@svg@lineto@rel{% \ifnum\pgf@lib@svg@count=0\relax% nothing read \else% \pgf@lib@svg@clear@bezier@quad% \advance\pgf@lib@svg@last@x by\pgf@lib@svg@get@num{0}pt% \advance\pgf@lib@svg@last@y by\pgf@lib@svg@get@num{1}pt% \pgfpathlineto{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}% \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@lineto@rel}% \fi }% % Handle a closepath: \pgfparserdef{svgpath}{all}{the letter Z} {% \pgf@lib@svg@closepath }% \pgfparserdef{svgpath}{all}{the letter z} {% \pgf@lib@svg@closepath }% \def\pgf@lib@svg@closepath{% \pgf@lib@svg@finish@prev \pgfpathclose \let\pgf@lib@svg@finish@prev=\relax \pgf@lib@svg@clear@bezier@quad% \pgfparserswitch{initial}% }% % Ignore spaces if no other rules says differently: \pgfparserdef{svgpath}{all}{blank space \space}{}% % Handle a horizontal lineto: \pgfparserdef{svgpath}{all}{the letter H} {% \pgf@lib@svg@finish@prev \pgf@lib@svg@read@nums{1}{\pgf@lib@svg@hlineto}% }% \def\pgf@lib@svg@hlineto{% \ifnum\pgf@lib@svg@count=0\relax% nothing read \else% \pgf@lib@svg@clear@bezier@quad% \pgf@lib@svg@last@x=\pgf@lib@svg@get@num{0}pt% \pgfpathlineto{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}% \pgf@lib@svg@read@nums{1}{\pgf@lib@svg@hlineto}% \fi }% \pgfparserdef{svgpath}{all}{the letter h} {% \pgf@lib@svg@finish@prev \pgf@lib@svg@read@nums{1}{\pgf@lib@svg@hlineto@rel}% }% \def\pgf@lib@svg@hlineto@rel{% \ifnum\pgf@lib@svg@count=0\relax% nothing read \else% \pgf@lib@svg@clear@bezier@quad% \advance\pgf@lib@svg@last@x by\pgf@lib@svg@get@num{0}pt% \pgfpathlineto{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}% \pgf@lib@svg@read@nums{1}{\pgf@lib@svg@hlineto@rel}% \fi }% % Handle a horizontal lineto: \pgfparserdef{svgpath}{all}{the letter V} {% \pgf@lib@svg@finish@prev \pgf@lib@svg@read@nums{1}{\pgf@lib@svg@vlineto}% }% \def\pgf@lib@svg@vlineto{% \ifnum\pgf@lib@svg@count=0\relax% nothing read \else% \pgf@lib@svg@clear@bezier@quad% \pgf@lib@svg@last@y=\pgf@lib@svg@get@num{0}pt% \pgfpathlineto{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}% \pgf@lib@svg@read@nums{1}{\pgf@lib@svg@vlineto}% \fi }% \pgfparserdef{svgpath}{all}{the letter v} {% \pgf@lib@svg@finish@prev \pgf@lib@svg@read@nums{1}{\pgf@lib@svg@vlineto@rel}% }% \def\pgf@lib@svg@vlineto@rel{% \ifnum\pgf@lib@svg@count=0\relax% nothing read \else% \pgf@lib@svg@clear@bezier@quad% \advance\pgf@lib@svg@last@y by\pgf@lib@svg@get@num{0}pt% \pgfpathlineto{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}% \pgf@lib@svg@read@nums{1}{\pgf@lib@svg@vlineto@rel}% \fi }% % Handle a Bezier curve: \pgfparserdef{svgpath}{all}{the letter C} {% \pgf@lib@svg@finish@prev \pgf@lib@svg@read@nums{6}{\pgf@lib@svg@curveto}% }% \def\pgf@lib@svg@curveto{% \ifnum\pgf@lib@svg@count=0\relax% nothing read \else% % Clear quadratic last point and save new last control point: \let\pgf@lib@svg@quad@last=\pgfutil@empty% \edef\pgf@lib@svg@bezier@last{% \noexpand\pgfqpoint{\pgf@lib@svg@get@num{2}pt}{\pgf@lib@svg@get@num{3}pt}}% % Draw curve \pgf@lib@svg@last@x=\pgf@lib@svg@get@num{4}pt% \pgf@lib@svg@last@y=\pgf@lib@svg@get@num{5}pt% \pgfpathcurveto {\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}% {\pgfqpoint{\pgf@lib@svg@get@num{2}pt}{\pgf@lib@svg@get@num{3}pt}}% {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}% % Go on \pgf@lib@svg@read@nums{6}{\pgf@lib@svg@curveto}% \fi }% \pgfparserdef{svgpath}{all}{the letter c} {% \pgf@lib@svg@finish@prev \pgf@lib@svg@read@nums{6}{\pgf@lib@svg@curveto@rel}% }% \def\pgf@lib@svg@curveto@rel{% \ifnum\pgf@lib@svg@count=0\relax% nothing read \else% % Clear quadratic last point and save new last control point: \let\pgf@lib@svg@quad@last=\pgfutil@empty% \pgf@process{\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{2}pt}{\pgf@lib@svg@get@num{3}pt}}}% \edef\pgf@lib@svg@bezier@last{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}% % Draw curve \pgfpathcurveto {\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}}% {\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{2}pt}{\pgf@lib@svg@get@num{3}pt}}}% {\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{4}pt}{\pgf@lib@svg@get@num{5}pt}}}% \advance\pgf@lib@svg@last@x by\pgf@lib@svg@get@num{4}pt% \advance\pgf@lib@svg@last@y by\pgf@lib@svg@get@num{5}pt% \pgf@lib@svg@read@nums{6}{\pgf@lib@svg@curveto@rel}% \fi }% \pgfparserdef{svgpath}{all}{the letter S} {% \pgf@lib@svg@finish@prev \pgf@lib@svg@read@nums{4}{\pgf@lib@svg@curveto@smooth}% }% \def\pgf@lib@svg@curveto@smooth{% \ifnum\pgf@lib@svg@count=0\relax% nothing read \else% % Draw curve % Compute first control point \ifx\pgf@lib@svg@bezier@last\pgfutil@empty% \def\pgf@lib@svg@first@cp{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}% \else \def\pgf@lib@svg@first@cp{% \pgfpointadd {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}% {\pgfpointdiff {\pgf@lib@svg@bezier@last}% {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}% }% }% \fi \pgfpathcurveto {\pgf@lib@svg@first@cp}% {\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}% {\pgfqpoint{\pgf@lib@svg@get@num{2}pt}{\pgf@lib@svg@get@num{3}pt}}% % Clear quadratic last point and save new last control point: \let\pgf@lib@svg@quad@last=\pgfutil@empty% \edef\pgf@lib@svg@bezier@last{% \noexpand\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}% % Update \pgf@lib@svg@last@x=\pgf@lib@svg@get@num{2}pt% \pgf@lib@svg@last@y=\pgf@lib@svg@get@num{3}pt% % Go on \pgf@lib@svg@read@nums{4}{\pgf@lib@svg@curveto@smooth}% \fi }% \pgfparserdef{svgpath}{all}{the letter s} {% \pgf@lib@svg@finish@prev \pgf@lib@svg@read@nums{4}{\pgf@lib@svg@curveto@rel@smooth}% }% \def\pgf@lib@svg@curveto@rel@smooth{% \ifnum\pgf@lib@svg@count=0\relax% nothing read \else% % Draw curve % Compute first control point \ifx\pgf@lib@svg@bezier@last\pgfutil@empty% \def\pgf@lib@svg@first@cp{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}% \else \def\pgf@lib@svg@first@cp{% \pgfpointadd {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}% {\pgfpointdiff {\pgf@lib@svg@bezier@last}% {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}% }% }% \fi \pgfpathcurveto {\pgf@lib@svg@first@cp}% {\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}}% {\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{2}pt}{\pgf@lib@svg@get@num{3}pt}}}% % Clear quadratic last point and save new last control point: \let\pgf@lib@svg@quad@last=\pgfutil@empty% \pgf@process{\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}}% \edef\pgf@lib@svg@bezier@last{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}% % update \advance\pgf@lib@svg@last@x by\pgf@lib@svg@get@num{2}pt% \advance\pgf@lib@svg@last@y by\pgf@lib@svg@get@num{3}pt% % Go on \pgf@lib@svg@read@nums{4}{\pgf@lib@svg@curveto@rel@smooth}% \fi }% % Handle a quadratic curve: \pgfparserdef{svgpath}{all}{the letter Q} {% \pgf@lib@svg@finish@prev \pgf@lib@svg@read@nums{4}{\pgf@lib@svg@quad@curveto}% }% \def\pgf@lib@svg@quad@curveto{% \ifnum\pgf@lib@svg@count=0\relax% nothing read \else% % Clear bezier last point and save new last control point: \let\pgf@lib@svg@bezier@last=\pgfutil@empty% \edef\pgf@lib@svg@quad@last{% \noexpand\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}% % Draw curve \pgf@lib@svg@last@x=\pgf@lib@svg@get@num{2}pt% \pgf@lib@svg@last@y=\pgf@lib@svg@get@num{3}pt% \pgfpathquadraticcurveto {\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}% {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}% % Go on \pgf@lib@svg@read@nums{4}{\pgf@lib@svg@quad@curveto}% \fi }% \pgfparserdef{svgpath}{all}{the letter q} {% \pgf@lib@svg@finish@prev \pgf@lib@svg@read@nums{4}{\pgf@lib@svg@quad@curveto@rel}% }% \def\pgf@lib@svg@quad@curveto@rel{% \ifnum\pgf@lib@svg@count=0\relax% nothing read \else% % Clear quadratic last point and save new last control point: \let\pgf@lib@svg@bezier@last=\pgfutil@empty% \pgf@process{\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}}% \edef\pgf@lib@svg@quad@last{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}% % Draw curve \pgfpathquadraticcurveto {\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}}% {\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{2}pt}{\pgf@lib@svg@get@num{3}pt}}}% \advance\pgf@lib@svg@last@x by\pgf@lib@svg@get@num{2}pt% \advance\pgf@lib@svg@last@y by\pgf@lib@svg@get@num{3}pt% \pgf@lib@svg@read@nums{4}{\pgf@lib@svg@quad@curveto@rel}% \fi }% \pgfparserdef{svgpath}{all}{the letter T} {% \pgf@lib@svg@finish@prev \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@quad@curveto@smooth}% }% \def\pgf@lib@svg@quad@curveto@smooth{% \ifnum\pgf@lib@svg@count=0\relax% nothing read \else% % Draw curve % Compute first control point \pgf@process{% \ifx\pgf@lib@svg@quad@last\pgfutil@empty% \pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}% \else \pgfpointadd {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}% {\pgfpointdiff {\pgf@lib@svg@quad@last}% {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}% }% \fi }% \edef\pgf@lib@svg@first@cp{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}% \pgfpathquadraticcurveto {\pgf@lib@svg@first@cp}% {\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}% % Clear quadratic last point and save new last control point: \let\pgf@lib@svg@bezier@last=\pgfutil@empty% \let\pgf@lib@svg@quad@last=\pgf@lib@svg@first@cp% % Update \pgf@lib@svg@last@x=\pgf@lib@svg@get@num{0}pt% \pgf@lib@svg@last@y=\pgf@lib@svg@get@num{1}pt% % Go on \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@quad@curveto@smooth}% \fi }% \pgfparserdef{svgpath}{all}{the letter t} {% \pgf@lib@svg@finish@prev \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@quad@curveto@rel@smooth}% }% \def\pgf@lib@svg@quad@curveto@rel@smooth{% \ifnum\pgf@lib@svg@count=0\relax% nothing read \else% % Draw curve % Compute first control point \pgf@process{% \ifx\pgf@lib@svg@quad@last\pgfutil@empty% \pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}% \else \pgfpointadd {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}% {\pgfpointdiff {\pgf@lib@svg@quad@last}% {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}% }% \fi }% \edef\pgf@lib@svg@first@cp{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}% \pgfpathquadraticcurveto {\pgf@lib@svg@first@cp}% {\pgfpointadd{\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}{\pgfqpoint{\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}}}% % Clear quadratic last point and save new last control point: \let\pgf@lib@svg@bezier@last=\pgfutil@empty% \let\pgf@lib@svg@quad@last=\pgf@lib@svg@first@cp% % update \advance\pgf@lib@svg@last@x by\pgf@lib@svg@get@num{0}pt% \advance\pgf@lib@svg@last@y by\pgf@lib@svg@get@num{1}pt% % Go on \pgf@lib@svg@read@nums{2}{\pgf@lib@svg@quad@curveto@rel@smooth}% \fi }% % Handle an arcto: \pgfparserdef{svgpath}{all}{the letter A} {% \pgf@lib@svg@finish@prev \pgf@lib@svg@read@nums{7}{\pgf@lib@svg@arcto}% }% \def\pgf@lib@svg@arcto{% \ifnum\pgf@lib@svg@count=0\relax% nothing read \else% % Clear bezier last point and save new last control point: \pgf@lib@svg@clear@bezier@quad% % Draw curve \pgf@lib@svg@last@x=\pgf@lib@svg@get@num{5}pt% \pgf@lib@svg@last@y=\pgf@lib@svg@get@num{6}pt% \pgfpatharcto {\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}% {\pgf@lib@svg@get@num{2}}% {\pgf@lib@svg@get@num{3}}% {\pgf@lib@svg@get@num{4}}% {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}% % Go on \pgf@lib@svg@read@nums{7}{\pgf@lib@svg@arcto}% \fi }% \pgfparserdef{svgpath}{all}{the letter a} {% \pgf@lib@svg@finish@prev \pgf@lib@svg@read@nums{7}{\pgf@lib@svg@arcto@rel}% }% \def\pgf@lib@svg@arcto@rel{% \ifnum\pgf@lib@svg@count=0\relax% nothing read \else% % Clear bezier last point and save new last control point: \pgf@lib@svg@clear@bezier@quad% % Draw curve \advance\pgf@lib@svg@last@x by\pgf@lib@svg@get@num{5}pt% \advance\pgf@lib@svg@last@y by\pgf@lib@svg@get@num{6}pt% \pgfpatharcto {\pgf@lib@svg@get@num{0}pt}{\pgf@lib@svg@get@num{1}pt}% {\pgf@lib@svg@get@num{2}}% {\pgf@lib@svg@get@num{3}}% {\pgf@lib@svg@get@num{4}}% {\pgfqpoint{\pgf@lib@svg@last@x}{\pgf@lib@svg@last@y}}% % Go on \pgf@lib@svg@read@nums{7}{\pgf@lib@svg@arcto@rel}% \fi }% % Handle to end of the world \pgfparserdef{svgpath}{all}{the character "} {% \pgf@lib@svg@finish@prev \pgfparserswitch{final}% }% % Handle spacers for numbers \def\pgf@lib@svg@read@nums#1#2{% get #1 number symbols, then do #2 \pgf@lib@svg@count=0\relax \pgf@lib@svg@max@num=#1\relax \pgfparserswitch{num}% \def\pgf@lib@svg@finish@prev{% \ifx\pgf@lib@svg@num\pgfutil@empty% \else% \ifx\pgf@lib@svg@exp\pgfutil@empty \else \pgfmathfloatparsenumber{\pgf@lib@svg@num e\pgf@lib@svg@exp}% \pgfmathfloattofixed{\pgfmathresult}% \let\pgf@lib@svg@num=\pgfmathresult \fi \expandafter\let\csname pgf@lib@svg@num@\the\pgf@lib@svg@count\endcsname=\pgf@lib@svg@num \advance\pgf@lib@svg@count by1\relax% \let\pgf@lib@svg@num=\pgfutil@empty% \let\pgf@lib@svg@exp=\pgfutil@empty% \fi #2% }% }% \def\pgf@lib@svg@get@num#1{\csname pgf@lib@svg@num@#1\endcsname}% \pgfparserdef{svgpath}{num}{the character ,} {% \pgf@lib@svg@handle@spacer }% \pgfparserlet{svgpath}{after.}{the character ,}[num]{the character ,} \pgfparserlet{svgpath}{exp},[num], \pgfparserlet{svgpath}{exp sign},[num], \pgfparserdef{svgpath}{num}{\meaning\pgfutil@sptoken} {% \pgf@lib@svg@handle@spacer }% \pgfparserlet{svgpath}{after.}{blank space}[num]{blank space} \pgfparserlet{svgpath}{exp}{blank space}, \pgfparserlet{svgpath}{exp sign}{blank space}, \pgfparserdef{svgpath}{num}{the character -} {% \pgf@lib@svg@handle@spacer \def\pgf@lib@svg@num{-}% }% \pgfparserlet{svgpath}{after.}{the character -}[num]{the character -} \pgfparserlet{svgpath}{exp}-[num]- \pgfparserdef{svgpath}{num}{the character +} {% \pgf@lib@svg@handle@spacer \def\pgf@lib@svg@num{+}% } \pgfparserlet{svgpath}{after.}{the character +}[num]{the character +} \pgfparserlet{svgpath}{exp}+[num]+ \def\pgf@lib@svg@handle@spacer{% \ifx\pgf@lib@svg@num\pgfutil@empty% % ignore \else \ifx\pgf@lib@svg@exp\pgfutil@empty \else \pgfmathfloatparsenumber{\pgf@lib@svg@num e\pgf@lib@svg@exp}% \pgfmathfloattofixed{\pgfmathresult}% \let\pgf@lib@svg@num=\pgfmathresult \fi \expandafter\let\csname pgf@lib@svg@num@\the\pgf@lib@svg@count\endcsname=\pgf@lib@svg@num \advance\pgf@lib@svg@count by1\relax% \ifnum\pgf@lib@svg@count=\pgf@lib@svg@max@num\relax% \pgf@lib@svg@finish@prev% \fi \let\pgf@lib@svg@num=\pgfutil@empty% \let\pgf@lib@svg@exp=\pgfutil@empty% \pgfparserswitch{num}% \fi }% % Handle digits \pgfparserdef{svgpath}{num}e {% \pgfparserswitch{exp sign}% \let\pgf@lib@svg@exp=\pgfutil@empty } \pgfparserlet{svgpath}{after.}e[num]e \pgfparserdef{svgpath}{exp sign}- {% \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp-}% \pgfparserswitch{exp}% } \pgfparserdef{svgpath}{exp sign}+ {% \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp+}% \pgfparserswitch{exp}% } \pgfparserdef{svgpath}{exp sign}0 {% \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp0}% \pgfparserswitch{exp}% } \pgfparserdef{svgpath}{exp sign}1 {% \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp1}% \pgfparserswitch{exp}% } \pgfparserdef{svgpath}{exp sign}2 {% \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp2}% \pgfparserswitch{exp}% } \pgfparserdef{svgpath}{exp sign}3 {% \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp3}% \pgfparserswitch{exp}% } \pgfparserdef{svgpath}{exp sign}4 {% \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp4}% \pgfparserswitch{exp}% } \pgfparserdef{svgpath}{exp sign}5 {% \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp5}% \pgfparserswitch{exp}% } \pgfparserdef{svgpath}{exp sign}6 {% \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp6}% \pgfparserswitch{exp}% } \pgfparserdef{svgpath}{exp sign}7 {% \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp7}% \pgfparserswitch{exp}% } \pgfparserdef{svgpath}{exp sign}8 {% \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp8}% \pgfparserswitch{exp}% } \pgfparserdef{svgpath}{exp sign}9 {% \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp9}% \pgfparserswitch{exp}% } \pgfparserdef{svgpath}{exp}0 {% \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp0}% } \pgfparserdef{svgpath}{exp}1 {% \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp1}% } \pgfparserdef{svgpath}{exp}2 {% \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp2}% } \pgfparserdef{svgpath}{exp}3 {% \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp3}% } \pgfparserdef{svgpath}{exp}4 {% \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp4}% } \pgfparserdef{svgpath}{exp}5 {% \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp5}% } \pgfparserdef{svgpath}{exp}6 {% \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp6}% } \pgfparserdef{svgpath}{exp}7 {% \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp7}% } \pgfparserdef{svgpath}{exp}8 {% \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp8}% } \pgfparserdef{svgpath}{exp}9 {% \expandafter\def\expandafter\pgf@lib@svg@exp\expandafter{\pgf@lib@svg@exp9}% } \pgfparserdef{svgpath}{num}{the character .} {% \expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num.}% \pgfparserswitch{after.}% }% \pgfparserdef{svgpath}{after.}{the character .} {% \pgf@lib@svg@handle@spacer \def\pgf@lib@svg@num{.}% \pgfparserswitch{after.}% }% \pgfparserlet{svgpath}{exp}{the character .}[after.]{the character .} \pgfparserdef{svgpath}{all}{the character 0} {\expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num0}}% \pgfparserdef{svgpath}{all}{the character 1} {\expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num1}}% \pgfparserdef{svgpath}{all}{the character 2} {\expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num2}}% \pgfparserdef{svgpath}{all}{the character 3} {\expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num3}}% \pgfparserdef{svgpath}{all}{the character 4} {\expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num4}}% \pgfparserdef{svgpath}{all}{the character 5} {\expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num5}}% \pgfparserdef{svgpath}{all}{the character 6} {\expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num6}}% \pgfparserdef{svgpath}{all}{the character 7} {\expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num7}}% \pgfparserdef{svgpath}{all}{the character 8} {\expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num8}}% \pgfparserdef{svgpath}{all}{the character 9} {\expandafter\def\expandafter\pgf@lib@svg@num\expandafter{\pgf@lib@svg@num9}}%