%% %% This is file `spath3.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% spath3.dtx (with options: `spath3') %% ---------------------------------------------------------------- %% spath3 --- Functions for manipulating PGF soft paths %% E-mail: stacey@math.ntnu.no %% Released under the LaTeX Project Public License v1.3c or later %% See http://www.latex-project.org/lppl.txt %% ---------------------------------------------------------------- %% \NeedsTeXFormat{LaTeX2e} \RequirePackage{expl3} \RequirePackage{pgf} \ProvidesExplPackage {spath3} {2016/02/19} {1.1} {Functions for manipulating PGF soft paths} \RequirePackage{xparse} \tl_new:N \l__spath_tmpa_tl \tl_new:N \l__spath_tmpb_tl \tl_new:N \l__spath_tmpc_tl \tl_new:N \l__spath_tmpd_tl \tl_new:N \l__spath_smuggle_tl \dim_new:N \l__spath_tmpa_dim \dim_new:N \l__spath_tmpb_dim \fp_new:N \l__spath_tmpa_fp \fp_new:N \l__spath_tmpb_fp \int_new:N \l__spath_tmpa_int \tl_new:N \g__spath_moveto_tl \tl_new:N \g__spath_lineto_tl \tl_new:N \g__spath_curveto_tl \tl_new:N \g__spath_curvetoa_tl \tl_new:N \g__spath_curvetob_tl \tl_new:N \g__spath_closepath_tl \tl_set:Nn \g__spath_moveto_tl {\pgfsyssoftpath@movetotoken} \tl_set:Nn \g__spath_lineto_tl {\pgfsyssoftpath@linetotoken} \tl_set:Nn \g__spath_curveto_tl {\pgfsyssoftpath@curvetotoken} \tl_set:Nn \g__spath_curvetoa_tl {\pgfsyssoftpath@curvetosupportatoken} \tl_set:Nn \g__spath_curvetob_tl {\pgfsyssoftpath@curvetosupportbtoken} \tl_set:Nn \g__spath_closepath_tl {\pgfsyssoftpath@closepathtoken} \tl_new:N \g__spath_attributes \tl_new:N \g__spath_moveable_attributes \tl_new:N \g__spath_path_attributes \tl_set:Nn \g__spath_attributes { {path} {reverse path} {length} {real length} {number of components} {initial point} {final point} {initial action} {final action} {min bb} {max bb} } \tl_set:Nn \g__spath_moveable_attributes { {initial point} {final point} {min bb} {max bb} } \tl_set:Nn \g__spath_path_attributes { {path} {reverse path} } \cs_new_nopar:Npn \spath_new:n #1 { \prop_new:c {l__spath_#1} } \cs_new_nopar:Npn \spath_clear:n #1 { \prop_gclear:c {l__spath_#1} } \cs_new_nopar:Npn \spath_clear_new:n #1 { \prop_gclear_new:c {l__spath_#1} } \cs_new_nopar:Npn \spath_show:n #1 { \prop_show:c {l__spath_#1} } \cs_new_nopar:Npn \spath_put:nnn #1#2#3 { \prop_gput:cnn {l__spath_#1} {#2} {#3} } \cs_new_nopar:Npn \spath_remove:nn #1#2 { \prop_gremove:cn {l__spath_#1} {#2} } \cs_new_nopar:Npn \__spath_get:nn #1#2 { \prop_item:cn {l__spath_#1} {#2} } \cs_new_nopar:Npn \__spath_get:nnN #1#2#3 { \prop_get:cnN {l__spath_#1} {#2} #3 } \prg_new_conditional:Npnn \spath_if_in:nn #1#2 {p, T, F, TF} { \prop_if_in:cnTF {l__spath_#1} {#2} { \prg_return_true: } { \prg_return_false: } } \cs_generate_variant:Nn \__prop_split:NnTF {cnTF} \prg_new_protected_conditional:Npnn \__spath_get:nnN #1#2#3 {T, F, TF} { \__prop_split:cnTF {l__spath_#1} {#2} { \tl_set:Nn #3 {##2} \prg_return_true: } { \prg_return_false: } } \cs_generate_variant:Nn \spath_put:nnn {nnV, nnx, nno} \cs_generate_variant:Nn \__spath_get:nn {Vn} \cs_generate_variant:Nn \__spath_get:nnN {VnN} \prg_new_conditional:Npnn \spath_if_exist:n #1 {p,T,F,TF} { \prop_if_exist:cTF {l__spath_#1} { \prg_return_true: } { \prg_return_false: } } \cs_new_nopar:Npn \spath_clone:nn #1 #2 { \spath_clear_new:n {#2} \tl_map_inline:Nn \g__spath_attributes { \spath_if_in:nnT {#1} {##1} { \__spath_get:nnN {#1} {##1} \l__spath_tmpa_tl \spath_put:nnV {#2} {##1} \l__spath_tmpa_tl } } } \cs_new_protected_nopar:Npn \spath_get_current_path:n #1 { \pgfsyssoftpath@getcurrentpath\l__spath_tmpa_tl \spath_clear_new:n {#1} \spath_put:nnV {#1} {path} \l__spath_tmpa_tl } \cs_new_protected_nopar:Npn \spath_set_current_path:n #1 { \spath_get:nnN {#1} {min bb} \l__spath_tmpa_tl \exp_last_unbraced:NV \pgf@protocolsizes\l__spath_tmpa_tl \spath_get:nnN {#1} {max bb} \l__spath_tmpa_tl \exp_last_unbraced:NV \pgf@protocolsizes\l__spath_tmpa_tl \spath_get:nnN {#1} {path} \l__spath_tmpa_tl \pgfsyssoftpath@setcurrentpath\l__spath_tmpa_tl \pgfsyssoftpath@flushcurrentpath } \cs_new_protected_nopar:Npn \spath_use_path:nn #1#2 { \spath_set_current_path:n {#1} \pgfusepath{#2} } \cs_new_protected_nopar:Npn \spath_protocol_path:n #1 { \spath_get:nnN {#1} {min bb} \l__spath_tmpa_tl \exp_last_unbraced:NV \pgf@protocolsizes\l__spath_tmpa_tl \spath_get:nnN {#1} {max bb} \l__spath_tmpa_tl \exp_last_unbraced:NV \pgf@protocolsizes\l__spath_tmpa_tl } \cs_new_protected_nopar:Npn \spath_tikz_path:nn #1#2 { \path[#1] \pgfextra{ \spath_get:nnN {#2} {path} \l__spath_tmpa_tl \pgfsyssoftpath@setcurrentpath \l__spath_tmpa_tl }; } \cs_generate_variant:Nn \spath_tikz_path:nn {Vn} \cs_new_nopar:Npn \spath_get:nn #1#2 { \spath_if_in:nnF {#1} {#2} { \cs_if_exist_use:cT {spath_generate_#2:n} {{#1}} } \__spath_get:nn {#1} {#2} } \cs_new_nopar:Npn \spath_get:nnN #1#2#3 { \spath_if_in:nnF {#1} {#2} { \cs_if_exist_use:cT {spath_generate_#2:n} {{#1}} } \__spath_get:nnN {#1} {#2} #3 } \cs_generate_variant:Nn \spath_get:nnN {nnV,VnN,VnV} \cs_new_nopar:Npn \spath_generate_length:n #1 { \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl \spath_put:nnx {#1} {length} {\int_eval:n {\tl_count:N \l__spath_tmpa_tl /3 }} } \cs_new_nopar:Npn \spath_generate_reallength:n #1 { \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl \int_set:Nn \l__spath_tmpa_int {0} \tl_map_inline:Nn \l__spath_tmpa_tl { \tl_if_eq:nnT {##1} {\pgfsyssoftpath@linetotoken} { \int_incr:N \l__spath_tmpa_int } \tl_if_eq:nnT {##1} {\pgfsyssoftpath@curvetotoken} { \int_incr:N \l__spath_tmpa_int } } \spath_put:nnx {#1} {real length} {\int_use:N \l__spath_tmpa_int} } \cs_new_nopar:Npn \spath_generate_numberofcomponents:n #1 { \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl \int_set:Nn \l__spath_tmpa_int {0} \tl_map_inline:Nn \l__spath_tmpa_tl { \tl_if_eq:nnT {##1} {\pgfsyssoftpath@movetotoken} { \int_incr:N \l__spath_tmpa_int } } \spath_put:nnx {#1} {number of components} {\int_use:N \l__spath_tmpa_int} } \cs_new_nopar:Npn \spath_generate_initialpoint:n #1 { \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl \tl_clear:N \l__spath_tmpb_tl \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}} \spath_put:nnV {#1} {initial point} \l__spath_tmpb_tl } \cs_new_nopar:Npn \spath_generate_finalpoint:n #1 { \tl_clear:N \l__spath_tmpb_tl \spath_if_in:nnTF {#1} {reverse path} { \__spath_get:nnN {#1} {reverse path} \l__spath_tmpa_tl \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}} } { \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl \tl_reverse:N \l__spath_tmpa_tl \tl_put_left:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \tl_put_left:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}} } \spath_put:nnV {#1} {final point} \l__spath_tmpb_tl } \cs_generate_variant:Nn \spath_generate_finalpoint:n {V} \cs_new_nopar:Npn \spath_generate_reversepath:n #1 { \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl \tl_clear:N \l__spath_tmpb_tl \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \tl_put_left:Nx \l__spath_tmpb_tl { {\dim_use:N \l__spath_tmpa_dim} {\dim_use:N \l__spath_tmpb_dim} } \bool_until_do:nn { \tl_if_empty_p:N \l__spath_tmpa_tl } { \tl_set:Nx \l__spath_tmpc_tl {\tl_head:N \l__spath_tmpa_tl} \tl_set:Nn \l__spath_tmpd_tl {} \tl_case:NnF \l__spath_tmpc_tl { \g__spath_moveto_tl {\tl_set_eq:NN \l__spath_tmpd_tl \g__spath_moveto_tl } \g__spath_lineto_tl {\tl_set_eq:NN \l__spath_tmpd_tl \g__spath_lineto_tl } \g__spath_curveto_tl {\tl_set_eq:NN \l__spath_tmpd_tl \g__spath_curvetoa_tl } \g__spath_curvetoa_tl {\tl_set_eq:NN \l__spath_tmpd_tl \g__spath_curveto_tl } \g__spath_curvetob_tl {\tl_set_eq:NN \l__spath_tmpd_tl \g__spath_curvetob_tl } } { \tl_show:N \l__spath_tmpc_tl } \tl_put_left:NV \l__spath_tmpb_tl \l__spath_tmpd_tl \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \tl_put_left:Nx \l__spath_tmpb_tl { {\dim_use:N \l__spath_tmpa_dim} {\dim_use:N \l__spath_tmpb_dim} } } \tl_put_left:NV \l__spath_tmpb_tl \g__spath_moveto_tl \spath_put:nnV {#1} {reverse path} \l__spath_tmpb_tl } \cs_new_nopar:Npn \spath_generate_initialaction:n #1 { \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl \tl_clear:N \l__spath_tmpb_tl \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \tl_if_empty:NF \l__spath_tmpa_tl { \tl_set:Nx \l__spath_tmpb_tl {\tl_head:N \l__spath_tmpa_tl} } \spath_put:nnV {#1} {initial action} \l__spath_tmpb_tl } \cs_new_nopar:Npn \spath_generate_finalaction:n #1 { \tl_clear:N \l__spath_tmpb_tl \spath_if_in:nnTF {#1} {reverse path} { \__spath_get:nnN {#1} {reverse path} \l__spath_tmpa_tl \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} } { \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl \tl_reverse:N \l__spath_tmpa_tl } \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \tl_if_empty:NF \l__spath_tmpa_tl { \tl_set:Nx \l__spath_tmpb_tl {\tl_head:N \l__spath_tmpa_tl} } \tl_if_eq:NNT \l__spath_tmpa_tl \g__spath_curvetoa_tl { \tl_set_eq:NN \l__spath_tmpa_tl \g__spath_curveto_tl } \spath_put:nnV {#1} {final action} \l__spath_tmpb_tl } \cs_new_nopar:Npn \spath_generate_minbb:n #1 { \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \bool_until_do:nn { \tl_if_empty_p:N \l__spath_tmpa_tl } { \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \dim_set:Nn \l__spath_tmpa_dim {\dim_min:nn {\tl_head:N \l__spath_tmpa_tl} {\l__spath_tmpa_dim}} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \dim_set:Nn \l__spath_tmpb_dim {\dim_min:nn {\tl_head:N \l__spath_tmpa_tl} {\l__spath_tmpb_dim}} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} } \tl_clear:N \l__spath_tmpb_tl \tl_put_right:Nx \l__spath_tmpb_tl { {\dim_use:N \l__spath_tmpa_dim} {\dim_use:N \l__spath_tmpb_dim} } \spath_put:nnV {#1} {min bb} \l__spath_tmpb_tl } \cs_new_nopar:Npn \spath_generate_maxbb:n #1 { \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \bool_until_do:nn { \tl_if_empty_p:N \l__spath_tmpa_tl } { \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \dim_set:Nn \l__spath_tmpa_dim {\dim_max:nn {\tl_head:N \l__spath_tmpa_tl} {\l__spath_tmpa_dim}} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \dim_set:Nn \l__spath_tmpb_dim {\dim_max:nn {\tl_head:N \l__spath_tmpa_tl} {\l__spath_tmpb_dim}} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} } \tl_clear:N \l__spath_tmpb_tl \tl_put_right:Nx \l__spath_tmpb_tl { {\dim_use:N \l__spath_tmpa_dim} {\dim_use:N \l__spath_tmpb_dim} } \spath_put:nnV {#1} {max bb} \l__spath_tmpb_tl } \tl_new:N \l__spath_rp_tl \int_new:N \l__spath_l_int \int_new:N \l__spath_rl_int \int_new:N \l__spath_nc_int \tl_new:N \l__spath_ip_tl \tl_new:N \l__spath_fp_tl \tl_new:N \l__spath_ia_tl \tl_new:N \l__spath_fa_tl \dim_new:N \l__spath_minx_dim \dim_new:N \l__spath_miny_dim \dim_new:N \l__spath_maxx_dim \dim_new:N \l__spath_maxy_dim \cs_new_nopar:Npn \spath_generate_all:n #1 { \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl \tl_clear:N \l__spath_rp_tl \int_set:Nn \l__spath_l_int {1} \int_zero:N \l__spath_rl_int \int_set:Nn \l__spath_nc_int {1} \tl_clear:N \l__spath_ip_tl \tl_clear:N \l__spath_fp_tl \tl_clear:N \l__spath_ia_tl \tl_clear:N \l__spath_fa_tl \dim_zero:N \l__spath_minx_dim \dim_zero:N \l__spath_miny_dim \dim_zero:N \l__spath_maxx_dim \dim_zero:N \l__spath_maxy_dim \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \tl_clear:N \l__spath_ip_tl \tl_put_right:Nx \l__spath_ip_tl { {\dim_use:N \l__spath_tmpa_dim} {\dim_use:N \l__spath_tmpb_dim} } \dim_set_eq:NN \l__spath_minx_dim \l__spath_tmpa_dim \dim_set_eq:NN \l__spath_miny_dim \l__spath_tmpb_dim \dim_set_eq:NN \l__spath_maxx_dim \l__spath_tmpa_dim \dim_set_eq:NN \l__spath_maxy_dim \l__spath_tmpb_dim \tl_put_left:Nx \l__spath_rp_tl { {\dim_use:N \l__spath_tmpa_dim} {\dim_use:N \l__spath_tmpb_dim} } \tl_set:Nx \l__spath_ia_tl {\tl_head:N \l__spath_tmpa_tl} \bool_until_do:nn { \tl_if_empty_p:N \l__spath_tmpa_tl } { \tl_set:Nx \l__spath_tmpc_tl {\tl_head:N \l__spath_tmpa_tl} \tl_set:Nn \l__spath_tmpd_tl {} \tl_set_eq:NN \l__spath_fa_tl \l__spath_tmpc_tl \int_incr:N \l__spath_l_int \tl_case:NnF \l__spath_tmpc_tl { \g__spath_moveto_tl { \tl_set_eq:NN \l__spath_tmpd_tl \g__spath_moveto_tl \int_incr:N \l__spath_nc_int } \g__spath_lineto_tl { \tl_set_eq:NN \l__spath_tmpd_tl \g__spath_lineto_tl \int_incr:N \l__spath_rl_int } \g__spath_curveto_tl { \tl_set_eq:NN \l__spath_tmpd_tl \g__spath_curvetoa_tl \int_incr:N \l__spath_rl_int } \g__spath_curvetoa_tl { \tl_set_eq:NN \l__spath_tmpd_tl \g__spath_curveto_tl } \g__spath_curvetob_tl { \tl_set_eq:NN \l__spath_tmpd_tl \g__spath_curvetob_tl } } { \tl_show:N \l__spath_tmpc_tl } \tl_put_left:NV \l__spath_rp_tl \l__spath_tmpd_tl \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \dim_set:Nn \l__spath_minx_dim {\dim_min:nn { \l__spath_minx_dim} {\l__spath_tmpa_dim}} \dim_set:Nn \l__spath_miny_dim {\dim_min:nn { \l__spath_miny_dim} {\l__spath_tmpb_dim}} \dim_set:Nn \l__spath_maxx_dim {\dim_max:nn { \l__spath_maxx_dim} {\l__spath_tmpa_dim}} \dim_set:Nn \l__spath_maxy_dim {\dim_max:nn { \l__spath_maxy_dim} {\l__spath_tmpb_dim}} \tl_put_left:Nx \l__spath_rp_tl { {\dim_use:N \l__spath_tmpa_dim} {\dim_use:N \l__spath_tmpb_dim} } \tl_set:Nx \l__spath_fp_tl { {\dim_use:N \l__spath_tmpa_dim} {\dim_use:N \l__spath_tmpb_dim} } } \tl_put_left:NV \l__spath_rp_tl \g__spath_moveto_tl \spath_put:nnV {#1} {reverse path} \l__spath_rp_tl \spath_put:nnV {#1} {length} \l__spath_l_int \spath_put:nnV {#1} {real length} \l__spath_rl_int \spath_put:nnV {#1} {number of components} \l__spath_nc_int \spath_put:nnV {#1} {initial point} \l__spath_ip_tl \spath_put:nnV {#1} {final point} \l__spath_fp_tl \spath_put:nnV {#1} {initial action} \l__spath_ia_tl \spath_put:nnV {#1} {final action} \l__spath_fa_tl \tl_clear:N \l__spath_tmpb_tl \tl_put_right:Nx \l__spath_tmpb_tl { {\dim_use:N \l__spath_minx_dim} {\dim_use:N \l__spath_miny_dim} } \spath_put:nnV {#1} {min bb} \l__spath_tmpb_tl \tl_clear:N \l__spath_tmpb_tl \tl_put_right:Nx \l__spath_tmpb_tl { {\dim_use:N \l__spath_maxx_dim} {\dim_use:N \l__spath_maxy_dim} } \spath_put:nnV {#1} {max bb} \l__spath_tmpb_tl } \cs_new_nopar:Npn \spath_translate:nnn #1#2#3 { \tl_map_inline:Nn \g__spath_moveable_attributes { \spath_if_in:nnT {#1} {##1} { \__spath_get:nnN {#1} {##1} \l__spath_tmpa_tl \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl + #2} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl + #3} \tl_clear:N \l__spath_tmpb_tl \tl_put_right:Nx \l__spath_tmpb_tl { {\dim_use:N \l__spath_tmpa_dim} {\dim_use:N \l__spath_tmpb_dim} } \spath_put:nnV {#1} {##1} \l__spath_tmpb_tl } } \tl_map_inline:Nn \g__spath_path_attributes { \spath_if_in:nnT {#1} {##1} { \__spath_get:nnN {#1} {##1} \l__spath_tmpa_tl \tl_clear:N \l__spath_tmpb_tl \bool_until_do:nn { \tl_if_empty_p:N \l__spath_tmpa_tl } { \tl_put_right:Nx \l__spath_tmpb_tl {\tl_head:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl + #2} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl + #3} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \tl_put_right:Nx \l__spath_tmpb_tl { {\dim_use:N \l__spath_tmpa_dim} {\dim_use:N \l__spath_tmpb_dim} } } \spath_put:nnV {#1} {##1} \l__spath_tmpb_tl } } } \cs_generate_variant:Nn \spath_translate:nnn {nxx} \cs_new_nopar:Npn \spath_translate:nn #1#2 { \spath_translate:nnn {#1} #2 } \cs_generate_variant:Nn \spath_translate:nn {nV} \cs_new_nopar:Npn \spath_scale:nnn #1#2#3 { \tl_map_inline:Nn \g__spath_moveable_attributes { \spath_if_in:nnT {#1} {##1} { \__spath_get:nnN {#1} {##1} \l__spath_tmpa_tl \fp_set:Nn \l__spath_tmpa_fp {\tl_head:N \l__spath_tmpa_tl * #2} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \fp_set:Nn \l__spath_tmpb_fp {\tl_head:N \l__spath_tmpa_tl * #3} \tl_clear:N \l__spath_tmpb_tl \tl_put_right:Nx \l__spath_tmpb_tl { {\fp_to_dim:N \l__spath_tmpa_fp} {\fp_to_dim:N \l__spath_tmpb_fp} } \spath_put:nnV {#1} {##1} \l__spath_tmpb_tl } } \tl_map_inline:Nn \g__spath_path_attributes { \spath_if_in:nnT {#1} {##1} { \__spath_get:nnN {#1} {##1} \l__spath_tmpa_tl \tl_clear:N \l__spath_tmpb_tl \bool_until_do:nn { \tl_if_empty_p:N \l__spath_tmpa_tl } { \tl_put_right:Nx \l__spath_tmpb_tl {\tl_head:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \fp_set:Nn \l__spath_tmpa_fp {\tl_head:N \l__spath_tmpa_tl * #2} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \fp_set:Nn \l__spath_tmpb_fp {\tl_head:N \l__spath_tmpa_tl * #3} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \tl_put_right:Nx \l__spath_tmpb_tl { {\fp_to_dim:N \l__spath_tmpa_fp} {\fp_to_dim:N \l__spath_tmpb_fp} } } \spath_put:nnV {#1} {##1} \l__spath_tmpb_tl } } } \cs_generate_variant:Nn \spath_scale:nnn {nxx} \cs_new_nopar:Npn \spath_scale:nn #1#2 { \spath_scale:nnn {#1} #2 } \cs_generate_variant:Nn \spath_scale:nn {nV} \cs_new_nopar:Npn \spath_transform:nnnnnnn #1#2#3#4#5#6#7 { \tl_map_inline:Nn \g__spath_moveable_attributes { \spath_if_in:nnT {#1} {##1} { \__spath_get:nnN {#1} {##1} \l__spath_tmpa_tl \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpb_tl {\tl_head:N \l__spath_tmpb_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_head:N \l__spath_tmpa_tl} \fp_set:Nn \l__spath_tmpa_fp {\l__spath_tmpa_tl * #2 + \l__spath_tmpb_tl * #3 + #6} \fp_set:Nn \l__spath_tmpb_fp {\l__spath_tmpa_tl * #4 + \l__spath_tmpb_tl * #5 + #7} \tl_clear:N \l__spath_tmpb_tl \tl_put_right:Nx \l__spath_tmpb_tl { {\fp_to_dim:N \l__spath_tmpa_fp} {\fp_to_dim:N \l__spath_tmpb_fp} } \spath_put:nnV {#1} {##1} \l__spath_tmpb_tl } } \tl_map_inline:Nn \g__spath_path_attributes { \spath_if_in:nnT {#1} {##1} { \__spath_get:nnN {#1} {##1} \l__spath_tmpa_tl \tl_clear:N \l__spath_tmpb_tl \bool_until_do:nn { \tl_if_empty_p:N \l__spath_tmpa_tl } { \tl_put_right:Nx \l__spath_tmpb_tl {\tl_head:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \tl_set:Nx \l_tmpa_tl {\tl_head:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \tl_set:Nx \l_tmpb_tl {\tl_head:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \fp_set:Nn \l__spath_tmpa_fp {\l_tmpa_tl * #2 + \l_tmpb_tl * #3 + #6} \fp_set:Nn \l__spath_tmpb_fp {\l_tmpa_tl * #4 + \l_tmpb_tl * #5 + #7} \tl_put_right:Nx \l__spath_tmpb_tl { {\fp_to_dim:N \l__spath_tmpa_fp} {\fp_to_dim:N \l__spath_tmpb_fp} } } \spath_put:nnV {#1} {##1} \l__spath_tmpb_tl } } } \cs_generate_variant:Nn \spath_transform:nnnnnnn {nxxxxxx} \cs_new_nopar:Npn \spath_transform:nn #1#2 { \spath_transform:nnnnnnn {#1} #2 } \cs_generate_variant:Nn \spath_transform:nn {nV} \cs_new_nopar:Npn \spath_reverse:n #1 { \spath_if_in:nnF {#1} {reverse path} { \use:c {spath_generate_reverse path:n} {#1} } \spath_swap:nnn {#1} {path} {reverse path} \spath_swap:nnn {#1} {initial point} {final point} \spath_swap:nnn {#1} {initial action} {final action} } \cs_new_nopar:Npn \spath_swap:nnn #1#2#3 { \__spath_get:nnNF {#1} {#2} \l__spath_tmpa_tl {\tl_clear:N \l__spath_tmpa_tl} \__spath_get:nnNF {#1} {#3} \l__spath_tmpb_tl {\tl_clear:N \l__spath_tmpb_tl} \tl_if_empty:NTF \l__spath_tmpb_tl {\spath_remove:nn {#1} {#2}} {\spath_put:nnV {#1} {#2} \l__spath_tmpb_tl} \tl_if_empty:NTF \l__spath_tmpa_tl {\spath_remove:nn {#1} {#3}} {\spath_put:nnV {#1} {#3} \l__spath_tmpa_tl} } \cs_new_nopar:Npn \spath_weld:nn #1#2 { \spath_clone:nn {#2} {tmp_path} \spath_get:nnN {#1} {final point} \l__spath_tmpa_tl \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl} \spath_get:nnN {#2} {initial point} \l__spath_tmpa_tl \dim_sub:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \dim_sub:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl} \spath_translate:nxx {tmp_path} {\dim_use:N \l__spath_tmpa_dim} {\dim_use:N \l__spath_tmpb_dim} \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl \__spath_get:nnN {tmp_path} {path} \l__spath_tmpb_tl \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl} \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl} \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl} \tl_put_right:NV \l__spath_tmpa_tl \l__spath_tmpb_tl \spath_put:nnV {#1} {path} \l__spath_tmpa_tl \__spath_get:nnNTF {tmp_path} {final point} \l__spath_tmpa_tl { \spath_put:nnV {#1} {final point} \l__spath_tmpa_tl } { \spath_remove:nn {#1} {final point} } \__spath_get:nnNTF {tmp_path} {final action} \l__spath_tmpa_tl { \spath_put:nnV {#1} {final action} \l__spath_tmpa_tl } { \spath_remove:nn {#1} {final action} } \__spath_get:nnNT {tmp_path} {min bb} \l__spath_tmpa_tl { \__spath_get:nnNT {#1} {min bb} \l__spath_tmpb_tl { \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl} \dim_set:Nn \l__spath_tmpa_dim {\dim_min:nn {\l__spath_tmpa_dim} {\tl_head:N \l__spath_tmpb_tl}} \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl} \dim_set:Nn \l__spath_tmpb_dim {\dim_min:nn {\l__spath_tmpb_dim} {\tl_head:N \l__spath_tmpb_tl}} \tl_clear:N \l__spath_tmpb_tl \tl_put_right:Nx \l__spath_tmpb_tl { {\dim_use:N \l__spath_tmpa_dim} {\dim_use:N \l__spath_tmpb_dim} } \spath_put:nnV {#1} {min bb} \l__spath_tmpb_tl } } \__spath_get:nnNT {tmp_path} {max bb} \l__spath_tmpa_tl { \__spath_get:nnNT {#1} {max bb} \l__spath_tmpb_tl { \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl} \dim_set:Nn \l__spath_tmpa_dim {\dim_max:nn {\l__spath_tmpa_dim} {\tl_head:N \l__spath_tmpb_tl}} \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl} \dim_set:Nn \l__spath_tmpb_dim {\dim_max:nn {\l__spath_tmpb_dim} {\tl_head:N \l__spath_tmpb_tl}} \tl_clear:N \l__spath_tmpb_tl \tl_put_right:Nx \l__spath_tmpb_tl { {\dim_use:N \l__spath_tmpa_dim} {\dim_use:N \l__spath_tmpb_dim} } \spath_put:nnV {#1} {max bb} \l__spath_tmpb_tl } } \__spath_get:nnNT {tmp_path} {reverse path} \l__spath_tmpa_tl { \__spath_get:nnNT {#1} {reverse path} \l__spath_tmpb_tl { \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl} \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl} \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl} \tl_put_right:NV \l__spath_tmpa_tl \l__spath_tmpb_tl \spath_put:nnV {#1} {reverse path} \l__spath_tmpa_tl } } \__spath_get:nnNT {tmp_path} {length} \l__spath_tmpa_tl { \__spath_get:nnNT {#1} {length} \l__spath_tmpb_tl { \int_set:Nn \l__spath_tmpa_int {\l__spath_tmpa_tl + \l__spath_tmpb_tl - 1} \spath_put:nnV {#1} {length} \l__spath_tmpa_int } } \__spath_get:nnNT {tmp_path} {real length} \l__spath_tmpa_tl { \__spath_get:nnNT {#1} {real length} \l__spath_tmpb_tl { \int_set:Nn \l__spath_tmpa_int {\l__spath_tmpa_tl + \l__spath_tmpb_tl} \spath_put:nnV {#1} {real length} \l__spath_tmpa_int } } \__spath_get:nnNT {tmp_path} {number of components} \l__spath_tmpa_tl { \__spath_get:nnNT {#1} {number of components} \l__spath_tmpb_tl { \int_set:Nn \l__spath_tmpa_int {\l__spath_tmpa_tl + \l__spath_tmpb_tl - 1} \spath_put:nnV {#1} {number of components} \l__spath_tmpa_int } } } \cs_new_nopar:Npn \spath_prepend_no_move:nn #1#2 { \spath_if_exist:nT {#2} { \__spath_get:nnN {#2} {path} \l__spath_tmpa_tl \__spath_get:nnN {#1} {path} \l__spath_tmpb_tl \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl} \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl} \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl} \tl_put_right:NV \l__spath_tmpa_tl \l__spath_tmpb_tl \spath_put:nnV {#1} {path} \l__spath_tmpa_tl \spath_if_in:nnTF {#2} {initial point} { \__spath_get:nnN {#2} {initial point} \l__spath_tmpa_tl \spath_put:nnV {#1} {initial point} \l__spath_tmpa_tl } { \spath_remove:nn {#1} {initial point} } \spath_if_in:nnTF {#2} {initial action} { \__spath_get:nnN {#2} {initial action} \l__spath_tmpa_tl \spath_put:nnV {#1} {initial action} \l__spath_tmpa_tl } { \spath_remove:nn {#1} {initial action} } \bool_if:nTF { \spath_if_in_p:nn {#1} {length} && \spath_if_in_p:nn {#2} {length} } { \__spath_get:nnN {#1} {length} \l__spath_tmpa_tl \__spath_get:nnN {#2} {length} \l__spath_tmpb_tl \spath_put:nnx {#1} {length} {\int_eval:n {\l__spath_tmpa_tl + \l__spath_tmpb_tl - 1}} } { \spath_remove:nn {#1} {length} } \bool_if:nTF { \spath_if_in_p:nn {#1} {real length} && \spath_if_in_p:nn {#2} {real length} } { \__spath_get:nnN {#1} {real length} \l__spath_tmpa_tl \__spath_get:nnN {#2} {real length} \l__spath_tmpb_tl \spath_put:nnx {#1} {real length} {\int_eval:n {\l__spath_tmpa_tl + \l__spath_tmpb_tl }} } { \spath_remove:nn {#1} {real length} } \bool_if:nTF { \spath_if_in_p:nn {#1} {number of components} && \spath_if_in_p:nn {#2} {number of components} } { \__spath_get:nnN {#1} {number of components} \l__spath_tmpa_tl \__spath_get:nnN {#2} {number of components} \l__spath_tmpb_tl \spath_put:nnx {#1} {number of components} {\int_eval:n {\l__spath_tmpa_tl + \l__spath_tmpb_tl - 1}} } { \spath_remove:nn {#1} {number of components} } \bool_if:nTF { \spath_if_in_p:nn {#1} {min bb} && \spath_if_in_p:nn {#2} {min bb} } { \__spath_get:nnN {#1} {min bb} \l__spath_tmpa_tl \__spath_get:nnN {#2} {min bb} \l__spath_tmpb_tl \dim_set:Nn \l__spath_tmpa_dim {\dim_min:nn {\tl_item:Nn \l__spath_tmpa_tl {1}} {\tl_item:Nn \l__spath_tmpb_tl {1}}} \dim_set:Nn \l__spath_tmpb_dim {\dim_min:nn {\tl_item:Nn \l__spath_tmpa_tl {2}} {\tl_item:Nn \l__spath_tmpb_tl {2}}} \spath_put:nnx {#1} {min bb} { {\dim_use:N \l__spath_tmpa_dim} {\dim_use:N \l__spath_tmpb_dim} } } { \spath_remove:nn {#1} {min bb} } \bool_if:nTF { \spath_if_in_p:nn {#1} {max bb} && \spath_if_in_p:nn {#2} {max bb} } { \__spath_get:nnN {#1} {max bb} \l__spath_tmpa_tl \__spath_get:nnN {#2} {max bb} \l__spath_tmpb_tl \dim_set:Nn \l__spath_tmpa_dim {\dim_min:nn {\tl_item:Nn \l__spath_tmpa_tl {1}} {\tl_item:Nn \l__spath_tmpb_tl {1}}} \dim_set:Nn \l__spath_tmpb_dim {\dim_min:nn {\tl_item:Nn \l__spath_tmpa_tl {2}} {\tl_item:Nn \l__spath_tmpb_tl {2}}} \spath_put:nnx {#1} {max bb} { {\dim_use:N \l__spath_tmpa_dim} {\dim_use:N \l__spath_tmpb_dim} } } { \spath_remove:nn {#1} {max bb} } \bool_if:nTF { \spath_if_in_p:nn {#1} {reverse path} && \spath_if_in_p:nn {#2} {reverse path} } { \__spath_get:nnN {#1} {reverse path} \l__spath_tmpa_tl \__spath_get:nnN {#2} {reverse path} \l__spath_tmpb_tl \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl} \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl} \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl} \tl_put_right:NV \l__spath_tmpa_tl \l__spath_tmpb_tl \spath_put:nnV {#1} {reverse path} \l__spath_tmpb_tl } { \spath_remove:nn {#1} {reverse path} } } } \cs_new_nopar:Npn \spath_append_no_move:nn #1#2 { \spath_if_exist:nT {#2} { \spath_get:nnN {#1} {path} \l__spath_tmpa_tl \spath_get:nnN {#2} {path} \l__spath_tmpb_tl \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl} \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl} \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl} \tl_put_right:NV \l__spath_tmpa_tl \l__spath_tmpb_tl \spath_put:nnV {#1} {path} \l__spath_tmpa_tl \spath_if_in:nnTF {#2} {final point} { \__spath_get:nnN {#2} {final point} \l__spath_tmpa_tl \spath_put:nnV {#1} {final point} \l__spath_tmpa_tl } { \spath_remove:nn {#1} {final point} } \spath_if_in:nnTF {#2} {final action} { \__spath_get:nnN {#2} {final action} \l__spath_tmpa_tl \spath_put:nnV {#1} {final action} \l__spath_tmpa_tl } { \spath_remove:nn {#1} {final action} } \bool_if:nTF { \spath_if_in_p:nn {#1} {length} && \spath_if_in_p:nn {#2} {length} } { \__spath_get:nnN {#1} {length} \l__spath_tmpa_tl \__spath_get:nnN {#2} {length} \l__spath_tmpb_tl \spath_put:nnx {#1} {length} {\int_eval:n {\l__spath_tmpa_tl + \l__spath_tmpb_tl - 1}} } { \spath_remove:nn {#1} {length} } \bool_if:nTF { \spath_if_in_p:nn {#1} {real length} && \spath_if_in_p:nn {#2} {real length} } { \__spath_get:nnN {#1} {real length} \l__spath_tmpa_tl \__spath_get:nnN {#2} {real length} \l__spath_tmpb_tl \spath_put:nnx {#1} {real length} {\int_eval:n {\l__spath_tmpa_tl + \l__spath_tmpb_tl }} } { \spath_remove:nn {#1} {real length} } \bool_if:nTF { \spath_if_in_p:nn {#1} {number of components} && \spath_if_in_p:nn {#2} {number of components} } { \__spath_get:nnN {#1} {number of components} \l__spath_tmpa_tl \__spath_get:nnN {#2} {number of components} \l__spath_tmpb_tl \spath_put:nnx {#1} {number of components} {\int_eval:n {\l__spath_tmpa_tl + \l__spath_tmpb_tl - 1}} } { \spath_remove:nn {#1} {number of components} } \bool_if:nTF { \spath_if_in_p:nn {#1} {min bb} && \spath_if_in_p:nn {#2} {min bb} } { \__spath_get:nnN {#1} {min bb} \l__spath_tmpa_tl \__spath_get:nnN {#2} {min bb} \l__spath_tmpb_tl \dim_set:Nn \l__spath_tmpa_dim {\dim_min:nn {\tl_item:Nn \l__spath_tmpa_tl {1}} {\tl_item:Nn \l__spath_tmpb_tl {1}}} \dim_set:Nn \l__spath_tmpb_dim {\dim_min:nn {\tl_item:Nn \l__spath_tmpa_tl {2}} {\tl_item:Nn \l__spath_tmpb_tl {2}}} \spath_put:nnx {#1} {min bb} { {\dim_use:N \l__spath_tmpa_dim} {\dim_use:N \l__spath_tmpb_dim} } } { \spath_remove:nn {#1} {min bb} } \bool_if:nTF { \spath_if_in_p:nn {#1} {max bb} && \spath_if_in_p:nn {#2} {max bb} } { \__spath_get:nnN {#1} {max bb} \l__spath_tmpa_tl \__spath_get:nnN {#2} {max bb} \l__spath_tmpb_tl \dim_set:Nn \l__spath_tmpa_dim {\dim_min:nn {\tl_item:Nn \l__spath_tmpa_tl {1}} {\tl_item:Nn \l__spath_tmpb_tl {1}}} \dim_set:Nn \l__spath_tmpb_dim {\dim_min:nn {\tl_item:Nn \l__spath_tmpa_tl {2}} {\tl_item:Nn \l__spath_tmpb_tl {2}}} \spath_put:nnx {#1} {max bb} { {\dim_use:N \l__spath_tmpa_dim} {\dim_use:N \l__spath_tmpb_dim} } } { \spath_remove:nn {#1} {max bb} } \bool_if:nTF { \spath_if_in_p:nn {#1} {reverse path} && \spath_if_in_p:nn {#2} {reverse path} } { \__spath_get:nnN {#2} {reverse path} \l__spath_tmpa_tl \__spath_get:nnN {#1} {reverse path} \l__spath_tmpb_tl \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl} \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl} \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl} \tl_put_right:NV \l__spath_tmpa_tl \l__spath_tmpb_tl \spath_put:nnV {#1} {reverse path} \l__spath_tmpb_tl } { \spath_remove:nn {#1} {reverse path} } } } \cs_new_nopar:Npn \spath_bake_round:n #1 { \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl \pgf@@processround\l__spath_tmpa_tl\l__spath_tmpb_tl \spath_put:nnV {#1} {path} \l__spath_tmpb_tl } \cs_new_nopar:Npn \spath_close_path:n #1 { \spath_get:nnN {#1} {initial point} \l__spath_tmpb_tl \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl \tl_put_right:NV \l__spath_tmpa_tl \g__spath_closepath_tl \tl_put_right:NV \l__spath_tmpa_tl \l__spath_tmpb_tl \spath_put:nnV {#1} {path} \l__spath_tmpa_tl \spath_if_in:nnT {#1} {reverse path} { \spath_get:nnN {#1} {final point} \l__spath_tmpb_tl \__spath_get:nnN {#1} {reverse path} \l__spath_tmpa_tl \tl_put_right:NV \l__spath_tmpa_tl \g__spath_closepath_tl \tl_put_right:NV \l__spath_tmpa_tl \l__spath_tmpb_tl \spath_put:nnV {#1} {reverse path} \l__spath_tmpa_tl } } \cs_new_nopar:Npn \spath_map_component:Nn #1#2 { \int_gincr:N \g__prg_map_int \cs_gset:cpn { __prg_map_ \int_use:N \g__prg_map_int :w } ##1 {#2} \tl_set:NV \l__spath_tmpa_tl #1 \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \tl_put_right:NV \l__spath_tmpa_tl \g__spath_moveto_tl \tl_set_eq:NN \l__spath_tmpb_tl \g__spath_moveto_tl \bool_until_do:nn { \tl_if_empty_p:N \l__spath_tmpa_tl } { \tl_set:Nx \l__spath_tmpc_tl {\tl_head:N \l__spath_tmpa_tl} \tl_if_eq:NNT \l__spath_tmpc_tl \g__spath_moveto_tl { \exp_args:NnV \use:c { __prg_map_ \int_use:N \g__prg_map_int :w } \l__spath_tmpb_tl \tl_clear:N \l__spath_tmpb_tl } \tl_if_single:NTF \l__spath_tmpc_tl { \tl_put_right:NV \l__spath_tmpb_tl \l__spath_tmpc_tl } { \tl_put_right:Nx \l__spath_tmpb_tl {{\l__spath_tmpc_tl}} } \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} } } \cs_new_nopar:Npn \spath_map_segment_inline:Nn #1#2 { \int_gincr:N \g__prg_map_int \cs_gset:cpn { __prg_map_ \int_use:N \g__prg_map_int :w } ##1 ##2 {#2} \spath_map_segment_function:Nc #1 { __prg_map_ \int_use:N \g__prg_map_int :w } } \cs_new_nopar:Npn \spath_map_segment_inline:nn #1#2 { \int_gincr:N \g__prg_map_int \cs_gset:cpn { __prg_map_ \int_use:N \g__prg_map_int :w } ##1 ##2 {#2} \spath_get:nnN {#1} {path} \l__spath_tmpd_tl \spath_map_segment_function:Nc \l__spath_tmpd_tl { __prg_map_ \int_use:N \g__prg_map_int :w } } \cs_new_nopar:Npn \spath_map_segment_function:nN #1#2 { \spath_get:nnN {#1} {path} \l__spath_tmpd_tl \spath_map_segment_function:NN \l__spath_tmpd_tl #2 } \cs_new_nopar:Npn \spath_map_segment_function:NN #1#2 { \tl_set_eq:NN \l__spath_tmpa_tl #1 \tl_clear:N \l__spath_tmpb_tl \dim_zero:N \l__spath_tmpa_dim \dim_zero:N \l__spath_tmpb_dim \bool_until_do:nn { \tl_if_empty_p:N \l__spath_tmpa_tl } { \tl_set:Nx \l__spath_tmpc_tl {\tl_head:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \tl_case:NnF \l__spath_tmpc_tl { \g__spath_lineto_tl { \tl_set_eq:NN \l__spath_tmpb_tl \g__spath_moveto_tl \tl_put_right:Nx \l__spath_tmpb_tl { {\dim_use:N \l__spath_tmpa_dim} {\dim_use:N \l__spath_tmpb_dim} } \tl_put_right:NV \l__spath_tmpb_tl \g__spath_lineto_tl \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}} \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}} \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} } \g__spath_curvetoa_tl { \tl_set_eq:NN \l__spath_tmpb_tl \g__spath_moveto_tl \tl_put_right:Nx \l__spath_tmpb_tl { {\dim_use:N \l__spath_tmpa_dim} {\dim_use:N \l__spath_tmpb_dim} } \tl_put_right:NV \l__spath_tmpb_tl \g__spath_curvetoa_tl \prg_replicate:nn {2} { \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \tl_put_right:Nx \l__spath_tmpb_tl {\tl_head:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} } \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}} \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}} \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} } } { \tl_set_eq:NN \l__spath_tmpb_tl \l__spath_tmpc_tl \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}} \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}} \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl} \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} } #2 \l__spath_tmpc_tl \l__spath_tmpb_tl \tl_clear:N \l__spath_tmpb_tl } } \cs_generate_variant:Nn \spath_map_segment_function:NN {Nc} \NewDocumentCommand \MakeSPath { m m } { \spath_clear_new:n {#1} \spath_put:nno {#1} {path} {#2} } \NewDocumentCommand \MakeSPathList { m m } { \tl_gclear_new:c {l__spath_list_#1} \int_zero:N \l__spath_tmpa_int \spath_map_component:Nn #2 { \spath_clear_new:n {#1 _ \int_use:N \l__spath_tmpa_int} \spath_put:nnn {#1 _ \int_use:N \l__spath_tmpa_int} {path} {##1} \tl_gput_right:cx {l__spath_list_#1} {{#1 _ \int_use:N \l__spath_tmpa_int}} \int_incr:N \l__spath_tmpa_int } } \NewDocumentCommand \CloneSPath { m m } { \spath_clone:nn {#1} {#2} } \NewDocumentCommand \SPathInfo { m m } { \spath_get:nn {#1} {#2} } \NewDocumentCommand \SPathPrepare { m } { \spath_generate_all:n {#1} } \NewDocumentCommand \SPathListPrepare { m } { \tl_map_inline:cn {l__spath_list_#1} { \spath_generate_all:n {##1} } } \NewDocumentCommand \SPathInfoInto { m m m } { \tl_set:Nn \l_tmpa_tl #3 \spath_get:nnV {#1} {#2} \l_tmpa_tl } \NewDocumentCommand \SPathShow { m } { \spath_show:n {#1} } \NewDocumentCommand \SPathTranslate { m m m } { \spath_translate:nnn {#1} {#2} {#3} } \NewDocumentCommand \SPathTranslateInto { m m m m } { \spath_clone:nn {#1} {#2} \spath_translate:nnn {#2} {#3} {#4} } \NewDocumentCommand \SPathScale { m m m } { \spath_scale:nnn {#1} {#2} {#3} } \NewDocumentCommand \SPathScaleInto { m m m m } { \spath_clone:nn {#1} {#2} \spath_scale:nnn {#2} {#3} {#4} } \NewDocumentCommand \SPathWeld { m m } { \spath_weld:nn {#1} {#2} } \NewDocumentCommand \SPathWeldInto { m m m } { \spath_clone:nn {#1} {#2} \spath_weld:nn {#2} {#3} } \tikzset{ save~spath/.code={ \tikz@addmode{ \spath_get_current_path:n {#1} } }, restore~spath/.code={ \spath_set_current_path:n {#1} } } \cs_new_nopar:Npn \spath_split_curve:nnNN #1#2#3#4 { \group_begin: \tl_gclear:N \l__spath_smuggle_tl \tl_set_eq:NN \l__spath_tmpa_tl \g__spath_moveto_tl \tl_put_right:Nx \l__spath_tmpa_tl { {\tl_item:nn {#2} {3}} {\tl_item:nn {#2} {4}} } \tl_put_right:NV \l__spath_tmpa_tl \g__spath_curvetoa_tl \tl_put_right:Nx \l__spath_tmpa_tl { {\fp_to_dim:n { (1 - #1) * \tl_item:nn {#2} {2} + (#1) * \tl_item:nn {#2} {5} }} {\fp_to_dim:n { (1 - #1) * \tl_item:nn {#2} {3} + (#1) * \tl_item:nn {#2} {6} }} } \tl_put_right:NV \l__spath_tmpa_tl \g__spath_curvetob_tl \tl_put_right:Nx \l__spath_tmpa_tl { {\fp_to_dim:n { (1 - #1)^2 * \tl_item:nn {#2} {2} + 2 * (1 - #1) * (#1) * \tl_item:nn {#2} {5} + (#1)^2 * \tl_item:nn {#2} {8} }} {\fp_to_dim:n { (1 - #1)^2 * \tl_item:nn {#2} {3} + 2 * (1 - #1) * (#1) * \tl_item:nn {#2} {6} + (#1)^2 * \tl_item:nn {#2} {9} }} } \tl_put_right:NV \l__spath_tmpa_tl \g__spath_curveto_tl \tl_put_right:Nx \l__spath_tmpa_tl { {\fp_to_dim:n { (1 - #1)^3 * \tl_item:nn {#2} {2} + 3 * (1 - #1)^2 * (#1) * \tl_item:nn {#2} {5} + 3 * (1 - #1) * (#1)^2 * \tl_item:nn {#2} {8} + (#1)^3 * \tl_item:nn {#2} {11} }} {\fp_to_dim:n { (1 - #1)^3 * \tl_item:nn {#2} {3} + 3 * (1 - #1)^2 * (#1) * \tl_item:nn {#2} {6} + 3 * (1 - #1) * (#1)^2 * \tl_item:nn {#2} {9} + (#1)^3 * \tl_item:nn {#2} {12} }} } \tl_gset_eq:NN \l__spath_smuggle_tl \l__spath_tmpa_tl \group_end: \tl_set_eq:NN #3 \l__spath_smuggle_tl \group_begin: \tl_set_eq:NN \l__spath_tmpa_tl \g__spath_moveto_tl \tl_put_right:Nx \l__spath_tmpa_tl { {\fp_to_dim:n { (1 - #1)^3 * \tl_item:nn {#2} {2} + 3 * (1 - #1)^2 * (#1) * \tl_item:nn {#2} {5} + 3 * (1 - #1) * (#1)^2 * \tl_item:nn {#2} {8} + (#1)^3 * \tl_item:nn {#2} {11} }} {\fp_to_dim:n { (1 - #1)^3 * \tl_item:nn {#2} {3} + 3 * (1 - #1)^2 * (#1) * \tl_item:nn {#2} {6} + 3 * (1 - #1) * (#1)^2 * \tl_item:nn {#2} {9} + (#1)^3 * \tl_item:nn {#2} {12} }} } \tl_put_right:NV \l__spath_tmpa_tl \g__spath_curvetoa_tl \tl_put_right:Nx \l__spath_tmpa_tl { {\fp_to_dim:n { (1 - #1)^2 * \tl_item:nn {#2} {5} + 2 * (1 - #1) * (#1) * \tl_item:nn {#2} {8} + (#1)^2 * \tl_item:nn {#2} {11} }} {\fp_to_dim:n { (1 - #1)^2 * \tl_item:nn {#2} {6} + 2 * (1 - #1) * (#1) * \tl_item:nn {#2} {9} + (#1)^2 * \tl_item:nn {#2} {12} }} } \tl_put_right:NV \l__spath_tmpa_tl \g__spath_curvetob_tl \tl_put_right:Nx \l__spath_tmpa_tl { {\fp_to_dim:n { (1 - #1) * \tl_item:nn {#2} {8} + (#1) * \tl_item:nn {#2} {11} }} {\fp_to_dim:n { (1 - #1) * \tl_item:nn {#2} {9} + (#1) * \tl_item:nn {#2} {12} }} } \tl_put_right:NV \l__spath_tmpa_tl \g__spath_curveto_tl \tl_put_right:Nx \l__spath_tmpa_tl { {\tl_item:nn {#2} {11}} {\tl_item:nn {#2} {12}} } \tl_gset_eq:NN \l__spath_smuggle_tl \l__spath_tmpa_tl \group_end: \tl_set_eq:NN #4 \l__spath_smuggle_tl } \cs_generate_variant:Nn \spath_split_curve:nnNN {nVNN, VVNN} %% %% Copyright (C) 2011 by Andrew Stacey %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License (LPPL), either %% version 1.3c of this license or (at your option) any later %% version. The latest version of this license is in the file: %% %% http://www.latex-project.org/lppl.txt %% %% This work is "maintained" (as per LPPL maintenance status) by %% Andrew Stacey. %% %% This work consists of the files spath3.dtx %% calligraphy_doc.tex %% knot_doc.tex %% and the derived files spath3.ins, %% spath3.pdf, %% spath3.sty, %% tikzlibrarycalligraphy.code.tex %% tikzlibraryknots.code.tex %% calligraphy_doc.pdf %% knots_doc.pdf %% README.txt %% %% %% End of file `spath3.sty'.