%% pgflibraryoffsetpath.code.tex %% Copyright 2023 Jonathan Schulz % % This work may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.3c % of this license or (at your option) any later version. % The latest version of this license is in % http://www.latex-project.org/lppl.txt % and version 1.3c or later is part of all distributions of LaTeX % version 2008-05-04 or later. % % This work has the LPPL maintenance status 'maintained'. % % The Current Maintainer of this work is Jonathan Schulz. % % This work consists of the files % pgflibrarybezieroffset.code.tex, pgflibrarynfold.code.tex, pgflibraryoffsetpath.code.tex, tikz-nfold-doc.tex, tikzlibrarynfold.code.tex, tikz-nfold-doc.tex, and tikz-nfold-doc.pdf. % % % A commented version of this file can be found on https://github.com/jonschz/tikz-nfold . % \usepgflibrary{bezieroffset} \gdef\pgf@nfold@cached@miterlimit{10} \let\pgf@nfold@old@miterlimit\pgfsetmiterlimit \def\pgfsetmiterlimit#1{% \pgf@nfold@old@miterlimit{#1}% \edef\pgf@nfold@cached@miterlimit{#1}% } \global\let\pgf@cached@linejoin=m% \let\pgf@nfold@old@setbeveljoin\pgfsetbeveljoin \let\pgf@nfold@old@setmiterjoin\pgfsetmiterjoin \let\pgf@nfold@old@setroundjoin\pgfsetroundjoin \def\pgfsetbeveljoin{% \pgf@nfold@old@setbeveljoin% \let\pgf@cached@linejoin=b% } \def\pgfsetmiterjoin{% \pgf@nfold@old@setmiterjoin% \let\pgf@cached@linejoin=m% } \def\pgfsetroundjoin{% \pgf@nfold@old@setroundjoin% \let\pgf@cached@linejoin=r% } \def\pgf@nfold@miterjoin{ \pgfpathlineto{ \pgfpointadd{\pgf@nfold@join@centre}{% \pgfpointpolar{\pgf@nfold@firstang+.5*\pgf@nfold@deltaphi+90}% {\pgf@nfold@shiftamount/cos(.5*\pgf@nfold@deltaphi)}% }% }% } \def\pgf@nfold@beveljoin{ \pgfmathsetlengthmacro{\bevelouterprotrusion}% {\pgf@nfold@shortenstartjoin pt - .5*\pgflinewidth*abs(tan(.25*\pgf@nfold@deltaphi))} \pgfmathsetmacro{\bevelshorten}{2*\insidepercentage*abs(tan(.25*\pgf@nfold@deltaphi))} \pgfmathparse{\bevelshorten < abs(sin(.5*\pgf@nfold@deltaphi))} \ifnum\pgfmathresult=1\relax \pgfmathsetlengthmacro{\bevelextension}{\bevelouterprotrusion-\bevelshorten*\pgf@nfold@hwidth} \pgfpointadd{\pgf@nfold@join@start}{\pgfpointpolar{\pgf@nfold@firstang}{\bevelextension}} \pgfpathlineto{} \pgfpointadd{\pgf@nfold@join@end}{\pgfpointpolar{\pgf@nfold@secondang}{-\bevelextension}} \pgfpathlineto{} \else \pgf@nfold@miterjoin \fi } \def\pgf@nfold@roundjoin{ \ifdim\insidepercentage pt<.5pt\relax \pgfpointadd{\pgf@nfold@join@start}{\pgfpointpolar{\pgf@nfold@firstang}{\pgf@nfold@shortenstartjoin}} \pgfpathlineto{} \pgfmathsetmacro\pgf@tmp@firstang{\pgf@nfold@firstang+90*\turnindicator} \pgfpatharc% {\pgf@tmp@firstang}% {\pgf@tmp@firstang+\pgf@nfold@deltaphi}% {abs(\pgf@nfold@shift@fraction)*\pgf@nfold@hwidth}% \else \pgf@nfold@miterjoin \fi } \def\pgf@nfold@token@join#1#2#3#4#5#6#7#8{% \def\pgf@nfold@join@centre{#1}% \def\pgf@nfold@join@prevend{#2}% \def\pgf@nfold@join@nextstart{#3}% \def\pgf@nfold@firstang{#4}% \def\pgf@nfold@secondang{#5}% \pgfextract@process\pgf@nfold@join@start{% \pgfpointadd{#2}{\pgfpointpolar{\pgf@nfold@firstang+90}{\pgf@nfold@shiftamount}}}% \pgfextract@process\pgf@nfold@join@end{% \pgfpointadd{#3}{\pgfpointpolar{\pgf@nfold@secondang+90}{\pgf@nfold@shiftamount}}}% \pgf@process{\pgfpointdiff{\pgf@nfold@join@start}{\pgf@nfold@join@end}} \pgfpointtaxicabnorm\pgfutil@tempdima \ifdim\pgfutil@tempdima>0.1pt\relax \def\pgf@nfold@deltaphi{#6}% \def\pgf@nfold@shortenstartjoin{#7}% \ifdim\pgf@nfold@deltaphi pt<0pt \def\turnindicator{1} \else \def\turnindicator{-1} \fi \pgfutil@tempdima=\pgf@nfold@shift@fraction pt\relax \pgfutil@tempdima=\turnindicator\pgfutil@tempdima \advance\pgfutil@tempdima by-1pt\relax \pgfutil@tempdima=-.5\pgfutil@tempdima \edef\insidepercentage{\pgf@sys@tonumber\pgfutil@tempdima}% #8% \fi } \def\pgf@nfold@process@join{% \pgf@xa=\pgf@nfold@deltaphi@start pt\relax \ifdim\pgf@xa<0pt\relax \pgf@xa=-\pgf@xa \fi \ifdim\pgf@xa>1pt\relax \edef\pgf@nfold@jointype{\pgf@cached@linejoin} \if\pgf@cached@linejoin m% \pgf@xa=.5\pgf@xa \pgfmathcos@{\pgf@sys@tonumber\pgf@xa} \pgf@xa=\pgfmathresult pt\relax \pgf@xa=\pgf@nfold@cached@miterlimit\pgf@xa \ifdim\pgf@xa>1pt\relax \def\pgf@nfold@tmp@joinmacro{\pgf@nfold@miterjoin} \else \def\pgf@nfold@tmp@joinmacro{\pgf@nfold@beveljoin} \fi \else \if b\pgf@cached@linejoin\relax \def\pgf@nfold@tmp@joinmacro{\pgf@nfold@beveljoin} \else \def\pgf@nfold@tmp@joinmacro{\pgf@nfold@roundjoin} \fi \fi \edef\pgf@nfold@macrotoadd{% \noexpand\pgf@nfold@token@join{\pgf@nfold@cur@first}{\pgf@nfold@prev@segment@end} {\pgf@nfold@cur@movedfirst}{\pgf@nfold@prev@angle@ii}{\pgf@nfold@cur@angle@i}% {\pgf@nfold@deltaphi@start}{\pgf@nfold@shortenstartjoin}{% \expandafter\noexpand\pgf@nfold@tmp@joinmacro% \expandafter\noexpand\ifpgf@nfold@closejoinsedgecase% \pgf@nfold@token@finish@edgecase{\pgf@nfold@cur@movedlast}% \else% \pgf@nfold@token@finish@normal% \fi% }% }% \pgf@nfold@addmacro\pgf@parsed@cur@conn@seg% \fi% } \def\pgf@nfold@token@finish@normal{% \pgfpathlineto{\pgf@nfold@join@end}% } \def\pgf@nfold@token@finish@edgecase#1{% \pgf@nfold@join@end% \ifdim\insidepercentage pt<.5pt\relax% \pgf@process{\pgfpointadd{#1}{\pgfpointpolar{\pgf@nfold@secondang+90}{\pgf@nfold@shiftamount}}} \fi% \pgfpathlineto{}% } \newif\ifpgf@nfold@continuesegment \newif\ifpgf@nfold@closejoinsedgecase \newif\ifpgf@nfold@angletoosharp \newif\ifpgf@nfold@intersectionsnotloaded \newif\ifpgf@nfold@lastconnsubpath \def\pgf@nfold@process@segment{% \if\pgf@nfold@cur@visible0 \if\pgf@nfold@cur@type m \if\pgf@nfold@start@arrowcode1 \ifpgf@nfold@lastconnsubpath \if\pgf@nfold@prev@type f \if\pgf@nfold@next@visible1 \edef\pgf@nfold@macrotoadd{% \noexpand\pgf@nfold@extendtotip{s}{\pgf@nfold@cur@last}{\pgf@nfold@next@angle@i} }% \pgf@nfold@addmacro\pgf@parsed@cur@conn@seg% \let\pgf@nfold@cur@type l \let\pgf@nfold@cur@visible1 \let\pgf@nfold@cur@angle@ii\pgf@nfold@next@angle@i \let\pgf@nfold@cur@tang@ii\pgf@nfold@next@tang@i \def\pgf@nfold@deltaphi@end{0} \pgf@nfold@angletoosharpfalse \fi \fi% \fi \fi \fi% \else% \let\pgf@nfold@cur@movedfirst\pgf@nfold@cur@first \let\pgf@nfold@cur@movedlast\pgf@nfold@cur@last \def\pgf@nfold@shortenstartjoin{0} \def\pgf@nfold@shortenendjoin{0} \pgf@nfold@closejoinsedgecasefalse \if\pgf@nfold@prev@visible0 \pgf@nfold@continuesegmentfalse \else \pgf@nfold@continuesegmenttrue \let\pgf@nfold@deltaphi@start\pgf@nfold@deltaphi@end \pgf@xb=\pgf@nfold@deltaphi@start pt\relax \ifdim\pgf@xb<0pt\relax \pgf@xb=-\pgf@xb \fi \ifpgf@nfold@angletoosharp\else \ifdim\pgf@xb>0.5pt\relax \pgf@yb=.5\pgf@xb \pgfmathtan@{\pgf@sys@tonumber\pgf@yb} \pgf@yb=\pgf@nfold@hwidth\relax \pgf@yb=\pgfmathresult\pgf@yb \edef\pgf@nfold@shortenstartjoin{\pgf@sys@tonumber\pgf@yb} \pgfextract@process\pgf@nfold@cur@movedfirst{% \pgfpointadd{\pgf@nfold@cur@first}% {\pgfqpointscale{\pgf@nfold@shortenstartjoin}{\pgf@nfold@cur@tang@i}}}% \if\pgf@nfold@cur@type c \pgf@process{\pgfpointdiff{\pgf@nfold@cur@first}{\pgf@nfold@cur@supporta}} \pgfmathveclen@{\pgf@sys@tonumber\pgf@x}{\pgf@sys@tonumber\pgf@y} \ifdim\pgfmathresult pt>0.1pt\relax \pgfmathveclen@{\pgfmathresult}{\pgf@sys@tonumber\pgf@yb} \pgfextract@process\pgf@nfold@cur@supporta{\pgfpointadd% {\pgf@nfold@cur@first}% {\pgfqpointscale{\pgfmathresult}{\pgf@nfold@cur@tang@i}}}% \else \let\pgf@nfold@cur@supporta\pgf@nfold@cur@movedfirst \fi \fi \fi \fi \fi \if\pgf@nfold@next@visible1 \pgfmathsubtract@{\pgf@nfold@next@angle@i}{\pgf@nfold@cur@angle@ii} \pgf@nfold@clampangle \edef\pgf@nfold@deltaphi@end{\pgfmathresult} \pgf@xb=\pgf@nfold@deltaphi@end pt\relax \ifdim\pgf@xb<0pt\relax \pgf@xb=-\pgf@xb \fi \ifdim\pgf@xb>178pt\relax \pgfutil@packagewarning{tikz-nfold}{Angle too sharp, expect visual errors} \pgf@nfold@angletoosharptrue \else \pgf@nfold@angletoosharpfalse \ifdim\pgf@xb>0.5pt\relax \pgf@yb=.5\pgf@xb \pgfmathtan@{\pgf@sys@tonumber\pgf@yb} \pgf@yb=\pgf@nfold@hwidth\relax \pgf@yb=\pgfmathresult\pgf@yb \edef\pgf@nfold@shortenendjoin{\pgf@sys@tonumber\pgf@yb} \pgf@yb=-\pgf@yb \pgfextract@process\pgf@nfold@cur@movedlast{% \pgfpointadd{\pgf@nfold@cur@last}% {\pgfqpointscale{-\pgf@nfold@shortenendjoin}{\pgf@nfold@cur@tang@ii}}}% \pgfextract@process\pgf@nfold@cur@movedlast{% \pgfpointadd{\pgf@nfold@cur@last}% {\pgfqpointpolar{\pgf@nfold@cur@angle@ii}{\pgf@yb}}}% \if\pgf@nfold@cur@type c \pgf@process{\pgfpointdiff{\pgf@nfold@cur@supportb}{\pgf@nfold@cur@last}} \pgfmathveclen@{\pgf@sys@tonumber\pgf@x}{\pgf@sys@tonumber\pgf@y} \ifdim\pgfmathresult pt>0.1pt\relax \pgfmathveclen@{\pgfmathresult}{\pgf@sys@tonumber\pgf@yb} \pgfextract@process\pgf@nfold@cur@supportb{\pgfpointadd% {\pgf@nfold@cur@last}% {\pgfqpointscale{-\pgfmathresult}{\pgf@nfold@cur@tang@ii}}}% \else \let\pgf@nfold@cur@supportb\pgf@nfold@cur@movedlast \fi \fi \fi \fi \if\pgf@nfold@cur@type l \pgf@process{\pgfpointdiff{\pgf@nfold@cur@first}{\pgf@nfold@cur@last}} \pgfmathveclen@{\pgf@sys@tonumber\pgf@x}{\pgf@sys@tonumber\pgf@y} \pgf@xa=\pgf@nfold@shortenstartjoin pt\relax \advance\pgf@xa by\pgf@nfold@shortenendjoin pt\relax \ifdim\pgf@xa>\pgfmathresult pt\relax \pgf@nfold@closejoinsedgecasetrue \fi \fi \fi% \if\pgf@nfold@prev@visible0% \ifpgf@nfold@closejoinsedgecase \edef\pgf@nfold@macrotoadd{% \noexpand\pgf@nfold@token@edgecase@movetostart{\pgf@nfold@cur@movedfirst}{\pgf@nfold@cur@angle@i}% }% \pgf@nfold@addmacro\pgf@parsed@cur@conn@seg% \fi \else \ifpgf@nfold@angletoosharp\else \if\pgf@nfold@cur@type z\else \pgf@nfold@process@join \fi \fi \fi \let\pgf@nfold@prev@segment@end\pgf@nfold@cur@movedlast \if\pgf@nfold@cur@type i \let\pgf@nfold@connsubpath@tang@i\pgf@nfold@next@tang@i% \let\pgf@nfold@connsubpath@angle@i\pgf@nfold@next@angle@i% \fi \if\pgf@nfold@cur@type l \ifpgf@nfold@closejoinsedgecase\else \edef\pgf@nfold@macrotoadd{% \expandafter\noexpand\ifpgf@nfold@continuesegment% \pgf@nfold@token@lineto@continue% \else% \pgf@nfold@token@lineto% \fi{\pgf@nfold@cur@movedfirst}{\pgf@nfold@cur@movedlast}{\pgf@nfold@cur@tang@i}% }% \pgf@nfold@addmacro\pgf@parsed@cur@conn@seg% \fi \fi \if\pgf@nfold@cur@type o \def\pgf@nfold@macrotoadd{\pgf@nfold@token@closepath}% \pgf@nfold@addmacro\pgf@parsed@cur@conn@seg% \fi \if\pgf@nfold@cur@type z \def\pgf@nfold@macrotoadd{\pgf@nfold@token@closepath}% \pgf@nfold@addmacro\pgf@parsed@cur@conn@seg% \fi \if\pgf@nfold@cur@type c \ifpgf@nfold@continuesegment \pgf@subdividecurve{\pgf@nfold@cur@movedfirst}{\pgf@nfold@cur@supporta}{\pgf@nfold@cur@supportb}{\pgf@nfold@cur@movedlast}{\pgf@offset@max@recursion}{0}{\pgf@nfold@addcurvesegment@callback@continue} \else \pgf@subdividecurve{\pgf@nfold@cur@movedfirst}{\pgf@nfold@cur@supporta}{\pgf@nfold@cur@supportb}{\pgf@nfold@cur@movedlast}{\pgf@offset@max@recursion}{0}{\pgf@nfold@addcurvesegment@callback}% \fi \fi \if\pgf@nfold@cur@type i \edef\pgf@nfold@macrotoadd{% \noexpand\pgf@nfold@token@invisibleline{\pgf@nfold@cur@movedfirst}{\pgf@nfold@cur@movedlast}{\pgf@nfold@cur@tang@i}% }% \pgf@nfold@addmacro\pgf@parsed@cur@conn@seg% \fi \if\pgf@nfold@next@type t% \ifnum\pgf@nfold@end@arrowcode=1 \edef\pgf@nfold@macrotoadd{% \noexpand\pgf@nfold@extendtotip{e}{\pgf@nfold@cur@last}{\pgf@nfold@cur@angle@ii}}% \pgf@nfold@addmacro\pgf@parsed@cur@conn@seg% \fi% \fi% \fi% } \def\pgf@nfold@addcurvesegment@callback#1#2#3#4#5{% \if#50% \edef\pgf@nfold@macrotoadd{% \noexpand\pgf@nfold@token@curveto{#1}{#2}{#3}{#4}{\pgf@tmp@tang@i}{\pgf@tmp@tang@ii}% }% \pgf@nfold@addmacro\pgf@parsed@cur@conn@seg% \else% \pgf@nfold@addcurvesegment@callback@continue{#1}{#2}{#3}{#4}{#5}% \fi% } \def\pgf@nfold@addcurvesegment@callback@continue#1#2#3#4#5{% \edef\pgf@nfold@macrotoadd{% \noexpand\pgf@nfold@token@curveto@continue{#1}{#2}{#3}{#4}{\pgf@tmp@tang@i}{\pgf@tmp@tang@ii}% }% \pgf@nfold@addmacro\pgf@parsed@cur@conn@seg% } \expandafter\def\csname pgf@nfold@intersec@cache@2@3\endcsname{\pgfqpoint{2pt}{0pt}} \expandafter\def\csname pgf@nfold@intersec@cache@2@4\endcsname{\pgfqpoint{0.94063pt}{-0.33333pt}} \expandafter\def\csname pgf@nfold@intersec@cache@3@4\endcsname{\pgfqpoint{0.94063pt}{0.33333pt}} \expandafter\def\csname pgf@nfold@intersec@cache@2@5\endcsname{\pgfqpoint{0.64167pt}{-0.5pt}} \expandafter\def\csname pgf@nfold@intersec@cache@3@5\endcsname{\pgfqpoint{2pt}{0pt}} \expandafter\def\csname pgf@nfold@intersec@cache@4@5\endcsname{\pgfqpoint{0.64167pt}{0.5pt}} \def\pgf@nfold@intersec@numcached{5} \newif\ifpgf@nfold@ontheedge \def\pgf@nfold@extendtotip#1#2#3{ \ifpgf@nfold@intersectionsnotloaded \pgfutil@packageerror{tikz-nfold}{% If `nfold' is larger than \pgf@nfold@intersec@numcached\space and you use an `Implies' arrow tip you need to say \string\usetikzlibrary{intersections}}{} \else \pgf@nfold@ontheedgetrue \ifnum\pgf@nfold@index>1\relax\ifnum\pgf@nfold@index<\pgf@nfold@order\relax% \pgf@nfold@ontheedgefalse \fi\fi \ifpgf@nfold@ontheedge% \if#1s \pgfpathmoveto{\pgfpointadd{#2}{\pgfpointpolar{#3+90}{\pgf@nfold@shiftamount}}}% \fi \else \ifcsname pgf@nfold@intersec@cache@\the\pgf@nfold@index @\the\pgf@nfold@order\endcsname \pgfextract@process\pgf@nfold@arrowintersect {\csname pgf@nfold@intersec@cache@\the\pgf@nfold@index @\the\pgf@nfold@order\endcsname}% \else \pgfintersectionofpaths{ \pgfpathmoveto{\pgfqpoint{-1.4pt}{2.65pt}} \pgfpathcurveto{\pgfqpoint{-0.75pt}{1.25pt}}{\pgfqpoint{1pt}{0.05pt}}{\pgfqpoint{2pt}{0pt}} \pgfpathcurveto{\pgfqpoint{1pt}{-0.05pt}}{\pgfqpoint{-0.75pt}{-1.25pt}}{\pgfqpoint{-1.4pt}{-2.65pt}} }{ \pgfpathmoveto{\pgfqpoint{-3pt}{\pgf@nfold@shift@fraction pt}} \pgfpathlineto{\pgfqpoint{3pt}{\pgf@nfold@shift@fraction pt}} } \ifnum\pgfintersectionsolutions>0 \pgfextract@process\pgf@nfold@arrowintersect{\pgfpointintersectionsolution{1}}% \immediate\write17{tikz-nfold: computed intersection cache@\the\pgf@nfold@index @\the\pgf@nfold@order: \string\pgfqpoint{\the\pgf@x}{\the\pgf@y}^^J} \expandafter\xdef\csname pgf@nfold@intersec@cache@\the\pgf@nfold@index @\the\pgf@nfold@order\endcsname{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}} \else \pgfutil@packagewarning{tikz-nfold}{did not find intersection} \pgfextract@process\pgf@nfold@arrowintersect{\pgfqpoint{0pt}{\pgf@nfold@shift@fraction pt}}% \fi \fi% \begingroup \pgftransformreset \pgftransformshift{#2} \pgftransformrotate{#3} \if#1s \pgftransformxscale{-1} \fi \pgfutil@tempdima=\pgf@nfold@hwidth \pgfutil@tempdima=\pgf@nfold@shift@fraction\pgfutil@tempdima \pgfextract@process\pgf@nfold@startofextension {\pgfpointtransformed{\pgfqpoint{0pt}{\pgfutil@tempdima}}} \pgftransformshift{\pgfqpoint{.42\pgflinewidth}{0pt}} \pgftransformscale{\pgf@nfold@hwidth} \pgfextract@process\pgf@nfold@arrowintersect{\pgfpointtransformed{\pgf@nfold@arrowintersect}} \global\let\pgf@nfold@startofextension\pgf@nfold@startofextension \global\let\pgf@nfold@arrowintersect\pgf@nfold@arrowintersect \endgroup \if#1s \pgfpathmoveto{\pgf@nfold@arrowintersect} \pgfpathlineto{\pgf@nfold@startofextension} \else\if#1e \pgfpathlineto{\pgf@nfold@arrowintersect} \else \pgfutil@packageerror{tikz-nfold}{Invalid argument to \string\pgf@nfold@extendtotip: \meaning#1}{} \fi\fi \pgftransformreset \fi% \fi% } \def\pgf@nfold@start@arrowcode{0} \def\pgf@nfold@end@arrowcode{0} \def\pgf@nfold@parsearrows{ \ifpgfutil@tempswa% \expandafter\pgf@nfold@parsearrowmacro\pgf@start@tip@sequence\relax \let\pgf@nfold@start@arrowcode\pgf@nfold@detectedarrow \expandafter\pgf@nfold@parsearrowmacro\pgf@end@tip@sequence\relax \let\pgf@nfold@end@arrowcode\pgf@nfold@detectedarrow \else \def\pgf@nfold@start@arrowcode{0} \def\pgf@nfold@end@arrowcode{0} \fi } \def\pgf@nfold@parsearrowmacro#1{% \def\pgf@nfold@detectedarrow{0} \ifx#1\relax \let\pgf@next\relax \else \ifx#1\pgf@arrow@handle \let\pgf@next\pgf@nfold@parse@arrow@handle \else \ifx#1\pgf@arrow@handle@shorthand@empty \let\pgf@next\pgf@nfold@parse@shorthandempty \else \let\pgf@next\pgfutil@gobble@until@relax \fi \fi \fi \pgf@next } \def\pgf@nfold@param@Implies{Implies} \def\pgf@nfold@parse@arrow@handle#1{% \def\pgf@tmp{#1} \ifx\pgf@tmp\pgf@nfold@param@Implies \def\pgf@nfold@detectedarrow{1} \fi \pgfutil@gobble@until@relax } \def\pgf@nfold@parse@shorthandempty#1{ \expandafter\def\expandafter\pgf@tmp\expandafter{#1} \expandafter\pgf@nfold@parsearrowmacro\pgf@tmp\relax \pgfutil@gobble@until@relax } \newcount\pgf@nfold@order \pgf@nfold@order=1 \def\pgf@nfold@preparenfoldpath{% \ifnum\pgf@nfold@order>1\relax \ifdim\pgfinnerlinewidth>0pt\relax \pgfsyssoftpath@getcurrentpath\pgf@nfold@cachedpath% \pgfsyssoftpath@setcurrentpath\pgfutil@empty% \else \pgfutil@packageerror{tikz-nfold}{Must set \string\pgfinnerlinewidth\space to use nfold, e.g. by setting /tikz/double distance}{} \fi \fi } \let\pgf@nfold@old@path@check@proper\pgf@path@check@proper \def\pgf@path@check@proper{% \pgf@nfold@old@path@check@proper% \ifpgfutil@tempswa\else% \pgf@nfold@preparenfoldpath% \fi% } \let\pgf@nfold@old@prepare@start@of@path\pgf@prepare@start@of@path \def\pgf@prepare@start@of@path{% \pgf@nfold@old@prepare@start@of@path% \pgf@nfold@preparenfoldpath% } \let\pgf@nfold@old@stroke@inner@line\pgf@stroke@inner@line \def\pgf@stroke@inner@line{% \ifnum\pgf@nfold@order>1\relax% \pgf@nfold@render@cached@softpath% \else% \pgf@nfold@old@stroke@inner@line% \fi% } \def\pgf@nfold@parsemoveto#1#2{% \ifx\pgf@cur@conn@subpath\pgfutil@empty% \def\pgf@nfold@parser@last@moveto{{#1}{#2}}% \def\pgf@cur@conn@subpath{\relax}% \else% \def\pgf@nfold@macrotoadd{\pgf@nfold@processmoveto{#1}{#2}}% \pgf@nfold@addmacro\pgf@cur@conn@subpath% \pgf@nfold@lastconnsubpathfalse% \pgf@nfold@process@conn@subpath% \let\pgf@nfold@last@closepath@from\pgfutil@empty% \let\pgf@cur@conn@subpath\pgfutil@empty% \pgf@nfold@parser@setupfirst% \def\pgf@nfold@parser@last@moveto{{#1}{#2}}% \fi% \pgf@nfold@parsesoftpath@finish{#1}{#2}% } \def\pgf@nfold@parselineto#1#2{% \def\pgf@nfold@macrotoadd{\pgf@nfold@processlineto{#1}{#2}}% \pgf@nfold@addmacro\pgf@cur@conn@subpath% \pgf@nfold@parsesoftpath@finish{#1}{#2}% } \def\pgf@nfold@parseclosepath#1#2{% \let\pgf@nfold@last@closepath@from\pgf@nfold@parser@previous@pt% \def\pgf@nfold@macrotoadd{\pgf@nfold@processclosepath{#1}{#2}}% \pgf@nfold@addmacro\pgf@cur@conn@subpath% \pgf@nfold@parsesoftpath@finish{#1}{#2}% } \def\pgf@nfold@parsecurveto#1#2{% \edef\pgf@nfold@macrotoadd{\noexpand\pgf@nfold@processcurveto\pgf@nfold@parser@supporta\pgf@nfold@parser@supportb{#1}{#2}}% \pgf@nfold@addmacro\pgf@cur@conn@subpath% \pgf@nfold@parsesoftpath@finish{#1}{#2}% } \def\pgf@nfold@parserect#1#2#3#4{% \pgf@nfold@parsemoveto{#1}{#2}% \pgf@xc=#1\relax \pgf@yc=#2\relax \pgf@xd=#3\relax \pgf@yd=#4\relax \advance\pgf@yc\pgf@yd% \edef\pgf@temp{{\the\pgf@xc}{\the\pgf@yc}}% \expandafter\pgf@nfold@parselineto\pgf@temp% \advance\pgf@xc\pgf@xd% \edef\pgf@temp{{\the\pgf@xc}{\the\pgf@yc}}% \expandafter\pgf@nfold@parselineto\pgf@temp% \advance\pgf@yc-\pgf@yd% \edef\pgf@temp{{\the\pgf@xc}{\the\pgf@yc}}% \expandafter\pgf@nfold@parselineto\pgf@temp% \advance\pgf@xc-\pgf@xd% \edef\pgf@temp{{\the\pgf@xc}{\the\pgf@yc}}% \expandafter\pgf@nfold@parseclosepath\pgf@temp% \pgf@nfold@parsemoveto{#1}{#2}% } \def\pgf@nfold@parsesoftpath#1#2{% \let\pgf@cur@conn@subpath\pgfutil@empty% \let\pgf@all@parsed@subpaths\pgfutil@empty% \edef\pgf@nfold@parser@last@moveto{{\the\pgf@path@lastx}{\the\pgf@path@lasty}}% \let\pgf@nfold@last@closepath@from\pgfutil@empty% \pgf@nfold@parser@setupfirst% \expandafter\pgf@nfold@@parsesoftpath#1\pgf@stop{}{}% \let#2\pgf@all@parsed@subpaths% }% \def\pgf@nfold@@parsesoftpath#1#2#3{% \let\pgf@next\pgf@nfold@@parsesoftpath% \ifx#1\pgf@stop% \def\pgf@nfold@macrotoadd{\pgf@nfold@processlast}% \pgf@nfold@addmacro\pgf@cur@conn@subpath% \pgf@nfold@lastconnsubpathtrue% \pgf@nfold@process@conn@subpath% \let\pgf@next\relax% \else% \ifx#1\pgfsyssoftpath@movetotoken% \pgf@nfold@parsemoveto{#2}{#3}% \else% \ifx#1\pgfsyssoftpath@linetotoken% \pgf@nfold@parselineto{#2}{#3}% \else% \ifx#1\pgfsyssoftpath@curvetosupportatoken% \def\pgf@nfold@parser@supporta{{#2}{#3}}% \else% \ifx#1\pgfsyssoftpath@curvetosupportbtoken% \def\pgf@nfold@parser@supportb{{#2}{#3}}% \else% \ifx#1\pgfsyssoftpath@curvetotoken% \pgf@nfold@parsecurveto{#2}{#3}% \else% \ifx#1\pgfsyssoftpath@closepathtoken% \pgf@nfold@parseclosepath{#2}{#3}% \else% \ifx#1\pgfsyssoftpath@rectcornertoken% \def\pgf@nfold@parser@rectcorner{{#2}{#3}}% \else% \ifx#1\pgfsyssoftpath@rectsizetoken% \expandafter\pgf@nfold@parserect\pgf@nfold@parser@rectcorner{#2}{#3}% \else% \pgfutil@packageerror{tikz-nfold}{Unrecognised soft path token `#1'}{}% \fi% \fi% \fi% \fi% \fi% \fi% \fi% \fi% \fi% \pgf@next% }% \def\pgf@nfold@parsesoftpath@finish#1#2{% \def\pgf@nfold@parser@previous@pt{{#1}{#2}}% \let\pgf@nfold@sectolast@segment\pgf@nfold@last@segment% \let\pgf@nfold@last@segment\pgf@nfold@macrotoadd% } \def\pgf@nfold@process@conn@subpath{% \let\pgf@parsed@cur@conn@seg\pgfutil@empty% \ifx\pgf@nfold@last@closepath@from\pgfutil@empty% \expandafter\pgf@nfold@processmoveto\pgf@nfold@parser@last@moveto% \else% \expandafter\pgf@nfold@processmoveto\pgf@nfold@last@closepath@from% \expandafter\pgf@nfold@processinvisibleline\pgf@nfold@parser@last@moveto% \fi% \pgf@cur@conn@subpath% \let\pgf@nfold@macrotoadd\pgf@parsed@cur@conn@seg% \pgf@nfold@addmacro\pgf@all@parsed@subpaths% } \def\pgf@nfold@processmoveto#1#2{% \pgf@nfold@process@moveup% \let\pgf@nfold@next@type=m% \let\pgf@nfold@next@visible=0% \edef\pgf@nfold@next@last{\pgf@x#1\pgf@y#2}% \pgf@nfold@process@segment% }% \def\pgf@nfold@process@line@common#1#2#3{% \pgf@nfold@process@moveup% \pgfextract@process\pgf@tmp@tang@i{\pgfpointnormalised{}\global\let\pgf@nfold@tmp\pgf@tmp} \let\pgf@nfold@next@type=#3% \let\pgf@nfold@next@visible=1% \let\pgf@nfold@next@tang@i\pgf@tmp@tang@i \let\pgf@nfold@next@tang@ii\pgf@tmp@tang@i \let\pgf@nfold@next@angle@i\pgf@nfold@tmp \let\pgf@nfold@next@angle@ii\pgf@nfold@tmp \let\pgf@nfold@next@first\pgf@nfold@cur@last \def\pgf@nfold@next@last{\pgf@x#1\pgf@y#2}% \pgf@nfold@process@segment% } \def\pgf@nfold@processlineto#1#2{% \pgf@process{\pgfpointdiff{\pgf@nfold@next@last}{\pgf@x#1\pgf@y#2}}% \pgfpointtaxicabnorm\pgf@xa% \ifdim\pgf@xa>.1pt\relax% \pgf@nfold@process@line@common{#1}{#2}{l}% \fi% }% \def\pgf@nfold@processcurveto#1#2#3#4#5#6{% \pgf@nfold@process@moveup% \pgf@offset@compute@tangents{\pgf@nfold@cur@last}{\pgf@x#1\pgf@y#2}{\pgf@x#3\pgf@y#4}{\pgf@x#5\pgf@y#6}% \let\pgf@nfold@next@type=c% \let\pgf@nfold@next@visible=1% \let\pgf@nfold@next@tang@i=\pgf@tmp@tang@i \let\pgf@nfold@next@tang@ii=\pgf@tmp@tang@ii \let\pgf@nfold@next@angle@i\pgf@tmp@angle@i \let\pgf@nfold@next@angle@ii\pgf@tmp@angle@ii \let\pgf@nfold@next@first\pgf@nfold@cur@last \def\pgf@nfold@next@supporta{\pgf@x#1\pgf@y#2} \def\pgf@nfold@next@supportb{\pgf@x#3\pgf@y#4} \def\pgf@nfold@next@last{\pgf@x#5\pgf@y#6} \pgf@nfold@process@segment% }% \def\pgf@nfold@processclosepath#1#2{% \pgf@process{\pgfpointdiff{\pgf@nfold@next@last}{\pgf@x#1\pgf@y#2}}% \pgfpointtaxicabnorm\pgf@xa% \ifdim\pgf@xa<0.1pt\relax% \pgf@nfold@process@closepath@zerolength{#1}{#2}% \else% \pgf@nfold@process@line@common{#1}{#2}{o}% \fi% }% \def\pgf@nfold@process@closepath@zerolength#1#2{% \pgf@nfold@process@moveup% \let\pgf@nfold@next@type=z% \let\pgf@nfold@next@visible=1% \let\pgf@nfold@next@tang@i\pgf@nfold@connsubpath@tang@i \let\pgf@nfold@next@tang@ii\pgf@nfold@connsubpath@tang@i \let\pgf@nfold@next@angle@i\pgf@nfold@connsubpath@angle@i \let\pgf@nfold@next@angle@ii\pgf@nfold@connsubpath@angle@i \let\pgf@nfold@next@first\pgf@nfold@cur@last \def\pgf@nfold@next@last{\pgf@x#1\pgf@y#2}% \pgf@nfold@process@segment% } \def\pgf@nfold@processinvisibleline#1#2{% \pgf@process{\pgfpointdiff{\pgf@nfold@next@last}{\pgf@x#1\pgf@y#2}}% \pgfpointtaxicabnorm\pgf@xa% \ifdim\pgf@xa>.1pt\relax% \pgf@nfold@process@line@common{#1}{#2}{i}% \else% \begingroup% \let\pgf@nfold@process@segment\relax% \pgf@nfold@sectolast@segment% \global\let\pgf@nfold@tmp\pgf@nfold@next@tang@ii% \endgroup% \pgfextract@process\pgf@nfold@next@first{\pgfpointdiff{\pgf@nfold@tmp}{\pgfqpoint{#1}{#2}}}% \pgf@nfold@tmp% \pgf@nfold@process@line@common{#1}{#2}{i}% \fi% }% \def\pgf@nfold@processlast{% \pgf@nfold@process@moveup% \let\pgf@nfold@next@type=t% \let\pgf@nfold@next@visible=0% \pgf@nfold@process@segment% } \def\pgf@nfold@addmacro#1{% \expandafter\expandafter\expandafter\gdef% \expandafter\expandafter\expandafter#1% \expandafter\expandafter\expandafter{% \expandafter#1\pgf@nfold@macrotoadd}% } \def\pgf@nfold@token@lineto#1#2#3{% \pgfoffsetline@{#1}{#2}{\pgf@nfold@shiftamount}{#3}% } \def\pgf@nfold@token@lineto@continue#1#2#3{% \pgfoffsetlinenomove@{#1}{#2}{\pgf@nfold@shiftamount}{#3}% } \def\pgf@nfold@token@invisibleline#1#2#3{% \pgfqpointscale{\pgf@nfold@shiftamount}{#3}% \pgf@xc=-\pgf@y% \pgf@y=\pgf@x% \pgf@x=\pgf@xc% \pgfpathmoveto{\pgfpointadd{}{#2}}% } \def\pgf@nfold@token@curveto#1#2#3#4#5#6{% \def\pgf@tmp@tang@i{#5}% \def\pgf@tmp@tang@ii{#6}% \pgf@offset@bezier@segment@{#1}{#2}{#3}{#4}{\pgf@nfold@shiftamount}% \pgfpathmoveto{\pgf@bezier@offset@i}% \pgfpathcurveto{\pgf@bezier@offset@ii}{\pgf@bezier@offset@iii}{\pgf@bezier@offset@iv}% } \def\pgf@nfold@token@curveto@continue#1#2#3#4#5#6{% \def\pgf@tmp@tang@i{#5}% \def\pgf@tmp@tang@ii{#6}% \pgf@offset@bezier@segment@{#1}{#2}{#3}{#4}{\pgf@nfold@shiftamount}% \pgfpathcurveto{\pgf@bezier@offset@ii}{\pgf@bezier@offset@iii}{\pgf@bezier@offset@iv}% } \def\pgf@nfold@token@closepath{% \pgfpathclose% } \def\pgf@nfold@token@edgecase@movetostart#1#2{% \pgfpathmoveto{\pgfpointadd% {#1}{\pgfpointpolar{#2+90}{\pgf@nfold@shiftamount}}}% } \def\pgf@nfold@parser@setupfirst{% \let\pgf@nfold@next@type=f% \let\pgf@nfold@next@visible=0% \edef\pgf@nfold@next@last{\pgf@x\the\pgf@path@lastx\pgf@y\the\pgf@path@lasty}% } \def\pgf@nfold@clampangle{ \ifdim\pgfmathresult pt<-180pt\relax \pgfutil@tempdima=\pgfmathresult pt \advance\pgfutil@tempdima by 360pt \edef\pgfmathresult{\pgf@sys@tonumber\pgfutil@tempdima} \else\ifdim\pgfmathresult pt>180pt\relax \pgfutil@tempdima=\pgfmathresult pt \advance\pgfutil@tempdima by -360pt \edef\pgfmathresult{\pgf@sys@tonumber\pgfutil@tempdima} \fi\fi } \def\pgf@nfold@process@moveup{% \let\pgf@nfold@prev@type\pgf@nfold@cur@type% \let\pgf@nfold@prev@visible\pgf@nfold@cur@visible% \let\pgf@nfold@prev@tang@i\pgf@nfold@cur@tang@i% \let\pgf@nfold@prev@tang@ii\pgf@nfold@cur@tang@ii% \let\pgf@nfold@prev@angle@i\pgf@nfold@cur@angle@i% \let\pgf@nfold@prev@angle@ii\pgf@nfold@cur@angle@ii% \let\pgf@nfold@prev@first\pgf@nfold@cur@first% \let\pgf@nfold@prev@supporta\pgf@nfold@cur@supporta% \let\pgf@nfold@prev@supportb\pgf@nfold@cur@supportb% \let\pgf@nfold@prev@last\pgf@nfold@cur@last% \let\pgf@nfold@cur@type\pgf@nfold@next@type% \let\pgf@nfold@cur@visible\pgf@nfold@next@visible% \let\pgf@nfold@cur@tang@i\pgf@nfold@next@tang@i% \let\pgf@nfold@cur@tang@ii\pgf@nfold@next@tang@ii% \let\pgf@nfold@cur@angle@i\pgf@nfold@next@angle@i% \let\pgf@nfold@cur@angle@ii\pgf@nfold@next@angle@ii \let\pgf@nfold@cur@first\pgf@nfold@next@first% \let\pgf@nfold@cur@supporta\pgf@nfold@next@supporta% \let\pgf@nfold@cur@supportb\pgf@nfold@next@supportb% \let\pgf@nfold@cur@last\pgf@nfold@next@last% } \def\pgfoffsetpath#1#2{% \begingroup \pgfmathsetlengthmacro\pgf@nfold@parsed@hwidth{#2} \pgf@x=\pgf@nfold@parsed@hwidth\relax \ifdim\pgf@x<0pt\relax \pgf@x=-\pgf@x \def\pgf@nfold@shift@fraction{-1} \else \def\pgf@nfold@shift@fraction{1} \fi \edef\pgf@nfold@parsed@hwidth{\the\pgf@x} \pgfoffsetpathqfraction{#1}{\pgf@nfold@parsed@hwidth}{\pgf@nfold@shift@fraction} \endgroup } \def\pgfoffsetpathfraction#1#2#3{% \begingroup \pgfmathsetlengthmacro\pgf@nfold@parsed@hwidth{#2} \pgfmathsetmacro\pgf@nfold@shift@fraction{#3} \pgfoffsetpathqfraction{#1}{\pgf@nfold@parsed@hwidth}{\pgf@nfold@shift@fraction} \endgroup } \def\pgfoffsetpathindex#1#2#3#4{% \begingroup \pgfmathsetmacro\pgf@nfold@shift@fraction{-1+2*(#3-1)/(#4-1)} \pgfoffsetpathqfraction{#1}{#2}{\pgf@nfold@shift@fraction} \endgroup } \def\pgfoffsetpathqfraction#1#2#3{% \begingroup \pgf@x=#2\relax \edef\pgf@nfold@hwidth{\the\pgf@x} \edef\pgf@nfold@shift@fraction{#3} \pgf@x=\pgf@nfold@shift@fraction\pgf@x\relax \edef\pgf@nfold@shiftamount{\pgf@sys@tonumber\pgf@x} \pgfprocessround{#1}{\pgf@nfold@cachedpath}% \pgf@nfold@parsesoftpath{\pgf@nfold@cachedpath}{\parsedpath}% \pgftransformreset% \parsedpath% \endgroup } \endinput