diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/spath3')
4 files changed, 5685 insertions, 1554 deletions
diff --git a/Master/texmf-dist/tex/latex/spath3/spath3.sty b/Master/texmf-dist/tex/latex/spath3/spath3.sty index 43fd64cf5e2..868e648f570 100644 --- a/Master/texmf-dist/tex/latex/spath3/spath3.sty +++ b/Master/texmf-dist/tex/latex/spath3/spath3.sty @@ -4,10 +4,10 @@ %% %% The original source files were: %% -%% spath3.dtx (with options: `spath3') +%% spath3_code.dtx (with options: `spath3') %% ---------------------------------------------------------------- %% spath3 --- Functions for manipulating PGF soft paths -%% E-mail: stacey@math.ntnu.no +%% E-mail: loopspace@mathforge.org %% Released under the LaTeX Project Public License v1.3c or later %% See http://www.latex-project.org/lppl.txt %% ---------------------------------------------------------------- @@ -15,335 +15,661 @@ \NeedsTeXFormat{LaTeX2e} \RequirePackage{expl3} \RequirePackage{pgf} -\ProvidesExplPackage {spath3} {2019/02/12} {1.2} {Functions for +\ProvidesExplPackage {spath3} {2021/02/05} {2.2} {Functions for manipulating PGF soft paths} \RequirePackage{xparse} +\cs_new_protected:Nn \__spath_tl_put_right_braced:Nn +{ + \tl_put_right:Nn #1 { { #2 } } +} +\cs_generate_variant:Nn \__spath_tl_put_right_braced:Nn { NV, cV, cv, Nx, cx } + +\cs_new_protected:Nn \__spath_tl_gput_right_braced:Nn +{ + \tl_gput_right:Nn #1 { { #2 } } +} +\cs_generate_variant:Nn \__spath_tl_gput_right_braced:Nn { NV, cV, cv, Nx, cx } +\cs_new_protected:Nn \__spath_tl_put_left_braced:Nn +{ + \tl_put_left:Nn #1 { { #2 } } +} +\cs_generate_variant:Nn \__spath_tl_put_left_braced:Nn { NV, cV, cv, Nx, cx } + +\cs_new_protected:Nn \__spath_tl_gput_left_braced:Nn +{ + \tl_gput_left:Nn #1 { { #2 } } +} +\cs_generate_variant:Nn \__spath_tl_gput_left_braced:Nn { NV, cV, cv, Nx, cx } +\tl_new:N \g__spath_output_tl +\int_new:N \g__spath_output_int +\seq_new:N \g__spath_output_seq +\bool_new:N \g__spath_output_bool \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 +\tl_new:N \l__spath_tmpe_tl +\tl_new:N \l__spath_tmpf_tl +\tl_new:N \l__spath_tmpg_tl +\tl_new:N \l__spath_tmph_tl +\tl_new:N \l__spath_tmpi_tl + +\seq_new:N \l__spath_tmpa_seq +\seq_new:N \l__spath_tmpb_seq +\seq_new:N \l__spath_tmpc_seq + \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 +\fp_new:N \l__spath_tmpc_fp + \int_new:N \l__spath_tmpa_int -\int_new:N \g__spath_map_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 +\int_new:N \l__spath_tmpb_int + +\bool_new:N \l__spath_tmpa_bool +\dim_new:N \l__spath_move_x_dim +\dim_new:N \l__spath_move_y_dim +\bool_new:N \l__spath_closed_bool +\tl_new:N \l__spath_intersecta_tl +\tl_new:N \l__spath_intersectb_tl +\tl_const:Nn \c_spath_moveto_tl {\pgfsyssoftpath@movetotoken} +\tl_const:Nn \c_spath_lineto_tl {\pgfsyssoftpath@linetotoken} +\tl_const:Nn \c_spath_curveto_tl {\pgfsyssoftpath@curvetotoken} +\tl_const:Nn \c_spath_curvetoa_tl {\pgfsyssoftpath@curvetosupportatoken} +\tl_const:Nn \c_spath_curvetob_tl {\pgfsyssoftpath@curvetosupportbtoken} +\tl_const:Nn \c_spath_closepath_tl {\pgfsyssoftpath@closepathtoken} +\int_new:N \g__spath_anon_int +\int_gzero:N \g__spath_anon_int +\msg_new:nnn { spath3 } { unknown path construction } +{ The~ path~ construction~ element~ #1~ is~ not~ currently~ supported.} +\cs_new_protected_nopar:Npn \__spath_segments_to_seq:n #1 { - \prop_new:c {l__spath_#1} + \group_begin: + \tl_set:Nn \l__spath_tmpa_tl {#1} + \tl_clear:N \l__spath_tmpb_tl + \seq_clear:N \l__spath_tmpa_seq + \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 + { + \c_spath_moveto_tl + { + \tl_set_eq:NN \l__spath_tmpb_tl \c_spath_moveto_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:Nx \l__spath_tmpd_tl {\tl_head:N \l__spath_tmpa_tl} + \tl_if_eq:NNF \l__spath_tmpd_tl \c_spath_moveto_tl + { + \tl_clear:N \l__spath_tmpb_tl + } + + } + + \c_spath_lineto_tl + { + \tl_set_eq:NN \l__spath_tmpb_tl \c_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 \c_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} + + } + + \c_spath_curvetoa_tl + { + \tl_set_eq:NN \l__spath_tmpb_tl \c_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 \c_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} + + } + + \c_spath_closepath_tl + { + \tl_set_eq:NN \l__spath_tmpb_tl \c_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 \c_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} + + } + + } + { + + \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} + + } + + \tl_if_empty:NF \l__spath_tmpb_tl + { + \seq_put_right:NV \l__spath_tmpa_seq \l__spath_tmpb_tl + } + \tl_clear:N \l__spath_tmpb_tl + } + + \seq_gclear:N \g__spath_output_seq + \seq_gset_eq:NN \g__spath_output_seq \l__spath_tmpa_seq + \group_end: } -\cs_new_nopar:Npn \spath_clear:n #1 +\cs_new_protected_nopar:Npn \spath_segments_to_seq:Nn #1#2 { - \prop_gclear:c {l__spath_#1} + \__spath_segments_to_seq:n {#2} + \seq_clear_new:N #1 + \seq_set_eq:NN #1 \g__spath_output_seq + \seq_gclear:N \g__spath_output_seq } -\cs_new_nopar:Npn \spath_clear_new:n #1 +\cs_generate_variant:Nn \spath_segments_to_seq:Nn {NV, cn, cV, Nv, cv} +\cs_new_protected_nopar:Npn \spath_segments_gto_seq:Nn #1#2 { - \prop_gclear_new:c {l__spath_#1} + \__spath_segments_to_seq:n {#2} + \seq_clear_new:N #1 + \seq_gset_eq:NN #1 \g__spath_output_seq + \seq_gclear:N \g__spath_output_seq } -\cs_new_nopar:Npn \spath_show:n #1 +\cs_generate_variant:Nn \spath_segments_gto_seq:Nn {NV, cn, cV, Nv, cv} +\cs_new_protected_nopar:Npn \__spath_components_to_seq:n #1 { - \prop_show:c {l__spath_#1} + \group_begin: + \tl_set:Nn \l__spath_tmpa_tl {#1} + \seq_clear:N \l__spath_tmpa_seq + \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} + \tl_put_right:NV \l__spath_tmpa_tl \c_spath_moveto_tl + \tl_set_eq:NN \l__spath_tmpb_tl \c_spath_moveto_tl + \bool_do_until: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 \c_spath_moveto_tl + { + \seq_put_right:NV \l__spath_tmpa_seq \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} + } + + \seq_gclear:N \g__spath_output_seq + \seq_gset_eq:NN \g__spath_output_seq \l__spath_tmpa_seq + \group_end: } -\cs_new_nopar:Npn \spath_put:nnn #1#2#3 +\cs_new_protected_nopar:Npn \spath_components_to_seq:Nn #1#2 { - \prop_gput:cnn {l__spath_#1} {#2} {#3} + \__spath_components_to_seq:n {#2} + \seq_clear_new:N #1 + \seq_set_eq:NN #1 \g__spath_output_seq + \seq_gclear:N \g__spath_output_seq } -\cs_new_nopar:Npn \spath_remove:nn #1#2 +\cs_generate_variant:Nn \spath_components_to_seq:Nn {NV, cn, cV, cv, Nv} +\cs_new_protected_nopar:Npn \spath_components_gto_seq:Nn #1#2 { - \prop_gremove:cn {l__spath_#1} {#2} + \__spath_components_to_seq:n {#2} + \seq_clear_new:N #1 + \seq_gset_eq:NN #1 \g__spath_output_seq + \seq_gclear:N \g__spath_output_seq } -\cs_new_nopar:Npn \__spath_get:nn #1#2 +\cs_generate_variant:Nn \spath_components_gto_seq:Nn {NV, cn, cV, cv, Nv} +\cs_new_protected_nopar:Npn \spath_components_to_clist:Nn #1#2 { - \prop_item:cn {l__spath_#1} {#2} + \__spath_components_to_seq:n {#2} + \clist_clear_new:N #1 + \clist_set_from_seq:NN #1 \g__spath_output_seq + \seq_gclear:N \g__spath_output_seq } -\cs_new_nopar:Npn \__spath_get:nnN #1#2#3 +\cs_generate_variant:Nn \spath_components_to_clist:Nn {NV, cn, cV, cv, Nv} +\cs_new_protected_nopar:Npn \spath_components_gto_clist:Nn #1#2 { - \prop_get:cnN {l__spath_#1} {#2} #3 + \__spath_components_to_seq:n {#2} + \clist_clear_new:N #1 + \clist_gset_from_seq:NN #1 \g__spath_output_seq + \seq_gclear:N \g__spath_output_seq } -\prg_new_conditional:Npnn \spath_if_in:nn #1#2 {p, T, F, TF} +\cs_generate_variant:Nn \spath_components_gto_clist:Nn {NV, cn, cV, cv, Nv} +\cs_new_protected_nopar:Npn \spath_length:n #1 { - \prop_if_in:cnTF {l__spath_#1} {#2} - { \prg_return_true: } - { \prg_return_false: } + \int_eval:n {\tl_count:n {#1} / 3} } -\cs_generate_variant:Nn \__prop_split:NnTF {cnTF} -\prg_new_protected_conditional:Npnn \__spath_get:nnN #1#2#3 {T, F, TF} +\cs_generate_variant:Nn \spath_length:n {V} +\cs_new_protected_nopar:Npn \__spath_reallength:n #1 { - \__prop_split:cnTF {l__spath_#1} {#2} - { - \tl_set:Nn #3 {##2} - \prg_return_true: + \group_begin: + \int_set:Nn \l__spath_tmpa_int {0} + \tl_map_inline:nn {#1} { + \tl_set:Nn \l__spath_tmpa_tl {##1} + \tl_case:NnT \l__spath_tmpa_tl + { + \c_spath_lineto_tl {} + \c_spath_curveto_tl {} + \c_spath_closepath_tl {} + } + { + \int_incr:N \l__spath_tmpa_int + } } - { \prg_return_false: } + \int_gzero:N \g__spath_output_int + \int_gset_eq:NN \g__spath_output_int \l__spath_tmpa_int + \group_end: } -\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} +\cs_new_protected_nopar:Npn \spath_reallength:Nn #1#2 { - \prop_if_exist:cTF {l__spath_#1} - { - \prg_return_true: - } - { - \prg_return_false: - } + \__spath_reallength:n {#2} + \int_set_eq:NN #1 \g__spath_output_int + \int_gzero:N \g__spath_output_int } -\cs_new_nopar:Npn \spath_clone:nn #1 #2 +\cs_generate_variant:Nn \spath_reallength:Nn {NV, cn, cV, Nv, cv} +\cs_new_protected_nopar:Npn \spath_greallength:Nn #1#2 { - \spath_clear_new:n {#2} - \tl_map_inline:Nn \g__spath_attributes - { - \spath_if_in:nnT {#1} {##1} + \__spath_reallength:n {#2} + \int_gset_eq:NN #1 \g__spath_output_int + \int_gzero:N \g__spath_output_int +} +\cs_generate_variant:Nn \spath_greallength:Nn {NV, cn, cV} +\cs_new_protected_nopar:Npn \__spath_numberofcomponents:n #1 +{ + \group_begin: + \int_set:Nn \l__spath_tmpa_int {0} + \tl_map_inline:nn {#1} { + \tl_set:Nn \l__spath_tmpa_tl {##1} + \tl_case:Nn \l__spath_tmpa_tl { - \__spath_get:nnN {#1} {##1} \l__spath_tmpa_tl - \spath_put:nnV {#2} {##1} \l__spath_tmpa_tl + \c_spath_moveto_tl + { + \int_incr:N \l__spath_tmpa_int + } } } + \int_gzero:N \g__spath_output_int + \int_gset_eq:NN \g__spath_output_int \l__spath_tmpa_int + \group_end: } -\cs_new_protected_nopar:Npn \spath_get_current_path:n #1 +\cs_new_protected_nopar:Npn \spath_numberofcomponents:Nn #1#2 { - \pgfsyssoftpath@getcurrentpath\l__spath_tmpa_tl - \spath_clear_new:n {#1} - \spath_put:nnV {#1} {path} \l__spath_tmpa_tl + \__spath_numberofcomponents:n {#2} + \int_set_eq:NN #1 \g__spath_output_int + \int_gzero:N \g__spath_output_int } -\cs_new_protected_nopar:Npn \spath_set_current_path:n #1 +\cs_generate_variant:Nn \spath_numberofcomponents:Nn {NV, cn, cV, Nv} +\cs_new_protected_nopar:Npn \spath_gnumberofcomponents:Nn #1#2 { - \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 + \__spath_numberofcomponents:n {#2} + \int_gset_eq:NN #1 \g__spath_output_int + \int_gzero:N \g__spath_output_int } -\cs_new_protected_nopar:Npn \spath_use_path:nn #1#2 +\cs_generate_variant:Nn \spath_gnumberofcomponents:Nn {NV, cn, cV, Nv} +\cs_new_protected_nopar:Npn \__spath_initialpoint:n #1 { - \spath_set_current_path:n {#1} - \pgfusepath{#2} + \group_begin: + \tl_clear:N \l__spath_tmpa_tl + \tl_set:Nx \l__spath_tmpa_tl + { + { \tl_item:nn {#1} {2} } + { \tl_item:nn {#1} {3} } + } + \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpa_tl + \group_end: } -\cs_new_protected_nopar:Npn \spath_protocol_path:n #1 +\cs_new_protected_nopar:Npn \spath_initialpoint:Nn #1#2 { - \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_initialpoint:n {#2} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl } -\cs_new_protected_nopar:Npn \spath_tikz_path:nn #1#2 +\cs_generate_variant:Nn \spath_initialpoint:Nn {NV, cn, cV, Nv} +\cs_new_protected_nopar:Npn \spath_ginitialpoint:Nn #1#2 { - \path[#1] \pgfextra{ - \spath_get:nnN {#2} {path} \l__spath_tmpa_tl - \pgfsyssoftpath@setcurrentpath \l__spath_tmpa_tl - }; + \__spath_initialpoint:n {#2} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl } -\cs_generate_variant:Nn \spath_tikz_path:nn {Vn} -\cs_new_nopar:Npn \spath_get:nn #1#2 +\cs_generate_variant:Nn \spath_ginitialpoint:Nn {NV, cn, cV, Nv} +\cs_new_protected_nopar:Npn \__spath_finalpoint:n #1 { - \spath_if_in:nnF {#1} {#2} + \group_begin: + \tl_set:Nn \l__spath_tmpa_tl {#1} + \tl_reverse:N \l__spath_tmpa_tl + \tl_clear:N \l__spath_tmpb_tl + \tl_set:Nx \l__spath_tmpb_tl { - \cs_if_exist_use:cT {spath_generate_#2:n} {{#1}} + { \tl_item:Nn \l__spath_tmpa_tl {2} } + { \tl_item:Nn \l__spath_tmpa_tl {1} } } - \__spath_get:nn {#1} {#2} + \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpb_tl + \group_end: } -\cs_new_nopar:Npn \spath_get:nnN #1#2#3 +\cs_new_protected_nopar:Npn \spath_finalpoint:Nn #1#2 { - \spath_if_in:nnF {#1} {#2} - { - \cs_if_exist_use:cT {spath_generate_#2:n} {{#1}} - } - \__spath_get:nnN {#1} {#2} #3 + \__spath_finalpoint:n {#2} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl } -\cs_generate_variant:Nn \spath_get:nnN {VnN} -\cs_new_nopar:Npn \spath_generate_length:n #1 +\cs_generate_variant:Nn \spath_finalpoint:Nn {NV, cn, cV, Nv} +\cs_new_protected_nopar:Npn \spath_gfinalpoint:Nn #1#2 { - \__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 }} + \__spath_finalpoint:n {#2} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl } -\cs_new_nopar:Npn \spath_generate_reallength:n #1 +\cs_generate_variant:Nn \spath_gfinalpoint:Nn {NV, cn, cV, Nv} +\cs_new_protected_nopar:Npn \__spath_finalmovepoint: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} + \group_begin: + \tl_set:Nn \l__spath_tmpc_tl { {0pt} {0pt} } + \tl_set:Nn \l__spath_tmpa_tl {#1} + \bool_do_until:nn + { + \tl_if_empty_p:N \l__spath_tmpa_tl + } + { + \tl_set:Nx \l__spath_tmpb_tl {\tl_head:N \l__spath_tmpa_tl} + \tl_case:Nn \l__spath_tmpb_tl { - \int_incr:N \l__spath_tmpa_int + \c_spath_moveto_tl + { + \tl_set:Nx \l__spath_tmpc_tl + { + { \tl_item:Nn \l__spath_tmpa_tl {2} } + { \tl_item:Nn \l__spath_tmpa_tl {3} } + } + } } - } - \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} + \prg_replicate:nn {3} { - \int_incr:N \l__spath_tmpa_int + \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} } } - \spath_put:nnx {#1} {number of components} {\int_use:N \l__spath_tmpa_int} + \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpc_tl + \group_end: } -\cs_new_nopar:Npn \spath_generate_initialpoint:n #1 +\cs_new_protected_nopar:Npn \spath_finalmovepoint:Nn #1#2 { - \__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 + \__spath_finalmovepoint:n {#2} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl } -\cs_new_nopar:Npn \spath_generate_finalpoint:n #1 +\cs_generate_variant:Nn \spath_finalmovepoint:Nn {NV, cn, cV} +\cs_new_protected_nopar:Npn \spath_gfinalmovepoint:Nn #1#2 { - \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 + \__spath_finalmovepoint:n {#2} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl } -\cs_generate_variant:Nn \spath_generate_finalpoint:n {V} -\cs_new_nopar:Npn \spath_generate_reversepath:n #1 +\cs_generate_variant:Nn \spath_gfinalmovepoint:Nn {NV, cn, cV} +\cs_new_protected_nopar:Npn \__spath_reverse:n #1 { - \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl + \group_begin: + \tl_set:Nn \l__spath_tmpa_tl {#1} + \tl_clear:N \l__spath_tmpb_tl + \tl_clear:N \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 + + \tl_put_left:Nx \l__spath_tmpd_tl { {\dim_use:N \l__spath_tmpa_dim} {\dim_use:N \l__spath_tmpb_dim} } + + \bool_set_false:N \l__spath_closed_bool + \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 + + \tl_case:NnTF \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 } + \c_spath_moveto_tl { + + \bool_if:NT \l__spath_closed_bool + { + \tl_put_right:NV \l__spath_tmpd_tl \c_spath_closepath_tl + \tl_set:Nx \l__spath_tmpe_tl {\tl_tail:N \l__spath_tmpd_tl} + \tl_put_right:Nx \l__spath_tmpd_tl + { + { \tl_head:N \l__spath_tmpd_tl } + { \tl_head:N \l__spath_tmpe_tl } + } + } + \bool_set_false:N \l__spath_closed_bool + \tl_put_left:NV \l__spath_tmpd_tl \c_spath_moveto_tl + \tl_put_left:NV \l__spath_tmpb_tl \l__spath_tmpd_tl + \tl_clear:N \l__spath_tmpd_tl + } + \c_spath_lineto_tl { + \tl_put_left:NV \l__spath_tmpd_tl \c_spath_lineto_tl + } + \c_spath_curveto_tl { + \tl_put_left:NV \l__spath_tmpd_tl \c_spath_curvetoa_tl + } + \c_spath_curvetoa_tl { + \tl_put_left:NV \l__spath_tmpd_tl \c_spath_curveto_tl + } + \c_spath_curvetob_tl { + \tl_put_left:NV \l__spath_tmpd_tl \c_spath_curvetob_tl + } } { - \tl_show:N \l__spath_tmpc_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_tmpd_tl + { + {\dim_use:N \l__spath_tmpa_dim} + {\dim_use:N \l__spath_tmpb_dim} + } + } - \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_if_eq:NNTF \l__spath_tmpc_tl \c_spath_closepath_tl + { + \bool_set_true:N \l__spath_closed_bool + } + { + \msg_warning:nnx + { spath3 } + { unknown path construction } + {\l__spath_tmpc_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} + + } + } + + \bool_if:NT \l__spath_closed_bool + { + \tl_put_right:NV \l__spath_tmpd_tl \c_spath_closepath_tl + \tl_set:Nx \l__spath_tmpe_tl {\tl_tail:N \l__spath_tmpd_tl} + \tl_put_right:Nx \l__spath_tmpd_tl + { + { \tl_head:N \l__spath_tmpd_tl } + { \tl_head:N \l__spath_tmpe_tl } } } - \tl_put_left:NV \l__spath_tmpb_tl \g__spath_moveto_tl - \spath_put:nnV {#1} {reverse path} \l__spath_tmpb_tl + + \bool_set_false:N \l__spath_closed_bool + \tl_put_left:NV \l__spath_tmpd_tl \c_spath_moveto_tl + \tl_put_left:NV \l__spath_tmpb_tl \l__spath_tmpd_tl + + \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpb_tl + \group_end: } -\cs_new_nopar:Npn \spath_generate_initialaction:n #1 +\cs_new_protected_nopar:Npn \spath_reverse:Nn #1#2 { - \__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 + \__spath_reverse:n {#2} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl } -\cs_new_nopar:Npn \spath_generate_finalaction:n #1 +\cs_generate_variant:Nn \spath_reverse:Nn {NV, cn, cV, Nv} +\cs_new_protected_nopar:Npn \spath_reverse:N #1 { - \tl_clear:N \l__spath_tmpb_tl - \spath_if_in:nnTF {#1} {reverse path} + \spath_reverse:NV #1#1 +} +\cs_generate_variant:Nn \spath_reverse:N {c} +\cs_new_protected_nopar:Npn \spath_greverse:Nn #1#2 +{ + \__spath_reverse:n {#2} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_greverse:Nn {NV, cn, cV, Nv} +\cs_new_protected_nopar:Npn \spath_greverse:N #1 +{ + \spath_greverse:NV #1#1 +} +\cs_generate_variant:Nn \spath_greverse:N {c} +\cs_new_protected_nopar:Npn \__spath_initialaction:n #1 +{ + \group_begin: + \tl_clear:N \l__spath_tmpa_tl + \int_compare:nT { - \__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_count:n {#1} > 3 } { - \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl - \tl_reverse:N \l__spath_tmpa_tl + \tl_set:Nx \l__spath_tmpa_tl + { + \tl_item:Nn {#1} {4} + } } - \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_gset_eq:NN \g__spath_output_tl \l__spath_tmpa_tl + \group_end: +} +\cs_new_protected_nopar:Npn \spath_initialaction:Nn #1#2 +{ + \__spath_initialaction:n {#2} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_initialaction:Nn {NV} +\cs_new_protected_nopar:Npn \spath_ginitialaction:Nn #1#2 +{ + \__spath_initialaction:n {#2} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_ginitialaction:Nn {NV} +\cs_new_protected_nopar:Npn \__spath_finalaction:n #1 +{ + \group_begin: + \tl_clear:N \l__spath_tmpb_tl + \int_compare:nT + { + \tl_count:n {#1} > 3 } - \tl_if_eq:NNT \l__spath_tmpa_tl \g__spath_curvetoa_tl { - \tl_set_eq:NN \l__spath_tmpa_tl \g__spath_curveto_tl + \tl_set:Nn \l__spath_tmpa_tl {#1} + \tl_reverse:N \l__spath_tmpa_tl + \tl_set:Nx \l__spath_tmpb_tl + { + \tl_item:Nn \l__spath_tmpa_tl {3} + } + \tl_if_eq:NNT \l__spath_tmpb_tl \c_spath_curvetoa_tl + { + \tl_set_eq:NN \l__spath_tmpb_tl \c_spath_curveto_tl + } } - \spath_put:nnV {#1} {final action} \l__spath_tmpb_tl + \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpb_tl + \group_end: +} +\cs_new_protected_nopar:Npn \spath_finalaction:Nn #1#2 +{ + \__spath_finalaction:n {#2} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_finalaction:Nn {NV} +\cs_new_protected_nopar:Npn \spath_gfinalaction:Nn #1#2 +{ + \__spath_finalaction:n {#2} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl } -\cs_new_nopar:Npn \spath_generate_minbb:n #1 +\cs_generate_variant:Nn \spath_gfinalaction:Nn {NV} +\cs_new_protected_nopar:Npn \__spath_minbb:n #1 { - \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl + \group_begin: + \tl_set:Nn \l__spath_tmpa_tl {#1} \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} @@ -354,9 +680,11 @@ manipulating PGF soft paths} } { \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}} + \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}} + \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 @@ -365,11 +693,27 @@ manipulating PGF soft paths} {\dim_use:N \l__spath_tmpa_dim} {\dim_use:N \l__spath_tmpb_dim} } - \spath_put:nnV {#1} {min bb} \l__spath_tmpb_tl + \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpb_tl + \group_end: +} +\cs_new_protected_nopar:Npn \spath_minbb:Nn #1#2 +{ + \__spath_minbb:n {#2} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_minbb:Nn {NV, cn, cV} +\cs_new_protected_nopar:Npn \spath_gminbb:Nn #1#2 +{ + \__spath_minbb:n {#2} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl } -\cs_new_nopar:Npn \spath_generate_maxbb:n #1 +\cs_generate_variant:Nn \spath_gminbb:Nn {NV, cn, cV} +\cs_new_protected_nopar:Npn \__spath_maxbb:n #1 { - \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl + \group_begin: + \tl_set:Nn \l__spath_tmpa_tl {#1} \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} @@ -380,9 +724,11 @@ manipulating PGF soft paths} } { \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}} + \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}} + \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 @@ -391,1101 +737,3215 @@ manipulating PGF soft paths} {\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 + \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpb_tl + \group_end: +} +\cs_new_protected_nopar:Npn \spath_maxbb:Nn #1#2 +{ + \__spath_maxbb:n {#2} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_maxbb:Nn {NV, cn, cV} +\cs_new_protected_nopar:Npn \spath_gmaxbb:Nn #1#2 +{ + \__spath_maxbb:n {#2} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_gmaxbb:Nn {NV, cn, cV} +\int_set:Nn \l__spath_tmpa_int {\char_value_catcode:n {`@}} +\char_set_catcode_letter:N @ +\cs_new_protected_nopar:Npn \spath_save_to_aux:Nn #1#2 { + \tl_if_empty:nF {#2} { - {\dim_use:N \l__spath_tmpa_dim} - {\dim_use:N \l__spath_tmpb_dim} + \tl_clear:N \l__spath_tmpa_tl + \tl_put_right:Nn \l__spath_tmpa_tl { + \ExplSyntaxOn + \tl_clear:N #1 + \tl_set:Nn #1 {#2} + \ExplSyntaxOff + } + \protected@write\@auxout{}{ + \tl_to_str:N \l__spath_tmpa_tl + } } - - \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 +} +\char_set_catcode:nn {`@} {\l__spath_tmpa_int} +\cs_generate_variant:Nn \spath_save_to_aux:Nn {cn, cV, NV} +\cs_new_protected_nopar:Npn \spath_save_to_aux:N #1 +{ + \tl_if_exist:NT #1 { - {\dim_use:N \l__spath_tmpa_dim} - {\dim_use:N \l__spath_tmpb_dim} + \spath_save_to_aux:NV #1#1 } - - \tl_set:Nx \l__spath_ia_tl {\tl_head:N \l__spath_tmpa_tl} - +} +\cs_new_protected_nopar:Npn \__spath_translate:nnn #1#2#3 +{ + \group_begin: + \tl_set:Nn \l__spath_tmpa_tl {#1} + \tl_clear:N \l__spath_tmpb_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_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} - \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 {\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_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}} + \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_left:Nx \l__spath_rp_tl + \tl_put_right:Nx \l__spath_tmpb_tl { {\dim_use:N \l__spath_tmpa_dim} {\dim_use:N \l__spath_tmpb_dim} } + } + \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpb_tl + \group_end: +} +\cs_generate_variant:Nn \__spath_translate:nnn {nVV} +\cs_new_protected_nopar:Npn \spath_translate:Nnnn #1#2#3#4 +{ + \__spath_translate:nnn {#2}{#3}{#4} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_translate:Nnnn {NVxx, NVVV, NVnn} +\cs_new_protected_nopar:Npn \spath_translate:Nnn #1#2#3 +{ + \spath_translate:NVnn #1#1{#2}{#3} +} +\cs_generate_variant:Nn \spath_translate:Nnn {NVV, cnn, cVV} +\cs_new_protected_nopar:Npn \spath_gtranslate:Nnnn #1#2#3#4 +{ + \__spath_translate:nnn {#2}{#3}{#4} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_gtranslate:Nnnn {NVxx, NVVV, NVnn} +\cs_new_protected_nopar:Npn \spath_gtranslate:Nnn #1#2#3 +{ + \spath_gtranslate:NVnn #1#1{#2}{#3} +} +\cs_generate_variant:Nn \spath_gtranslate:Nnn {NVV, cnn, cVV} +\cs_new_protected_nopar:Npn \spath_translate:Nn #1#2 +{ + \spath_translate:Nnn #1 #2 +} +\cs_generate_variant:Nn \spath_translate:Nn {NV} +\cs_new_protected_nopar:Npn \spath_gtranslate:Nn #1#2 +{ + \spath_gtranslate:Nnn #1 #2 +} +\cs_generate_variant:Nn \spath_gtranslate:Nn {NV} +\cs_new_protected_nopar:Npn \__spath_translate_to:nnn #1#2#3 +{ + \group_begin: + \spath_initialpoint:Nn \l__spath_tmpa_tl {#1} - \tl_set:Nx \l__spath_fp_tl - { - {\dim_use:N \l__spath_tmpa_dim} - {\dim_use:N \l__spath_tmpb_dim} - } + \dim_set:Nn \l__spath_tmpa_dim + { + #2 + - + \tl_item:Nn \l__spath_tmpa_tl {1} + } + \dim_set:Nn \l__spath_tmpb_dim + { + #3 + - + \tl_item:Nn \l__spath_tmpa_tl {2} + } + \__spath_translate:nVV {#1} \l__spath_tmpa_dim \l__spath_tmpb_dim + \group_end: +} +\cs_new_protected_nopar:Npn \spath_translate_to:Nnnn #1#2#3#4 +{ + \__spath_translate_to:nnn {#2}{#3}{#4} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_translate_to:Nnnn {NVxx, NVVV, NVnn} +\cs_new_protected_nopar:Npn \spath_translate_to:Nnn #1#2#3 +{ + \spath_translate_to:NVnn #1#1{#2}{#3} +} +\cs_generate_variant:Nn \spath_translate_to:Nnn {NVV, cnn, cVV} +\cs_new_protected_nopar:Npn \spath_gtranslate_to:Nnnn #1#2#3#4 +{ + \__spath_translate_to:nnn {#2}{#3}{#4} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_gtranslate_to:Nnnn {NVxx, NVVV, NVnn} +\cs_new_protected_nopar:Npn \spath_gtranslate_to:Nnn #1#2#3 +{ + \spath_gtranslate_to:NVnn #1#1{#2}{#3} +} +\cs_generate_variant:Nn \spath_gtranslate_to:Nnn {NVV, cnn, cVV} +\cs_new_protected_nopar:Npn \spath_translate_to:Nn #1#2 +{ + \spath_translate_to:Nnn #1 #2 +} +\cs_generate_variant:Nn \spath_translate_to:Nn {NV} +\cs_new_protected_nopar:Npn \spath_gtranslate_to:Nn #1#2 +{ + \spath_gtranslate_to:Nnn #1 #2 +} +\cs_generate_variant:Nn \spath_gtranslate_to:Nn {NV} +\cs_new_protected_nopar:Npn \__spath_scale:nnn #1#2#3 +{ + \group_begin: + \tl_set:Nn \l__spath_tmpa_tl {#1} + \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_put_left:NV \l__spath_rp_tl \g__spath_moveto_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} - \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 + \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_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} + \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} {min bb} \l__spath_tmpb_tl + \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpb_tl + \group_end: +} +\cs_new_protected_nopar:Npn \spath_scale:Nnnn #1#2#3#4 +{ + \__spath_scale:nnn {#2}{#3}{#4} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_scale:Nnnn {NVnn, Nnxx} +\cs_new_protected_nopar:Npn \spath_scale:Nnn #1#2#3 +{ + \spath_scale:NVnn #1#1{#2}{#3} +} +\cs_generate_variant:Nn \spath_scale:Nnn {cnn, cVV, NVV} +\cs_new_protected_nopar:Npn \spath_gscale:Nnnn #1#2#3#4 +{ + \__spath_scale:nnn {#2}{#3}{#4} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_gscale:Nnnn {NVnn, Nnxx} +\cs_new_protected_nopar:Npn \spath_gscale:Nnn #1#2#3 +{ + \spath_gscale:NVnn #1#1{#2}{#3} +} +\cs_generate_variant:Nn \spath_gscale:Nnn {cnn, cVV, NVV} +\cs_new_protected_nopar:Npn \spath_scale:Nn #1#2 +{ + \spath_scale:Nnn #1 #2 +} + +\cs_generate_variant:Nn \spath_scale:Nn {NV} +\cs_new_protected_nopar:Npn \spath_gscale:Nn #1#2 +{ + \spath_gscale:Nnn #1 #2 +} +\cs_generate_variant:Nn \spath_gscale:Nn {NV} +\cs_new_protected_nopar:Npn \__spath_transform:nnnnnnn #1#2#3#4#5#6#7 +{ + \group_begin: + \tl_set:Nn \l__spath_tmpa_tl {#1} \tl_clear:N \l__spath_tmpb_tl - \tl_put_right:Nx \l__spath_tmpb_tl + \bool_until_do:nn { + \tl_if_empty_p:N \l__spath_tmpa_tl + } { - {\dim_use:N \l__spath_maxx_dim} - {\dim_use:N \l__spath_maxy_dim} + \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__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_set:Nx \l__spath_tmpd_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__spath_tmpc_tl * #2 + \l__spath_tmpd_tl * #4 + #6} + \fp_set:Nn \l__spath_tmpb_fp + {\l__spath_tmpc_tl * #3 + \l__spath_tmpd_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} {max bb} \l__spath_tmpb_tl + \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpb_tl + \group_end: +} +\cs_new_protected_nopar:Npn \spath_transform:Nnnnnnnn #1#2#3#4#5#6#7#8 +{ + \__spath_transform:nnnnnnn {#2}{#3}{#4}{#5}{#6}{#7}{#8} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_transform:Nnnnnnnn +{NVnnnnnn, Nnxxxxxx, cnnnnnnn} +\cs_new_protected_nopar:Npn \spath_transform:Nnnnnnn #1#2#3#4#5#6#7 +{ + \spath_transform:NVnnnnnn #1#1{#2}{#3}{#4}{#5}{#6}{#7} } -\cs_new_nopar:Npn \spath_translate:nnn #1#2#3 +\cs_generate_variant:Nn \spath_transform:Nnnnnnn {cnnnnnn} +\cs_new_protected_nopar:Npn \spath_transform:Nnn #1#2#3 { - \tl_map_inline:Nn \g__spath_moveable_attributes + \spath_transform:Nnnnnnnn #1{#2}#3 +} +\cs_generate_variant:Nn \spath_transform:Nnn {cnn, cVn, NVn, NnV} +\cs_new_protected_nopar:Npn \spath_transform:Nn #1#2 +{ + \spath_transform:NVnnnnnn #1#1#2 +} +\cs_generate_variant:Nn \spath_transform:Nn {cn, cV, NV} + +\cs_new_protected_nopar:Npn \spath_gtransform:Nnnnnnnn #1#2#3#4#5#6#7#8 +{ + \__spath_transform:nnnnnnn {#2}{#3}{#4}{#5}{#6}{#7}{#8} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_gtransform:Nnnnnnnn {NVnnnnnn, Nnxxxxxx, cnnnnnnn} +\cs_new_protected_nopar:Npn \spath_gtransform:Nnnnnnn #1#2#3#4#5#6#7 +{ + \spath_gtransform:NVnnnnnn #1#1{#2}{#3}{#4}{#5}{#6}{#7} +} +\cs_generate_variant:Nn \spath_gtransform:Nnnnnnn {cnnnnnn} +\cs_new_protected_nopar:Npn \spath_gtransform:Nnn #1#2#3 +{ + \spath_gtransform:Nnnnnnnn #1{#2}#3 +} +\cs_generate_variant:Nn \spath_gtransform:Nnn {cnn, cVn, NVn, NnV} +\cs_new_protected_nopar:Npn \spath_gtransform:Nn #1#2 +{ + \spath_gtransform:NVnnnnnn #1#1#2 +} +\cs_generate_variant:Nn \spath_gtransform:Nn {cn, cV, NV} +\cs_new_protected_nopar:Npn \__spath_span:nnn #1#2#3 +{ + \group_begin: + \spath_initialpoint:Nn \l__spath_tmpa_tl {#1} + \spath_finalpoint:Nn \l__spath_tmpb_tl {#1} + + \fp_set:Nn \l__spath_tmpa_fp { - \spath_if_in:nnT {#1} {##1} - { - \__spath_get:nnN {#1} {##1} \l__spath_tmpa_tl + (\tl_item:Nn \l__spath_tmpb_tl {1}) - + (\tl_item:Nn \l__spath_tmpa_tl {1}) + } + \fp_set:Nn \l__spath_tmpb_fp + { + (\tl_item:Nn \l__spath_tmpb_tl {2}) - + (\tl_item:Nn \l__spath_tmpa_tl {2}) + } + \fp_set:Nn \l__spath_tmpc_fp + { + (\l__spath_tmpa_fp) * (\l__spath_tmpa_fp) + + + (\l__spath_tmpb_fp * \l__spath_tmpb_fp) + } - \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 - } + \fp_compare:nTF + { + \l__spath_tmpc_fp < 0.001 + } + { + \spath_translate_to:Nnnn \l__spath_tmpd_tl {#1} #2 } - \tl_map_inline:Nn \g__spath_path_attributes { - \spath_if_in:nnT {#1} {##1} + \fp_set:Nn \l__spath_tmpa_fp + { + ( + ((\tl_item:nn {#3} {1}) + - + (\tl_item:nn {#2} {1})) + * + ((\tl_item:Nn \l__spath_tmpb_tl {1}) + - + (\tl_item:Nn \l__spath_tmpa_tl {1})) + + + ((\tl_item:nn {#3} {2}) + - + (\tl_item:nn {#2} {2})) + * + ((\tl_item:Nn \l__spath_tmpb_tl {2}) + - + (\tl_item:Nn \l__spath_tmpa_tl {2})) + ) + / + \l__spath_tmpc_fp + } + \fp_set:Nn \l__spath_tmpb_fp + { + ( + ((\tl_item:nn {#3} {2}) + - + (\tl_item:nn {#2} {2})) + * + ((\tl_item:Nn \l__spath_tmpb_tl {1}) + - + (\tl_item:Nn \l__spath_tmpa_tl {1})) + - + ((\tl_item:nn {#3} {1}) + - + (\tl_item:nn {#2} {1})) + * + ((\tl_item:Nn \l__spath_tmpb_tl {2}) + - + (\tl_item:Nn \l__spath_tmpa_tl {2})) + ) + / + \l__spath_tmpc_fp + } + + \tl_set:Nx \l__spath_tmpc_tl { - \__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 + { + \fp_to_decimal:N \l__spath_tmpa_fp } { - \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 + \fp_to_decimal:N \l__spath_tmpb_fp + } + { + \fp_eval:n { - \l__spath_tmpb_fp } + } + { + \fp_to_decimal:N \l__spath_tmpa_fp + } + { + \fp_to_dim:n { - {\dim_use:N \l__spath_tmpa_dim} - {\dim_use:N \l__spath_tmpb_dim} + \tl_item:nn {#2} {1} + - + \l__spath_tmpa_fp * (\tl_item:Nn \l__spath_tmpa_tl {1}) + + + \l__spath_tmpb_fp * (\tl_item:Nn \l__spath_tmpa_tl {2}) + } + } + { + \fp_to_dim:n + { + \tl_item:nn {#2} {2} + - + \l__spath_tmpb_fp * (\tl_item:Nn \l__spath_tmpa_tl {1}) + - + \l__spath_tmpa_fp * (\tl_item:Nn \l__spath_tmpa_tl {2}) } } - \spath_put:nnV {#1} {##1} \l__spath_tmpb_tl } + \spath_transform:NnV \l__spath_tmpd_tl {#1} \l__spath_tmpc_tl } + \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpd_tl + \group_end: } - -\cs_generate_variant:Nn \spath_translate:nnn {nxx} -\cs_new_nopar:Npn \spath_translate:nn #1#2 +\cs_new_protected_nopar:Npn \spath_span:Nnnn #1#2#3#4 { - \spath_translate:nnn {#1} #2 + \__spath_span:nnn {#2}{#3}{#4} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl } - -\cs_generate_variant:Nn \spath_translate:nn {nV} -\cs_new_nopar:Npn \spath_scale:nnn #1#2#3 +\cs_generate_variant:Nn \spath_span:Nnnn {NVnn, NVVV, NnVV} +\cs_new_protected_nopar:Npn \spath_span:Nnn #1#2#3 +{ + \spath_span:NVnn #1#1{#2}{#3} +} +\cs_generate_variant:Nn \spath_span:Nnn {NVV, cnn, cvv, cVV} +\cs_new_protected_nopar:Npn \spath_gspan:Nnnn #1#2#3#4 +{ + \__spath_span:nnn {#2}{#3}{#4} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_gspan:Nnnn {NVnn, NVVV} +\cs_new_protected_nopar:Npn \spath_gspan:Nnn #1#2#3 +{ + \spath_gspan:NVnn #1#1{#2}{#3} +} +\cs_generate_variant:Nn \spath_gspan:Nnn {NVV, cnn, cvv, cVV} +\cs_new_protected_nopar:Npn \__spath_normalise:n #1 +{ + \__spath_span:nnn {#1}{{0pt}{0pt}}{{1pt}{0pt}} +} +\cs_new_protected_nopar:Npn \spath_normalise:Nn #1#2 +{ + \__spath_normalise:n {#2} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_normalise:Nn {cn,NV, cV, cv} +\cs_new_protected_nopar:Npn \spath_normalise:N #1 +{ + \spath_normalise:NV #1#1 +} +\cs_generate_variant:Nn \spath_normalise:N {c} +\cs_new_protected_nopar:Npn \spath_gnormalise:Nn #1#2 +{ + \__spath_normalise:n {#2} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_gnormalise:Nn {cn,NV, cV, cv} +\cs_new_protected_nopar:Npn \spath_gnormalise:N #1 +{ + \spath_gnormalise:NV #1#1 +} +\cs_generate_variant:Nn \spath_gnormalise:N {c} +\cs_new_protected_nopar:Npn \__spath_splice_between:nnn #1#2#3 +{ + \group_begin: + \spath_finalpoint:NV \l__spath_tmpd_tl {#1} + \spath_initialpoint:NV \l__spath_tmpe_tl {#3} + \spath_span:NnVV \l__spath_tmpb_tl {#2} \l__spath_tmpd_tl \l__spath_tmpe_tl + \spath_append_no_move:NnV \l__spath_tmpa_tl {#1} \l__spath_tmpb_tl + \spath_append_no_move:Nn \l__spath_tmpa_tl {#3} + \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpa_tl + \group_end: +} +\cs_new_protected_nopar:Npn \spath_splice_between:Nnnn #1#2#3#4 +{ + \__spath_splice_between:nnn {#2}{#3}{#4} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_splice_between:Nnnn {NVnn, NVVV} +\cs_new_protected_nopar:Npn \spath_splice_between:Nnn #1#2#3 { - \tl_map_inline:Nn \g__spath_moveable_attributes + \spath_splice_between:NVnn #1#1{#2}{#3} +} +\cs_generate_variant:Nn \spath_splice_between:Nnn {NVV, cnn, cvv, Nvn} +\cs_new_protected_nopar:Npn \spath_gsplice_between:Nnnn #1#2#3#4 +{ + \__spath_splice_between:nnn {#2}{#3}{#4} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_gsplice_between:Nnnn {NVnn, NVVV} +\cs_new_protected_nopar:Npn \spath_gsplice_between:Nnn #1#2#3 +{ + \spath_gsplice_between:NVnn #1#1{#2}{#3} +} +\cs_generate_variant:Nn \spath_gsplice_between:Nnn {NVV, cnn, cvv} +\cs_new_protected_nopar:Npn \__spath_close_with:nn #1#2 +{ + \group_begin: + \spath_finalmovepoint:Nn \l__spath_tmpa_tl {#1} + \spath_finalpoint:Nn \l__spath_tmpb_tl {#1} + \dim_compare:nTF { - \spath_if_in:nnT {#1} {##1} + \dim_abs:n { - \__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_item:Nn \l__spath_tmpa_tl {1} + - + \tl_item:Nn \l__spath_tmpb_tl {1} } + + + \dim_abs:n + { + \tl_item:Nn \l__spath_tmpa_tl {2} + - + \tl_item:Nn \l__spath_tmpb_tl {2} + } + < 0.01pt + } + { + \__spath_close:n {#1} + } + { + \spath_span:NnVV \l__spath_tmpc_tl {#2} \l__spath_tmpb_tl \l__spath_tmpa_tl + \spath_append_no_move:NnV \l__spath_tmpd_tl {#1} \l__spath_tmpc_tl + \__spath_close:V \l__spath_tmpd_tl + } + \group_end: +} +\cs_new_protected_nopar:Npn \spath_close_with:Nnn #1#2#3 +{ + \__spath_close_with:nn {#2}{#3} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_close_with:Nnn {cnn, cVV, cvv, NVn} +\cs_new_protected_nopar:Npn \spath_close_with:Nn #1#2 +{ + \spath_close_with:NVn #1#1{#2} +} +\cs_generate_variant:Nn \spath_close_with:Nn {cn, cV, cv, NV} +\cs_new_protected_nopar:Npn \spath_gclose_with:Nnn #1#2#3 +{ + \__spath_close_with:nn {#2}{#3} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_gclose_with:Nnn {cnn, cVV, cvv, NVn} +\cs_new_protected_nopar:Npn \spath_gclose_with:Nn #1#2 +{ + \spath_gclose_with:NVn #1#1{#2} +} +\cs_generate_variant:Nn \spath_gclose_with:Nn {cn, cV, cv, NV} +\cs_new_protected_nopar:Npn \__spath_weld:nn #1#2 +{ + \group_begin: + \tl_set:Nn \l__spath_tmpa_tl {#1} + \tl_set:Nn \l__spath_tmpb_tl {#2} + \spath_finalpoint:Nn \l__spath_tmpc_tl {#1} + \spath_translate_to:NV \l__spath_tmpb_tl \l__spath_tmpc_tl + + \__spath_append_no_move:VV \l__spath_tmpa_tl \l__spath_tmpb_tl + \group_end: +} +\cs_new_protected_nopar:Npn \spath_weld:Nnn #1#2#3 +{ + \__spath_weld:nn {#2}{#3} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_weld:Nnn {NVV,NVn} +\cs_new_protected_nopar:Npn \spath_weld:Nn #1#2 +{ + \spath_weld:NVn #1#1{#2} +} +\cs_generate_variant:Nn \spath_weld:Nn {NV, Nv, cV, cv} +\cs_new_protected_nopar:Npn \spath_gweld:Nnn #1#2#3 +{ + \__spath_weld:nn {#2}{#3} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_gweld:Nnn {NVV, NVn} +\cs_new_protected_nopar:Npn \spath_gweld:Nn #1#2 +{ + \spath_gweld:NVn #1#1{#2} +} +\cs_generate_variant:Nn \spath_gweld:Nn {NV, Nv, cV, cv} +\cs_new_protected_nopar:Npn \__spath_append_no_move:nn #1#2 +{ + \group_begin: + \tl_set:Nn \l__spath_tmpa_tl {#1} + \tl_set:Nn \l__spath_tmpb_tl {#2} + \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 + \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpa_tl + \group_end: +} +\cs_generate_variant:Nn \__spath_append_no_move:nn {VV} +\cs_new_protected_nopar:Npn \spath_append_no_move:Nnn #1#2#3 +{ + \__spath_append_no_move:nn {#2}{#3} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_append_no_move:Nnn {NVV, NVn, NnV} +\cs_new_protected_nopar:Npn \spath_append_no_move:Nn #1#2 +{ + \spath_append_no_move:NVn #1#1{#2} +} +\cs_generate_variant:Nn \spath_append_no_move:Nn {NV, cv, Nv} +\cs_new_protected_nopar:Npn \spath_gappend_no_move:Nnn #1#2#3 +{ + \__spath_append_no_move:nn {#2}{#3} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_gappend_no_move:Nnn {NVV, NVn} +\cs_new_protected_nopar:Npn \spath_gappend_no_move:Nn #1#2 +{ + \spath_gappend_no_move:NVn #1#1{#2} +} +\cs_generate_variant:Nn \spath_gappend_no_move:Nn {NV, cv, Nv} +\cs_new_protected_nopar:Npn \spath_append:Nnn #1#2#3 +{ + \tl_set:Nn #1 {#2} + \tl_put_right:Nn #1 {#3} +} +\cs_generate_variant:Nn \spath_append:Nnn {NVV, NVn} +\cs_new_protected_nopar:Npn \spath_append:Nn #1#2 +{ + \spath_append:NVn #1#1{#2} +} +\cs_generate_variant:Nn \spath_append:Nn {NV, Nv, cv} +\cs_new_protected_nopar:Npn \spath_gappend:Nnn #1#2#3 +{ + \tl_gset:Nn #1 {#2} + \tl_gput_right:Nn #1 {#3} +} +\cs_generate_variant:Nn \spath_gappend:Nnn {NVV, NVn} +\cs_new_protected_nopar:Npn \spath_gappend:Nn #1#2 +{ + \spath_gappend:NVn #1#1{#2} +} +\cs_generate_variant:Nn \spath_gappend:Nn {NV, Nv, cv} +\cs_new_protected_nopar:Npn \spath_prepend_no_move:Nnn #1#2#3 +{ + \spath_append_no_move:Nnn #1{#3}{#2} +} +\cs_generate_variant:Nn \spath_prepend_no_move:Nnn {NVV, NVn} +\cs_new_protected_nopar:Npn \spath_prepend_no_move:Nn #1#2 +{ + \spath_prepend_no_move:NVn #1#1{#2} +} +\cs_generate_variant:Nn \spath_prepend_no_move:Nn {NV, cv} +\cs_new_protected_nopar:Npn \spath_gprepend_no_move:Nnn #1#2#3 +{ + \spath_gappend_no_move:Nnn #1{#3}{#2} +} +\cs_generate_variant:Nn \spath_gprepend_no_move:Nnn {NVV, NVn} +\cs_new_protected_nopar:Npn \spath_gprepend_no_move:Nn #1#2 +{ + \spath_gprepend_no_move:NVn #1#1{#2} +} +\cs_generate_variant:Nn \spath_gprepend_no_move:Nn {NV, cv} +\cs_new_protected_nopar:Npn \spath_prepend:Nnn #1#2#3 +{ + \spath_append:Nnn #1{#3}{#2} +} +\cs_generate_variant:Nn \spath_prepend:Nnn {NVV, NVn} +\cs_new_protected_nopar:Npn \spath_prepend:Nn #1#2 +{ + \spath_prepend:NVn #1#1{#2} +} +\cs_generate_variant:Nn \spath_prepend:Nn {NV} +\cs_new_protected_nopar:Npn \spath_gprepend:Nnn #1#2#3 +{ + \spath_gappend:Nnn #1{#3}{#2} +} +\cs_generate_variant:Nn \spath_gprepend:Nnn {NVV, NVn} +\cs_new_protected_nopar:Npn \spath_gprepend:Nn #1#2 +{ + \spath_gprepend:NVn #1#1{#2} +} +\cs_generate_variant:Nn \spath_gprepend:Nn {NV} +\cs_new_protected_nopar:Npn \__spath_bake_round:n #1 +{ + \group_begin: + \tl_set:Nn \l__spath_tmpa_tl {#1} + \pgf@@processround \l__spath_tmpa_tl\l__spath_tmpb_tl + \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpb_tl + \group_end: +} +\cs_new_protected_nopar:Npn \spath_bake_round:Nn #1#2 +{ + \__spath_bake_round:n {#2} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_bake_round:Nn {NV} +\cs_new_protected_nopar:Npn \spath_bake_round:N #1 +{ + \spath_bake_round:NV #1#1 +} +\cs_generate_variant:Nn \spath_bake_round:N {c} +\cs_new_protected_nopar:Npn \spath_gbake_round:Nn #1#2 +{ + \__spath_bake_round:n {#2} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_gbake_round:Nn {NV} +\cs_new_protected_nopar:Npn \spath_gbake_round:N #1 +{ + \spath_gbake_round:NV #1#1 +} +\cs_generate_variant:Nn \spath_gbake_round:N {c} +\cs_new_protected_nopar:Npn \__spath_close:n #1 +{ + \group_begin: + \tl_set:Nn \l__spath_tmpa_tl {#1} + \spath_finalmovepoint:NV \l__spath_tmpb_tl \l__spath_tmpa_tl + \tl_put_right:NV \l__spath_tmpa_tl \c_spath_closepath_tl + \tl_put_right:NV \l__spath_tmpa_tl \l__spath_tmpb_tl + \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpa_tl + \group_end: +} +\cs_generate_variant:Nn \__spath_close:n {V} +\cs_new_protected_nopar:Npn \spath_close:Nn #1#2 +{ + \__spath_close:n {#2} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_close:Nn {NV} +\cs_new_protected_nopar:Npn \spath_close:N #1 +{ + \spath_close:NV #1#1 +} +\cs_generate_variant:Nn \spath_close:N {c} +\cs_new_protected_nopar:Npn \spath_gclose:Nn #1#2 +{ + \__spath_close:n {#2} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_gclose:Nn {NV} +\cs_new_protected_nopar:Npn \spath_gclose:N #1 +{ + \spath_gclose:NV #1#1 +} +\cs_generate_variant:Nn \spath_gclose:N {c} +\cs_new_protected_nopar:Npn \__spath_open:n #1 +{ + \group_begin: + \tl_set:Nn \l__spath_tmpa_tl {#1} + \tl_clear:N \l__spath_tmpb_tl + \bool_until_do:nn { + \tl_if_empty_p:N \l__spath_tmpa_tl } - \tl_map_inline:Nn \g__spath_path_attributes { - \spath_if_in:nnT {#1} {##1} + \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 { - \__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} + \c_spath_closepath_tl { + + \bool_if:nF + { + \dim_compare_p:n + { + \l__spath_move_x_dim == \l__spath_tmpa_dim + } + && + \dim_compare_p:n + { + \l__spath_move_y_dim == \l__spath_tmpb_dim + } + } + { + \tl_put_right:NV \l__spath_tmpb_tl \c_spath_lineto_tl - \fp_set:Nn \l__spath_tmpa_fp {\tl_head:N \l__spath_tmpa_tl * #2} + \tl_put_right:Nx \l__spath_tmpb_tl { + { \dim_use:N \l__spath_move_x_dim } + { \dim_use:N \l__spath_move_y_dim } + } + } + + \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} + } + + \c_spath_moveto_tl { + \tl_put_right:NV \l__spath_tmpb_tl \l__spath_tmpc_tl - \fp_set:Nn \l__spath_tmpb_fp {\tl_head:N \l__spath_tmpa_tl * #3} + \dim_set:Nn \l__spath_move_x_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_move_y_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 - { - {\fp_to_dim:N \l__spath_tmpa_fp} - {\fp_to_dim:N \l__spath_tmpb_fp} + \tl_put_right:Nx \l__spath_tmpb_tl { + { \dim_use:N \l__spath_move_x_dim } + { \dim_use:N \l__spath_move_y_dim } } + + \dim_set_eq:NN \l__spath_tmpa_dim \l__spath_move_x_dim + \dim_set_eq:NN \l__spath_tmpb_dim \l__spath_move_y_dim + } + } + { + \tl_put_right:NV \l__spath_tmpb_tl \l__spath_tmpc_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_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_gset_eq:NN \g__spath_output_tl \l__spath_tmpb_tl + \group_end: } -\cs_generate_variant:Nn \spath_scale:nnn {nxx} -\cs_new_nopar:Npn \spath_scale:nn #1#2 +\cs_new_protected_nopar:Npn \spath_open:Nn #1#2 { - \spath_scale:nnn {#1} #2 + \__spath_open:n {#2} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl } - -\cs_generate_variant:Nn \spath_scale:nn {nV} -\cs_new_nopar:Npn \spath_transform:nnnnnnn #1#2#3#4#5#6#7 +\cs_generate_variant:Nn \spath_open:Nn {NV} +\cs_new_protected_nopar:Npn \spath_open:N #1 +{ + \spath_open:NV #1#1 +} +\cs_new_protected_nopar:Npn \spath_gopen:Nn #1#2 { - \tl_map_inline:Nn \g__spath_moveable_attributes + \__spath_open:n {#2} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_gopen:Nn {NV} +\cs_new_protected_nopar:Npn \spath_gopen:N #1 +{ + \spath_gopen:NV #1#1 +} +\cs_new_protected_nopar:Npn \__spath_remove_empty_components:n #1 +{ + \group_begin: + \spath_components_to_seq:Nn \l__spath_tmpa_seq {#1} + \tl_clear:N \l__spath_tmpa_tl + \seq_map_inline:Nn \l__spath_tmpa_seq { - \spath_if_in:nnT {#1} {##1} + \int_compare:nF { - \__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_count:n {##1} == 3 + } + { + \tl_put_right:Nn \l__spath_tmpa_tl {##1} } } - \tl_map_inline:Nn \g__spath_path_attributes + \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpa_tl + \group_end: +} +\cs_new_protected_nopar:Npn \spath_remove_empty_components:Nn #1#2 +{ + \__spath_remove_empty_components:n {#2} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_remove_empty_components:Nn {NV} +\cs_new_protected_nopar:Npn \spath_remove_empty_components:N #1 +{ + \spath_remove_empty_components:NV #1#1 +} +\cs_generate_variant:Nn \spath_remove_empty_components:N {c} +\cs_new_protected_nopar:Npn \spath_gremove_empty_components:Nn #1#2 +{ + \__spath_remove_empty_components:n {#2} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_gremove_empty_components:Nn {NV} +\cs_new_protected_nopar:Npn \spath_gremove_empty_components:N #1 +{ + \spath_gremove_empty_components:NV #1#1 +} +\cs_generate_variant:Nn \spath_gremove_empty_components:N {c} +\prg_new_protected_conditional:Npnn \spath_if_eq:nn #1#2 { T, F, TF } +{ + \group_begin: + \tl_set:Nn \l__spath_tmpa_tl {#1} + \tl_set:Nn \l__spath_tmpb_tl {#2} + \bool_gset_true:N \g__spath_tmpa_bool + \int_compare:nNnTF + {\tl_count:N \l__spath_tmpa_tl} + = + {\tl_count:N \l__spath_tmpb_tl} { - \spath_if_in:nnT {#1} {##1} + \int_step_inline:nnnn {1} {3} {\tl_count:N \l__spath_tmpa_tl} { - \__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_set:Nx \l__spath_tmpc_tl {\tl_item:Nn \l__spath_tmpa_tl {##1}} + \tl_set:Nx \l__spath_tmpd_tl {\tl_item:Nn \l__spath_tmpb_tl {##1}} + \tl_if_eq:NNF \l__spath_tmpc_tl \l__spath_tmpd_tl + { + \bool_gset_false:N \g__spath_tmpa_bool } + \dim_set:Nn \l__spath_tmpa_dim {\tl_item:Nn \l__spath_tmpa_tl {##1+1}} + \dim_set:Nn \l__spath_tmpb_dim {\tl_item:Nn \l__spath_tmpb_tl {##1+1}} + \dim_compare:nF { - \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 + \dim_abs:n { - {\fp_to_dim:N \l__spath_tmpa_fp} - {\fp_to_dim:N \l__spath_tmpb_fp} + \l__spath_tmpa_dim - \l__spath_tmpb_dim } + < 0.001pt + } + { + \bool_gset_false:N \g__spath_tmpa_bool + } + \dim_set:Nn \l__spath_tmpa_dim {\tl_item:Nn \l__spath_tmpa_tl {##1+2}} + \dim_set:Nn \l__spath_tmpb_dim {\tl_item:Nn \l__spath_tmpb_tl {##1+2}} + \dim_compare:nF + { + \dim_abs:n + { + \l__spath_tmpa_dim - \l__spath_tmpb_dim + } + < 0.001pt + } + { + \bool_gset_false:N \g__spath_tmpa_bool } - \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} + { + \bool_gset_false:N \g__spath_tmpa_bool + } + \group_end: + \bool_if:NTF \g__spath_tmpa_bool + { + \prg_return_true: + } + { + \prg_return_false: } - \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 +\prg_generate_conditional_variant:Nnn \spath_if_eq:nn {VV, Vn, nV, vv} {TF, T, F} +\cs_new_protected_nopar:Npn \__spath_split_curve: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 + \group_begin: + \tl_set_eq:NN \l__spath_tmpa_tl \c_spath_moveto_tl + \tl_put_right:Nx \l__spath_tmpa_tl { + {\tl_item:nn {#1} {2}} + {\tl_item:nn {#1} {3}} + } + \tl_put_right:NV \l__spath_tmpa_tl \c_spath_curvetoa_tl + \tl_put_right:Nx \l__spath_tmpa_tl + { + {\fp_to_dim:n + { + (1 - #2) * \tl_item:nn {#1} {2} + (#2) * \tl_item:nn {#1} {5} + }} + {\fp_to_dim:n + { + (1 - #2) * \tl_item:nn {#1} {3} + (#2) * \tl_item:nn {#1} {6} + }} + } - \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} + \tl_put_right:NV \l__spath_tmpa_tl \c_spath_curvetob_tl + \tl_put_right:Nx \l__spath_tmpa_tl + { + {\fp_to_dim:n + { + (1 - #2)^2 * \tl_item:nn {#1} {2} + + 2 * (1 - #2) * (#2) * \tl_item:nn {#1} {5} + + (#2)^2 * \tl_item:nn {#1} {8} + }} + {\fp_to_dim:n + { + (1 - #2)^2 * \tl_item:nn {#1} {3} + + 2 * (1 - #2) * (#2) * \tl_item:nn {#1} {6} + + (#2)^2 * \tl_item:nn {#1} {9} + }} + } - \spath_translate:nxx {tmp_path} {\dim_use:N \l__spath_tmpa_dim} {\dim_use:N \l__spath_tmpb_dim} + \tl_put_right:NV \l__spath_tmpa_tl \c_spath_curveto_tl + \tl_put_right:Nx \l__spath_tmpa_tl + { + {\fp_to_dim:n + { + (1 - #2)^3 * \tl_item:nn {#1} {2} + + 3 * (1 - #2)^2 * (#2) * \tl_item:nn {#1} {5} + + 3 * (1 - #2) * (#2)^2 * \tl_item:nn {#1} {8} + + (#2)^3 * \tl_item:nn {#1} {11} + }} + {\fp_to_dim:n + { + (1 - #2)^3 * \tl_item:nn {#1} {3} + + 3 * (1 - #2)^2 * (#2) * \tl_item:nn {#1} {6} + + 3 * (1 - #2) * (#2)^2 * \tl_item:nn {#1} {9} + + (#2)^3 * \tl_item:nn {#1} {12} + }} + } - \__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 + \tl_gclear:N \g__spath_output_tl + \__spath_tl_gput_right_braced:NV \g__spath_output_tl \l__spath_tmpa_tl - \spath_put:nnV {#1} {path} \l__spath_tmpa_tl + \tl_clear:N \l__spath_tmpa_tl + \tl_set_eq:NN \l__spath_tmpa_tl \c_spath_moveto_tl + \tl_put_right:Nx \l__spath_tmpa_tl + { + {\fp_to_dim:n + { + (1 - #2)^3 * \tl_item:nn {#1} {2} + + 3 * (1 - #2)^2 * (#2) * \tl_item:nn {#1} {5} + + 3 * (1 - #2) * (#2)^2 * \tl_item:nn {#1} {8} + + (#2)^3 * \tl_item:nn {#1} {11} + }} + {\fp_to_dim:n + { + (1 - #2)^3 * \tl_item:nn {#1} {3} + + 3 * (1 - #2)^2 * (#2) * \tl_item:nn {#1} {6} + + 3 * (1 - #2) * (#2)^2 * \tl_item:nn {#1} {9} + + (#2)^3 * \tl_item:nn {#1} {12} + }} + } - \__spath_get:nnNTF {tmp_path} {final point} \l__spath_tmpa_tl + \tl_put_right:NV \l__spath_tmpa_tl \c_spath_curvetoa_tl + \tl_put_right:Nx \l__spath_tmpa_tl { - \spath_put:nnV {#1} {final point} \l__spath_tmpa_tl + {\fp_to_dim:n + { + (1 - #2)^2 * \tl_item:nn {#1} {5} + + 2 * (1 - #2) * (#2) * \tl_item:nn {#1} {8} + + (#2)^2 * \tl_item:nn {#1} {11} + }} + {\fp_to_dim:n + { + (1 - #2)^2 * \tl_item:nn {#1} {6} + + 2 * (1 - #2) * (#2) * \tl_item:nn {#1} {9} + + (#2)^2 * \tl_item:nn {#1} {12} + }} } + \tl_put_right:NV \l__spath_tmpa_tl \c_spath_curvetob_tl + \tl_put_right:Nx \l__spath_tmpa_tl { - \spath_remove:nn {#1} {final point} + {\fp_to_dim:n + { + (1 - #2) * \tl_item:nn {#1} {8} + (#2) * \tl_item:nn {#1} {11} + }} + {\fp_to_dim:n + { + (1 - #2) * \tl_item:nn {#1} {9} + (#2) * \tl_item:nn {#1} {12} + }} + } + \tl_put_right:NV \l__spath_tmpa_tl \c_spath_curveto_tl + \tl_put_right:Nx \l__spath_tmpa_tl { + {\tl_item:nn {#1} {11}} + {\tl_item:nn {#1} {12}} } - \__spath_get:nnNTF {tmp_path} {final action} \l__spath_tmpa_tl + \__spath_tl_gput_right_braced:NV \g__spath_output_tl \l__spath_tmpa_tl + \group_end: +} +\cs_generate_variant:Nn \__spath_split_curve:nn {nv, nV} +\cs_new_protected_nopar:Npn \spath_split_curve:NNnn #1#2#3#4 +{ + \__spath_split_curve:nn {#3}{#4} + \tl_set:Nx #1 {\tl_item:Nn \g__spath_output_tl {1}} + \tl_set:Nx #2 {\tl_item:Nn \g__spath_output_tl {2}} + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_split_curve:NNnn {NNnV, NNVn, NNVV} +\cs_new_protected_nopar:Npn \spath_gsplit_curve:NNnn #1#2#3#4 +{ + \__spath_split_curve:nn {#3}{#4} + \tl_gset:Nx #1 {\tl_item:Nn \g__spath_output_tl {1}} + \tl_gset:Nx #2 {\tl_item:Nn \g__spath_output_tl {2}} + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_gsplit_curve:NNnn {NNnV, NNVn, NNVV} +\cs_new_protected_nopar:Npn \__spath_maybe_split_curve:n #1 +{ + \group_begin: + \fp_set:Nn \l__spath_tmpa_fp + { + ( + \tl_item:nn {#1} {3} + - 3 * \tl_item:nn {#1} {6} + + 3 * \tl_item:nn {#1} {9} + - \tl_item:nn {#1} {12} + ) + * + (3 * \tl_item:nn {#1} {8} - 3 * \tl_item:nn {#1} {11}) + - + ( + \tl_item:nn {#1} {2} + - 3 * \tl_item:nn {#1} {5} + + 3 * \tl_item:nn {#1} {8} + - \tl_item:nn {#1} {11} + ) + * + (3 * \tl_item:nn {#1} {9} - 3 * \tl_item:nn {#1} {12}) + } + \fp_set:Nn \l__spath_tmpb_fp + { + ( + \tl_item:nn {#1} {2} + - 3 * \tl_item:nn {#1} {5} + + 3 * \tl_item:nn {#1} {8} + - \tl_item:nn {#1} {11} + ) + * + ( + 3 * \tl_item:nn {#1} {6} + - 6 * \tl_item:nn {#1} {9} + + 3 * \tl_item:nn {#1} {12} + ) + - + ( + \tl_item:nn {#1} {3} + - 3 * \tl_item:nn {#1} {6} + + 3 * \tl_item:nn {#1} {9} + - \tl_item:nn {#1} {12} + ) + * + ( + 3 * \tl_item:nn {#1} {5} + - 6 * \tl_item:nn {#1} {8} + + 3 * \tl_item:nn {#1} {11} + ) + } + \fp_compare:nTF { - \spath_put:nnV {#1} {final action} \l__spath_tmpa_tl + \l__spath_tmpb_fp != 0 } { - \spath_remove:nn {#1} {final action} + \fp_set:Nn \l__spath_tmpa_fp {.5 * \l__spath_tmpa_fp / \l__spath_tmpb_fp} + \fp_compare:nTF + { + 0 < \l__spath_tmpa_fp && \l__spath_tmpa_fp < 1 + } + { + \__spath_split_curve:nV {#1} \l__spath_tmpa_fp + } + { + \tl_gset:Nn \g__spath_output_tl { {#1} {} } + } + } + { + \tl_gset:Nn \g__spath_output_tl { {#1} {} } + } + \group_end: +} +\cs_new_protected_nopar:Npn \spath_maybe_split_curve:NNn #1#2#3 +{ + \__spath_maybe_split_curve:n {#3} + \tl_set:Nx #1 {\tl_item:Nn \g__spath_output_tl {1}} + \tl_set:Nx #2 {\tl_item:Nn \g__spath_output_tl {2}} + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_maybe_split_curve:NNn {NNn, NNV } +\cs_new_protected_nopar:Npn \spath_maybe_gsplit_curve:NNn #1#2#3 +{ + \__spath_maybe_split_curve:n {#3} + \tl_gset:Nx #1 {\tl_item:Nn \g__spath_output_tl {1}} + \tl_gset:Nx #2 {\tl_item:Nn \g__spath_output_tl {2}} + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_maybe_gsplit_curve:NNn {NNn, NNV} +\cs_new_protected_nopar:Npn \__spath_split_curves:n #1 +{ + \group_begin: + \tl_set:Nn \l__spath_tmpa_tl {#1} + \tl_clear:N \l__spath_tmpb_tl + \tl_clear:N \l__spath_tmpc_tl + \bool_do_until:nn + { + \tl_if_empty_p:N \l__spath_tmpa_tl } - - \__spath_get:nnNT {tmp_path} {min bb} \l__spath_tmpa_tl { - \__spath_get:nnNT {#1} {min bb} \l__spath_tmpb_tl + \tl_set:Nx \l__spath_tmpc_tl {\tl_head:N \l__spath_tmpa_tl} + \tl_case:NnF \l__spath_tmpc_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}} + \c_spath_curvetoa_tl + { + \tl_clear:N \l__spath_tmpd_tl + \tl_set_eq:NN \l__spath_tmpd_tl \c_spath_moveto_tl + \tl_put_right:Nx \l__spath_tmpd_tl + { + { \dim_use:N \l__spath_tmpa_dim } + { \dim_use:N \l__spath_tmpb_dim } + } + \dim_set:Nn \l__spath_tmpa_dim + { + \tl_item:Nn \l__spath_tmpa_tl {8} + } + \dim_set:Nn \l__spath_tmpb_dim + { + \tl_item:Nn \l__spath_tmpa_tl {9} + } + \prg_replicate:nn {3} + { + \tl_put_right:Nx \l__spath_tmpd_tl + { + \tl_item:Nn \l__spath_tmpa_tl {1} + {\tl_item:Nn \l__spath_tmpa_tl {2}} + {\tl_item:Nn \l__spath_tmpa_tl {3}} + } + \prg_replicate:nn {3} + { + \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} + } + } - \tl_clear:N \l__spath_tmpb_tl + \spath_maybe_split_curve:NNV + \l__spath_tmpd_tl + \l__spath_tmpe_tl + \l__spath_tmpd_tl + \prg_replicate:nn {3} + { + \tl_set:Nx \l__spath_tmpd_tl {\tl_tail:N \l__spath_tmpd_tl} + \tl_set:Nx \l__spath_tmpe_tl {\tl_tail:N \l__spath_tmpe_tl} + } + \tl_put_right:NV \l__spath_tmpb_tl \l__spath_tmpd_tl + \tl_put_right:NV \l__spath_tmpb_tl \l__spath_tmpe_tl + } + } + { + \dim_set:Nn \l__spath_tmpa_dim + { + \tl_item:Nn \l__spath_tmpa_tl {2} + } + \dim_set:Nn \l__spath_tmpb_dim + { + \tl_item:Nn \l__spath_tmpa_tl {3} + } \tl_put_right:Nx \l__spath_tmpb_tl { - {\dim_use:N \l__spath_tmpa_dim} - {\dim_use:N \l__spath_tmpb_dim} + \tl_item:Nn \l__spath_tmpa_tl {1} + {\tl_item:Nn \l__spath_tmpa_tl {2}} + {\tl_item:Nn \l__spath_tmpa_tl {3}} + } + \prg_replicate:nn {3} + { + \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} } - \spath_put:nnV {#1} {min bb} \l__spath_tmpb_tl } } + \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpb_tl + \group_end: +} +\cs_new_protected_nopar:Npn \spath_split_curves:Nn #1#2 +{ + \__spath_split_curves:n {#2} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_split_curves:Nn {NV, cV, cn, cv } +\cs_new_protected_nopar:Npn \spath_split_curves:N #1 +{ + \spath_split_curves:NV #1#1 +} +\cs_generate_variant:Nn \spath_split_curves:N {c} +\cs_new_protected_nopar:Npn \spath_gsplit_curves:Nn #1#2 +{ + \__spath_split_curves:n {#2} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_gsplit_curves:Nn {NV, cV, cn, cv } +\cs_new_protected_nopar:Npn \spath_gsplit_curves:N #1 +{ + \spath_gsplit_curves:NV #1#1 +} +\cs_generate_variant:Nn \spath_gsplit_curves:N {c} +\cs_new_protected_nopar:Npn \__spath_split_line:nn #1#2 +{ + \group_begin: + \tl_set_eq:NN \l__spath_tmpa_tl \c_spath_moveto_tl + \tl_put_right:Nx \l__spath_tmpa_tl { + {\tl_item:nn {#1} {2}} + {\tl_item:nn {#1} {3}} + } + \tl_put_right:NV \l__spath_tmpa_tl \c_spath_lineto_tl + \tl_put_right:Nx \l__spath_tmpa_tl + { + {\fp_to_dim:n + { + (1 - #2) * \tl_item:nn {#1} {2} + (#2) * \tl_item:nn {#1} {5} + }} + {\fp_to_dim:n + { + (1 - #2) * \tl_item:nn {#1} {3} + (#2) * \tl_item:nn {#1} {6} + }} + } + \tl_gclear:N \g__spath_output_tl + \__spath_tl_gput_right_braced:NV \g__spath_output_tl \l__spath_tmpa_tl - \__spath_get:nnNT {tmp_path} {max bb} \l__spath_tmpa_tl + \tl_clear:N \l__spath_tmpa_tl + \tl_set_eq:NN \l__spath_tmpa_tl \c_spath_moveto_tl + \tl_put_right:Nx \l__spath_tmpa_tl { - \__spath_get:nnNT {#1} {max bb} \l__spath_tmpb_tl + {\fp_to_dim:n { - \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} + (1 - #2) * \tl_item:nn {#1} {2} + (#2) * \tl_item:nn {#1} {5} + }} + {\fp_to_dim:n + { + (1 - #2) * \tl_item:nn {#1} {3} + (#2) * \tl_item:nn {#1} {6} + }} + } + \tl_put_right:NV \l__spath_tmpa_tl \c_spath_lineto_tl + \tl_put_right:Nx \l__spath_tmpa_tl { + {\tl_item:nn {#1} {5}} + {\tl_item:nn {#1} {6}} + } - \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}} + \__spath_tl_gput_right_braced:NV \g__spath_output_tl \l__spath_tmpa_tl + \group_end: +} +\cs_new_protected_nopar:Npn \spath_split_line:NNnn #1#2#3#4 +{ + \__spath_split_line:nn {#3}{#4} + \tl_set:Nx #1 {\tl_item:Nn \g__spath_output_tl {1}} + \tl_set:Nx #2 {\tl_item:Nn \g__spath_output_tl {2}} + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_split_line:NNnn {NNnV, NNVn, NNVV} +\cs_new_protected_nopar:Npn \spath_gsplit_line:NNnn #1#2#3#4 +{ + \__spath_split_line:nn {#3}{#4} + \tl_gset:Nx #1 {\tl_item:Nn \g__spath_output_tl {1}} + \tl_gset:Nx #2 {\tl_item:Nn \g__spath_output_tl {2}} + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_gsplit_line:NNnn {NNnV, NNVn, NNVV} +\cs_new_protected_nopar:Npn \__spath_split_at:nn #1#2 +{ + \group_begin: + \int_set:Nn \l__spath_tmpa_int {\fp_to_int:n {floor(#2) + 1}} + \fp_set:Nn \l__spath_tmpa_fp {#2 - floor(#2)} - \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 - } + % Is split point near one end or other of a component? + \fp_compare:nT + { + \l__spath_tmpa_fp < 0.01 + } + { + % Near the start, so we'll place it at the start + \fp_set:Nn \l__spath_tmpa_fp {0} } + \fp_compare:nT + { + \l__spath_tmpa_fp > 0.99 + } + { + % Near the end, so we'll place it at the end + \fp_set:Nn \l__spath_tmpa_fp {0} + \int_incr:N \l__spath_tmpa_int + } + + \int_zero:N \l__spath_tmpb_int + \bool_set_true:N \l__spath_tmpa_bool - \__spath_get:nnNT {tmp_path} {reverse path} \l__spath_tmpa_tl + \tl_set:Nn \l__spath_tmpe_tl {#1} + \tl_clear:N \l__spath_tmpc_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_tmpe_tl + || + \int_compare_p:n { \l__spath_tmpa_int == \l__spath_tmpb_int } + } { - \__spath_get:nnNT {#1} {reverse path} \l__spath_tmpb_tl + \tl_set:Nx \l__spath_tmpf_tl {\tl_head:N \l__spath_tmpe_tl} + \tl_set:Nx \l__spath_tmpe_tl {\tl_tail:N \l__spath_tmpe_tl } + \tl_case:Nn \l__spath_tmpf_tl + { + \c_spath_lineto_tl + { + \int_incr:N \l__spath_tmpb_int + } + \c_spath_curvetoa_tl + { + \int_incr:N \l__spath_tmpb_int + } + } + \int_compare:nT { \l__spath_tmpb_int < \l__spath_tmpa_int } { - \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 + \tl_put_right:NV \l__spath_tmpc_tl \l__spath_tmpf_tl + + \tl_put_right:Nx \l__spath_tmpc_tl + {{ \tl_head:N \l__spath_tmpe_tl }} + \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpe_tl} + \tl_set:Nx \l__spath_tmpe_tl {\tl_tail:N \l__spath_tmpe_tl } + + \tl_put_right:Nx \l__spath_tmpc_tl + {{ \tl_head:N \l__spath_tmpe_tl }} + \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpe_tl} + \tl_set:Nx \l__spath_tmpe_tl {\tl_tail:N \l__spath_tmpe_tl } - \spath_put:nnV {#1} {reverse path} \l__spath_tmpa_tl } } - \__spath_get:nnNT {tmp_path} {length} \l__spath_tmpa_tl + \tl_clear:N \l__spath_tmpd_tl + \tl_put_right:NV \l__spath_tmpd_tl \c_spath_moveto_tl + \tl_put_right:Nx \l__spath_tmpd_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 - } + {\dim_use:N \l__spath_tmpa_dim} + {\dim_use:N \l__spath_tmpb_dim} } - \__spath_get:nnNT {tmp_path} {real length} \l__spath_tmpa_tl + \fp_compare:nTF { - \__spath_get:nnNT {#1} {real length} \l__spath_tmpb_tl + \l__spath_tmpa_fp == 0 + } + { + \tl_set_eq:NN \l__spath_tmpb_tl \l__spath_tmpd_tl + \tl_if_empty:NF \l__spath_tmpe_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 + \tl_put_right:NV \l__spath_tmpb_tl \l__spath_tmpf_tl + \tl_put_right:NV \l__spath_tmpb_tl \l__spath_tmpe_tl } } - - \__spath_get:nnNT {tmp_path} {number of components} \l__spath_tmpa_tl { - \__spath_get:nnNT {#1} {number of components} \l__spath_tmpb_tl + + \tl_case:Nn \l__spath_tmpf_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 + \c_spath_lineto_tl + { + \tl_put_right:NV \l__spath_tmpd_tl \l__spath_tmpf_tl + \tl_put_right:Nx \l__spath_tmpd_tl + {{ \tl_head:N \l__spath_tmpe_tl }} + \tl_set:Nx \l__spath_tmpe_tl {\tl_tail:N \l__spath_tmpe_tl } + + \tl_put_right:Nx \l__spath_tmpd_tl + {{ \tl_head:N \l__spath_tmpe_tl }} + \tl_set:Nx \l__spath_tmpe_tl {\tl_tail:N \l__spath_tmpe_tl } + + \spath_split_line:NNVV + \l__spath_tmpa_tl + \l__spath_tmpb_tl + \l__spath_tmpd_tl + \l__spath_tmpa_fp + + \prg_replicate:nn {3} { + \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} + } + + \tl_put_right:NV \l__spath_tmpc_tl \l__spath_tmpa_tl + \tl_put_right:NV \l__spath_tmpb_tl \l__spath_tmpe_tl + } + \c_spath_curvetoa_tl + { + \tl_put_right:NV \l__spath_tmpd_tl \l__spath_tmpf_tl + \tl_put_right:Nx \l__spath_tmpd_tl + {{ \tl_head:N \l__spath_tmpe_tl }} + \tl_set:Nx \l__spath_tmpe_tl {\tl_tail:N \l__spath_tmpe_tl } + + \tl_put_right:Nx \l__spath_tmpd_tl + {{ \tl_head:N \l__spath_tmpe_tl }} + \tl_set:Nx \l__spath_tmpe_tl {\tl_tail:N \l__spath_tmpe_tl } + + \prg_replicate:nn {2} { + + \tl_put_right:Nx \l__spath_tmpd_tl + { \tl_head:N \l__spath_tmpe_tl } + \tl_set:Nx \l__spath_tmpe_tl {\tl_tail:N \l__spath_tmpe_tl } + + \tl_put_right:Nx \l__spath_tmpd_tl + {{ \tl_head:N \l__spath_tmpe_tl }} + \tl_set:Nx \l__spath_tmpe_tl {\tl_tail:N \l__spath_tmpe_tl } + + \tl_put_right:Nx \l__spath_tmpd_tl + {{ \tl_head:N \l__spath_tmpe_tl }} + \tl_set:Nx \l__spath_tmpe_tl {\tl_tail:N \l__spath_tmpe_tl } + } + + \spath_split_curve:NNVV + \l__spath_tmpa_tl + \l__spath_tmpb_tl + \l__spath_tmpd_tl \l__spath_tmpa_fp + + \prg_replicate:nn {3} { + \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} + } + + \tl_put_right:NV \l__spath_tmpc_tl \l__spath_tmpa_tl + \tl_put_right:NV \l__spath_tmpb_tl \l__spath_tmpe_tl + } } } + \tl_gclear:N \g__spath_output_tl + \__spath_tl_gput_right_braced:NV \g__spath_output_tl \l__spath_tmpc_tl + \__spath_tl_gput_right_braced:NV \g__spath_output_tl \l__spath_tmpb_tl + \group_end: +} +\cs_new_protected_nopar:Npn \spath_split_at:NNnn #1#2#3#4 +{ + \__spath_split_at:nn {#3}{#4} + \tl_set:Nx #1 {\tl_item:Nn \g__spath_output_tl {1}} + \tl_set:Nx #2 {\tl_item:Nn \g__spath_output_tl {2}} + \tl_gclear:N \g__spath_output_tl } -\cs_new_nopar:Npn \spath_prepend_no_move:nn #1#2 +\cs_generate_variant:Nn \spath_split_at:NNnn {NNVn, NNVV, NNnV} +\cs_new_protected_nopar:Npn \spath_gsplit_at:NNnn #1#2#3#4 { - \spath_if_exist:nT {#2} + \__spath_split_at:nn {#3}{#4} + \tl_gset:Nx #1 {\tl_item:Nn \g__spath_output_tl {1}} + \tl_gset:Nx #2 {\tl_item:Nn \g__spath_output_tl {2}} + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_gsplit_at:NNnn {NNVn, NNVV, NNnV} +\cs_new_protected_nopar:Npn \spath_split_at:Nnn #1#2#3 +{ + \__spath_split_at:nn {#2}{#3} + \tl_set:Nx #1 { - \__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 + \tl_item:Nn \g__spath_output_tl {1} + \tl_item:Nn \g__spath_output_tl {2} + } + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_split_at:Nnn {NVn, NVV} +\cs_new_protected_nopar:Npn \spath_split_at:Nn #1#2 +{ + \spath_split_at:NVn #1#1{#2} +} +\cs_new_protected_nopar:Npn \spath_gsplit_at:Nnn #1#2#3 +{ + \__spath_split_at:nn {#2}{#3} + \tl_gset:Nx #1 + { + \tl_item:Nn \g__spath_output_tl {1} + \tl_item:Nn \g__spath_output_tl {2} + } + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_gsplit_at:Nnn {NVn, NVV} +\cs_new_protected_nopar:Npn \spath_gsplit_at:Nn #1#2 +{ + \spath_gsplit_at:NVn #1#1{#2} +} +\cs_new_protected_nopar:Npn \__spath_shorten_at_end:nn #1#2 +{ + \int_compare:nTF + { + \tl_count:n {#1} > 3 + } + { + \group_begin: + \tl_set:Nn \l__spath_tmpa_tl {#1} + \tl_reverse:N \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} - } + \tl_set:Nx \l__spath_tmpb_tl {\tl_item:Nn \l__spath_tmpa_tl {3}} - \spath_if_in:nnTF {#2} {initial action} + \tl_clear:N \l__spath_tmpe_tl + \tl_if_eq:NNTF \l__spath_tmpb_tl \c_spath_curveto_tl { - \__spath_get:nnN {#2} {initial action} \l__spath_tmpa_tl - \spath_put:nnV {#1} {initial action} \l__spath_tmpa_tl + \int_set:Nn \l__spath_tmpa_int {3} } { - \spath_remove:nn {#1} {initial action} + \int_set:Nn \l__spath_tmpa_int {1} } - \bool_if:nTF + \prg_replicate:nn { \l__spath_tmpa_int } { - \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} + \tl_put_right:Nx \l__spath_tmpe_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_tmpe_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_tmpe_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_tmpe_tl { - \__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 }} + {\tl_item:Nn \l__spath_tmpa_tl {1}} + {\tl_item:Nn \l__spath_tmpa_tl {2}} } + \tl_put_right:NV \l__spath_tmpe_tl \c_spath_moveto_tl + + \tl_reverse:N \l__spath_tmpa_tl + + \fp_set:Nn \l__spath_tmpa_fp { - \spath_remove:nn {#1} {real length} + \dim_to_fp:n {\tl_item:Nn \l__spath_tmpe_tl {4}} + - + \dim_to_fp:n {\tl_item:Nn \l__spath_tmpe_tl {1}} } - \bool_if:nTF + + \fp_set:Nn \l__spath_tmpb_fp { - \spath_if_in_p:nn {#1} {number of components} - && - \spath_if_in_p:nn {#2} {number of components} + \dim_to_fp:n {\tl_item:Nn \l__spath_tmpe_tl {5}} + - + \dim_to_fp:n {\tl_item:Nn \l__spath_tmpe_tl {2}} } + + \fp_set:Nn \l__spath_tmpc_fp { - \__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}} + sqrt( + \l__spath_tmpa_fp * \l__spath_tmpa_fp + + + \l__spath_tmpb_fp * \l__spath_tmpb_fp + ) * \l__spath_tmpa_int } + + \fp_compare:nTF { - \spath_remove:nn {#1} {number of components} + \l__spath_tmpc_fp > #2 } - \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} + + \fp_set:Nn \l__spath_tmpc_fp + { + (\l__spath_tmpc_fp - #2)/ \l__spath_tmpc_fp } - } - { - \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} + + \tl_reverse:N \l__spath_tmpe_tl + + \tl_if_eq:NNTF \l__spath_tmpb_tl \c_spath_curveto_tl + { + \spath_split_curve:NNVV + \l__spath_tmpc_tl + \l__spath_tmpd_tl + \l__spath_tmpe_tl + \l__spath_tmpc_fp } + { + \spath_split_line:NNVV + \l__spath_tmpc_tl + \l__spath_tmpd_tl + \l__spath_tmpe_tl + \l__spath_tmpc_fp + } + + \prg_replicate:nn {3} + { + \tl_set:Nx \l__spath_tmpc_tl {\tl_tail:N \l__spath_tmpc_tl} + } + + \tl_put_right:NV \l__spath_tmpa_tl \l__spath_tmpc_tl + } { - \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} + + \int_compare:nT + { + \tl_count:N \l__spath_tmpa_tl > 3 + } + { + \dim_set:Nn \l__spath_tmpa_dim {\fp_to_dim:n {#2 - \l__spath_tmpc_fp } } + \spath_shorten_at_end:NV \l__spath_tmpa_tl \l__spath_tmpa_dim + } } + \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpa_tl + \group_end: + } + { + \tl_gset:Nn \g__spath_output_tl {#1} } } -\cs_new_nopar:Npn \spath_append_no_move:nn #1#2 +\cs_new_protected_nopar:Npn \spath_shorten_at_end:Nnn #1#2#3 { - \spath_if_exist:nT {#2} + \__spath_shorten_at_end:nn {#2}{#3} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_shorten_at_end:Nnn {NVV, cnn, cVV, NVn} +\cs_new_protected_nopar:Npn \spath_shorten_at_end:Nn #1#2 +{ + \spath_shorten_at_end:NVn #1#1{#2} +} +\cs_generate_variant:Nn \spath_shorten_at_end:Nn {cn, cV, NV} +\cs_new_protected_nopar:Npn \spath_gshorten_at_end:Nnn #1#2#3 +{ + \__spath_shorten_at_end:nn {#2}{#3} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_gshorten_at_end:Nnn {NVV, cnn, cVV, NVn} +\cs_new_protected_nopar:Npn \spath_gshorten_at_end:Nn #1#2 +{ + \spath_gshorten_at_end:NVn #1#1{#2} +} +\cs_generate_variant:Nn \spath_gshorten_at_end:Nn {cn, cV, NV} +\cs_new_protected_nopar:Npn \__spath_shorten_at_start:nn #1#2 +{ + \int_compare:nTF { - \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 - } + \tl_count:n {#1} > 3 + } + { + \group_begin: + \tl_set:Nn \l__spath_tmpa_tl {#1} + + \tl_set:Nx \l__spath_tmpb_tl {\tl_item:Nn \l__spath_tmpa_tl {4}} + + \tl_clear:N \l__spath_tmpe_tl + + \tl_if_eq:NNTF \l__spath_tmpb_tl \c_spath_curvetoa_tl + { + \int_set:Nn \l__spath_tmpa_int {3} + } + { + \int_set:Nn \l__spath_tmpa_int {1} + } + + \tl_set_eq:NN \l__spath_tmpe_tl \c_spath_moveto_tl + \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl } + + \prg_replicate:nn { \l__spath_tmpa_int } + { + \__spath_tl_put_right_braced:Nx + \l__spath_tmpe_tl + {\tl_item:Nn \l__spath_tmpa_tl {1}} + \__spath_tl_put_right_braced:Nx + \l__spath_tmpe_tl + {\tl_item:Nn \l__spath_tmpa_tl {2}} + \tl_put_right:Nx \l__spath_tmpe_tl {\tl_item:Nn \l__spath_tmpa_tl {3}} + + \prg_replicate:nn {3} { - \spath_remove:nn {#1} {final point} + \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl } } - \spath_if_in:nnTF {#2} {final action} + } + \__spath_tl_put_right_braced:Nx + \l__spath_tmpe_tl + {\tl_item:Nn \l__spath_tmpa_tl {1}} + \__spath_tl_put_right_braced:Nx + \l__spath_tmpe_tl + {\tl_item:Nn \l__spath_tmpa_tl {2}} + + \fp_set:Nn \l__spath_tmpa_fp + { + \dim_to_fp:n {\tl_item:Nn \l__spath_tmpe_tl {5}} + - + \dim_to_fp:n {\tl_item:Nn \l__spath_tmpe_tl {2}} + } + + \fp_set:Nn \l__spath_tmpb_fp + { + \dim_to_fp:n {\tl_item:Nn \l__spath_tmpe_tl {6}} + - + \dim_to_fp:n {\tl_item:Nn \l__spath_tmpe_tl {3}} + } + + \fp_set:Nn \l__spath_tmpc_fp + { + sqrt( + \l__spath_tmpa_fp * \l__spath_tmpa_fp + + + \l__spath_tmpb_fp * \l__spath_tmpb_fp + ) + * + \l__spath_tmpa_int + } + + \fp_compare:nTF + { + \l__spath_tmpc_fp > #2 + } + { + + \fp_set:Nn \l__spath_tmpc_fp { - \__spath_get:nnN {#2} {final action} \l__spath_tmpa_tl - \spath_put:nnV {#1} {final action} \l__spath_tmpa_tl + #2/ \l__spath_tmpc_fp } + + \tl_if_eq:NNTF \l__spath_tmpb_tl \c_spath_curvetoa_tl { - \spath_remove:nn {#1} {final action} + \spath_split_curve:NNVV + \l__spath_tmpc_tl + \l__spath_tmpd_tl + \l__spath_tmpe_tl + \l__spath_tmpc_fp } - \bool_if:nTF { - \spath_if_in_p:nn {#1} {length} - && - \spath_if_in_p:nn {#2} {length} + \spath_split_line:NNVV + \l__spath_tmpc_tl + \l__spath_tmpd_tl + \l__spath_tmpe_tl + \l__spath_tmpc_fp } + + \prg_replicate:nn {2} { - \__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}} + \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} } + + \tl_put_left:NV \l__spath_tmpa_tl \l__spath_tmpd_tl + + } + { + + \tl_put_left:NV \l__spath_tmpa_tl \c_spath_moveto_tl + + \int_compare:nT { - \spath_remove:nn {#1} {length} + \tl_count:N \l__spath_tmpa_tl > 3 } - \bool_if:nTF { - \spath_if_in_p:nn {#1} {real length} - && - \spath_if_in_p:nn {#2} {real length} + \dim_set:Nn \l__spath_tmpa_dim {\fp_to_dim:n {#2 - \l__spath_tmpc_fp } } + \spath_shorten_at_start:NV \l__spath_tmpa_tl \l__spath_tmpa_dim } + } + + \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpa_tl + \group_end: + } + { + \tl_gset:Nn \g__spath_output_tl {#1} + } +} +\cs_new_protected_nopar:Npn \spath_shorten_at_start:Nnn #1#2#3 +{ + \__spath_shorten_at_start:nn {#2}{#3} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_shorten_at_start:Nnn {NVV, cnn, cVV, NVn} +\cs_new_protected_nopar:Npn \spath_shorten_at_start:Nn #1#2 +{ + \spath_shorten_at_start:NVn #1#1{#2} +} +\cs_generate_variant:Nn \spath_shorten_at_start:Nn {cn, cV, NV} +\cs_new_protected_nopar:Npn \spath_gshorten_at_start:Nnn #1#2#3 +{ + \__spath_shorten_at_start:nn {#2}{#3} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_gshorten_at_start:Nnn {NVV, cnn, cVV, NVn} +\cs_new_protected_nopar:Npn \spath_gshorten_at_start:Nn #1#2 +{ + \spath_gshorten_at_start:NVn #1#1{#2} +} +\cs_generate_variant:Nn \spath_gshorten_at_start:Nn {cn, cV, NV} +\cs_new_protected_nopar:Npn \__spath_point_at:nn #1#2 +{ + \group_begin: + \int_set:Nn \l__spath_tmpa_int {\fp_to_int:n {floor(#2) + 1}} + \fp_set:Nn \l__spath_tmpa_fp {#2 - floor(#2)} + + \spath_segments_to_seq:Nn \l__spath_tmpa_seq {#1} + + \int_compare:nTF + { + \l__spath_tmpa_int < 1 + } + { + \spath_initialpoint:Nn \l__spath_tmpc_tl {#1} + } + { + \int_compare:nTF { - \__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 }} + \l__spath_tmpa_int > \seq_count:N \l__spath_tmpa_seq } { - \spath_remove:nn {#1} {real length} + \spath_finalpoint:Nn \l__spath_tmpc_tl {#1} } - \bool_if:nTF { - \spath_if_in_p:nn {#1} {number of components} - && - \spath_if_in_p:nn {#2} {number of components} + + \tl_set:Nx + \l__spath_tmpa_tl + {\seq_item:Nn \l__spath_tmpa_seq { \l__spath_tmpa_int} } + + \int_compare:nTF + { + \tl_count:N \l__spath_tmpa_tl > 3 + } + { + \tl_set:Nx \l__spath_tmpb_tl {\tl_item:Nn \l__spath_tmpa_tl {4}} + } + { + \tl_set:Nx \l__spath_tmpb_tl {\tl_item:Nn \l__spath_tmpa_tl {1}} + } + + \tl_clear:N \l__spath_tmpc_tl + + \tl_case:Nn \l__spath_tmpb_tl + { + \c_spath_moveto_tl + { + \tl_set:Nx \l__spath_tmpc_tl + { + { + \tl_item:Nn \l__spath_tmpa_tl {2} + } + { + \tl_item:Nn \l__spath_tmpa_tl {3} + } + } + } + + \c_spath_lineto_tl + { + \tl_set:Nx \l__spath_tmpc_tl + { + {\fp_to_dim:n + { + (1 - \l__spath_tmpa_fp) * ( \tl_item:Nn \l__spath_tmpa_tl {2} ) + + + \l__spath_tmpa_fp * ( \tl_item:Nn \l__spath_tmpa_tl {5} ) + } + } + {\fp_to_dim:n + { + (1 - \l__spath_tmpa_fp) * ( \tl_item:Nn \l__spath_tmpa_tl {3} ) + + + \l__spath_tmpa_fp * ( \tl_item:Nn \l__spath_tmpa_tl {6} ) + } + } + } + } + + \c_spath_closepath_tl + { + \tl_set:Nx \l__spath_tmpc_tl + { + {\fp_to_dim:n + { + (1 - \l__spath_tmpa_fp) * ( \tl_item:Nn \l__spath_tmpa_tl {2} ) + + + \l__spath_tmpa_fp * ( \tl_item:Nn \l__spath_tmpa_tl {5} ) + } + } + {\fp_to_dim:n + { + (1 - \l__spath_tmpa_fp) * ( \tl_item:Nn \l__spath_tmpa_tl {3} ) + + + \l__spath_tmpa_fp * ( \tl_item:Nn \l__spath_tmpa_tl {6} ) + } + } + } + } + + \c_spath_curvetoa_tl + { + \tl_set:Nx \l__spath_tmpc_tl + { + {\fp_to_dim:n + { + (1 - \l__spath_tmpa_fp)^3 * \tl_item:Nn \l__spath_tmpa_tl {2} + + 3 * (1 - \l__spath_tmpa_fp)^2 * (\l__spath_tmpa_fp) + * \tl_item:Nn \l__spath_tmpa_tl {5} + + 3 * (1 - \l__spath_tmpa_fp) * (\l__spath_tmpa_fp)^2 + * \tl_item:Nn \l__spath_tmpa_tl {8} + + (\l__spath_tmpa_fp)^3 * \tl_item:Nn \l__spath_tmpa_tl {11} + }} + {\fp_to_dim:n + { + (1 - \l__spath_tmpa_fp)^3 * \tl_item:Nn \l__spath_tmpa_tl {3} + + 3 * (1 - \l__spath_tmpa_fp)^2 * (\l__spath_tmpa_fp) + * \tl_item:Nn \l__spath_tmpa_tl {6} + + 3 * (1 - \l__spath_tmpa_fp) * (\l__spath_tmpa_fp)^2 + * \tl_item:Nn \l__spath_tmpa_tl {9} + + (\l__spath_tmpa_fp)^3 * \tl_item:Nn \l__spath_tmpa_tl {12} + }} + } + } + } } + } + + \tl_gclear:N \g__spath_output_tl + \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpc_tl + \group_end: +} +\cs_new_protected_nopar:Npn \spath_point_at:Nnn #1#2#3 +{ + \__spath_point_at:nn {#2}{#3} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_point_at:Nnn {NVn, NVV, NnV} +\cs_new_protected_nopar:Npn \spath_gpoint_at:Nnn #1#2#3 +{ + \__spath_point_at:nn {#2}{#3} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_gpoint_at:Nnn {NVn, NVV, NnV} +\cs_new_protected_nopar:Npn \__spath_tangent_at:nn #1#2 +{ + \group_begin: + \int_set:Nn \l__spath_tmpa_int {\fp_to_int:n {floor(#2) + 1}} + \fp_set:Nn \l__spath_tmpa_fp {#2 - floor(#2)} + + \spath_segments_to_seq:Nn \l__spath_tmpa_seq {#1} + + \int_compare:nTF + { + \l__spath_tmpa_int < 1 + } + { + \spath_initialpoint:Nn \l__spath_tmpc_tl {#1} + } + { + \int_compare:nTF { - \__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}} + \l__spath_tmpa_int > \seq_count:N \l__spath_tmpa_seq } { - \spath_remove:nn {#1} {number of components} + \spath_finalpoint:Nn \l__spath_tmpc_tl {#1} } - \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} + + \tl_set:Nx + \l__spath_tmpa_tl + {\seq_item:Nn \l__spath_tmpa_seq { \l__spath_tmpa_int} } + + \int_compare:nTF + { + \tl_count:N \l__spath_tmpa_tl > 3 + } + { + \tl_set:Nx \l__spath_tmpb_tl {\tl_item:Nn \l__spath_tmpa_tl {4}} + } + { + \tl_set:Nx \l__spath_tmpb_tl {\tl_item:Nn \l__spath_tmpa_tl {1}} + } + + \tl_clear:N \l__spath_tmpc_tl + + \tl_case:Nn \l__spath_tmpb_tl + { + \c_spath_moveto_tl + { + \tl_set:Nx \l__spath_tmpc_tl + { + { + \tl_item:Nn \l__spath_tmpa_tl {2} + } + { + \tl_item:Nn \l__spath_tmpa_tl {3} + } + } + } + + \c_spath_lineto_tl + { + \tl_set:Nx \l__spath_tmpc_tl + { + {\fp_to_dim:n + { + ( \tl_item:Nn \l__spath_tmpa_tl {5} ) + - + ( \tl_item:Nn \l__spath_tmpa_tl {2} ) + } + } + {\fp_to_dim:n + { + ( \tl_item:Nn \l__spath_tmpa_tl {6} ) + - + ( \tl_item:Nn \l__spath_tmpa_tl {3} ) + } + } + } + } + + \c_spath_closepath_tl + { + \tl_set:Nx \l__spath_tmpc_tl + { + {\fp_to_dim:n + { + ( \tl_item:Nn \l__spath_tmpa_tl {5} ) + - + ( \tl_item:Nn \l__spath_tmpa_tl {2} ) + } + } + {\fp_to_dim:n + { + ( \tl_item:Nn \l__spath_tmpa_tl {6} ) + - + ( \tl_item:Nn \l__spath_tmpa_tl {3} ) + } + } + } + } + + \c_spath_curvetoa_tl + { + \tl_set:Nx \l__spath_tmpc_tl + { + {\fp_to_dim:n + { + 3*(1 - \l__spath_tmpa_fp)^2 * (\tl_item:Nn \l__spath_tmpa_tl {5} + - \tl_item:Nn \l__spath_tmpa_tl {2}) + + 6 * (1 - \l__spath_tmpa_fp) * (\l__spath_tmpa_fp) * + (\tl_item:Nn \l__spath_tmpa_tl {8} + - \tl_item:Nn \l__spath_tmpa_tl {5}) + + 3*(\l__spath_tmpa_fp)^2 * (\tl_item:Nn \l__spath_tmpa_tl {11} + - \tl_item:Nn \l__spath_tmpa_tl {8}) + } + } + {\fp_to_dim:n + { + 3*(1 - \l__spath_tmpa_fp)^2 * (\tl_item:Nn \l__spath_tmpa_tl {6} + - \tl_item:Nn \l__spath_tmpa_tl {3}) + + 6 * (1 - \l__spath_tmpa_fp) * (\l__spath_tmpa_fp) * + (\tl_item:Nn \l__spath_tmpa_tl {9} + - \tl_item:Nn \l__spath_tmpa_tl {6}) + + 3*(\l__spath_tmpa_fp)^2 * (\tl_item:Nn \l__spath_tmpa_tl {12} + - \tl_item:Nn \l__spath_tmpa_tl {9}) + }} + } + } } } + } + + \tl_gclear:N \g__spath_output_tl + \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpc_tl + \group_end: +} +\cs_new_protected_nopar:Npn \spath_tangent_at:Nnn #1#2#3 +{ + \__spath_tangent_at:nn {#2}{#3} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_tangent_at:Nnn {NVn, NVV, NnV} +\cs_new_protected_nopar:Npn \spath_gtangent_at:Nnn #1#2#3 +{ + \__spath_tangent_at:nn {#2}{#3} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_gtangent_at:Nnn {NVn, NVV, NnV} +\cs_new_protected_nopar:Npn \__spath_transformation_at:nn #1#2 +{ + \group_begin: + \tl_clear:N \l__spath_tmpa_tl + \__spath_tangent_at:nn {#1}{#2} + \tl_set_eq:NN \l__spath_tmpb_tl \g__spath_output_tl + \fp_set:Nn \l__spath_tmpa_fp + { + sqrt( + (\tl_item:Nn \l__spath_tmpb_tl {1})^2 + + + (\tl_item:Nn \l__spath_tmpb_tl {2})^2 + ) + } + \fp_compare:nTF {\l__spath_tmpa_fp = 0} + { + \fp_set:Nn \l__spath_tmpa_fp {1} + \fp_set:Nn \l__spath_tmpb_fp {0} + } + { + \fp_set:Nn \l__spath_tmpb_fp + { (\tl_item:Nn \l__spath_tmpb_tl {2}) / \l__spath_tmpa_fp } + \fp_set:Nn \l__spath_tmpa_fp + { (\tl_item:Nn \l__spath_tmpb_tl {1}) / \l__spath_tmpa_fp } + } + \tl_set:Nx \l__spath_tmpa_tl + { + { \fp_to_decimal:n { \l__spath_tmpa_fp } } + { \fp_to_decimal:n { \l__spath_tmpb_fp } } + { \fp_to_decimal:n {- \l__spath_tmpb_fp } } + { \fp_to_decimal:n { \l__spath_tmpa_fp } } + } + \__spath_point_at:nn {#1}{#2} + \tl_put_right:NV \l__spath_tmpa_tl \g__spath_output_tl + \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpa_tl + \group_end: +} +\cs_new_protected_nopar:Npn \spath_transformation_at:Nnn #1#2#3 +{ + \__spath_transformation_at:nn {#2}{#3} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_transformation_at:Nnn {NVn, NVV, NnV, NvV} +\cs_new_protected_nopar:Npn \spath_gtransformation_at:Nnn #1#2#3 +{ + \__spath_transformation_at:nn {#2}{#3} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_gtransformation_at:Nnn {NVn, NVV, NnV} +\cs_new_protected_nopar:Npn \spath_intersect:NN #1#2 +{ + \pgfintersectionofpaths% + {% + \pgfsetpath #1 + }{% + \pgfsetpath #2 + } +} +\cs_new_protected_nopar:Npn \spath_intersect:nn #1#2 +{ + \tl_set:Nn \l__spath_intersecta_tl {#1} + \tl_set:Nn \l__spath_intersectb_tl {#2} + \spath_intersect:NN \l__spath_intersecta_tl \l__spath_intersectb_tl +} +\cs_new_protected_nopar:Npn \__spath_split_component_at_intersections:nn #1#2 +{ + \group_begin: + \tl_clear:N \l__spath_tmpe_tl + \seq_clear:N \l__spath_tmpb_seq + + % Find the intersections of these segments + \tl_set:Nn \l__spath_tmpb_tl {#1} + \tl_set:Nn \l__spath_tmpc_tl {#2} + + \spath_reallength:Nn \l__spath_tmpa_int {#1} + + % Remember if the component is closed + \spath_finalaction:NV \l__spath_tmpa_tl \l__spath_tmpb_tl + + \bool_set:Nn \l__spath_closed_bool + { + \tl_if_eq_p:NN \l__spath_tmpa_tl \c_spath_closepath_tl + } + + % Open it + \spath_open:N \l__spath_tmpb_tl + + % Sort intersections along the component + \pgfintersectionsortbyfirstpath + \spath_intersect:NN \l__spath_tmpb_tl \l__spath_tmpc_tl + + % If we get intersections + \int_compare:nT {\pgfintersectionsolutions > 0} + { + % Find the times of the intersections on the component + \int_step_inline:nnnn {1} {1} {\pgfintersectionsolutions} { - \spath_remove:nn {#1} {min bb} + \pgfintersectiongetsolutiontimes{##1}{\l__spath_tmph_tl}{\l__spath_tmpi_tl} + \seq_put_left:NV \l__spath_tmpb_seq \l__spath_tmph_tl } - \bool_if:nTF + + \seq_get_left:NN \l__spath_tmpb_seq \l__spath_tmpa_tl + \fp_compare:nT { - \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} - } + \l__spath_tmpa_tl > \l__spath_tmpa_int - .01 } { - \spath_remove:nn {#1} {max bb} + \bool_set_false:N \l__spath_closed_bool } - \bool_if:nTF + \seq_get_right:NN \l__spath_tmpb_seq \l__spath_tmpa_tl + \fp_compare:nT { - \spath_if_in_p:nn {#1} {reverse path} - && - \spath_if_in_p:nn {#2} {reverse path} + \l__spath_tmpa_tl < .01 } { - \__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 + \bool_set_false:N \l__spath_closed_bool } + + \tl_set:Nn \l__spath_tmpg_tl {-1} + + \seq_map_inline:Nn \l__spath_tmpb_seq { - \spath_remove:nn {#1} {reverse path} + \tl_set:Nn \l__spath_tmph_tl {##1} + + \tl_set_eq:NN \l__spath_tmpa_tl \l__spath_tmph_tl + \int_compare:nT + { + \fp_to_int:n {floor( \l__spath_tmph_tl) } + = + \fp_to_int:n {floor( \l__spath_tmpg_tl) } + } + { + \tl_set:Nx \l__spath_tmph_tl + { + \fp_eval:n { + floor( \l__spath_tmph_tl ) + + + ( \l__spath_tmph_tl - floor( \l__spath_tmph_tl) ) + / + ( \l__spath_tmpg_tl - floor( \l__spath_tmpg_tl) ) + } + } + } + \tl_set_eq:NN \l__spath_tmpg_tl \l__spath_tmpa_tl + + \spath_split_at:NNVV + \l__spath_tmpd_tl + \l__spath_tmpf_tl + \l__spath_tmpb_tl + \l__spath_tmph_tl + + \tl_put_left:NV \l__spath_tmpe_tl \l__spath_tmpf_tl + \tl_set_eq:NN \l__spath_tmpb_tl \l__spath_tmpd_tl + } + + \tl_put_left:NV \l__spath_tmpe_tl \l__spath_tmpb_tl + + \spath_remove_empty_components:N \l__spath_tmpe_tl + + \tl_set_eq:NN \l__spath_tmpb_tl \l__spath_tmpe_tl } + + \bool_if:NT \l__spath_closed_bool + { + \spath_join_component:Nn \l__spath_tmpb_tl {1} + } + + \tl_gclear:N \g__spath_output_tl + \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpb_tl + + \group_end: } -\cs_new_nopar:Npn \spath_bake_round:n #1 +\cs_new_protected_nopar:Npn \spath_split_component_at_intersections:Nnn #1#2#3 { - \__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 + \__spath_split_component_at_intersections:nn {#2}{#3} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl } -\cs_new_nopar:Npn \spath_close_path:n #1 +\cs_generate_variant:Nn \spath_split_component_at_intersections:Nnn {NVn, NVV} +\cs_new_protected_nopar:Npn \spath_split_component_at_intersections:Nn #1#2 { - \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 - } + \spath_split_component_at_intersections:NVn #1#1{#2} } -\cs_new_nopar:Npn \spath_map_component:Nn #1#2 +\cs_generate_variant:Nn \spath_split_component_at_intersections:Nn {cn, cv} +\cs_new_protected_nopar:Npn \spath_gsplit_component_at_intersections:Nnn #1#2#3 { - \int_gincr:N \g__spath_map_int - \cs_gset:cpn { __spath_map_ \int_use:N \g__spath_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 - } + \__spath_split_component_at_intersections:nn {#2}{#3} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_gsplit_component_at_intersections:Nnn {NVn, NVV} +\cs_new_protected_nopar:Npn \spath_gsplit_component_at_intersections:Nn #1#2 +{ + \spath_gsplit_component_at_intersections:NVn #1#1{#2} +} +\cs_generate_variant:Nn \spath_gsplit_component_at_intersections:Nn {cn, cv} +\cs_new_protected_nopar:Npn \__spath_split_path_at_intersections:nn #1#2 +{ + \group_begin: + + \seq_clear:N \l__spath_tmpa_seq + \seq_clear:N \l__spath_tmpb_seq + + \spath_components_to_seq:Nn \l__spath_tmpa_seq {#1} + \seq_map_inline:Nn \l__spath_tmpa_seq { - \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 { __spath_map_ \int_use:N \g__spath_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} + \spath_split_component_at_intersections:Nnn \l__spath_tmpa_tl {##1} {#2} + \seq_put_right:NV \l__spath_tmpb_seq \l__spath_tmpa_tl } + + \tl_gclear:N \g__spath_output_tl + \tl_gset:Nx \g__spath_output_tl {\seq_use:Nn \l__spath_tmpb_seq {} } + \group_end: } -\cs_new_nopar:Npn \spath_map_segment_inline:Nn #1#2 +\cs_new_protected_nopar:Npn \spath_split_path_at_intersections:Nnn #1#2#3 { - \int_gincr:N \g__spath_map_int - \cs_gset:cpn { __spath_map_ \int_use:N \g__spath_map_int :w } ##1 ##2 {#2} - \spath_map_segment_function:Nc #1 { __spath_map_ \int_use:N \g__spath_map_int :w } + \__spath_split_path_at_intersections:nn {#2}{#3} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl } -\cs_new_nopar:Npn \spath_map_segment_inline:nn #1#2 +\cs_generate_variant:Nn \spath_split_path_at_intersections:Nnn +{NVn, NVV, cVn, cVV, cvn, cvv} +\cs_new_protected_nopar:Npn \spath_split_path_at_intersections:Nn #1#2 { - \int_gincr:N \g__spath_map_int - \cs_gset:cpn { __spath_map_ \int_use:N \g__spath_map_int :w } ##1 ##2 {#2} - \spath_get:nnN {#1} {path} \l__spath_tmpd_tl - \spath_map_segment_function:Nc \l__spath_tmpd_tl { __spath_map_ \int_use:N \g__spath_map_int :w } + \spath_split_path_at_intersections:NVn #1#1{#2} } -\cs_new_nopar:Npn \spath_map_segment_function:nN #1#2 +\cs_generate_variant:Nn \spath_split_path_at_intersections:Nn {cv, NV} +\cs_new_protected_nopar:Npn \spath_gsplit_path_at_intersections:Nnn #1#2#3 { - \spath_get:nnN {#1} {path} \l__spath_tmpd_tl - \spath_map_segment_function:NN \l__spath_tmpd_tl #2 + \__spath_split_path_at_intersections:nn {#2}{#3} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl } -\cs_new_nopar:Npn \spath_map_segment_function:NN #1#2 +\cs_generate_variant:Nn \spath_gsplit_path_at_intersections:Nnn +{NVn, NVV, cVn, cVV, cvn, cvv} +\cs_new_protected_nopar:Npn \spath_gsplit_path_at_intersections: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 + \spath_gsplit_path_at_intersections:NVn #1#1{#2} +} +\cs_generate_variant:Nn \spath_gsplit_path_at_intersections:Nn {cv, NV} +\cs_new_protected_nopar:Npn \spath_split_at_intersections:NNnn #1#2#3#4 +{ + \__spath_split_path_at_intersections:nn {#3}{#4} + \tl_set_eq:NN #1 \g__spath_output_tl + \__spath_split_path_at_intersections:nn {#4}{#3} + \tl_set_eq:NN #2 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_split_at_intersections:NNnn +{NNVn, NNVV, ccVn, ccVV, ccvn, ccvv} +\cs_new_protected_nopar:Npn \spath_split_at_intersections:NN #1#2 +{ + \spath_split_at_intersections:NNVV #1#2#1#2 +} +\cs_generate_variant:Nn \spath_split_at_intersections:NN {cc} +\cs_new_protected_nopar:Npn \spath_gsplit_at_intersections:NNnn #1#2#3#4 +{ + \__spath_split_path_at_intersections:nn {#3}{#4} + \tl_gset_eq:NN #1 \g__spath_output_tl + \__spath_split_path_at_intersections:nn {#4}{#3} + \tl_gset_eq:NN #2 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_gsplit_at_intersections:NNnn +{NNVn, NNVV, ccVn, ccVV, ccvn, ccvv} +\cs_new_protected_nopar:Npn \spath_gsplit_at_intersections:NN #1#2 +{ + \spath_gsplit_at_intersections:NNVV #1#2#1#2 +} +\cs_generate_variant:Nn \spath_gsplit_at_intersections:NN {cc} +\cs_new_protected_nopar:Npn \__spath_split_component_at_self_intersections:n #1 +{ + \group_begin: + \tl_set:Nn \l__spath_tmpe_tl {#1} - \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 + % Remember if the component is closed + \spath_finalaction:NV \l__spath_tmpa_tl \l__spath_tmpe_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} + \bool_set:Nn \l__spath_closed_bool + { + \tl_if_eq_p:NN \l__spath_tmpa_tl \c_spath_closepath_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} + % Copy the path + \tl_set:Nn \l__spath_tmpe_tl {#1} - } + % Open the path + \spath_open:N \l__spath_tmpe_tl + % Ensure beziers don't self-intersect + \spath_split_curves:N \l__spath_tmpe_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 + % Make a copy for later + \tl_set_eq:NN \l__spath_tmpg_tl \l__spath_tmpe_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} - } + % Clear some token lists and sequences + \tl_clear:N \l__spath_tmpd_tl + \seq_clear:N \l__spath_tmpb_seq + \int_zero:N \l__spath_tmpa_int - \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} + \pgfintersectionsortbyfirstpath - \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} + % Split the path into a sequence of segments + \spath_segments_to_seq:NV \l__spath_tmpa_seq \l__spath_tmpe_tl + \seq_map_indexed_inline:Nn \l__spath_tmpa_seq + { + \seq_map_indexed_inline:Nn \l__spath_tmpa_seq + { + % Don't intersect a segment with itself + \int_compare:nF + { + ##1 == ####1 } - - \g__spath_closepath_tl { - \tl_set_eq:NN \l__spath_tmpb_tl \g__spath_moveto_tl - \tl_put_right:Nx \l__spath_tmpb_tl + \spath_intersect:nn {##2} {####2} + + \int_compare:nT {\pgfintersectionsolutions > 0} { - {\dim_use:N \l__spath_tmpa_dim} - {\dim_use:N \l__spath_tmpb_dim} + % Find the times of the intersections on each path + \int_step_inline:nnnn {1} {1} {\pgfintersectionsolutions} + { + \pgfintersectiongetsolutiontimes + {########1}{\l__spath_tmpb_tl}{\l__spath_tmpc_tl} + + \bool_if:nT + { + !( + \fp_compare_p:n { \l__spath_tmpb_tl > .99 } + && + \int_compare_p:n {##1 + 1 == ####1} + ) + && + !( + \fp_compare_p:n { \l__spath_tmpb_tl < .01 } + && + \int_compare_p:n {##1 - 1 == ####1} + ) + && + !( + \l__spath_closed_bool + && + \fp_compare_p:n { \l__spath_tmpb_tl < .01 } + && + \int_compare_p:n {##1 == 1} + && + \int_compare_p:n {\seq_count:N \l__spath_tmpa_seq == ####1} + ) + && + !( + \l__spath_closed_bool + && + \fp_compare_p:n { \l__spath_tmpb_tl > .99 } + && + \int_compare_p:n {####1 == 1} + && + \int_compare_p:n {\seq_count:N \l__spath_tmpa_seq == ##1} + ) + } + { + \tl_set:Nx \l__spath_tmpa_tl + {\fp_to_decimal:n {\l__spath_tmpb_tl + ##1 - 1}} + \seq_put_right:NV \l__spath_tmpb_seq \l__spath_tmpa_tl + } + } } - \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} + % Sort the sequence by reverse order along the path + \seq_sort:Nn \l__spath_tmpb_seq + { + \fp_compare:nNnTF { ##1 } < { ##2 } + { \sort_return_swapped: } + { \sort_return_same: } + } - \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} + \seq_get_left:NN \l__spath_tmpb_seq \l__spath_tmpa_tl + \fp_compare:nT + { + \l__spath_tmpa_tl > \seq_count:N \l__spath_tmpa_seq - .01 + } + { + \bool_set_false:N \l__spath_closed_bool + } + \seq_get_right:NN \l__spath_tmpb_seq \l__spath_tmpa_tl + \fp_compare:nT + { + \l__spath_tmpa_tl < .01 + } + { + \bool_set_false:N \l__spath_closed_bool + } - } + % Restore the original copy of the path + \tl_set_eq:NN \l__spath_tmpe_tl \l__spath_tmpg_tl + + % Clear the token lists + \tl_clear:N \l__spath_tmpf_tl + \tl_clear:N \l__spath_tmph_tl + \tl_clear:N \l__spath_tmpg_tl + \tl_set:Nn \l__spath_tmpi_tl {-1} + + \seq_map_inline:Nn \l__spath_tmpb_seq + { + \tl_set:Nn \l__spath_tmpb_tl {##1} + \tl_set_eq:NN \l__spath_tmpa_tl \l__spath_tmpb_tl + \int_compare:nT + { + \fp_to_int:n {floor( \l__spath_tmpb_tl ) } + = + \fp_to_int:n {floor( \l__spath_tmpi_tl) } } { + \tl_set:Nx \l__spath_tmpb_tl + { + \fp_eval:n { + floor( \l__spath_tmpb_tl ) + + + ( \l__spath_tmpb_tl - floor( \l__spath_tmpb_tl) ) + / + ( \l__spath_tmpi_tl - floor( \l__spath_tmpi_tl) ) + } + } + } + \tl_set_eq:NN \l__spath_tmpi_tl \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} + \spath_split_at:NNVV + \l__spath_tmpf_tl + \l__spath_tmph_tl + \l__spath_tmpe_tl + \l__spath_tmpb_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_put_left:NV \l__spath_tmpg_tl \l__spath_tmph_tl + \tl_set_eq:NN \l__spath_tmpe_tl \l__spath_tmpf_tl - } + } - #2 \l__spath_tmpc_tl \l__spath_tmpb_tl - \tl_clear:N \l__spath_tmpb_tl + \tl_put_left:NV \l__spath_tmpg_tl \l__spath_tmpe_tl + \tl_if_empty:NT \l__spath_tmpg_tl + { + \tl_set_eq:NN \l__spath_tmpg_tl \l__spath_tmpe_tl } + + \spath_remove_empty_components:N \l__spath_tmpg_tl + + % Do something with closed + \bool_if:NT \l__spath_closed_bool + { + \spath_join_component:Nn \l__spath_tmpg_tl {1} + } + + \tl_gclear:N \g__spath_output_tl + \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpg_tl + \group_end: } -\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 } +\cs_new_protected_nopar:Npn \spath_split_component_at_self_intersections:Nn #1#2 { - \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 - } + \__spath_split_component_at_self_intersections:n {#2} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl } -\NewDocumentCommand \CloneSPath { m m } +\cs_generate_variant:Nn \spath_split_component_at_self_intersections:Nn {NV} +\cs_new_protected_nopar:Npn \spath_split_component_at_self_intersections:N #1 { - \spath_clone:nn {#1} {#2} + \spath_split_component_at_self_intersections:NV #1#1 } -\NewDocumentCommand \SPathInfo { m m } +\cs_generate_variant:Nn \spath_split_component_at_self_intersections:N {c} +\cs_new_protected_nopar:Npn \spath_gsplit_component_at_self_intersections:Nn #1#2 { - \spath_get:nn {#1} {#2} + \__spath_split_component_at_self_intersections:n {#2} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl } -\NewDocumentCommand \SPathPrepare { m } +\cs_generate_variant:Nn \spath_gsplit_component_at_self_intersections:Nn {NV} +\cs_new_protected_nopar:Npn \spath_gsplit_component_at_self_intersections:N #1 { - \spath_generate_all:n {#1} + \spath_gsplit_component_at_self_intersections:NV #1#1 } -\NewDocumentCommand \SPathListPrepare { m } +\cs_generate_variant:Nn \spath_gsplit_component_at_self_intersections:N {c} +\cs_new_protected_nopar:Npn \__spath_split_at_self_intersections:n #1 { - \tl_map_inline:cn {l__spath_list_#1} + \group_begin: + \spath_components_to_seq:Nn \l__spath_tmpa_seq {#1} + \seq_clear:N \l__spath_tmpb_seq + \seq_clear:N \l__spath_tmpc_seq + + % Iterate over the components of the original path. + \bool_do_until:nn { - \spath_generate_all:n {##1} + \seq_if_empty_p:N \l__spath_tmpa_seq } + { + % Get the next component + \seq_pop_left:NN \l__spath_tmpa_seq \l__spath_tmpa_tl + % Copy for later + \tl_set_eq:NN \l__spath_tmpc_tl \l__spath_tmpa_tl + \int_compare:nT + { + \tl_count:N \l__spath_tmpa_tl > 3 + } + { + + % Split against itself + \spath_split_component_at_self_intersections:N \l__spath_tmpa_tl + % Grab the rest of the path + \tl_set:Nx \l__spath_tmpb_tl + { + \seq_use:Nn \l__spath_tmpb_seq {} + \seq_use:Nn \l__spath_tmpa_seq {} + } + % Split against the rest of the path + \spath_split_path_at_intersections:NV \l__spath_tmpa_tl \l__spath_tmpb_tl + } + % Save the split path + \seq_put_right:NV \l__spath_tmpc_seq \l__spath_tmpa_tl + % Add the original copy to the sequence of processed components + \seq_put_right:NV \l__spath_tmpb_seq \l__spath_tmpc_tl + } + + \tl_gclear:N \g__spath_output_tl + \tl_gset:Nx \g__spath_output_tl {\seq_use:Nn \l__spath_tmpc_seq {} } + \group_end: } -\NewDocumentCommand \SPathInfoInto { m m m } +\cs_generate_variant:Nn \__spath_split_at_self_intersections:n {V, v} +\cs_new_protected_nopar:Npn \spath_split_at_self_intersections:Nn #1#2 { - \tl_clear_new:N #3 - \spath_get:nnN {#1} {#2} #3 + \__spath_split_at_self_intersections:n {#2} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl } -\NewDocumentCommand \SPathShow { m } +\cs_generate_variant:Nn \spath_split_at_self_intersections:Nn {NV, cn, cV, cv} +\cs_new_protected_nopar:Npn \spath_split_at_self_intersections:N #1 { - \spath_show:n {#1} + \spath_split_at_self_intersections:NV #1#1 } -\NewDocumentCommand \SPathTranslate { m m m } +\cs_generate_variant:Nn \spath_split_at_self_intersections:N {c} +\cs_new_protected_nopar:Npn \spath_gsplit_at_self_intersections:Nn #1#2 { - \spath_translate:nnn {#1} {#2} {#3} + \__spath_split_at_self_intersections:n {#2} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl } -\NewDocumentCommand \SPathTranslateInto { m m m m } +\cs_generate_variant:Nn \spath_gsplit_at_self_intersections:Nn {NV, cn, cV, cv} +\cs_new_protected_nopar:Npn \spath_gsplit_at_self_intersections:N #1 { - \spath_clone:nn {#1} {#2} - \spath_translate:nnn {#2} {#3} {#4} + \spath_gsplit_at_self_intersections:NV #1#1 } -\NewDocumentCommand \SPathScale { m m m } +\cs_generate_variant:Nn \spath_gsplit_at_self_intersections:N {c} +\cs_new_protected_nopar:Npn \__spath_join_component:nn #1#2 { - \spath_scale:nnn {#1} {#2} {#3} + \group_begin: + \spath_numberofcomponents:Nn \l__spath_tmpa_int {#1} + + \bool_if:nTF + { + \int_compare_p:n { #2 >= 1 } + && + \int_compare_p:n { #2 <= \l__spath_tmpa_int } + } + { + \int_compare:nTF + { + #2 == 1 + } + { + \int_compare:nTF + { + \l__spath_tmpa_int == 1 + } + { + \tl_set:Nn \l__spath_tmpa_tl {#1} + \spath_initialpoint:Nn \l__spath_tmpb_tl {#1} + \tl_put_right:NV \l__spath_tmpa_tl \c_spath_closepath_tl + \tl_put_right:NV \l__spath_tmpa_tl \l__spath_tmpb_tl + \tl_gclear:N \g__spath_output_tl + \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpa_tl + } + { + \spath_components_to_seq:Nn \l__spath_tmpa_seq {#1} + \seq_pop_left:NN \l__spath_tmpa_seq \l__spath_tmpa_tl + + \prg_replicate:nn {3} + { + \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} + } + + \seq_put_right:NV \l__spath_tmpa_seq \l__spath_tmpa_tl + + \tl_gclear:N \g__spath_output_tl + \tl_gset:Nx \g__spath_output_tl {\seq_use:Nn \l__spath_tmpa_seq {}} + } + } + { + \spath_components_to_seq:Nn \l__spath_tmpa_seq {#1} + + \seq_clear:N \l__spath_tmpb_seq + \seq_map_indexed_inline:Nn \l__spath_tmpa_seq + { + \tl_set:Nn \l__spath_tmpa_tl {##2} + \int_compare:nT {##1 = #2} + { + \prg_replicate:nn {3} + { + \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} + } + } + \seq_put_right:NV \l__spath_tmpb_seq \l__spath_tmpa_tl + } + + \tl_gclear:N \g__spath_output_tl + \tl_gset:Nx \g__spath_output_tl {\seq_use:Nn \l__spath_tmpb_seq {}} + } + } + { + \tl_gclear:N \g__spath_output_tl + \tl_gset:Nn \g__spath_output_tl {#1} + } + + \group_end: } -\NewDocumentCommand \SPathScaleInto { m m m m } +\cs_new_protected_nopar:Npn \spath_join_component:Nnn #1#2#3 { - \spath_clone:nn {#1} {#2} - \spath_scale:nnn {#2} {#3} {#4} + \__spath_join_component:nn {#2}{#3} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl } -\NewDocumentCommand \SPathWeld { m m } +\cs_generate_variant:Nn \spath_join_component:Nnn {NVn, NVV} +\cs_new_protected_nopar:Npn \spath_join_component:Nn #1#2 { - \spath_weld:nn {#1} {#2} + \spath_join_component:NVn #1#1{#2} } -\NewDocumentCommand \SPathWeldInto { m m m } +\cs_generate_variant:Nn \spath_join_component:Nn {cn, NV, cV} +\cs_new_protected_nopar:Npn \spath_gjoin_component:Nnn #1#2#3 { - \spath_clone:nn {#1} {#2} - \spath_weld:nn {#2} {#3} + \__spath_join_component:nn {#2}{#3} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl } -\tikzset{ - save~spath/.code={ - \tikz@addmode{ - \spath_get_current_path:n {#1} - } - }, - restore~spath/.code={ - \spath_set_current_path:n {#1} - } +\cs_generate_variant:Nn \spath_gjoin_component:Nnn {NVn, NVV} +\cs_new_protected_nopar:Npn \spath_gjoin_component:Nn #1#2 +{ + \spath_gjoin_component:NVn #1#1{#2} } -\cs_new_nopar:Npn \spath_split_curve:nnNN #1#2#3#4 +\cs_generate_variant:Nn \spath_gjoin_component:Nn {cn, NV, cV} +\cs_new_protected_nopar:Npn \__spath_spot_weld_components:n #1 { \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} {2}} - {\tl_item:nn {#2} {3}} - } - \tl_put_right:NV \l__spath_tmpa_tl \g__spath_curvetoa_tl - \tl_put_right:Nx \l__spath_tmpa_tl + \dim_zero:N \l__spath_move_x_dim + \dim_zero:N \l__spath_move_y_dim + + \spath_components_to_seq:Nn \l__spath_tmpa_seq {#1} + \seq_clear:N \l__spath_tmpb_seq + \dim_set:Nn \l__spath_move_x_dim {\tl_item:nn {#1} {2} + 10 pt} + \dim_set:Nn \l__spath_move_y_dim {\tl_item:nn {#1} {3} + 10 pt} + + \int_set:Nn \l__spath_tmpa_int {\seq_count:N \l__spath_tmpa_seq} + + \seq_map_inline:Nn \l__spath_tmpa_seq { - {\fp_to_dim:n + \tl_set:Nn \l__spath_tmpa_tl {##1} + \bool_if:nT { - (1 - #1) * \tl_item:nn {#2} {2} + (#1) * \tl_item:nn {#2} {5} - }} - {\fp_to_dim:n + \dim_compare_p:n + { + \dim_abs:n + {\l__spath_move_x_dim - \tl_item:Nn \l__spath_tmpa_tl {2} } + < 0.01pt + } + && + \dim_compare_p:n + { + \dim_abs:n + {\l__spath_move_y_dim - \tl_item:Nn \l__spath_tmpa_tl {3} } + < 0.01pt + } + } { - (1 - #1) * \tl_item:nn {#2} {3} + (#1) * \tl_item:nn {#2} {6} - }} + \prg_replicate:nn {3} + { + \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} + } + \int_decr:N \l__spath_tmpa_int + } + \tl_reverse:N \l__spath_tmpa_tl + \dim_set:Nn \l__spath_move_x_dim {\tl_item:Nn \l__spath_tmpa_tl {2}} + \dim_set:Nn \l__spath_move_y_dim {\tl_item:Nn \l__spath_tmpa_tl {1}} + \tl_reverse:N \l__spath_tmpa_tl + \seq_put_right:NV \l__spath_tmpb_seq \l__spath_tmpa_tl } - \tl_put_right:NV \l__spath_tmpa_tl \g__spath_curvetob_tl - \tl_put_right:Nx \l__spath_tmpa_tl + + \tl_set:Nx \l__spath_tmpa_tl {\seq_use:Nn \l__spath_tmpb_seq {} } + \spath_components_to_seq:NV \l__spath_tmpb_seq \l__spath_tmpa_tl + + \spath_initialpoint:Nn \l__spath_tmpa_tl {#1} + \spath_finalpoint:Nn \l__spath_tmpb_tl {#1} + + \bool_if:nT { - {\fp_to_dim:n + \dim_compare_p: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 + \dim_abs:n + { + \tl_item:Nn \l__spath_tmpa_tl {1} - \tl_item:Nn \l__spath_tmpb_tl {1} + } + < + 0.01pt + } + && + \dim_compare_p: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} - }} + \dim_abs:n + { + \tl_item:Nn \l__spath_tmpa_tl {2} - \tl_item:Nn \l__spath_tmpb_tl {2} + } + < + 0.01pt + } } - \tl_put_right:NV \l__spath_tmpa_tl \g__spath_curveto_tl - \tl_put_right:Nx \l__spath_tmpa_tl { - {\fp_to_dim:n + \int_compare:nTF + { + \seq_count:N \l__spath_tmpb_seq > 1 + } + { + \seq_pop_left:NN \l__spath_tmpb_seq \l__spath_tmpb_tl + + \prg_replicate:nn {3} { - (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 + \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl} + } + \seq_put_right:NV \l__spath_tmpb_seq \l__spath_tmpb_tl + } { - (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_set:NV \l__spath_tmpb_tl \c_spath_closepath_tl + \tl_put_right:Nx \l__spath_tmpb_tl + { + { \tl_item:Nn \l__spath_tmpa_tl {1} } + { \tl_item:Nn \l__spath_tmpa_tl {2} } + } + \seq_put_right:NV \l__spath_tmpb_seq \l__spath_tmpb_tl + } } - \tl_gset_eq:NN \l__spath_smuggle_tl \l__spath_tmpa_tl + + \tl_gset:Nx \g__spath_output_tl {\seq_use:Nn \l__spath_tmpb_seq {}} \group_end: - \tl_set_eq:NN #3 \l__spath_smuggle_tl +} +\cs_new_protected_nopar:Npn \spath_spot_weld_components:Nn #1#2 +{ + \__spath_spot_weld_components:n {#2} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_spot_weld_components:Nn {NV, cV, cn} +\cs_new_protected_nopar:Npn \spath_spot_weld_components:N #1 +{ + \spath_spot_weld_components:NV #1#1 +} +\cs_generate_variant:Nn \spath_spot_weld_components:N {c} +\cs_new_protected_nopar:Npn \spath_spot_gweld_components:Nn #1#2 +{ + \__spath_spot_weld_components:n {#2} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_spot_gweld_components:Nn {NV, cV, cn} +\cs_new_protected_nopar:Npn \spath_spot_gweld_components:N #1 +{ + \spath_spot_gweld_components:NV #1#1 +} +\cs_generate_variant:Nn \spath_spot_gweld_components:N {c} +\cs_new_protected_nopar:Npn \__spath_convert_to_svg:n #1 +{ \group_begin: - \tl_set_eq:NN \l__spath_tmpa_tl \g__spath_moveto_tl - \tl_put_right:Nx \l__spath_tmpa_tl + \tl_clear:N \l__spath_tmpa_tl + \tl_put_right:Nn \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} - }} + <?xml~ version="1.0"~ standalone="no"?> + \iow_newline: + <!DOCTYPE~ svg~ PUBLIC~ "-//W3C//DTD SVG 1.1//EN"~ + "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> + \iow_newline: + <svg~ xmlns="http://www.w3.org/2000/svg"~ version="1.1"~viewBox=" } - \tl_put_right:NV \l__spath_tmpa_tl \g__spath_curvetoa_tl + + \spath_minbb:Nn \l__spath_tmpb_tl {#1} + \spath_maxbb:Nn \l__spath_tmpc_tl {#1} \tl_put_right:Nx \l__spath_tmpa_tl { - {\fp_to_dim:n + \dim_to_decimal: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 + \tl_item:Nn \l__spath_tmpb_tl {1} - 10pt + } + \exp_not:n {~} + \dim_to_decimal: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_item:Nn \l__spath_tmpb_tl {2} - 10pt + } + \exp_not:n {~} + \dim_to_decimal:n + { + \tl_item:Nn \l__spath_tmpc_tl {1} + - + \tl_item:Nn \l__spath_tmpb_tl {1} + + 20pt + } + \exp_not:n {~} + \dim_to_decimal:n + { + \tl_item:Nn \l__spath_tmpc_tl {2} + - + \tl_item:Nn \l__spath_tmpb_tl {2} + + 20pt + } } - \tl_put_right:NV \l__spath_tmpa_tl \g__spath_curvetob_tl - \tl_put_right:Nx \l__spath_tmpa_tl + + \tl_put_right:Nn \l__spath_tmpa_tl { - {\fp_to_dim:n + "> + \iow_newline: + <path~ d=" + } + \tl_set:Nn \l__spath_tmpc_tl {use:n} + \tl_map_inline:nn {#1} + { + \tl_set:Nn \l__spath_tmpb_tl {##1} + \tl_case:NnF \l__spath_tmpb_tl { - (1 - #1) * \tl_item:nn {#2} {8} + (#1) * \tl_item:nn {#2} {11} - }} - {\fp_to_dim:n + \c_spath_moveto_tl + { + \tl_put_right:Nn \l__spath_tmpa_tl {M~} + \tl_set:Nn \l__spath_tmpc_tl {use:n} + } + \c_spath_lineto_tl + { + \tl_put_right:Nn \l__spath_tmpa_tl {L~} + \tl_set:Nn \l__spath_tmpc_tl {use:n} + } + \c_spath_closepath_tl + { + \tl_put_right:Nn \l__spath_tmpa_tl {Z~} + \tl_set:Nn \l__spath_tmpc_tl {use_none:n} + } + \c_spath_curvetoa_tl + { + \tl_put_right:Nn \l__spath_tmpa_tl {C~} + \tl_set:Nn \l__spath_tmpc_tl {use:n} + } + \c_spath_curvetob_tl { + \tl_set:Nn \l__spath_tmpc_tl {use:n} + } + \c_spath_curveto_tl { + \tl_set:Nn \l__spath_tmpc_tl {use:n} + } + } { - (1 - #1) * \tl_item:nn {#2} {9} + (#1) * \tl_item:nn {#2} {12} - }} + \tl_put_right:Nx + \l__spath_tmpa_tl + {\use:c { \l__spath_tmpc_tl } {\dim_to_decimal:n {##1}} ~} + } } - \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_put_right:Nn \l__spath_tmpa_tl + { + "~ fill="none"~ stroke="black"~ /> + \iow_newline: + </svg> + \iow_newline: } - \tl_gset_eq:NN \l__spath_smuggle_tl \l__spath_tmpa_tl + \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpa_tl \group_end: - \tl_set_eq:NN #4 \l__spath_smuggle_tl } +\cs_new_protected_nopar:Npn \spath_convert_to_svg:Nn #1#2 +{ + \__spath_convert_to_svg:n {#2} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_new_protected_nopar:Npn \spath_gconvert_to_svg:Nn #1#2 +{ + \__spath_convert_to_svg:n {#2} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\iow_new:N \g__spath_stream +\cs_new_protected_nopar:Npn \spath_export_to_svg:nn #1#2 +{ + \group_begin: + \spath_convert_to_svg:Nn \l__spath_tmpa_tl {#2} + \iow_open:Nn \g__spath_stream {#1 .svg} + \iow_now:Nx \g__spath_stream + { + \tl_use:N \l__spath_tmpa_tl + } + \iow_close:N \g__spath_stream + \group_end: +} +\cs_generate_variant:Nn \spath_export_to_svg:nn {nv, nV} +\cs_new_protected_nopar:Npn \spath_show:n #1 +{ + \int_step_inline:nnnn {1} {3} {\tl_count:n {#1}} + { + \iow_term:x { + \tl_item:nn {#1} {##1} + {\tl_item:nn {#1} {##1+1}} + {\tl_item:nn {#1} {##1+2}} + } + } +} +\cs_generate_variant:Nn \spath_show:n {V, v} + +\cs_new_protected_nopar:Npn \spath_get_current_path:N #1 +{ + \pgfsyssoftpath@getcurrentpath #1 +} +\cs_new_protected_nopar:Npn \spath_gget_current_path:N #1 +{ + \pgfsyssoftpath@getcurrentpath #1 + \tl_gset_eq:NN #1 #1 +} +\cs_new_protected_nopar:Npn \spath_protocol_path:n #1 +{ + \spath_minbb:Nn \l__spath_tmpa_tl {#1} + \exp_last_unbraced:NV \pgf@protocolsizes\l__spath_tmpa_tl + + \spath_maxbb:Nn \l__spath_tmpa_tl {#1} + \exp_last_unbraced:NV \pgf@protocolsizes\l__spath_tmpa_tl +} +\cs_generate_variant:Nn \spath_protocol_path:n {V} +\cs_new_protected_nopar:Npn \spath_set_current_path:n #1 +{ + \spath_protocol_path:n {#1} + \tl_set:Nn \l__spath_tmpa_tl {#1} + \pgfsyssoftpath@setcurrentpath\l__spath_tmpa_tl +} +\cs_new_protected_nopar:Npn \spath_set_current_path:N #1 +{ + \spath_protocol_path:V #1 + \pgfsyssoftpath@setcurrentpath #1 +} +\cs_generate_variant:Nn \spath_set_current_path:N {c} +\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_tikz_path:nn #1#2 +{ + \path[#1] \pgfextra{ + \spath_set_current_path:n {#2} + \tl_put_right:Nn \tikz@preactions {\def\tikz@actions@path{#2}} + }; +} +\cs_generate_variant:Nn \spath_tikz_path:nn {Vn, VV, nv, Vv, nV} +\cs_new_protected_nopar:Npn \spath_set_tikz_data:n #1 +{ + \spath_finalpoint:Nn \l__spath_tmpa_tl {#1} + \tl_set:Nx \l__spath_tmpa_tl + { + \exp_not:c {pgf@x}=\tl_item:Nn \l__spath_tmpa_tl {1} + \exp_not:c {pgf@y}=\tl_item:Nn \l__spath_tmpa_tl {2} + } + \use:c {pgf@process}{% + \tl_use:N \l__spath_tmpa_tl + \pgftransforminvert + \use:c {pgf@pos@transform@glob} + } + \tl_set:Nx \l__spath_tmpa_tl + { + \exp_not:c {tikz@lastx}=\exp_not:c {pgf@x} + \exp_not:c {tikz@lasty}=\exp_not:c {pgf@y} + \exp_not:c {tikz@lastxsaved}=\exp_not:c {pgf@x} + \exp_not:c {tikz@lastysaved}=\exp_not:c {pgf@y} + } + \tl_use:N \l__spath_tmpa_tl + \spath_finalmovepoint:Nn \l__spath_tmpa_tl {#1} + \ifpgfsyssoftpathmovetorelevant% + \tl_gset_eq:cN {pgfsyssoftpath@lastmoveto} \l__spath_tmpa_tl + \fi + \tl_set:Nx \l__spath_tmpa_tl + { + \exp_not:c {pgf@x}=\tl_item:Nn \l__spath_tmpa_tl {1} + \exp_not:c {pgf@y}=\tl_item:Nn \l__spath_tmpa_tl {2} + } + \use:c {pgf@process}{% + \tl_use:N \l__spath_tmpa_tl + \pgftransforminvert + \use:c {pgf@pos@transform@glob} + } + \tl_set:Nx \l__spath_tmpa_tl + { + \exp_not:c {tikz@lastmovetox}=\exp_not:c {pgf@x} + \exp_not:c {tikz@lastmovetoy}=\exp_not:c {pgf@y} + } + \tl_use:N \l__spath_tmpa_tl + \tl_clear_new:c {tikz@timer} + \tl_set:cn {tikz@timer} + { + \spath_reallength:Nn \l__spath_tmpa_int {#1} + \tl_set_eq:Nc \l__spath_tmpb_tl {tikz@time} + \tl_set:Nx \l__spath_tmpb_tl + {\fp_to_decimal:n {(\l__spath_tmpb_tl) * (\l__spath_tmpa_int)}} + \spath_transformation_at:NnV \l__spath_tmpc_tl {#1} \l__spath_tmpb_tl -\cs_generate_variant:Nn \spath_split_curve:nnNN {nVNN, VVNN} + \tl_set:Nx \l__spath_tmpa_tl + { + \exp_not:N \pgfpoint + { \tl_item:Nn \l__spath_tmpc_tl {5} } + { \tl_item:Nn \l__spath_tmpc_tl {6} } + } + \exp_args:NV \pgftransformshift \l__spath_tmpa_tl + + \ifpgfresetnontranslationattime + \pgftransformresetnontranslations + \fi + + \ifpgfslopedattime + + \tl_set:Nx \l__spath_tmpa_tl + { + { \tl_item:Nn \l__spath_tmpc_tl {1} } + { \tl_item:Nn \l__spath_tmpc_tl {2} } + { \tl_item:Nn \l__spath_tmpc_tl {3} } + { \tl_item:Nn \l__spath_tmpc_tl {4} } + } + \ifpgfallowupsidedownattime + \else + \fp_compare:nT { \tl_item:Nn \l__spath_tmpc_tl {4} < 0} + { + \tl_set:Nx \l__spath_tmpa_tl + { + { \fp_eval:n { - (\tl_item:Nn \l__spath_tmpc_tl {1})} } + { \fp_eval:n { - (\tl_item:Nn \l__spath_tmpc_tl {2})} } + { \fp_eval:n { - (\tl_item:Nn \l__spath_tmpc_tl {3})} } + { \fp_eval:n { - (\tl_item:Nn \l__spath_tmpc_tl {4})} } + } + } + \fi + \tl_put_right:Nn \l__spath_tmpa_tl {{\pgfpointorigin}} + \exp_last_unbraced:NV \pgftransformcm \l__spath_tmpa_tl + \fi + } +} +\cs_generate_variant:Nn \spath_set_tikz_data:n {V, v} %% -%% Copyright (C) 2011-2019 by Andrew Stacey <stacey@math.ntnu.no> +%% Copyright (C) 2011-2021 by Andrew Stacey <loopspace@mathforge.org> %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License (LPPL), either @@ -1497,16 +3957,19 @@ manipulating PGF soft paths} %% This work is "maintained" (as per LPPL maintenance status) by %% Andrew Stacey. %% -%% This work consists of the files spath3.dtx +%% This work consists of the files spath3_code.dtx %% calligraphy_doc.tex %% knots_doc.tex +%% spath3.tex %% and the derived files spath3.ins, %% spath3_code.pdf, %% spath3.sty, %% tikzlibrarycalligraphy.code.tex %% tikzlibraryknots.code.tex +%% tikzlibraryspath3.code.tex %% calligraphy.pdf %% knots.pdf +%% spath3.pdf %% README %% %% diff --git a/Master/texmf-dist/tex/latex/spath3/tikzlibrarycalligraphy.code.tex b/Master/texmf-dist/tex/latex/spath3/tikzlibrarycalligraphy.code.tex index 9b0e082b144..35dd9f51c35 100644 --- a/Master/texmf-dist/tex/latex/spath3/tikzlibrarycalligraphy.code.tex +++ b/Master/texmf-dist/tex/latex/spath3/tikzlibrarycalligraphy.code.tex @@ -4,10 +4,10 @@ %% %% The original source files were: %% -%% spath3.dtx (with options: `calligraphy') +%% spath3_code.dtx (with options: `calligraphy') %% ---------------------------------------------------------------- %% spath3 --- Functions for manipulating PGF soft paths -%% E-mail: stacey@math.ntnu.no +%% E-mail: loopspace@mathforge.org %% Released under the LaTeX Project Public License v1.3c or later %% See http://www.latex-project.org/lppl.txt %% ---------------------------------------------------------------- @@ -17,10 +17,24 @@ \tl_new:N \l__cal_tmpa_tl \tl_new:N \l__cal_tmpb_tl +\tl_new:N \l__cal_tmp_path_tl +\tl_new:N \l__cal_tmp_rpath_tl +\tl_new:N \l__cal_tmp_rpathb_tl +\tl_new:N \l__cal_tmp_patha_tl + +\seq_new:N \l__cal_tmpa_seq + \int_new:N \l__cal_tmpa_int \int_new:N \l__cal_tmpb_int -\int_new:N \l__cal_path_component_int -\int_new:N \l__cal_label_int +\int_new:N \g__cal_path_component_int +\int_new:N \g__cal_label_int + +\fp_new:N \l__cal_tmpa_fp +\fp_new:N \l__cal_tmpb_fp +\fp_new:N \l__cal_tmpc_fp +\fp_new:N \l__cal_tmpd_fp +\fp_new:N \l__cal_tmpe_fp + \dim_new:N \l__cal_tmpa_dim \dim_new:N \l__cal_tmpb_dim \dim_new:N \l__cal_tmpc_dim @@ -29,10 +43,12 @@ \dim_new:N \l__cal_tmpf_dim \dim_new:N \l__cal_tmpg_dim \dim_new:N \l__cal_tmph_dim + \bool_new:N \l__cal_annotate_bool \bool_new:N \l__cal_taper_start_bool \bool_new:N \l__cal_taper_end_bool \bool_new:N \l__cal_taperable_bool + \dim_new:N \l__cal_taper_width_dim \dim_new:N \l__cal_line_width_dim @@ -40,27 +56,38 @@ \bool_set_true:N \l__cal_taper_end_bool \cs_generate_variant:Nn \tl_put_right:Nn {Nv} + +\msg_new:nnn { calligraphy } { undefined pen } { The~ pen~ "#1"~ is~ not~ defined. } \tikzset{ define~pen/.code={ \tikzset{pen~name=#1} \pgf@relevantforpicturesizefalse \tikz@addmode{ \pgfsyssoftpath@getcurrentpath\l__cal_tmpa_tl - \MakeSPathList{calligraphy pen \pgfkeysvalueof{/tikz/pen~name}}{\l__cal_tmpa_tl} - \SPathListPrepare{calligraphy pen \pgfkeysvalueof{/tikz/pen~name}} + \spath_components_to_seq:NV \l__cal_tmpa_seq \l__cal_tmpa_tl + \seq_gclear_new:c {g__cal_pen_\pgfkeysvalueof{/tikz/pen~name}_seq} + \seq_gset_eq:cN + {g__cal_pen_\pgfkeysvalueof{/tikz/pen~name}_seq} \l__cal_tmpa_seq \pgfusepath{discard}% } }, define~pen/.default={default}, use~pen/.code={ \tikzset{pen~name=#1} - \int_gzero:N \l__cal_path_component_int + \int_gzero:N \g__cal_path_component_int \cs_set_eq:NN \pgfpathmoveto \cal_moveto:n \tikz@addmode{ \pgfsyssoftpath@getcurrentpath\l__cal_tmpa_tl - \MakeSPathList{calligraphy path}{\l__cal_tmpa_tl} - \SPathListPrepare{calligraphy path} - \CalligraphyPathCreate{calligraphy path}{\pgfkeysvalueof{/tikz/pen~name}} + \spath_components_to_seq:NV \l__cal_tmpa_seq \l__cal_tmpa_tl + \tl_if_exist:cTF {g__cal_pen_\pgfkeysvalueof{/tikz/pen~name}_seq} + { + \cal_path_create:Nc \l__cal_tmpa_seq + {g__cal_pen_\pgfkeysvalueof{/tikz/pen~name}_seq} + } + { + \msg_warning:nnx { calligraphy } { undefined pen } + { \pgfkeysvalueof{/tikz/pen~name} } + } } }, use~pen/.default={default}, @@ -132,8 +159,10 @@ \tl_set:cn {l__cal_stroke_style_#1} {#2} }, this~stroke~style/.code={ - \tl_clear_new:c {l__cal_stroke_inline_style_ \int_use:N \l__cal_path_component_int} - \tl_set:cn {l__cal_stroke_inline_style_ \int_use:N \l__cal_path_component_int} {#1} + \tl_clear_new:c + {l__cal_stroke_inline_style_ \int_use:N \g__cal_path_component_int} + \tl_set:cn + {l__cal_stroke_inline_style_ \int_use:N \g__cal_path_component_int} {#1} }, annotate/.style={ annotate~if, @@ -151,12 +180,13 @@ } }, annotate~reset/.code={ - \int_gzero:N \l__cal_label_int + \int_gzero:N \g__cal_label_int }, annotation~style/.initial={draw,->}, annotation~shift/.initial={(0,1ex)}, every~annotation~node/.initial={anchor=south~west}, annotation~node~style/.code~2~args={ + \tl_clear_new:c {l__cal_annotation_style_ #1 _tl} \tl_set:cn {l__cal_annotation_style_ #1 _tl}{#2} }, tl~use:N/.code={ @@ -179,7 +209,7 @@ { \pgfkeyssetvalue{\pgfkeyscurrentpath}{#1} } - } + }, } \NewDocumentCommand \pen { O{} } { @@ -195,100 +225,110 @@ { \path[use~ pen,every~ calligraphy/.try,#1] } -\NewDocumentCommand \CalligraphyPathCreate { m m } +\cs_new_protected_nopar:Npn \cal_path_create:NN #1#2 { \int_zero:N \l__cal_tmpa_int - \tl_map_inline:cn {l__spath_list_#1} + \seq_map_inline:Nn #1 { - \int_incr:N \l__cal_tmpa_int - \int_zero:N \l__cal_tmpb_int - \tl_map_inline:cn {l__spath_list_calligraphy pen #2} + \int_compare:nT {\tl_count:n {##1} > 3} { - \int_incr:N \l__cal_tmpb_int - \group_begin: - \pgfsys@beginscope - - \cal_apply_style:c {l__cal_stroke_style_ \int_use:N \l__cal_tmpa_int} - \cal_apply_style:c {l__cal_stroke_inline_style_ \int_use:N \l__cal_tmpa_int} - \cal_apply_style:c {l__cal_nib_style_ \int_use:N \l__cal_tmpb_int} - - \spath_clone:nn {##1} {calligraphy temp path} - - \__spath_get:nnN {####1} {initial point} \l__cal_tmpa_tl - \spath_translate:nV {calligraphy temp path} \l__cal_tmpa_tl - - \__spath_get:nnN {####1} {length} \l__cal_tmpa_tl - - \int_compare:nTF {\l__cal_tmpa_tl = 1} - { - \cal_at_least_three:n {calligraphy temp path} - \spath_protocol_path:n {calligraphy temp path} + \int_incr:N \l__cal_tmpa_int + \int_zero:N \l__cal_tmpb_int - \__spath_get:nnN {calligraphy temp path} {path} \l__cal_tmpa_tl + \tl_set:Nn \l__cal_tmp_path_tl {##1} + \spath_open:N \l__cal_tmp_path_tl + \spath_reverse:NV \l__cal_tmp_rpath_tl \l__cal_tmp_path_tl - \tikz@options - \dim_set:Nn \l__cal_line_width_dim {\pgflinewidth} - \cal_maybe_taper:N \l__cal_tmpa_tl - } + \seq_map_inline:Nn #2 { - - \spath_weld:nn {calligraphy temp path} {####1} - \spath_reverse:n {##1} - \spath_reverse:n {####1} - \spath_weld:nn {calligraphy temp path} {##1} - \spath_weld:nn {calligraphy temp path} {####1} - \spath_reverse:n {##1} - \spath_reverse:n {####1} - - \tl_clear:N \l__cal_tmpa_tl - \tl_set:Nn \l__cal_tmpa_tl {fill=\pgfkeysvalueof{/tikz/pen~colour},draw=none} - \tl_if_exist:cT {l__cal_stroke_style_ \int_use:N \l__cal_tmpa_int} + \int_incr:N \l__cal_tmpb_int + \group_begin: + \pgfsys@beginscope + \cal_apply_style:c {l__cal_stroke_style_ \int_use:N \l__cal_tmpa_int} + \cal_apply_style:c {l__cal_stroke_inline_style_ \int_use:N \l__cal_tmpa_int} + \cal_apply_style:c {l__cal_nib_style_ \int_use:N \l__cal_tmpb_int} + + \spath_initialpoint:Nn \l__cal_tmpa_tl {####1} + \tl_set_eq:NN \l__cal_tmp_patha_tl \l__cal_tmp_path_tl + \spath_translate:NV \l__cal_tmp_patha_tl \l__cal_tmpa_tl + + \int_compare:nTF {\tl_count:n {####1} == 3} { - \tl_put_right:Nv \l__cal_tmpa_tl {l__cal_stroke_style_ \int_use:N \l__cal_tmpa_int} - } - \tl_if_exist:cT {l__cal_stroke_inline_style_ \int_use:N \l__cal_tmpa_int} - { - \tl_put_right:Nn \l__cal_tmpa_tl {,} - \tl_put_right:Nv \l__cal_tmpa_tl {l__cal_stroke_inline_style_ \int_use:N \l__cal_tmpa_int} + \cal_at_least_three:N \l__cal_tmp_patha_tl + \spath_protocol_path:V \l__cal_tmp_patha_tl + + \tikz@options + \dim_set:Nn \l__cal_line_width_dim {\pgflinewidth} + \cal_maybe_taper:N \l__cal_tmp_patha_tl } - \tl_if_exist:cT {l__cal_nib_style_ \int_use:N \l__cal_tmpb_int} { - \tl_put_right:Nn \l__cal_tmpa_tl {,} - \tl_put_right:Nv \l__cal_tmpa_tl {l__cal_nib_style_ \int_use:N \l__cal_tmpb_int} + \spath_weld:Nn \l__cal_tmp_patha_tl {####1} + \spath_weld:NV \l__cal_tmp_patha_tl \l__cal_tmp_rpath_tl + \spath_reverse:Nn \l__cal_tmp_rpathb_tl {####1} + \spath_weld:NV \l__cal_tmp_patha_tl \l__cal_tmp_rpathb_tl + + \tl_clear:N \l__cal_tmpa_tl + \tl_set:Nn \l__cal_tmpa_tl + { + fill=\pgfkeysvalueof{/tikz/pen~colour}, + draw=none + } + \tl_if_exist:cT {l__cal_stroke_style_ \int_use:N \l__cal_tmpa_int} + { + \tl_put_right:Nv \l__cal_tmpa_tl + {l__cal_stroke_style_ \int_use:N \l__cal_tmpa_int} + } + \tl_if_exist:cT {l__cal_stroke_inline_style_ \int_use:N \l__cal_tmpa_int} + { + \tl_put_right:Nn \l__cal_tmpa_tl {,} + \tl_put_right:Nv \l__cal_tmpa_tl + {l__cal_stroke_inline_style_ \int_use:N \l__cal_tmpa_int} + } + \tl_if_exist:cT {l__cal_nib_style_ \int_use:N \l__cal_tmpb_int} + { + \tl_put_right:Nn \l__cal_tmpa_tl {,} + \tl_put_right:Nv \l__cal_tmpa_tl + {l__cal_nib_style_ \int_use:N \l__cal_tmpb_int} + } + \spath_tikz_path:VV \l__cal_tmpa_tl \l__cal_tmp_patha_tl } - \spath_tikz_path:Vn \l__cal_tmpa_tl {calligraphy temp path} + \pgfsys@endscope + \group_end: + } + \bool_if:NT \l__cal_annotate_bool + { + \seq_get_right:NN #2 \l__cal_tmpa_tl + \spath_finalpoint:NV \l__cal_tmpa_tl \l__cal_tmpa_tl + \spath_translate:NV \l__cal_tmp_path_tl \l__cal_tmpa_tl + \tikz@scan@one@point + \pgfutil@firstofone + \pgfkeysvalueof{/tikz/annotation~shift} + + \spath_translate:Nnn \l__cal_tmp_path_tl {\pgf@x} {\pgf@y} + + \pgfkeysgetvalue{/tikz/annotation~style}{\l__cal_tmpa_tl} + \spath_tikz_path:VV \l__cal_tmpa_tl \l__cal_tmp_path_tl + + \spath_finalpoint:NV \l__cal_tmpa_tl \l__cal_tmp_path_tl + + \exp_last_unbraced:NV \pgfqpoint \l__cal_tmpa_tl + \begin{scope}[reset~ cm] + \node[ + every~annotation~node/.try, + tl~use:c = {l__cal_annotation_style_ \int_use:N \l__cal_tmpa_int _tl} + ] at (\pgf@x,\pgf@y) {\int_use:N \l__cal_tmpa_int}; + \end{scope} } - \pgfsys@endscope - \group_end: - } - \bool_if:NT \l__cal_annotate_bool - { - \spath_clone:nn {##1} {calligraphy temp path} - \tl_set_eq:Nc \l_tmpa_tl {l__spath_list_calligraphy pen #2} - \tl_reverse:N \l_tmpa_tl - \tl_set:Nx \l_tmpa_tl {\tl_head:N \l_tmpa_tl} - \spath_generate_finalpoint:V \l_tmpa_tl - \spath_get:VnN \l_tmpa_tl {final point} \l_tmpa_tl - \spath_translate:nV {calligraphy temp path} \l_tmpa_tl - \tikz@scan@one@point\pgfutil@firstofone\pgfkeysvalueof{/tikz/annotation~shift} - \spath_translate:nnn {calligraphy temp path} {\pgf@x} {\pgf@y} - - \pgfkeysgetvalue{/tikz/annotation~style}{\l_tmpa_tl} - \spath_tikz_path:Vn \l_tmpa_tl {calligraphy temp path} - \spath_get:nnN {calligraphy temp path} {final point} \l_tmpa_tl - \exp_last_unbraced:NV \pgfqpoint \l_tmpa_tl - \begin{scope}[reset~ cm] - \node[every~annotation~node/.try,tl~use:c = {l__cal_annotation_style_ \int_use:N \l__cal_tmpa_int _tl}] at (\pgf@x,\pgf@y) {\int_use:N \l__cal_tmpa_int}; - \end{scope} } } } +\cs_generate_variant:Nn \cal_path_create:NN {Nc} \cs_new_eq:NN \cal_orig_moveto:n \pgfpathmoveto \cs_new_nopar:Npn \cal_moveto:n #1 { - \int_gincr:N \l__cal_path_component_int + \int_gincr:N \g__cal_path_component_int \cal_orig_moveto:n {#1} } \cs_new_nopar:Npn \cal_apply_style:N #1 @@ -298,154 +338,32 @@ } } \cs_generate_variant:Nn \cal_apply_style:N {c} -\cs_new_nopar:Npn \cal_at_least_three:n #1 +\cs_new_protected_nopar:Npn \cal_at_least_three:Nn #1#2 { - \spath_get:nnN {#1} {real length} \l__cal_tmpa_tl + \spath_reallength:Nn \l__cal_tmpa_int {#2} \tl_clear:N \l__cal_tmpb_tl - \int_compare:nTF {\l__cal_tmpa_tl = 1} + \tl_set:Nn \l__cal_tmpb_tl {#2} + \int_compare:nTF {\l__cal_tmpa_int = 1} { - \spath_get:nnN {#1} {path} \l__cal_tmpa_tl - \spath_map_segment_inline:Nn \l__cal_tmpa_tl - { - \tl_case:NnF ##1 { - \g__spath_lineto_tl { - \cal_split_line_in_three:NN \l__cal_tmpb_tl ##2 - } - \g__spath_curvetoa_tl { - \cal_split_curve_in_three:NN \l__cal_tmpb_tl ##2 - } - } - { - \tl_put_right:NV \l__cal_tmpb_tl ##2 - } - } - \spath_put:nnV {#1} {path} \l__cal_tmpb_tl + \spath_split_at:Nn \l__cal_tmpb_tl {2/3} + \spath_split_at:Nn \l__cal_tmpb_tl {1/2} } { - \int_compare:nT {\l__cal_tmpa_tl = 2} + \int_compare:nT {\l__cal_tmpa_int = 2} { - \spath_get:nnN {#1} {path} \l__cal_tmpa_tl - \spath_map_segment_inline:Nn \l__cal_tmpa_tl - { - \tl_case:NnF ##1 { - \g__spath_lineto_tl { - \cal_split_line_in_two:NN \l__cal_tmpb_tl ##2 - } - \g__spath_curvetoa_tl { - \cal_split_curve_in_two:NN \l__cal_tmpb_tl ##2 - } - } - { - \tl_put_right:NV \l__cal_tmpb_tl ##2 - } - } - \spath_put:nnV {#1} {path} \l__cal_tmpb_tl + \spath_split_at:Nn \l__cal_tmpb_tl {1.5} + \spath_split_at:Nn \l__cal_tmpb_tl {.5} } } + \tl_set_eq:NN #1 \l__cal_tmpb_tl } -\cs_new_nopar:Npn \cal_split_line_in_two:NN #1#2 -{ - \tl_set_eq:NN \l__cal_tmpc_tl #2 - - \tl_set:Nx \l__cal_tmpc_tl {\tl_tail:N \l__cal_tmpc_tl} - - \dim_set:Nn \l__cal_tmpa_dim {\tl_head:N \l__cal_tmpc_tl} - \tl_set:Nx \l__cal_tmpc_tl {\tl_tail:N \l__cal_tmpc_tl} - - \dim_set:Nn \l__cal_tmpb_dim {\tl_head:N \l__cal_tmpc_tl} - \tl_set:Nx \l__cal_tmpc_tl {\tl_tail:N \l__cal_tmpc_tl} - - \tl_set:Nx \l__cal_tmpc_tl {\tl_tail:N \l__cal_tmpc_tl} - - \dim_set:Nn \l__cal_tmpc_dim {\tl_head:N \l__cal_tmpc_tl} - \tl_set:Nx \l__cal_tmpc_tl {\tl_tail:N \l__cal_tmpc_tl} - \dim_set:Nn \l__cal_tmpd_dim {\tl_head:N \l__cal_tmpc_tl} - \tl_set:Nx \l__cal_tmpc_tl {\tl_tail:N \l__cal_tmpc_tl} - - \tl_put_right:NV #1 \g__spath_lineto_tl - - \tl_put_right:Nx #1 { - {\dim_eval:n {(\l__cal_tmpa_dim + \l__cal_tmpc_dim)/2}} - {\dim_eval:n {(\l__cal_tmpb_dim + \l__cal_tmpd_dim)/2}} - } - - \tl_put_right:NV #1 \g__spath_lineto_tl - \tl_put_right:Nx #1 { - {\dim_use:N \l__cal_tmpc_dim} - {\dim_use:N \l__cal_tmpd_dim} - } -} -\cs_new_nopar:Npn \cal_split_line_in_three:NN #1#2 +\cs_generate_variant:Nn \cal_at_least_three:Nn {NV} +\cs_new_protected_nopar:Npn \cal_at_least_three:N #1 { - \tl_set_eq:NN \l__cal_tmpc_tl #2 - - \tl_set:Nx \l__cal_tmpc_tl {\tl_tail:N \l__cal_tmpc_tl} - - \dim_set:Nn \l__cal_tmpa_dim {\tl_head:N \l__cal_tmpc_tl} - \tl_set:Nx \l__cal_tmpc_tl {\tl_tail:N \l__cal_tmpc_tl} - - \dim_set:Nn \l__cal_tmpb_dim {\tl_head:N \l__cal_tmpc_tl} - \tl_set:Nx \l__cal_tmpc_tl {\tl_tail:N \l__cal_tmpc_tl} - - \tl_set:Nx \l__cal_tmpc_tl {\tl_tail:N \l__cal_tmpc_tl} - - \dim_set:Nn \l__cal_tmpc_dim {\tl_head:N \l__cal_tmpc_tl} - \tl_set:Nx \l__cal_tmpc_tl {\tl_tail:N \l__cal_tmpc_tl} - \dim_set:Nn \l__cal_tmpd_dim {\tl_head:N \l__cal_tmpc_tl} - \tl_set:Nx \l__cal_tmpc_tl {\tl_tail:N \l__cal_tmpc_tl} - - \tl_put_right:NV #1 \g__spath_lineto_tl - - \tl_put_right:Nx #1 { - {\dim_eval:n {(2\l__cal_tmpa_dim + \l__cal_tmpc_dim)/3}} - {\dim_eval:n {(2\l__cal_tmpb_dim + \l__cal_tmpd_dim)/3}} - } - - \tl_put_right:NV #1 \g__spath_lineto_tl - - \tl_put_right:Nx #1 { - {\dim_eval:n {(\l__cal_tmpa_dim + 2\l__cal_tmpc_dim)/3}} - {\dim_eval:n {(\l__cal_tmpb_dim + 2\l__cal_tmpd_dim)/3}} - } - - \tl_put_right:NV #1 \g__spath_lineto_tl - \tl_put_right:Nx #1 { - {\dim_use:N \l__cal_tmpc_dim} - {\dim_use:N \l__cal_tmpd_dim} - } + \cal_at_least_three:NV #1#1 } -\cs_new_nopar:Npn \cal_split_curve_in_two:NN #1#2 -{ - \spath_split_curve:nVNN {.5} #2 \l_tmpa_tl \l_tmpb_tl - \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} - \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} - \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} - \tl_set:Nx \l_tmpb_tl {\tl_tail:N \l_tmpb_tl} - \tl_set:Nx \l_tmpb_tl {\tl_tail:N \l_tmpb_tl} - \tl_set:Nx \l_tmpb_tl {\tl_tail:N \l_tmpb_tl} - \tl_put_right:NV #1 \l_tmpa_tl - \tl_put_right:NV #1 \l_tmpb_tl -} -\cs_new_nopar:Npn \cal_split_curve_in_three:NN #1#2 -{ - \spath_split_curve:nVNN {1/3} #2 \l_tmpa_tl \l_tmpb_tl - - \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} - \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} - \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} - \tl_put_right:NV #1 \l_tmpa_tl - - \spath_split_curve:nVNN {.5} \l_tmpb_tl \l_tmpa_tl \l_tmpb_tl - \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} - \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} - \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} - \tl_set:Nx \l_tmpb_tl {\tl_tail:N \l_tmpb_tl} - \tl_set:Nx \l_tmpb_tl {\tl_tail:N \l_tmpb_tl} - \tl_set:Nx \l_tmpb_tl {\tl_tail:N \l_tmpb_tl} - \tl_put_right:NV #1 \l_tmpa_tl - \tl_put_right:NV #1 \l_tmpb_tl -} -\cs_new_nopar:Npn \cal_maybe_taper:N #1 +\cs_generate_variant:Nn \cal_at_least_three:N {c} +\cs_new_protected_nopar:Npn \cal_maybe_taper:N #1 { \tl_set_eq:NN \l__cal_tmpa_tl #1 @@ -458,7 +376,7 @@ \tl_case:NnF \l__cal_tmpb_tl { - \g__spath_lineto_tl + \c_spath_lineto_tl { \bool_set_true:N \l__cal_taperable_bool @@ -472,9 +390,9 @@ { \tl_set:Nx \l__cal_tmpa_tl {\tl_tail:N \l__cal_tmpa_tl} } - \tl_put_left:NV \l__cal_tmpa_tl \g__spath_moveto_tl + \tl_put_left:NV \l__cal_tmpa_tl \c_spath_moveto_tl } - \g__spath_curvetoa_tl + \c_spath_curvetoa_tl { \bool_set_true:N \l__cal_taperable_bool \dim_set:Nn \l__cal_tmpc_dim {\tl_item:Nn \l__cal_tmpa_tl {5}} @@ -487,7 +405,7 @@ { \tl_set:Nx \l__cal_tmpa_tl {\tl_tail:N \l__cal_tmpa_tl} } - \tl_put_left:NV \l__cal_tmpa_tl \g__spath_moveto_tl + \tl_put_left:NV \l__cal_tmpa_tl \c_spath_moveto_tl } } { @@ -510,7 +428,7 @@ \tl_case:NnF \l__cal_tmpb_tl { - \g__spath_lineto_tl + \c_spath_lineto_tl { \bool_set_true:N \l__cal_taperable_bool @@ -527,7 +445,7 @@ } \tl_reverse:N \l__cal_tmpa_tl } - \g__spath_curveto_tl + \c_spath_curveto_tl { \bool_set_true:N \l__cal_taperable_bool \dim_set:Nn \l__cal_tmpc_dim {\tl_item:Nn \l__cal_tmpa_tl {-5}} @@ -560,10 +478,10 @@ \pgfusepath{stroke} } -\cs_new_nopar:Npn \__cal_taper_aux: +\cs_new_protected_nopar:Npn \__cal_taper_aux: { \tl_clear:N \l__cal_tmpb_tl - \tl_put_right:NV \l__cal_tmpb_tl \g__spath_moveto_tl + \tl_put_right:NV \l__cal_tmpb_tl \c_spath_moveto_tl \fp_set:Nn \l__cal_tmpa_fp { @@ -578,8 +496,18 @@ (\l__cal_tmpa_fp^2 + \l__cal_tmpb_fp^2)^.5 } - \fp_set:Nn \l__cal_tmpa_fp {.5*\l__cal_taper_width_dim * \l__cal_tmpa_fp / \l__cal_tmpe_fp} - \fp_set:Nn \l__cal_tmpb_fp {.5*\l__cal_taper_width_dim * \l__cal_tmpb_fp / \l__cal_tmpe_fp} + \fp_set:Nn \l__cal_tmpa_fp + { + .5*\l__cal_taper_width_dim + * + \l__cal_tmpa_fp / \l__cal_tmpe_fp + } + \fp_set:Nn \l__cal_tmpb_fp + { + .5*\l__cal_taper_width_dim + * + \l__cal_tmpb_fp / \l__cal_tmpe_fp + } \fp_set:Nn \l__cal_tmpc_fp { @@ -594,16 +522,26 @@ (\l__cal_tmpc_fp^2 + \l__cal_tmpd_fp^2)^.5 } - \fp_set:Nn \l__cal_tmpc_fp {.5*\l__cal_line_width_dim * \l__cal_tmpc_fp / \l__cal_tmpe_fp} - \fp_set:Nn \l__cal_tmpd_fp {.5*\l__cal_line_width_dim * \l__cal_tmpd_fp / \l__cal_tmpe_fp} + \fp_set:Nn \l__cal_tmpc_fp + { + .5*\l__cal_line_width_dim + * + \l__cal_tmpc_fp / \l__cal_tmpe_fp + } + \fp_set:Nn \l__cal_tmpd_fp + { + .5*\l__cal_line_width_dim + * + \l__cal_tmpd_fp / \l__cal_tmpe_fp + } \tl_put_right:Nx \l__cal_tmpb_tl { {\dim_eval:n { \fp_to_dim:N \l__cal_tmpa_fp + \l__cal_tmpa_dim}} - {\dim_eval:n { \fp_to_dim:N \l__cal_tmpb_fp + \l__cal_tmpb_dim}} + {\dim_eval:n { \fp_to_dim:N \l__cal_tmpb_fp + \l__cal_tmpb_dim}} } - \tl_put_right:NV \l__cal_tmpb_tl \g__spath_curvetoa_tl + \tl_put_right:NV \l__cal_tmpb_tl \c_spath_curvetoa_tl \tl_put_right:Nx \l__cal_tmpb_tl { @@ -611,7 +549,7 @@ {\dim_eval:n { \fp_to_dim:N \l__cal_tmpb_fp + \l__cal_tmpd_dim}} } - \tl_put_right:NV \l__cal_tmpb_tl \g__spath_curvetob_tl + \tl_put_right:NV \l__cal_tmpb_tl \c_spath_curvetob_tl \tl_put_right:Nx \l__cal_tmpb_tl { @@ -619,7 +557,7 @@ {\dim_eval:n { \fp_to_dim:N \l__cal_tmpd_fp + \l__cal_tmpf_dim}} } - \tl_put_right:NV \l__cal_tmpb_tl \g__spath_curveto_tl + \tl_put_right:NV \l__cal_tmpb_tl \c_spath_curveto_tl \tl_put_right:Nx \l__cal_tmpb_tl { @@ -627,23 +565,51 @@ {\dim_eval:n { \fp_to_dim:N \l__cal_tmpd_fp + \l__cal_tmph_dim}} } - \tl_put_right:NV \l__cal_tmpb_tl \g__spath_curvetoa_tl + \tl_put_right:NV \l__cal_tmpb_tl \c_spath_curvetoa_tl \tl_put_right:Nx \l__cal_tmpb_tl { - {\dim_eval:n { \fp_to_dim:N \l__cal_tmpc_fp + \l__cal_tmpg_dim - \fp_to_dim:n{ 1.32 * \l__cal_tmpd_fp}}} - {\dim_eval:n { \fp_to_dim:N \l__cal_tmpd_fp + \l__cal_tmph_dim + \fp_to_dim:n {1.32* \l__cal_tmpc_fp}}} + { + \dim_eval:n + { + \fp_to_dim:N \l__cal_tmpc_fp + \l__cal_tmpg_dim + - \fp_to_dim:n{ 1.32 * \l__cal_tmpd_fp + } + } + } + { + \dim_eval:n + { + \fp_to_dim:N \l__cal_tmpd_fp + \l__cal_tmph_dim + + \fp_to_dim:n {1.32* \l__cal_tmpc_fp + } + } + } } - \tl_put_right:NV \l__cal_tmpb_tl \g__spath_curvetob_tl + \tl_put_right:NV \l__cal_tmpb_tl \c_spath_curvetob_tl \tl_put_right:Nx \l__cal_tmpb_tl { - {\dim_eval:n { -\fp_to_dim:N \l__cal_tmpc_fp + \l__cal_tmpg_dim - \fp_to_dim:n {1.32 * \l__cal_tmpd_fp}}} - {\dim_eval:n { -\fp_to_dim:N \l__cal_tmpd_fp + \l__cal_tmph_dim + \fp_to_dim:n {1.32 * \l__cal_tmpc_fp}}} + { + \dim_eval:n + { + -\fp_to_dim:N \l__cal_tmpc_fp + \l__cal_tmpg_dim + - \fp_to_dim:n {1.32 * \l__cal_tmpd_fp + } + } + } + { + \dim_eval:n + { + -\fp_to_dim:N \l__cal_tmpd_fp + \l__cal_tmph_dim + + \fp_to_dim:n {1.32 * \l__cal_tmpc_fp + } + } + } } - \tl_put_right:NV \l__cal_tmpb_tl \g__spath_curveto_tl + \tl_put_right:NV \l__cal_tmpb_tl \c_spath_curveto_tl \tl_put_right:Nx \l__cal_tmpb_tl { @@ -651,7 +617,7 @@ {\dim_eval:n { -\fp_to_dim:N \l__cal_tmpd_fp + \l__cal_tmph_dim}} } - \tl_put_right:NV \l__cal_tmpb_tl \g__spath_curvetoa_tl + \tl_put_right:NV \l__cal_tmpb_tl \c_spath_curvetoa_tl \tl_put_right:Nx \l__cal_tmpb_tl { @@ -659,7 +625,7 @@ {\dim_eval:n { -\fp_to_dim:N \l__cal_tmpd_fp + \l__cal_tmpf_dim}} } - \tl_put_right:NV \l__cal_tmpb_tl \g__spath_curvetob_tl + \tl_put_right:NV \l__cal_tmpb_tl \c_spath_curvetob_tl \tl_put_right:Nx \l__cal_tmpb_tl { @@ -667,7 +633,7 @@ {\dim_eval:n { -\fp_to_dim:N \l__cal_tmpb_fp + \l__cal_tmpd_dim}} } - \tl_put_right:NV \l__cal_tmpb_tl \g__spath_curveto_tl + \tl_put_right:NV \l__cal_tmpb_tl \c_spath_curveto_tl \tl_put_right:Nx \l__cal_tmpb_tl { @@ -675,28 +641,52 @@ {\dim_eval:n { -\fp_to_dim:N \l__cal_tmpb_fp + \l__cal_tmpb_dim}} } - \tl_put_right:NV \l__cal_tmpb_tl \g__spath_curvetoa_tl + \tl_put_right:NV \l__cal_tmpb_tl \c_spath_curvetoa_tl \tl_put_right:Nx \l__cal_tmpb_tl { - {\dim_eval:n { -\fp_to_dim:N \l__cal_tmpa_fp + \l__cal_tmpa_dim + \fp_to_dim:n{ 1.32 * \l__cal_tmpb_fp}}} - {\dim_eval:n { -\fp_to_dim:N \l__cal_tmpb_fp + \l__cal_tmpb_dim - \fp_to_dim:n {1.32* \l__cal_tmpa_fp}}} + { + \dim_eval:n + { + -\fp_to_dim:N \l__cal_tmpa_fp + \l__cal_tmpa_dim + + \fp_to_dim:n{ 1.32 * \l__cal_tmpb_fp} + } + } + { + \dim_eval:n + { + -\fp_to_dim:N \l__cal_tmpb_fp + \l__cal_tmpb_dim + - \fp_to_dim:n {1.32* \l__cal_tmpa_fp} + } + } } - \tl_put_right:NV \l__cal_tmpb_tl \g__spath_curvetob_tl + \tl_put_right:NV \l__cal_tmpb_tl \c_spath_curvetob_tl \tl_put_right:Nx \l__cal_tmpb_tl { - {\dim_eval:n { \fp_to_dim:N \l__cal_tmpa_fp + \l__cal_tmpa_dim + \fp_to_dim:n {1.32 * \l__cal_tmpb_fp}}} - {\dim_eval:n { \fp_to_dim:N \l__cal_tmpb_fp + \l__cal_tmpb_dim - \fp_to_dim:n {1.32 * \l__cal_tmpa_fp}}} + { + \dim_eval:n + { + \fp_to_dim:N \l__cal_tmpa_fp + \l__cal_tmpa_dim + + \fp_to_dim:n {1.32 * \l__cal_tmpb_fp} + } + } + { + \dim_eval:n + { + \fp_to_dim:N \l__cal_tmpb_fp + \l__cal_tmpb_dim + - \fp_to_dim:n {1.32 * \l__cal_tmpa_fp} + } + } } - \tl_put_right:NV \l__cal_tmpb_tl \g__spath_curveto_tl + \tl_put_right:NV \l__cal_tmpb_tl \c_spath_curveto_tl \tl_put_right:Nx \l__cal_tmpb_tl { {\dim_eval:n { \fp_to_dim:N \l__cal_tmpa_fp + \l__cal_tmpa_dim}} - {\dim_eval:n { \fp_to_dim:N \l__cal_tmpb_fp + \l__cal_tmpb_dim}} + {\dim_eval:n { \fp_to_dim:N \l__cal_tmpb_fp + \l__cal_tmpb_dim}} } \pgfsyssoftpath@setcurrentpath\l__cal_tmpb_tl @@ -704,109 +694,198 @@ \pgfusepath{fill} } \tl_set:Nn \l__cal_tmpa_tl {\pgfsyssoftpath@movetotoken{0pt}{0pt}} -\MakeSPathList{calligraphy pen copperplate}{\l__cal_tmpa_tl} -\SPathListPrepare{calligraphy pen copperplate} +\spath_components_to_seq:NV \l__cal_tmpa_seq \l__cal_tmpa_tl +\seq_gclear_new:N \g__cal_pen_copperplate_seq +\seq_gset_eq:NN \g__cal_pen_copperplate_seq \l__cal_tmpa_seq +\DeclareDocumentCommand \CopperplatePath { m } +{ + \spath_components_to_seq:NV \l__cal_tmpa_seq #1 + \cal_path_create:NN \l__cal_tmpa_seq \g__cal_pen_copperplate_seq +} \ExplSyntaxOff \expandafter\ifx\csname pgfdeclaredecoration\endcsname\relax \else -\pgfdeclaredecoration{calligraphic brace}{brace} -{ - \state{brace}[width=+\pgfdecoratedremainingdistance,next state=final] - { - \pgfsyssoftpath@setcurrentpath{\pgfutil@empty} - \pgfpathmoveto{\pgfpointorigin} - \pgfpathcurveto - {\pgfqpoint{.15\pgfdecorationsegmentamplitude}{.3\pgfdecorationsegmentamplitude}} - {\pgfqpoint{.5\pgfdecorationsegmentamplitude}{.5\pgfdecorationsegmentamplitude}} - {\pgfqpoint{\pgfdecorationsegmentamplitude}{.5\pgfdecorationsegmentamplitude}} - { - \pgftransformxshift{+\pgfdecorationsegmentaspect\pgfdecoratedremainingdistance} - \pgfpathlineto{\pgfqpoint{-\pgfdecorationsegmentamplitude}{.5\pgfdecorationsegmentamplitude}} - \pgfpathcurveto - {\pgfqpoint{-.5\pgfdecorationsegmentamplitude}{.5\pgfdecorationsegmentamplitude}} - {\pgfqpoint{-.15\pgfdecorationsegmentamplitude}{.7\pgfdecorationsegmentamplitude}} - {\pgfqpoint{0\pgfdecorationsegmentamplitude}{1\pgfdecorationsegmentamplitude}} - \pgfpathmoveto{\pgfqpoint{0\pgfdecorationsegmentamplitude}{1\pgfdecorationsegmentamplitude}} - \pgfpathcurveto - {\pgfqpoint{.15\pgfdecorationsegmentamplitude}{.7\pgfdecorationsegmentamplitude}} - {\pgfqpoint{.5\pgfdecorationsegmentamplitude}{.5\pgfdecorationsegmentamplitude}} - {\pgfqpoint{\pgfdecorationsegmentamplitude}{.5\pgfdecorationsegmentamplitude}} - } - { - \pgftransformxshift{+\pgfdecoratedremainingdistance} - \pgfpathlineto{\pgfqpoint{-\pgfdecorationsegmentamplitude}{.5\pgfdecorationsegmentamplitude}} +\pgfdeclaredecoration{calligraphic brace}{brace}% +{% + \state{brace}[width=+\pgfdecoratedremainingdistance,next state=final]% + {% + \pgfsyssoftpath@setcurrentpath{\pgfutil@empty}% + \pgfpathmoveto{\pgfpointorigin}% + \pgfpathcurveto% + {% + \pgfqpoint% + {.15\pgfdecorationsegmentamplitude}% + {.3\pgfdecorationsegmentamplitude}% + }% + {% + \pgfqpoint% + {.5\pgfdecorationsegmentamplitude}% + {.5\pgfdecorationsegmentamplitude}% + }% + {% + \pgfqpoint% + {\pgfdecorationsegmentamplitude}% + {.5\pgfdecorationsegmentamplitude}% + }% + {% + \pgftransformxshift% + {+\pgfdecorationsegmentaspect\pgfdecoratedremainingdistance}% + \pgfpathlineto% + {% + \pgfqpoint% + {-\pgfdecorationsegmentamplitude}% + {.5\pgfdecorationsegmentamplitude}% + }% \pgfpathcurveto - {\pgfqpoint{-.5\pgfdecorationsegmentamplitude}{.5\pgfdecorationsegmentamplitude}} - {\pgfqpoint{-.15\pgfdecorationsegmentamplitude}{.3\pgfdecorationsegmentamplitude}} - {\pgfqpoint{0pt}{0pt}} - } - \tikzset{ - taper width=.5\pgflinewidth, - taper + {% + \pgfqpoint% + {-.5\pgfdecorationsegmentamplitude}% + {.5\pgfdecorationsegmentamplitude}% + }% + {% + \pgfqpoint% + {-.15\pgfdecorationsegmentamplitude}% + {.7\pgfdecorationsegmentamplitude}% + }% + {% + \pgfqpoint% + {0\pgfdecorationsegmentamplitude}% + {1\pgfdecorationsegmentamplitude}% + }% + \pgfpathmoveto% + {% + \pgfqpoint% + {0\pgfdecorationsegmentamplitude}% + {1\pgfdecorationsegmentamplitude}% + }% + \pgfpathcurveto% + {% + \pgfqpoint% + {.15\pgfdecorationsegmentamplitude}% + {.7\pgfdecorationsegmentamplitude}% + }% + {% + \pgfqpoint% + {.5\pgfdecorationsegmentamplitude}% + {.5\pgfdecorationsegmentamplitude}% + }% + {% + \pgfqpoint% + {\pgfdecorationsegmentamplitude}% + {.5\pgfdecorationsegmentamplitude}% + }% }% - \pgfsyssoftpath@getcurrentpath\cal@tmp@path - \MakeSPathList{calligraphy path}{\cal@tmp@path}% - \SPathListPrepare{calligraphy path}% - \CalligraphyPathCreate{calligraphy path}{copperplate}% - } - \state{final}{} -} + {% + \pgftransformxshift{+\pgfdecoratedremainingdistance}% + \pgfpathlineto% + {% + \pgfqpoint% + {-\pgfdecorationsegmentamplitude}% + {.5\pgfdecorationsegmentamplitude}% + }% + \pgfpathcurveto% + {% + \pgfqpoint% + {-.5\pgfdecorationsegmentamplitude}% + {.5\pgfdecorationsegmentamplitude}% + }% + {% + \pgfqpoint% + {-.15\pgfdecorationsegmentamplitude}% + {.3\pgfdecorationsegmentamplitude}% + }% + {\pgfqpoint{0pt}{0pt}}% + }% + \tikzset{% + taper width=.5\pgflinewidth,% + taper% + }%% + \pgfsyssoftpath@getcurrentpath\cal@tmp@path% + \CopperplatePath{\cal@tmp@path}% + }% + \state{final}{}% +}% \pgfdeclaredecoration{calligraphic straight parenthesis}{brace} { - \state{brace}[width=+\pgfdecoratedremainingdistance,next state=final] - { - \pgfsyssoftpath@setcurrentpath{\pgfutil@empty} - \pgfpathmoveto{\pgfpointorigin} - \pgfpathcurveto - {\pgfqpoint{.76604\pgfdecorationsegmentamplitude}{.64279\pgfdecorationsegmentamplitude}} - {\pgfqpoint{2.3333\pgfdecorationsegmentamplitude}{\pgfdecorationsegmentamplitude}} - {\pgfqpoint{3.3333\pgfdecorationsegmentamplitude}{\pgfdecorationsegmentamplitude}} - { - \pgftransformxshift{+\pgfdecoratedremainingdistance} - \pgfpathlineto{\pgfqpoint{-3.3333\pgfdecorationsegmentamplitude}{\pgfdecorationsegmentamplitude}} - \pgfpathcurveto - {\pgfqpoint{-2.3333\pgfdecorationsegmentamplitude}{\pgfdecorationsegmentamplitude}} - {\pgfqpoint{-.76604\pgfdecorationsegmentamplitude}{.64279\pgfdecorationsegmentamplitude}} - {\pgfqpoint{0pt}{0pt}} - } - \tikzset{ - taper width=.5\pgflinewidth, - taper + \state{brace}[width=+\pgfdecoratedremainingdistance,next state=final]% + {% + \pgfsyssoftpath@setcurrentpath{\pgfutil@empty}% + \pgfpathmoveto{\pgfpointorigin}% + \pgfpathcurveto% + {% + \pgfqpoint% + {.76604\pgfdecorationsegmentamplitude}% + {.64279\pgfdecorationsegmentamplitude}% }% - \pgfsyssoftpath@getcurrentpath\cal@tmp@path - \MakeSPathList{calligraphy path}{\cal@tmp@path}% - \SPathListPrepare{calligraphy path}% - \CalligraphyPathCreate{calligraphy path}{copperplate}% - } + {% + \pgfqpoint% + {2.3333\pgfdecorationsegmentamplitude}% + {\pgfdecorationsegmentamplitude}% + }% + {% + \pgfqpoint% + {3.3333\pgfdecorationsegmentamplitude}% + {\pgfdecorationsegmentamplitude}% + }% + {% + \pgftransformxshift{+\pgfdecoratedremainingdistance}% + \pgfpathlineto% + {% + \pgfqpoint% + {-3.3333\pgfdecorationsegmentamplitude}% + {\pgfdecorationsegmentamplitude}% + }% + \pgfpathcurveto% + {% + \pgfqpoint% + {-2.3333\pgfdecorationsegmentamplitude}% + {\pgfdecorationsegmentamplitude}% + }% + {% + \pgfqpoint% + {-.76604\pgfdecorationsegmentamplitude}% + {.64279\pgfdecorationsegmentamplitude}% + }% + {\pgfqpoint{0pt}{0pt}}% + }% + \tikzset{% + taper width=.5\pgflinewidth,% + taper% + }% + \pgfsyssoftpath@getcurrentpath\cal@tmp@path% + \CopperplatePath{\cal@tmp@path}% + }% \state{final}{}% } \pgfdeclaredecoration{calligraphic curved parenthesis}{brace} { - \state{brace}[width=+\pgfdecoratedremainingdistance,next state=final] - { - \pgfsyssoftpath@setcurrentpath{\pgfutil@empty} - \pgfpathmoveto{\pgfpointorigin} - \pgf@xa=\pgfdecoratedremainingdistance\relax - \advance\pgf@xa by -1.5890\pgfdecorationsegmentamplitude\relax - \edef\cgrphy@xa{\the\pgf@xa} - \pgfpathcurveto - {\pgfqpoint{1.5890\pgfdecorationsegmentamplitude}{1.3333\pgfdecorationsegmentamplitude}} - {\pgfqpoint{\cgrphy@xa}{1.3333\pgfdecorationsegmentamplitude}} - {\pgfqpoint{\pgfdecoratedremainingdistance}{0pt}} - \tikzset{ - taper width=.5\pgflinewidth, - taper + \state{brace}[width=+\pgfdecoratedremainingdistance,next state=final]% + {% + \pgfsyssoftpath@setcurrentpath{\pgfutil@empty}% + \pgfpathmoveto{\pgfpointorigin}% + \pgf@xa=\pgfdecoratedremainingdistance\relax% + \advance\pgf@xa by -1.5890\pgfdecorationsegmentamplitude\relax% + \edef\cgrphy@xa{\the\pgf@xa}% + \pgfpathcurveto% + {% + \pgfqpoint% + {1.5890\pgfdecorationsegmentamplitude}% + {1.3333\pgfdecorationsegmentamplitude}% }% - \pgfsyssoftpath@getcurrentpath\cal@tmp@path - \MakeSPathList{calligraphy path}{\cal@tmp@path}% - \SPathListPrepare{calligraphy path}% - \CalligraphyPathCreate{calligraphy path}{copperplate}% - } + {\pgfqpoint{\cgrphy@xa}{1.3333\pgfdecorationsegmentamplitude}}% + {\pgfqpoint{\pgfdecoratedremainingdistance}{0pt}}% + \tikzset{% + taper width=.5\pgflinewidth,% + taper% + }% + \pgfsyssoftpath@getcurrentpath\cal@tmp@path% + \CopperplatePath{\cal@tmp@path}% + }% \state{final}{}% } \fi %% -%% Copyright (C) 2011-2019 by Andrew Stacey <stacey@math.ntnu.no> +%% Copyright (C) 2011-2021 by Andrew Stacey <loopspace@mathforge.org> %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License (LPPL), either @@ -818,16 +897,19 @@ %% This work is "maintained" (as per LPPL maintenance status) by %% Andrew Stacey. %% -%% This work consists of the files spath3.dtx +%% This work consists of the files spath3_code.dtx %% calligraphy_doc.tex %% knots_doc.tex +%% spath3.tex %% and the derived files spath3.ins, %% spath3_code.pdf, %% spath3.sty, %% tikzlibrarycalligraphy.code.tex %% tikzlibraryknots.code.tex +%% tikzlibraryspath3.code.tex %% calligraphy.pdf %% knots.pdf +%% spath3.pdf %% README %% %% diff --git a/Master/texmf-dist/tex/latex/spath3/tikzlibraryknots.code.tex b/Master/texmf-dist/tex/latex/spath3/tikzlibraryknots.code.tex index 0322a679410..c6ae085925a 100644 --- a/Master/texmf-dist/tex/latex/spath3/tikzlibraryknots.code.tex +++ b/Master/texmf-dist/tex/latex/spath3/tikzlibraryknots.code.tex @@ -4,17 +4,17 @@ %% %% The original source files were: %% -%% spath3.dtx (with options: `knots') +%% spath3_code.dtx (with options: `knots') %% ---------------------------------------------------------------- %% spath3 --- Functions for manipulating PGF soft paths -%% E-mail: stacey@math.ntnu.no +%% E-mail: loopspace@mathforge.org %% Released under the LaTeX Project Public License v1.3c or later %% See http://www.latex-project.org/lppl.txt %% ---------------------------------------------------------------- %% %% \RequirePackage{spath3} -\usetikzlibrary{intersections} +\usetikzlibrary{intersections,spath3} \ExplSyntaxOn @@ -22,8 +22,6 @@ \tl_new:N \l__knot_tmpb_tl \tl_new:N \l__knot_tmpc_tl \tl_new:N \l__knot_tmpd_tl -\tl_new:N \l__knot_tmpe_tl -\tl_new:N \l__knot_tmpf_tl \tl_new:N \l__knot_tmpg_tl \tl_new:N \l__knot_redraws_tl \tl_new:N \l__knot_clip_width_tl @@ -31,17 +29,23 @@ \tl_new:N \l__knot_node_tl \tl_new:N \l__knot_aux_tl \tl_new:N \l__knot_auxa_tl +\tl_new:N \l__knot_prefix_tl + +\seq_new:N \l__knot_segments_seq \int_new:N \l__knot_tmpa_int \int_new:N \l__knot_strands_int -\int_new:N \l__knot_intersections_int -\int_new:N \l__knot_filaments_int +\int_new:N \g__knot_intersections_int +\int_new:N \g__knot_filaments_int \int_new:N \l__knot_component_start_int +\fp_new:N \l__knot_tmpa_fp +\fp_new:N \l__knot_tmpb_fp + \dim_new:N \l__knot_tmpa_dim \dim_new:N \l__knot_tmpb_dim -\dim_new:N \l__knot_tmpc_dim \dim_new:N \l__knot_tolerance_dim +\dim_new:N \l__knot_redraw_tolerance_dim \dim_new:N \l__knot_clip_bg_radius_dim \dim_new:N \l__knot_clip_draw_radius_dim @@ -56,10 +60,16 @@ \bool_new:N \l__knot_skip_bool \bool_new:N \l__knot_save_bool -\seq_new:N \l__knot_nodes_seq +\seq_new:N \g__knot_nodes_seq \bool_set_true:N \l__knot_ignore_ends_bool \tikzset{ + spath/prefix/knot/.style={ + spath/set~ prefix=knot strand, + }, + spath/suffix/knot/.style={ + spath/set~ suffix={}, + }, knot/.code={ \tl_if_eq:nnTF {#1} {none} { @@ -218,7 +228,7 @@ \int_incr:N \l__knot_strands_int \tl_clear_new:c {l__knot_options_strand \int_use:N \l__knot_strands_int} \tl_set:cn {l__knot_options_strand \int_use:N \l__knot_strands_int} {#1} - \path[#1,save~ spath=knot strand \int_use:N \l__knot_strands_int] + \path[#1,spath/set~ name=knot,spath/save=\int_use:N \l__knot_strands_int] } \NewDocumentEnvironment{knot} { O{} } { @@ -232,12 +242,17 @@ \tikzset{knot~ diagram/.cd,every~ knot~ diagram/.try,#1} \int_zero:N \l__knot_strands_int \tl_clear:N \l__knot_redraws_tl - \seq_gclear:N \l__knot_nodes_seq + \seq_gclear:N \g__knot_nodes_seq } \cs_new_protected_nopar:Npn \knot_render: { \pgfscope \pgftransformreset + \dim_set:Nn \l__knot_redraw_tolerance_dim {\fp_to_dim:n + { + sqrt(2) * max(\l__knot_clip_bg_radius_dim, \l__knot_clip_draw_radius_dim) + } + } \int_step_function:nnnN {1} {1} {\l__knot_strands_int} \knot_draw_strand:n \bool_if:NF \l__knot_super_draft_bool { @@ -245,34 +260,40 @@ \bool_if:NTF \l__knot_self_intersections_bool { \knot_split_strands: - \int_set_eq:NN \l__knot_tmpa_int \l__knot_filaments_int + \int_set_eq:NN \l__knot_tmpa_int \g__knot_filaments_int \tl_set:Nn \l__knot_prefix_tl {filament} } { \int_set_eq:NN \l__knot_tmpa_int \l__knot_strands_int \tl_set:Nn \l__knot_prefix_tl {strand} } - \int_gzero:N \l__knot_intersections_int - \bool_if:NTF \l__knot_draft_bool + \int_gzero:N \g__knot_intersections_int + \tl_clear:N \l__knot_node_tl + \bool_if:NT \l__knot_draft_bool { \tl_set:Nn \l__knot_node_tl { \exp_not:N \node[coordinate, - pin={[node~ contents={\int_use:N \l__knot_intersections_int},knot~ diagram/draft/crossing~ label, knot~ diagram/draft/crossing~ \int_use:N \l__knot_intersections_int \c_space_tl label/.try] + pin={[ + node~ contents={\int_use:N \g__knot_intersections_int}, + knot~ diagram/draft/crossing~ label, + knot~ diagram/draft/crossing~ + \int_use:N \g__knot_intersections_int \c_space_tl label/.try + ] }] } } - { - \tl_set:Nn \l__knot_node_tl {\exp_not:N \node[coordinate]} - } \int_step_variable:nnnNn {1} {1} {\l__knot_tmpa_int - 1} \l__knot_tmpa_tl { - \int_step_variable:nnnNn {\tl_use:N \l__knot_tmpa_tl + 1} {1} {\l__knot_tmpa_int} \l__knot_tmpb_tl + \int_step_variable:nnnNn + {\tl_use:N \l__knot_tmpa_tl + 1} + {1} + {\l__knot_tmpa_int} \l__knot_tmpb_tl { \knot_intersections:VV \l__knot_tmpa_tl \l__knot_tmpb_tl } } \tl_use:N \l__knot_redraws_tl - \seq_use:Nn \l__knot_nodes_seq {} + \seq_use:Nn \g__knot_nodes_seq {} } \endpgfscope } @@ -280,11 +301,16 @@ { \pgfscope \group_begin: - \tl_set:Nn \l_tmpa_tl {knot~ diagram/every~ strand/.try,} - \tl_put_right:Nv \l_tmpa_tl {l__knot_options_strand #1} - \tl_put_right:Nn \l_tmpa_tl {,knot~ diagram/only~ when~ rendering/.try,only~ when~ rendering/.try} - \spath_bake_round:n {knot strand #1} - \spath_tikz_path:Vn \l_tmpa_tl {knot strand #1} + \spath_bake_round:c {knot strand #1} + \tl_set:Nn \l__knot_tmpa_tl {knot~ diagram/every~ strand/.try,} + \tl_put_right:Nv \l__knot_tmpa_tl {l__knot_options_strand #1} + \tl_put_right:Nn \l__knot_tmpa_tl + { + , + knot~ diagram/only~ when~ rendering/.try, + only~ when~ rendering/.try + } + \spath_tikz_path:Vv \l__knot_tmpa_tl {knot strand #1} \group_end: \endpgfscope } @@ -293,14 +319,18 @@ { \bool_if:NT \l__knot_draft_bool { - \spath_get:nnN {knot strand #1} {final point} \l__knot_tmpb_tl + \spath_finalpoint:Nv \l__knot_tmpb_tl {knot strand #1} \dim_set:Nn \l__knot_tmpa_dim {\tl_item:Nn \l__knot_tmpb_tl {1}} \dim_set:Nn \l__knot_tmpb_dim {\tl_item:Nn \l__knot_tmpb_tl {2}} - \node[knot~ diagram/draft/strand~label] at (\l__knot_tmpa_dim,\l__knot_tmpb_dim) {#1}; - \spath_get:nnN {knot strand #1} {initial point} \l__knot_tmpb_tl + \node[ + knot~ diagram/draft/strand~label + ] at (\l__knot_tmpa_dim,\l__knot_tmpb_dim) {#1}; + \spath_initialpoint:Nv \l__knot_tmpb_tl {knot strand #1} \dim_set:Nn \l__knot_tmpa_dim {\tl_item:Nn \l__knot_tmpb_tl {1}} \dim_set:Nn \l__knot_tmpb_dim {\tl_item:Nn \l__knot_tmpb_tl {2}} - \node[knot~ diagram/draft/strand~label] at (\l__knot_tmpa_dim,\l__knot_tmpb_dim) {#1}; + \node[ + knot~ diagram/draft/strand~label + ] at (\l__knot_tmpa_dim,\l__knot_tmpb_dim) {#1}; } \bool_if:nT { \l__knot_self_intersections_bool @@ -309,84 +339,98 @@ } { \tl_clear:N \l__knot_tmpa_tl - \spath_map_segment_function:nN {knot strand #1} \knot_split_self_intersects:NN - \spath_put:nnV {knot strand #1} {path} \l__knot_tmpa_tl + \spath_initialpoint:Nv \l__knot_tmpa_tl {knot strand #1} + \tl_put_left:NV \l__knot_tmpa_tl \c_spath_moveto_tl + \spath_segments_to_seq:Nv \l__knot_segments_seq {knot strand #1} + \seq_map_function:NN \l__knot_segments_seq \knot_split_self_intersects:N + \tl_set_eq:cN {knot strand #1} \l__knot_tmpa_tl } } -\cs_new_protected_nopar:Npn \knot_split_self_intersects:NN #1#2 +\cs_new_protected_nopar:Npn \knot_split_self_intersects:N #1 { - \tl_case:NnF #1 + \tl_set:Nx \l__knot_tmpc_tl {\tl_item:nn {#1} {4}} + \tl_case:NnF \l__knot_tmpc_tl { - \g__spath_curvetoa_tl + \c_spath_curvetoa_tl { - \fp_set:Nn \l_tmpa_fp + \fp_set:Nn \l__knot_tmpa_fp { - (\tl_item:Nn #2 {3} - 3 * \tl_item:Nn #2 {6} + 3 * \tl_item:Nn #2 {9} - \tl_item:Nn #2 {12}) + (\tl_item:nn {#1} {3} - 3 * \tl_item:nn {#1} {6} + + 3 * \tl_item:nn {#1} {9} - \tl_item:nn {#1} {12}) * - (3 * \tl_item:Nn #2 {8} - 3 * \tl_item:Nn #2 {11}) + (3 * \tl_item:nn {#1} {8} - 3 * \tl_item:nn {#1} {11}) - - (\tl_item:Nn #2 {2} - 3 * \tl_item:Nn #2 {5} + 3 * \tl_item:Nn #2 {8} - \tl_item:Nn #2 {11}) + (\tl_item:nn {#1} {2} - 3 * \tl_item:nn {#1} {5} + + 3 * \tl_item:nn {#1} {8} - \tl_item:nn {#1} {11}) * - (3 * \tl_item:Nn #2 {9} - 3 * \tl_item:Nn #2 {12}) + (3 * \tl_item:nn {#1} {9} - 3 * \tl_item:nn {#1} {12}) } - \fp_set:Nn \l_tmpb_fp + \fp_set:Nn \l__knot_tmpb_fp { - (\tl_item:Nn #2 {2} - 3 * \tl_item:Nn #2 {5} + 3 * \tl_item:Nn #2 {8} - \tl_item:Nn #2 {11}) + (\tl_item:nn {#1} {2} - 3 * \tl_item:nn {#1} {5} + + 3 * \tl_item:nn {#1} {8} - \tl_item:nn {#1} {11}) * - (3 * \tl_item:Nn #2 {6} - 6 * \tl_item:Nn #2 {9} + 3 * \tl_item:Nn #2 {12}) + (3 * \tl_item:nn {#1} {6} - 6 * \tl_item:nn {#1} {9} + + 3 * \tl_item:nn {#1} {12}) - - (\tl_item:Nn #2 {3} - 3 * \tl_item:Nn #2 {6} + 3 * \tl_item:Nn #2 {9} - \tl_item:Nn #2 {12}) + (\tl_item:nn {#1} {3} - 3 * \tl_item:nn {#1} {6} + + 3 * \tl_item:nn {#1} {9} - \tl_item:nn {#1} {12}) * - (3 * \tl_item:Nn #2 {5} - 6 * \tl_item:Nn #2 {8} + 3 * \tl_item:Nn #2 {11}) + (3 * \tl_item:nn {#1} {5} - 6 * \tl_item:nn {#1} {8} + + 3 * \tl_item:nn {#1} {11}) } \fp_compare:nTF { - \l_tmpb_fp != 0 + \l__knot_tmpb_fp != 0 } { - \fp_set:Nn \l_tmpa_fp {.5 * \l_tmpa_fp / \l_tmpb_fp} + \fp_set:Nn \l__knot_tmpa_fp {.5 * \l__knot_tmpa_fp / \l__knot_tmpb_fp} \fp_compare:nTF { - 0 < \l_tmpa_fp && \l_tmpa_fp < 1 + 0 < \l__knot_tmpa_fp && \l__knot_tmpa_fp < 1 } { - \spath_split_curve:VVNN \l_tmpa_fp #2 \l_tmpa_tl \l_tmpb_tl - \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} - \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} - \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} - \tl_set:Nx \l_tmpb_tl {\tl_tail:N \l_tmpb_tl} - \tl_set:Nx \l_tmpb_tl {\tl_tail:N \l_tmpb_tl} - \tl_set:Nx \l_tmpb_tl {\tl_tail:N \l_tmpb_tl} - \tl_put_right:NV \l__knot_tmpa_tl \l_tmpa_tl - \tl_put_right:NV \l__knot_tmpa_tl \l_tmpb_tl + \spath_split_curve:NNnV + \l__knot_tmpc_tl + \l__knot_tmpd_tl + {#1} + \l__knot_tmpa_fp + \tl_set:Nx \l__knot_tmpc_tl {\tl_tail:N \l__knot_tmpc_tl} + \tl_set:Nx \l__knot_tmpc_tl {\tl_tail:N \l__knot_tmpc_tl} + \tl_set:Nx \l__knot_tmpc_tl {\tl_tail:N \l__knot_tmpc_tl} + \tl_set:Nx \l__knot_tmpd_tl {\tl_tail:N \l__knot_tmpd_tl} + \tl_set:Nx \l__knot_tmpd_tl {\tl_tail:N \l__knot_tmpd_tl} + \tl_set:Nx \l__knot_tmpd_tl {\tl_tail:N \l__knot_tmpd_tl} + \tl_put_right:NV \l__knot_tmpa_tl \l__knot_tmpc_tl + \tl_put_right:NV \l__knot_tmpa_tl \l__knot_tmpd_tl } { - \tl_set_eq:NN \l_tmpa_tl #2 - \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} - \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} - \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} - \tl_put_right:NV \l__knot_tmpa_tl \l_tmpa_tl + \tl_set:Nn \l__knot_tmpc_tl {#1} + \tl_set:Nx \l__knot_tmpc_tl {\tl_tail:N \l__knot_tmpc_tl} + \tl_set:Nx \l__knot_tmpc_tl {\tl_tail:N \l__knot_tmpc_tl} + \tl_set:Nx \l__knot_tmpc_tl {\tl_tail:N \l__knot_tmpc_tl} + \tl_put_right:NV \l__knot_tmpa_tl \l__knot_tmpc_tl } } { - \tl_set_eq:NN \l_tmpa_tl #2 - \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} - \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} - \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} - \tl_put_right:NV \l__knot_tmpa_tl \l_tmpa_tl + \tl_set:Nn \l__knot_tmpc_tl {#1} + \tl_set:Nx \l__knot_tmpc_tl {\tl_tail:N \l__knot_tmpc_tl} + \tl_set:Nx \l__knot_tmpc_tl {\tl_tail:N \l__knot_tmpc_tl} + \tl_set:Nx \l__knot_tmpc_tl {\tl_tail:N \l__knot_tmpc_tl} + \tl_put_right:NV \l__knot_tmpa_tl \l__knot_tmpc_tl } } - \g__spath_lineto_tl + \c_spath_lineto_tl { - \tl_set_eq:NN \l_tmpa_tl #2 - \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} - \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} - \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl} - \tl_put_right:NV \l__knot_tmpa_tl \l_tmpa_tl + \tl_set:Nn \l__knot_tmpc_tl {#1} + \tl_set:Nx \l__knot_tmpc_tl {\tl_tail:N \l__knot_tmpc_tl} + \tl_set:Nx \l__knot_tmpc_tl {\tl_tail:N \l__knot_tmpc_tl} + \tl_set:Nx \l__knot_tmpc_tl {\tl_tail:N \l__knot_tmpc_tl} + \tl_put_right:NV \l__knot_tmpa_tl \l__knot_tmpc_tl } } { - \tl_put_right:NV \l__knot_tmpa_tl #2 + \tl_put_right:Nn \l__knot_tmpa_tl {#1} } } \cs_new_protected_nopar:Npn \knot_intersections:nn #1#2 @@ -396,25 +440,41 @@ \tl_put_right:Nn \l__knot_tmpa_tl {#1} \tl_set_eq:NN \l__knot_tmpb_tl \l__knot_prefix_tl \tl_put_right:Nn \l__knot_tmpb_tl {#2} - \spath_get:nnN {knot \tl_use:N \l__knot_tmpa_tl} {path} \l__knot_tmpc_tl - \spath_get:nnN {knot \tl_use:N \l__knot_tmpb_tl} {path} \l__knot_tmpd_tl + \tl_set_eq:Nc \l__knot_tmpc_tl {knot \tl_use:N \l__knot_tmpa_tl} + \tl_set_eq:Nc \l__knot_tmpd_tl {knot \tl_use:N \l__knot_tmpb_tl} \bool_if:nTF { \l__knot_save_bool && - \tl_if_exist_p:c {knot~ intersections~ \tl_use:N \l__knot_name_tl - \tl_use:N \l__knot_tmpa_tl - \tl_use:N \l__knot_tmpb_tl} + \tl_if_exist_p:c { + knot~ intersections~ + \tl_use:N \l__knot_name_tl - + \tl_use:N \l__knot_tmpa_tl - + \tl_use:N \l__knot_tmpb_tl + } } { - \tl_use:c {knot~ intersections~ \tl_use:N \l__knot_name_tl - \tl_use:N \l__knot_tmpa_tl - \tl_use:N \l__knot_tmpb_tl} + \tl_use:c + { + knot~ intersections~ \tl_use:N \l__knot_name_tl - + \tl_use:N \l__knot_tmpa_tl - + \tl_use:N \l__knot_tmpb_tl + } } { -\pgfintersectionofpaths{\pgfsetpath\l__knot_tmpc_tl}{\pgfsetpath\l__knot_tmpd_tl} + \pgfintersectionofpaths{\pgfsetpath\l__knot_tmpc_tl}{\pgfsetpath\l__knot_tmpd_tl} } + \int_compare:nT {\pgfintersectionsolutions > 0} { - \int_step_function:nnnN {1} {1} {\pgfintersectionsolutions} \knot_do_intersection:n + \int_step_function:nnnN + {1} + {1} + {\pgfintersectionsolutions} + \knot_do_intersection:n } + \knot_save_intersections:VV \l__knot_tmpa_tl \l__knot_tmpb_tl \group_end: } @@ -444,7 +504,16 @@ } \tl_put_right:Nx \l__knot_aux_tl { - {\exp_not:N \pgf@x=\dim_use:N \l__knot_tmpa_dim\exp_not:N\relax\exp_not:N \pgf@y =\dim_use:N \l__knot_tmpb_dim\relax} + { + \exp_not:N \pgf@x + = + \dim_use:N \l__knot_tmpa_dim + \exp_not:N \relax + \exp_not:N \pgf@y + = + \dim_use:N \l__knot_tmpb_dim + \exp_not:N \relax + } } } \tl_set:Nn \l__knot_auxa_tl {\expandafter \gdef \csname knot~ intersections~} @@ -464,23 +533,23 @@ \bool_set_false:N \l__knot_skip_bool \bool_if:NT \l__knot_self_intersections_bool { - \tl_set:Nn \l_tmpa_tl {knot previous} - \tl_put_right:NV \l_tmpa_tl \l__knot_tmpa_tl - \tl_set:Nv \l_tmpa_tl \l_tmpa_tl - \tl_if_eq:NNT \l_tmpa_tl \l__knot_tmpb_tl + \tl_set:Nn \l__knot_tmpc_tl {knot previous} + \tl_put_right:NV \l__knot_tmpc_tl \l__knot_tmpa_tl + \tl_set:Nv \l__knot_tmpc_tl \l__knot_tmpc_tl + \tl_if_eq:NNT \l__knot_tmpc_tl \l__knot_tmpb_tl { - \knot_test_endpoint:VnT \l__knot_tmpb_tl {final point} + \knot_test_endpoint:NVnT \l__knot_tolerance_dim \l__knot_tmpb_tl {final point} { \bool_set_true:N \l__knot_skip_bool } } - \tl_set:Nn \l_tmpa_tl {knot previous} - \tl_put_right:NV \l_tmpa_tl \l__knot_tmpb_tl - \tl_set:Nv \l_tmpa_tl \l_tmpa_tl - \tl_if_eq:NNT \l_tmpa_tl \l__knot_tmpa_tl + \tl_set:Nn \l__knot_tmpc_tl {knot previous} + \tl_put_right:NV \l__knot_tmpc_tl \l__knot_tmpb_tl + \tl_set:Nv \l__knot_tmpc_tl \l__knot_tmpc_tl + \tl_if_eq:NNT \l__knot_tmpc_tl \l__knot_tmpa_tl { - \knot_test_endpoint:VnT \l__knot_tmpa_tl {final point} + \knot_test_endpoint:NVnT \l__knot_tolerance_dim \l__knot_tmpa_tl {final point} { \bool_set_true:N \l__knot_skip_bool } @@ -488,19 +557,19 @@ } \bool_if:NT \l__knot_ignore_ends_bool { - \knot_test_endpoint:VnT \l__knot_tmpa_tl {initial point} + \knot_test_endpoint:NVnT \l__knot_tolerance_dim \l__knot_tmpa_tl {initial point} { \bool_set_true:N \l__knot_skip_bool } - \knot_test_endpoint:VnT \l__knot_tmpa_tl {final point} + \knot_test_endpoint:NVnT \l__knot_tolerance_dim \l__knot_tmpa_tl {final point} { \bool_set_true:N \l__knot_skip_bool } - \knot_test_endpoint:VnT \l__knot_tmpb_tl {initial point} + \knot_test_endpoint:NVnT \l__knot_tolerance_dim \l__knot_tmpb_tl {initial point} { \bool_set_true:N \l__knot_skip_bool } - \knot_test_endpoint:VnT \l__knot_tmpb_tl {final point} + \knot_test_endpoint:NVnT \l__knot_tolerance_dim \l__knot_tmpb_tl {final point} { \bool_set_true:N \l__knot_skip_bool } @@ -508,23 +577,23 @@ \bool_if:NF \l__knot_skip_bool { - \int_gincr:N \l__knot_intersections_int + \int_gincr:N \g__knot_intersections_int \bool_if:nF { \tl_if_exist_p:c {l__knot_ignore_crossing_ \int_use:N - \l__knot_intersections_int} + \g__knot_intersections_int} && ! \tl_if_empty_p:c {l__knot_ignore_crossing_ \int_use:N - \l__knot_intersections_int} + \g__knot_intersections_int} } { \bool_if:nTF { \tl_if_exist_p:c {l__knot_crossing_ \int_use:N - \l__knot_intersections_int} + \g__knot_intersections_int} && ! \tl_if_empty_p:c {l__knot_crossing_ \int_use:N - \l__knot_intersections_int} + \g__knot_intersections_int} } { \tl_set_eq:NN \l__knot_tmpg_tl \l__knot_tmpb_tl @@ -534,14 +603,16 @@ } \bool_if:NT \l__knot_self_intersections_bool { - \knot_test_endpoint:VnT \l__knot_tmpg_tl {initial point} + \knot_test_endpoint:NVnT + \l__knot_redraw_tolerance_dim \l__knot_tmpg_tl {initial point} { \bool_set_true:N \l__knot_prepend_prev_bool } { \bool_set_false:N \l__knot_prepend_prev_bool } - \knot_test_endpoint:VnT \l__knot_tmpg_tl {final point} + \knot_test_endpoint:NVnT + \l__knot_redraw_tolerance_dim \l__knot_tmpg_tl {final point} { \bool_set_true:N \l__knot_append_next_bool } @@ -553,10 +624,15 @@ \l__knot_prepend_prev_bool || \l__knot_append_next_bool } { - \spath_clone:nn {knot \tl_use:N \l__knot_tmpg_tl} + \tl_clear_new:c {knot \tl_use:N \l__knot_prefix_tl -1} + \tl_set_eq:cc {knot \tl_use:N \l__knot_prefix_tl -1} + {knot \tl_use:N \l__knot_tmpg_tl} - \tl_set_eq:cc {l__knot_options_ \tl_use:N \l__knot_prefix_tl -1} {l__knot_options_ \tl_use:N \l__knot_tmpg_tl} + \tl_clear_new:c {l__knot_options_ \tl_use:N \l__knot_prefix_tl -1} + \tl_set_eq:cc + {l__knot_options_ \tl_use:N \l__knot_prefix_tl -1} + {l__knot_options_ \tl_use:N \l__knot_tmpg_tl} \bool_if:nT { @@ -567,7 +643,9 @@ !\tl_if_empty_p:c {knot previous \tl_use:N \l__knot_tmpg_tl} } { - \spath_prepend_no_move:nn {knot \tl_use:N \l__knot_prefix_tl -1} {knot \tl_use:c {knot previous \tl_use:N \l__knot_tmpg_tl}} + \spath_prepend_no_move:cv + {knot \tl_use:N \l__knot_prefix_tl -1} + {knot \tl_use:c {knot previous \tl_use:N \l__knot_tmpg_tl}} \bool_if:nT { \l__knot_splits_bool @@ -577,12 +655,19 @@ !\tl_if_empty_p:c {knot previous \tl_use:N \l__knot_tmpg_tl} } { - \knot_test_endpoint:vnT {knot previous \tl_use:N \l__knot_tmpg_tl} {initial point} + \knot_test_endpoint:NvnT + \l__knot_redraw_tolerance_dim + {knot previous \tl_use:N \l__knot_tmpg_tl} + {initial point} { - \spath_get:nnN {knot \tl_use:N \l__knot_prefix_tl -1} {path} \l_tmpa_tl - \spath_prepend_no_move:nn {knot \tl_use:N \l__knot_prefix_tl -1} {knot \tl_use:c {knot previous \tl_use:c {knot previous \tl_use:N \l__knot_tmpg_tl}}} - \spath_get:nnN {knot \tl_use:N \l__knot_prefix_tl -1} {path} \l_tmpa_tl - + \spath_prepend_no_move:cv + {knot \tl_use:N \l__knot_prefix_tl -1} + {knot \tl_use:c + {knot previous \tl_use:c + {knot previous \tl_use:N \l__knot_tmpg_tl} + } + } + \tl_set_eq:Nc \l__knot_tmpa_tl {knot \tl_use:N \l__knot_prefix_tl -1} } } } @@ -595,7 +680,9 @@ !\tl_if_empty_p:c {knot previous \tl_use:N \l__knot_tmpg_tl} } { - \spath_append_no_move:nn {knot \tl_use:N \l__knot_prefix_tl -1} {knot \tl_use:c {knot next \tl_use:N \l__knot_tmpg_tl}} + \spath_append_no_move:cv + {knot \tl_use:N \l__knot_prefix_tl -1} + {knot \tl_use:c {knot next \tl_use:N \l__knot_tmpg_tl}} \bool_if:nT { \l__knot_splits_bool @@ -606,39 +693,61 @@ !\tl_if_empty_p:c {knot previous \tl_use:N \l__knot_tmpg_tl} } { - \knot_test_endpoint:vnT {knot previous \tl_use:N \l__knot_tmpg_tl} {final point} + \knot_test_endpoint:NvnT + \l__knot_redraw_tolerance_dim + {knot previous \tl_use:N \l__knot_tmpg_tl} + {final point} { - \spath_append_no_move:nn {knot \tl_use:N \l__knot_prefix_tl -1} {knot \tl_use:c {knot next \tl_use:c {knot next \tl_use:N \l__knot_tmpg_tl}}} - + \spath_append_no_move:cv + {knot \tl_use:N \l__knot_prefix_tl -1} + {knot \tl_use:c + {knot next \tl_use:c + {knot next \tl_use:N \l__knot_tmpg_tl} + } + } } } } - \tl_set:Nn \l__knot_tmpg_tl {\tl_use:N \l__knot_prefix_tl -1} } } \pgfscope \group_begin: - \tikzset{knot~ diagram/every~ intersection/.try, every~ intersection/.try, knot~ diagram/intersection~ \int_use:N \l__knot_intersections_int/.try} - \knot_draw_crossing:nVV {\tl_use:N \l__knot_tmpg_tl} \l__knot_tmpa_dim \l__knot_tmpb_dim + \tikzset{ + knot~ diagram/every~ intersection/.try, + every~ intersection/.try, + knot~ diagram/intersection~ \int_use:N \g__knot_intersections_int/.try + } + \knot_draw_crossing:VVV \l__knot_tmpg_tl \l__knot_tmpa_dim \l__knot_tmpb_dim + \coordinate + (\l__knot_name_tl \c_space_tl \int_use:N \g__knot_intersections_int) + at (\dim_use:N \l__knot_tmpa_dim, \dim_use:N \l__knot_tmpb_dim); \group_end: \endpgfscope } - \seq_gpush:Nx \l__knot_nodes_seq { \l__knot_node_tl (\l__knot_name_tl \c_space_tl \int_use:N \l__knot_intersections_int) at (\dim_use:N \l__knot_tmpa_dim, \dim_use:N \l__knot_tmpb_dim) {};} - + \tl_if_empty:NF \l__knot_node_tl + { + \seq_gpush:Nx + \g__knot_nodes_seq + { + \l__knot_node_tl + at + (\dim_use:N \l__knot_tmpa_dim, \dim_use:N \l__knot_tmpb_dim) {}; + } + } } } \cs_generate_variant:Nn \knot_intersections:nn {VV} -\prg_new_conditional:Npnn \knot_test_endpoint:N #1 {p,T,F,TF} +\prg_new_conditional:Npnn \knot_test_endpoint:NN #1#2 {p,T,F,TF} { \dim_compare:nTF { - \dim_abs:n { \l__knot_tmpa_dim - \tl_item:Nn #1 {1}} + \dim_abs:n { \l__knot_tmpa_dim - \tl_item:Nn #2 {1}} + - \dim_abs:n { \l__knot_tmpb_dim - \tl_item:Nn #1 {2}} + \dim_abs:n { \l__knot_tmpb_dim - \tl_item:Nn #2 {2}} < - \l__knot_tolerance_dim + #1 } { \prg_return_true: @@ -647,10 +756,10 @@ \prg_return_false: } } -\prg_new_protected_conditional:Npnn \knot_test_endpoint:nn #1#2 {T,F,TF} +\prg_new_protected_conditional:Npnn \knot_test_endpoint:Nnn #1#2#3 {T,F,TF} { - \spath_get:nnN {knot #1} {#2} \l__knot_tmpd_tl - \knot_test_endpoint:NTF \l__knot_tmpd_tl + \use:c {spath_#3:Nv} \l__knot_tmpd_tl {knot #2} + \knot_test_endpoint:NNTF #1 \l__knot_tmpd_tl { \prg_return_true: } @@ -659,52 +768,62 @@ } } -\cs_generate_variant:Nn \knot_test_endpoint:nnT {VnT,vnT} -\cs_generate_variant:Nn \knot_test_endpoint:nnF {VnF,vnF} -\cs_generate_variant:Nn \knot_test_endpoint:nnTF {VnTF,vnTF} -\cs_new_nopar:Npn \knot_draw_crossing:nnn #1#2#3 +\cs_generate_variant:Nn \knot_test_endpoint:NnnT {NVnT,NvnT} +\cs_generate_variant:Nn \knot_test_endpoint:NnnF {NVnF,NvnF} +\cs_generate_variant:Nn \knot_test_endpoint:NnnTF {NVnTF,NvnTF} +\cs_new_protected_nopar:Npn \knot_draw_crossing:nnn #1#2#3 { \group_begin: \pgfscope - \path[knot~ diagram/background~ clip] (#2, #3) circle[radius=\l__knot_clip_bg_radius_dim]; + \path[knot~ diagram/background~ clip] (#2, #3) + circle[radius=\l__knot_clip_bg_radius_dim]; - \tl_set:Nn \l_tmpa_tl {knot~ diagram/every~ strand/.try,} + \tl_set:Nn \l__knot_tmpa_tl {knot~ diagram/every~ strand/.try,} \tl_if_exist:cT {l__knot_options_ #1} { - \tl_put_right:Nv \l_tmpa_tl {l__knot_options_ #1} + \tl_put_right:Nv \l__knot_tmpa_tl {l__knot_options_ #1} } - \tl_put_right:Nn \l_tmpa_tl {,knotbg,line~ width= \tl_use:N \l__knot_clip_width_tl * \pgflinewidth} - \spath_tikz_path:Vn \l_tmpa_tl {knot #1} + \tl_put_right:Nn \l__knot_tmpa_tl + { + ,knotbg + ,line~ width= \tl_use:N \l__knot_clip_width_tl * \pgflinewidth + } + \spath_tikz_path:Vv \l__knot_tmpa_tl {knot #1} \endpgfscope \pgfscope - \path[knot~ diagram/clip] (#2, #3) circle[radius=\l__knot_clip_draw_radius_dim]; + \path[knot~ diagram/clip] (#2, #3) + circle[radius=\l__knot_clip_draw_radius_dim]; - \tl_set:Nn \l_tmpa_tl {knot~ diagram/every~ strand/.try,} + \tl_set:Nn \l__knot_tmpa_tl {knot~ diagram/every~ strand/.try,} \tl_if_exist:cT {l__knot_options_ #1} { - \tl_put_right:Nv \l_tmpa_tl {l__knot_options_ #1} + \tl_put_right:Nv \l__knot_tmpa_tl {l__knot_options_ #1} + } + \tl_put_right:Nn \l__knot_tmpa_tl + { + ,knot~ diagram/only~ when~ rendering/.try + ,only~ when~ rendering/.try } - \tl_put_right:Nn \l_tmpa_tl {,knot~ diagram/only~ when~ rendering/.try,only~ when~ rendering/.try} - \spath_tikz_path:Vn \l_tmpa_tl {knot #1} + \spath_tikz_path:Vv \l__knot_tmpa_tl {knot #1} \endpgfscope \group_end: } -\cs_generate_variant:Nn \knot_draw_crossing:nnn {nVV} +\cs_generate_variant:Nn \knot_draw_crossing:nnn {nVV, VVV} -\cs_new_nopar:Npn \knot_draw_crossing:nn #1#2 +\cs_new_protected_nopar:Npn \knot_draw_crossing:nn #1#2 { \tikz@scan@one@point\pgfutil@firstofone #2 \relax \knot_draw_crossing:nVV {#1} \pgf@x \pgf@y } \cs_new_protected_nopar:Npn \knot_split_strands: { - \int_gzero:N \l__knot_filaments_int + \int_gzero:N \g__knot_filaments_int \int_step_function:nnnN {1} {1} {\l__knot_strands_int} \knot_split_strand:n - \int_step_function:nnnN {1} {1} {\l__knot_filaments_int} \knot_compute_nexts:n + \int_step_function:nnnN {1} {1} {\g__knot_filaments_int} \knot_compute_nexts:n } \cs_new_protected_nopar:Npn \knot_compute_nexts:n #1 { @@ -713,66 +832,83 @@ } \cs_new_protected_nopar:Npn \knot_split_strand:n #1 { - \int_set_eq:NN \l__knot_component_start_int \l__knot_filaments_int + \int_set_eq:NN \l__knot_component_start_int \g__knot_filaments_int \int_incr:N \l__knot_component_start_int \tl_set_eq:Nc \l__knot_tmpa_tl {l__knot_options_strand #1} - \spath_map_segment_function:nN {knot strand #1} \knot_save_filament:NN + \spath_segments_to_seq:Nv \l__knot_segments_seq {knot strand #1} + \seq_map_function:NN \l__knot_segments_seq \knot_save_filament:N } -\cs_new_protected_nopar:Npn \knot_save_filament:NN #1#2 +\cs_new_protected_nopar:Npn \knot_save_filament:N #1 { - \tl_case:NnF #1 + \tl_set:Nx \l__knot_tmpb_tl {\tl_item:nn {#1} {4}} + \tl_case:NnF \l__knot_tmpb_tl { - \g__spath_moveto_tl + \c_spath_moveto_tl { - \int_compare:nT {\l__knot_component_start_int < \l__knot_filaments_int} + \int_compare:nT {\l__knot_component_start_int < \g__knot_filaments_int} { - \int_set_eq:NN \l__knot_component_start_int \l__knot_filaments_int + \int_set_eq:NN \l__knot_component_start_int \g__knot_filaments_int } } - \g__spath_lineto_tl + \c_spath_lineto_tl { - \int_gincr:N \l__knot_filaments_int - \spath_clear_new:n {knot filament \int_use:N \l__knot_filaments_int} - \spath_put:nnV {knot filament \int_use:N \l__knot_filaments_int} {path} #2 - \tl_set_eq:cN {l__knot_options_filament \int_use:N \l__knot_filaments_int} \l__knot_tmpa_tl + \int_gincr:N \g__knot_filaments_int + \tl_clear_new:c {knot filament \int_use:N \g__knot_filaments_int} + \tl_set:cn {knot filament \int_use:N \g__knot_filaments_int} {#1} - \tl_clear_new:c {knot previous filament \int_use:N \l__knot_filaments_int} - \int_compare:nF {\l__knot_component_start_int == \l__knot_filaments_int} + \tl_clear_new:c {l__knot_options_filament \int_use:N \g__knot_filaments_int} + \tl_set_eq:cN {l__knot_options_filament \int_use:N \g__knot_filaments_int} + \l__knot_tmpa_tl + + \tl_clear_new:c {knot previous filament \int_use:N \g__knot_filaments_int} + \int_compare:nF {\l__knot_component_start_int == \g__knot_filaments_int} { - \tl_set:cx {knot previous filament \int_use:N \l__knot_filaments_int} {filament \int_eval:n {\l__knot_filaments_int - 1}} + \tl_set:cx {knot previous filament \int_use:N \g__knot_filaments_int} + {filament \int_eval:n {\g__knot_filaments_int - 1}} } } - \g__spath_curvetoa_tl + \c_spath_curvetoa_tl { - \int_gincr:N \l__knot_filaments_int - \spath_clear_new:n {knot filament \int_use:N \l__knot_filaments_int} - \spath_put:nnV {knot filament \int_use:N \l__knot_filaments_int} {path} #2 - \tl_set_eq:cN {l__knot_options_filament \int_use:N \l__knot_filaments_int} \l__knot_tmpa_tl + \int_gincr:N \g__knot_filaments_int + \tl_clear_new:c {knot filament \int_use:N \g__knot_filaments_int} + \tl_set:cn {knot filament \int_use:N \g__knot_filaments_int} {#1} + \tl_clear_new:c {l__knot_options_filament \int_use:N \g__knot_filaments_int} + \tl_set_eq:cN {l__knot_options_filament \int_use:N \g__knot_filaments_int} + \l__knot_tmpa_tl - \tl_clear_new:c {knot previous filament \int_use:N \l__knot_filaments_int} - \int_compare:nF {\l__knot_component_start_int == \l__knot_filaments_int} + \tl_clear_new:c {knot previous filament \int_use:N \g__knot_filaments_int} + \int_compare:nF {\l__knot_component_start_int == \g__knot_filaments_int} { - \tl_set:cx {knot previous filament \int_use:N \l__knot_filaments_int} {filament \int_eval:n {\l__knot_filaments_int - 1}} + \tl_set:cx + {knot previous filament \int_use:N \g__knot_filaments_int} + {filament \int_eval:n {\g__knot_filaments_int - 1}} } } - \g__spath_closepath_tl + \c_spath_closepath_tl { - \tl_show:N #2 - \int_gincr:N \l__knot_filaments_int - \spath_clear_new:n {knot filament \int_use:N \l__knot_filaments_int} - \tl_clear:N \l_tmpa_tl - \tl_put_right:Nx {\tl_item:Nn #2 {1}\tl_item:Nn #2 {2}\tl_item:Nn #2 {3}} - \tl_put_right:NV \l_tmpa_tl \g__spath_lineto_tl - \tl_put_right:Nx {\tl_item:Nn #2 {5}\tl_item:Nn #2 {6}} - \tl_show:N \l_tmpa_tl - \spath_put:nnV {knot filament \int_use:N \l__knot_filaments_int} {path} \l_tmpa_tl - \tl_set_eq:cN {l__knot_options_filament \int_use:N \l__knot_filaments_int} \l__knot_tmpa_tl - \tl_clear_new:c {knot previous filament \int_use:N \l__knot_filaments_int} - \int_compare:nF {\l__knot_component_start_int == \l__knot_filaments_int} + \int_gincr:N \g__knot_filaments_int + \tl_clear_new:c {knot filament \int_use:N \g__knot_filaments_int} + \tl_clear:N \l__knot_tmpa_tl + \tl_put_right:Nx + { + \tl_item:nn {#1} {1}\tl_item:nn {#1} {2}\tl_item:nn {#1} {3} + } + \tl_put_right:NV \l__knot_tmpa_tl \c_spath_lineto_tl + \tl_put_right:Nx {\tl_item:nn {#1} {5}\tl_item:nn {#1} {6}} + + \tl_set:cV {knot filament \int_use:N \g__knot_filaments_int} \l__knot_tmpa_tl + \tl_set_eq:cN {l__knot_options_filament \int_use:N \g__knot_filaments_int} + \l__knot_tmpa_tl + \tl_clear_new:c {knot previous filament \int_use:N \g__knot_filaments_int} + \int_compare:nF {\l__knot_component_start_int == \g__knot_filaments_int} { - \tl_set:cx {knot previous filament \int_use:N \l__knot_filaments_int} {filament \int_eval:n {\l__knot_filaments_int - 1}} + \tl_set:cx + {knot previous filament \int_use:N \g__knot_filaments_int} + {filament \int_eval:n {\g__knot_filaments_int - 1}} } - \tl_set:cx {knot previous filament \int_use:N \l__knot_component_start_int} {filament \int_use:N \l__knot_filaments_int} + \tl_set:cx + {knot previous filament \int_use:N \l__knot_component_start_int} + {filament \int_use:N \g__knot_filaments_int} } } { @@ -990,7 +1126,7 @@ } } %% -%% Copyright (C) 2011-2019 by Andrew Stacey <stacey@math.ntnu.no> +%% Copyright (C) 2011-2021 by Andrew Stacey <loopspace@mathforge.org> %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License (LPPL), either @@ -1002,16 +1138,19 @@ %% This work is "maintained" (as per LPPL maintenance status) by %% Andrew Stacey. %% -%% This work consists of the files spath3.dtx +%% This work consists of the files spath3_code.dtx %% calligraphy_doc.tex %% knots_doc.tex +%% spath3.tex %% and the derived files spath3.ins, %% spath3_code.pdf, %% spath3.sty, %% tikzlibrarycalligraphy.code.tex %% tikzlibraryknots.code.tex +%% tikzlibraryspath3.code.tex %% calligraphy.pdf %% knots.pdf +%% spath3.pdf %% README %% %% diff --git a/Master/texmf-dist/tex/latex/spath3/tikzlibraryspath3.code.tex b/Master/texmf-dist/tex/latex/spath3/tikzlibraryspath3.code.tex new file mode 100644 index 00000000000..9c1c158e52a --- /dev/null +++ b/Master/texmf-dist/tex/latex/spath3/tikzlibraryspath3.code.tex @@ -0,0 +1,1447 @@ +%% +%% This is file `tikzlibraryspath3.code.tex', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% spath3_code.dtx (with options: `tikzspath3') +%% ---------------------------------------------------------------- +%% spath3 --- Functions for manipulating PGF soft paths +%% E-mail: loopspace@mathforge.org +%% Released under the LaTeX Project Public License v1.3c or later +%% See http://www.latex-project.org/lppl.txt +%% ---------------------------------------------------------------- +%% +\RequirePackage{spath3} +\RequirePackage{expl3} +\ExplSyntaxOn + +\tl_new:N \l__spath_current_tl +\tl_new:N \l__spath_reverse_tl +\tl_new:N \l__spath_prefix_tl +\tl_new:N \l__spath_suffix_tl +\tl_new:N \g__spath_smuggle_tl +\seq_new:N \g__spath_tmpa_seq +\seq_new:N \g__spath_tmpb_seq +\bool_new:N \l__spath_draft_bool +\msg_new:nnn { spath3 } { missing soft path } { Soft~ path~ #1~ doesn't~ exist } +\msg_new:nnn { spath3 } { empty soft path } { Soft~ path~ #1~ is~ empty } +\tl_set:Nn \l__spath_prefix_tl {tikz@intersect@path@name@} +\tl_set:Nn \l__spath_suffix_tl {} +\tl_new:N \g__spath_tikzfinish_tl +\cs_new_protected_nopar:Npn \spath_at_end_of_path: +{ + \tl_use:N \g__spath_tikzfinish_tl + \tl_gclear:N \g__spath_tikzfinish_tl +} +\tl_put_right:Nn \tikz@finish {\spath_at_end_of_path:} + +\cs_new_protected_nopar:Npn \spath_save_path:Nn #1#2 +{ + \tl_gput_right:Nn \g__spath_tikzfinish_tl + { + \tl_clear_new:N #1 + \tl_set:Nn #1 {#2} + } +} +\cs_generate_variant:Nn \spath_save_path:Nn {cn, NV, cV} + +\cs_new_protected_nopar:Npn \spath_gsave_path:Nn #1#2 +{ + \tl_gput_right:Nn \g__spath_tikzfinish_tl + { + \tl_gclear_new:N #1 + \tl_gset:Nn #1 {#2} + } +} +\cs_generate_variant:Nn \spath_gsave_path:Nn {cn, NV, cV} +\cs_new_protected_nopar:Npn \__spath_process_tikz_point:Nn #1#2 +{ + \group_begin: + \use:c {tikz@scan@one@point} \use:n #2 \scan_stop: + \tl_gset:Nx \g__spath_output_tl + { + { \dim_use:c {pgf@x} } + { \dim_use:c {pgf@y} } + } + \group_end: + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_set_eq:NN \getComponentOf \clist_item:Nn +\tikzset{ + spath/.is~family, + spath/.cd, + set~ prefix/.store~ in=\l__spath_prefix_tl, + prefix/.is~choice, + prefix/default/.style={ + /tikz/spath/set~ prefix=tikz@intersect@path@name@ + }, + set~ suffix/.store~ in=\l__spath_suffix_tl, + suffix/.is~choice, + suffix/default/.style={ + /tikz/spath/set~ suffix={} + }, + set~ name/.style={ + /tikz/spath/prefix=#1, + /tikz/spath/suffix=#1 + }, + save/.code={ + \tikz@addmode{ + \spath_get_current_path:N \l__spath_tmpa_tl + \spath_bake_round:NV \l__spath_tmpa_tl \l__spath_tmpa_tl + \spath_save_path:cV + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + \l__spath_tmpa_tl + } + }, + clone/.code~ 2~ args={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #2 \tl_use:N \l__spath_suffix_tl} + { + \tl_clear_new:c + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + \tl_set_eq:cc + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + {\tl_use:N \l__spath_prefix_tl #2 \tl_use:N \l__spath_suffix_tl} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #2 } + } + }, + clone~ global/.code~ 2~ args={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #2 \tl_use:N \l__spath_suffix_tl} + { + \tl_gclear_new:c + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + \tl_gset_eq:cc + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + {\tl_use:N \l__spath_prefix_tl #2 \tl_use:N \l__spath_suffix_tl} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #2 } + } + }, + save~ global/.code={ + \tikz@addmode{ + \spath_get_current_path:N \l__spath_tmpa_tl + \spath_bake_round:NV \l__spath_tmpa_tl \l__spath_tmpa_tl + \spath_gsave_path:cV + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + \l__spath_tmpa_tl + } + }, + save~ to~ aux/.code={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \spath_save_to_aux:c + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + restore/.code={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \tl_if_empty:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \tl_clear:N \l__spath_tmpa_tl + \tl_put_right:NV \l__spath_tmpa_tl \c_spath_moveto_tl + \tl_put_right:Nn \l__spath_tmpa_tl {{0pt}{0pt}} + \spath_set_current_path:V \l__spath_tmpa_tl + \spath_set_tikz_data:V \l__spath_tmpa_tl + \msg_warning:nnn { spath3 } { empty soft path } { #1 } + } + { + \spath_set_current_path:c + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + \spath_set_tikz_data:v + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + } + } + { + \tl_clear:N \l__spath_tmpa_tl + \tl_put_right:NV \l__spath_tmpa_tl \c_spath_moveto_tl + \tl_put_right:Nn \l__spath_tmpa_tl {{0pt}{0pt}} + \spath_set_current_path:V \l__spath_tmpa_tl + \spath_set_tikz_data:V \l__spath_tmpa_tl + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + restore~ reverse/.code={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \tl_if_empty:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \tl_clear:N \l__spath_tmpa_tl + \tl_put_right:NV \l__spath_tmpa_tl \c_spath_moveto_tl + \tl_put_right:Nn \l__spath_tmpa_tl {{0pt}{0pt}} + \spath_set_current_path:V \l__spath_tmpa_tl + \spath_set_tikz_data:V \l__spath_tmpa_tl + \msg_warning:nnn { spath3 } { empty soft path } { #1 } + } + { + \spath_reverse:Nv + \l__spath_reverse_tl + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + \spath_set_current_path:N \l__spath_reverse_tl + \spath_set_tikz_data:V \l__spath_reverse_tl + } + } + { + \tl_clear:N \l__spath_tmpa_tl + \tl_put_right:NV \l__spath_tmpa_tl \c_spath_moveto_tl + \tl_put_right:Nn \l__spath_tmpa_tl {{0pt}{0pt}} + \spath_set_current_path:V \l__spath_tmpa_tl + \spath_set_tikz_data:V \l__spath_tmpa_tl + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + show~current~path/.code={ + \tikz@addmode{ + \pgfsyssoftpath@getcurrentpath\l__spath_tmpa_tl + \iow_term:n {---~ current~ soft~ path~ ---} + \spath_show:V \l__spath_tmpa_tl + } + }, + show/.code={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \tl_if_empty:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \msg_warning:nnn { spath3 } { empty soft path } { #1 } + } + { + \iow_term:n {---~ soft~ path~ #1~ ---} + \spath_show:v + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + } + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + append/.code={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \spath_get_current_path:N \l__spath_current_tl + \spath_finalpoint:NV \l__spath_tmpa_tl \l__spath_current_tl + \tl_set_eq:Nc + \l__spath_tmpb_tl + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + \spath_translate_to:NV \l__spath_tmpb_tl \l__spath_tmpa_tl + \spath_append_no_move:NV \l__spath_current_tl \l__spath_tmpb_tl + \spath_set_current_path:N \l__spath_current_tl + \spath_set_tikz_data:V \l__spath_tmpb_tl + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + join~ with/.code~ 2~ args={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #2 \tl_use:N \l__spath_suffix_tl} + { + \spath_append:cv + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + {\tl_use:N \l__spath_prefix_tl #2 \tl_use:N \l__spath_suffix_tl} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #2 } + } + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + spot~ weld/.code={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \spath_spot_weld_components:c + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + spot~ weld~ globally/.code={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \spath_spot_gweld_components:c + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + reverse/.code={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \spath_reverse:c + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + reverse~ globally/.code={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \spath_reverse:c + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + append~ reverse/.code={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \spath_reverse:Nv + \l__spath_reverse_tl + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + \spath_get_current_path:N \l__spath_current_tl + \spath_finalpoint:NV \l__spath_tmpa_tl \l__spath_current_tl + \spath_translate_to:NV \l__spath_reverse_tl \l__spath_tmpa_tl + \spath_append_no_move:NV \l__spath_current_tl \l__spath_reverse_tl + \spath_set_current_path:N \l__spath_current_tl + \spath_set_tikz_data:V \l__spath_reverse_tl + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + insert/.code={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \spath_get_current_path:N \l__spath_current_tl + \spath_append:Nv + \l__spath_current_tl + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + \spath_set_current_path:N \l__spath_current_tl + \spath_set_tikz_data:v + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + insert~ reverse/.code={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \spath_reverse:Nv + \l__spath_reverse_tl + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + \spath_get_current_path:N \l__spath_current_tl + \spath_append:NV \l__spath_current_tl \l__spath_reverse_tl + \spath_set_current_path:N \l__spath_current_tl + \spath_set_tikz_data:V \l__spath_reverse_tl + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + append~ no~ move/.code={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \spath_get_current_path:N \l__spath_current_tl + \spath_append_no_move:Nv + \l__spath_current_tl + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + \spath_set_current_path:N \l__spath_current_tl + \spath_set_tikz_data:v + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + append~ reverse~ no~ move/.code={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \spath_reverse:Nv + \l__spath_reverse_tl + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + \spath_get_current_path:N \l__spath_current_tl + \spath_append_no_move:NV \l__spath_current_tl \l__spath_reverse_tl + \spath_set_current_path:N \l__spath_current_tl + \spath_set_tikz_data:V \l__spath_reverse_tl + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + span/.code ~n~ args={3}{ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \__spath_process_tikz_point:Nn \l__spath_tmpa_tl {#2} + \__spath_process_tikz_point:Nn \l__spath_tmpb_tl {#3} + \spath_span:cVV + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + \l__spath_tmpa_tl \l__spath_tmpb_tl + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + span~ global/.code ~n~ args={3}{ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \__spath_process_tikz_point:Nn \l__spath_tmpa_tl {#2} + \__spath_process_tikz_point:Nn \l__spath_tmpb_tl {#3} + \spath_gspan:cVV + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + \l__spath_tmpa_tl \l__spath_tmpb_tl + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + to/.style={ + to~path={ + [ + spath/span={#1}{(\tikztostart)}{(\tikztotarget)}, + spath/append~no~move={#1}, + ] + \tikztonodes + } + }, + splice/.code ~n~ args={3}{ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #2 \tl_use:N \l__spath_suffix_tl} + { + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #3 \tl_use:N \l__spath_suffix_tl} + { + \spath_splice_between:cvv + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + {\tl_use:N \l__spath_prefix_tl #2 \tl_use:N \l__spath_suffix_tl} + {\tl_use:N \l__spath_prefix_tl #3 \tl_use:N \l__spath_suffix_tl} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #3 } + } + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #2 } + } + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + splice~ global/.code ~n~ args={3}{ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #2 \tl_use:N \l__spath_suffix_tl} + { + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #3 \tl_use:N \l__spath_suffix_tl} + { + \spath_gsplice_between:cvv + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + {\tl_use:N \l__spath_prefix_tl #2 \tl_use:N \l__spath_suffix_tl} + {\tl_use:N \l__spath_prefix_tl #3 \tl_use:N \l__spath_suffix_tl} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #3 } + } + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #2 } + } + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + join~ components~ with/.code~2~args={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #2 \tl_use:N \l__spath_suffix_tl} + { + \spath_spot_weld_components:c + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + + \spath_components_to_seq:Nv + \l__spath_tmpa_seq + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + + \seq_pop_left:NN \l__spath_tmpa_seq \l__spath_tmpa_tl + + \seq_map_inline:Nn \l__spath_tmpa_seq + { + \spath_splice_between:Nvn \l__spath_tmpa_tl + {\tl_use:N \l__spath_prefix_tl #2 \tl_use:N \l__spath_suffix_tl} + {##1} + } + \tl_set_eq:cN + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + \l__spath_tmpa_tl + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #2 } + } + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + join~ components~ globally~ with/.code~2~args={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #2 \tl_use:N \l__spath_suffix_tl} + { + \spath_spot_gweld_components:c + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + + \spath_components_to_seq:Nv + \l__spath_tmpa_seq + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + + \seq_pop_left:NN \l__spath_tmpa_seq \l__spath_tmpa_tl + + \seq_map_inline:Nn \l__spath_tmpa_seq + { + \spath_gsplice_between:Nvn \l__spath_tmpa_tl + {\tl_use:N \l__spath_prefix_tl #2 \tl_use:N \l__spath_suffix_tl} + {##1} + } + \tl_set_eq:cN + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + \l__spath_tmpa_tl + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #2 } + } + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + close/.code={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \spath_close:c + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + close~ globally/.code={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \spath_gclose:c + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + close~ with/.code~ 2~ args={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #2 \tl_use:N \l__spath_suffix_tl} + { + \spath_close_with:cv + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + {\tl_use:N \l__spath_prefix_tl #2 \tl_use:N \l__spath_suffix_tl} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #2 } + } + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + close~ globally~ with/.code~ 2~ args={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #2 \tl_use:N \l__spath_suffix_tl} + { + \spath_gclose_with:cv + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + {\tl_use:N \l__spath_prefix_tl #2 \tl_use:N \l__spath_suffix_tl} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #2 } + } + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + shorten~ at~ end/.code~ 2~ args={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \spath_shorten_at_end:cn + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} {#2} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + shorten~ at~ start/.code~ 2~ args ={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \spath_shorten_at_start:cn + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} {#2} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + shorten~ at~ both~ ends/.code~ 2~ args={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \spath_shorten_at_end:cn + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} {#2} + \spath_shorten_at_start:cn + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} {#2} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + shorten~ globally~ at~ end/.code~ 2~ args={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \spath_gshorten_at_end:cn + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} {#2} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + shorten~ globally~ at~ start/.code~ 2~ args ={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \spath_gshorten_at_start:cn + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} {#2} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + shorten~ globally~ at~ both~ ends/.code~ 2~ args={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \spath_shorten_at_end:cn + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} {#2} + \spath_shorten_at_start:cn + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} {#2} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + translate/.code~ n~ args={3}{ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \spath_translate:cnn + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl}{#2}{#3} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + translate~ globally/.code~ n~ args={3}{ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \spath_gtranslate:cnn + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl}{#2}{#3} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + normalise/.code={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \spath_normalise:c + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + normalise~ globally/.code={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \spath_gnormalise:c + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + export~ to~ svg/.code={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \spath_export_to_svg:nv {#1} + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + transform/.code~ 2~ args={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \group_begin: + \pgftransformreset + \tikzset{#2} + \pgfgettransform \l__spath_tmpa_tl + \tl_gset:Nn \g__spath_smuggle_tl + { + \spath_transform:cnnnnnn + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + } + \tl_gput_right:NV \g__spath_smuggle_tl \l__spath_tmpa_tl + \group_end: + \tl_use:N \g__spath_smuggle_tl + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + transform~globally/.code~ 2~ args={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \group_begin: + \pgftransformreset + \tikzset{#2} + \pgfgettransform \l__spath_tmpa_tl + \tl_gset:Nn \g__spath_smuggle_tl + { + \spath_gtransform:cnnnnnn + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + } + \tl_gput_right:NV \g__spath_smuggle_tl \l__spath_tmpa_tl + \group_end: + \tl_use:N \g__spath_smuggle_tl + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + split~ at~ intersections~ with/.code~ n~ args={2}{ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #2 \tl_use:N \l__spath_suffix_tl} + { + \spath_split_path_at_intersections:cv + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + {\tl_use:N \l__spath_prefix_tl #2 \tl_use:N \l__spath_suffix_tl} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #2 } + } + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + split~ globally~ at~ intersections~ with/.code~ n~ args={2}{ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #2 \tl_use:N \l__spath_suffix_tl} + { + \spath_gsplit_path_at_intersections:cv + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + {\tl_use:N \l__spath_prefix_tl #2 \tl_use:N \l__spath_suffix_tl} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #2 } + } + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + split~ at~ intersections/.code~ n~ args={2}{ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #2 \tl_use:N \l__spath_suffix_tl} + { + \spath_split_at_intersections:cc + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + {\tl_use:N \l__spath_prefix_tl #2 \tl_use:N \l__spath_suffix_tl} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #2 } + } + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + split~ globally~ at~ intersections/.code~ n~ args={2}{ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #2 \tl_use:N \l__spath_suffix_tl} + { + \spath_gsplit_at_intersections:cc + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + {\tl_use:N \l__spath_prefix_tl #2 \tl_use:N \l__spath_suffix_tl} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #2 } + } + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + split~ at~ self~ intersections/.code={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \spath_split_at_self_intersections:c + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + split~ globally~ at~ self~ intersections/.code={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \spath_gsplit_at_self_intersections:c + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + get~ components~ of/.code~ 2~ args={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \clist_clear_new:N #2 + \spath_components_to_seq:Nv + \l__spath_tmpa_seq + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + \seq_map_inline:Nn \l__spath_tmpa_seq + { + \tl_new:c + { + \tl_use:N \l__spath_prefix_tl + anonymous_\int_use:N \g__spath_anon_int + \tl_use:N \l__spath_suffix_tl + } + \tl_set:cn + { + \tl_use:N \l__spath_prefix_tl + anonymous_\int_use:N \g__spath_anon_int + \tl_use:N \l__spath_suffix_tl + } {##1} + \clist_put_right:Nx #2 {anonymous_\int_use:N \g__spath_anon_int} + \int_gincr:N \g__spath_anon_int + } + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + get~ components~ of~ globally/.code~ 2~ args={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \clist_gclear_new:N #2 + \spath_components_to_seq:Nv + \l__spath_tmpa_seq + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + \seq_map_inline:Nn \l__spath_tmpa_seq + { + \tl_new:c + { + \tl_use:N \l__spath_prefix_tl + anonymous_\int_use:N \g__spath_anon_int + \tl_use:N \l__spath_suffix_tl + } + \tl_gset:cn + { + \tl_use:N \l__spath_prefix_tl + anonymous_\int_use:N \g__spath_anon_int + \tl_use:N \l__spath_suffix_tl + } {##1} + \clist_gput_right:Nx #2 {anonymous_\int_use:N \g__spath_anon_int} + \int_gincr:N \g__spath_anon_int + } + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + render~ components/.code={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \group_begin: + \spath_components_to_seq:Nv + \l__spath_tmpa_seq + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + \seq_map_indexed_inline:Nn \l__spath_tmpa_seq + { + \spath_tikz_path:nn + { + every~ spath~ component/.try, + spath ~component~ ##1/.try, + spath ~component/.try={##1}, + every~ #1~ component/.try, + #1 ~component~ ##1/.try, + #1 ~component/.try={##1}, + } + { + ##2 + } + } + \group_end: + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + insert~ gaps~ after~ components/.code~ n~ args={3}{ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \group_begin: + \seq_gclear:N \g__spath_tmpa_seq + \seq_gclear:N \g__spath_tmpb_seq + \spath_numberofcomponents:Nv \l__spath_tmpa_int + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + \foreach \l__spath_tmpa_tl in {#3} + { + \seq_gput_right:NV \g__spath_tmpa_seq \l__spath_tmpa_tl + \seq_gput_right:Nx + \g__spath_tmpb_seq + {\int_eval:n + { + \int_mod:nn { \l__spath_tmpa_tl }{ \l__spath_tmpa_int } + 1 + } + } + } + \spath_components_to_seq:Nv + \l__spath_tmpa_seq + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + \seq_clear:N \l__spath_tmpb_seq + \seq_map_indexed_inline:Nn \l__spath_tmpa_seq + { + \tl_set:Nn \l__spath_tmpa_tl {##2} + \seq_if_in:NnT \g__spath_tmpa_seq {##1} + { + \spath_shorten_at_end:Nn \l__spath_tmpa_tl {#2/2} + } + \seq_if_in:NnT \g__spath_tmpb_seq {##1} + { + \spath_shorten_at_start:Nn \l__spath_tmpa_tl {#2/2} + } + \seq_put_right:NV \l__spath_tmpb_seq \l__spath_tmpa_tl + } + \tl_gset:Nx \g__spath_output_tl {\seq_use:Nn \l__spath_tmpb_seq {} } + \group_end: + \tl_set_eq:cN + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + insert~ gaps~ globally~ after~ components/.code~ n~ args={3}{ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \group_begin: + \seq_gclear:N \g__spath_tmpa_seq + \seq_gclear:N \g__spath_tmpb_seq + \spath_numberofcomponents:Nv \l__spath_tmpa_int + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + \foreach \l__spath_tmpa_tl in {#3} + { + \seq_gput_right:NV \g__spath_tmpa_seq \l__spath_tmpa_tl + \seq_gput_right:Nx + \g__spath_tmpb_seq + { + \int_eval:n + { + \int_mod:nn { \l__spath_tmpa_tl }{ \l__spath_tmpa_int } + 1 + } + } + } + \spath_components_to_seq:Nv + \l__spath_tmpa_seq + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + \seq_clear:N \l__spath_tmpb_seq + \seq_map_indexed_inline:Nn \l__spath_tmpa_seq + { + \tl_set:Nn \l__spath_tmpa_tl {##2} + \seq_if_in:NnT \g__spath_tmpa_seq {##1} + { + \spath_shorten_at_end:Nn \l__spath_tmpa_tl {#2/2} + } + \seq_if_in:NnT \g__spath_tmpb_seq {##1} + { + \spath_shorten_at_start:Nn \l__spath_tmpa_tl {#2/2} + } + \seq_put_right:NV \l__spath_tmpb_seq \l__spath_tmpa_tl + } + \tl_gset:Nx \g__spath_output_tl {\seq_use:Nn \l__spath_tmpb_seq {} } + \group_end: + \tl_gset_eq:cN + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + join~ components/.code~ 2~ args={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \seq_gclear:N \g__spath_tmpa_seq + \foreach \l__spath_tmpa_tl in {#2} + { + \seq_gput_right:NV \g__spath_tmpa_seq \l__spath_tmpa_tl + } + \seq_gsort:Nn \g__spath_tmpa_seq + { + \int_compare:nNnTF {##1} > {##2} + { \sort_return_same: } + { \sort_return_swapped: } + } + \seq_map_inline:Nn \g__spath_tmpa_seq + { + \spath_join_component:cn + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl}{##1} + } + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + join~ components~ globally/.code~ 2~ args={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \seq_gclear:N \g__spath_tmpa_seq + \foreach \l__spath_tmpa_tl in {#2} + { + \seq_gput_right:NV \g__spath_tmpa_seq \l__spath_tmpa_tl + } + \seq_gsort:Nn \g__spath_tmpa_seq + { + \int_compare:nNnTF {##1} > {##2} + { \sort_return_same: } + { \sort_return_swapped: } + } + \seq_map_inline:Nn \g__spath_tmpa_seq + { + \spath_gjoin_component:cn + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl}{##1} + } + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + remove~ empty~ components/.code={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \spath_remove_empty_components:c + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + remove~ empty~ components~ globally/.code={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \spath_gremove_empty_components:c + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + remove~ components/.code~ 2~ args={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \seq_gclear:N \g__spath_tmpa_seq + \foreach \l__spath_tmpa_tl in {#2} + { + \seq_gput_right:NV \g__spath_tmpa_seq \l__spath_tmpa_tl + } + \seq_gsort:Nn \g__spath_tmpa_seq + { + \int_compare:nNnTF {##1} < {##2} + { \sort_return_same: } + { \sort_return_swapped: } + } + \spath_components_to_seq:Nv + \l__spath_tmpa_seq + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + \seq_gpop_left:NNF \g__spath_tmpa_seq \l__spath_tmpa_tl + { + \tl_clear:N \l__spath_tmpa_tl + } + \seq_clear:N \l__spath_tmpb_seq + \seq_map_indexed_inline:Nn \l__spath_tmpa_seq + { + \tl_set:Nn \l__spath_tmpb_tl {##1} + \tl_if_eq:NNTF \l__spath_tmpb_tl \l__spath_tmpa_tl + { + \seq_gpop_left:NNF \g__spath_tmpa_seq \l__spath_tmpa_tl + { + \tl_clear:N \l__spath_tmpa_tl + } + } + { + \seq_put_right:Nn \l__spath_tmpb_seq {##2} + } + } + \tl_set:cx {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + {\seq_use:Nn \l__spath_tmpb_seq {} } + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + remove~ components~ globally/.code~ 2~ args={ + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \seq_gclear:N \g__spath_tmpa_seq + \foreach \l__spath_tmpa_tl in {#2} + { + \seq_gput_right:NV \g__spath_tmpa_seq \l__spath_tmpa_tl + } + \seq_gsort:Nn \g__spath_tmpa_seq + { + \int_compare:nNnTF {##1} < {##2} + { \sort_return_same: } + { \sort_return_swapped: } + } + \spath_components_to_seq:Nv + \l__spath_tmpa_seq + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + \seq_gpop_left:NNF \g__spath_tmpa_seq \l__spath_tmpa_tl + { + \tl_clear:N \l__spath_tmpa_tl + } + \seq_clear:N \l__spath_tmpb_seq + \seq_map_indexed_inline:Nn \l__spath_tmpa_seq + { + \tl_set:Nn \l__spath_tmpb_tl {##1} + \tl_if_eq:NNTF \l__spath_tmpb_tl \l__spath_tmpa_tl + { + \seq_gpop_left:NNF \g__spath_tmpa_seq \l__spath_tmpa_tl + { + \tl_clear:N \l__spath_tmpa_tl + } + } + { + \seq_put_right:Nn \l__spath_tmpb_seq {##2} + } + } + \tl_gset:cx {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + {\seq_use:Nn \l__spath_tmpb_seq {} } + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + }, + draft~ mode/.is~ choice, + draft~ mode/true/.code={ + \bool_set_true:N \l__spath_draft_bool + }, + draft~ mode/false/.code={ + \bool_set_false:N \l__spath_draft_bool + }, + maybe~ spot~ weld/.code={ + \bool_if:NF \l__spath_draft_bool + { + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \spath_spot_weld_components:c + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + } + }, + maybe~ spot~ weld~ globally/.code={ + \bool_if:NF \l__spath_draft_bool + { + \tl_if_exist:cTF + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + { + \spath_spot_gweld_components:c + {\tl_use:N \l__spath_prefix_tl #1 \tl_use:N \l__spath_suffix_tl} + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + } + } + }, + transform~ to/.code~ 2~ args={ + \group_begin: + \tl_if_exist:cTF + { + \tl_use:N \l__spath_prefix_tl + #1 + \tl_use:N \l__spath_suffix_tl + } + { + \spath_reallength:Nv + \l__spath_tmpa_int + { + \tl_use:N \l__spath_prefix_tl + #1 + \tl_use:N \l__spath_suffix_tl + } + + \tl_set:Nx \l__spath_tmpb_tl + {\fp_to_decimal:n {(#2) * (\l__spath_tmpa_int)}} + \spath_transformation_at:NvV \l__spath_tmpc_tl + { + \tl_use:N \l__spath_prefix_tl + #1 + \tl_use:N \l__spath_suffix_tl + } + \l__spath_tmpb_tl + \tl_gset_eq:NN \g__spath_smuggle_tl \l__spath_tmpc_tl + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + \tl_gset_eq:NN \g__spath_smuggle_tl { {1}{0}{0}{1}{0pt}{0pt} } + } + \group_end: + \exp_last_unbraced:NV \pgfsettransformentries \g__spath_smuggle_tl + \tl_gclear:N \g__spath_smuggle_tl + }, + upright~ transform~ to/.code~ 2~ args={ + \group_begin: + \tl_if_exist:cTF + { + \tl_use:N \l__spath_prefix_tl + #1 + \tl_use:N \l__spath_suffix_tl + } + { + \spath_reallength:Nv + \l__spath_tmpa_int + { + \tl_use:N \l__spath_prefix_tl + #1 + \tl_use:N \l__spath_suffix_tl + } + + \tl_set:Nx \l__spath_tmpb_tl + {\fp_to_decimal:n {(#2) * (\l__spath_tmpa_int)}} + \spath_transformation_at:NvV \l__spath_tmpc_tl + { + \tl_use:N \l__spath_prefix_tl + #1 + \tl_use:N \l__spath_suffix_tl + } + \l__spath_tmpb_tl + \tl_gset_eq:NN \g__spath_smuggle_tl \l__spath_tmpc_tl + } + { + \msg_warning:nnn { spath3 } { missing soft path } { #1 } + \tl_gset_eq:NN \g__spath_smuggle_tl { {1}{0}{0}{1}{0pt}{0pt} } + } + \fp_compare:nT { \tl_item:Nn \g__spath_smuggle_tl {4} < 0} + { + \tl_gset:Nx \g__spath_smuggle_tl + { + { \fp_eval:n { - (\tl_item:Nn \g__spath_smuggle_tl {1})} } + { \fp_eval:n { - (\tl_item:Nn \g__spath_smuggle_tl {2})} } + { \fp_eval:n { - (\tl_item:Nn \g__spath_smuggle_tl {3})} } + { \fp_eval:n { - (\tl_item:Nn \g__spath_smuggle_tl {4})} } + { \tl_item:Nn \g__spath_smuggle_tl {5} } + { \tl_item:Nn \g__spath_smuggle_tl {6} } + } + } + \group_end: + \exp_last_unbraced:NV \pgfsettransformentries \g__spath_smuggle_tl + \tl_gclear:N \g__spath_smuggle_tl + }, + knot/.style~ n~ args={3}{ + spath/split~ at~ self~ intersections=#1, + spath/remove~ empty~ components=#1, + spath/insert~ gaps~ after~ components={#1}{#2}{#3}, + spath/maybe~ spot~ weld=#1, + spath/render~ components=#1 + }, + global~ knot/.style~ n~ args={3}{ + spath/split~ globally~ at~ self~ intersections=#1, + spath/remove~ empty~ components~ globally=#1, + spath/insert~ gaps~ globally ~after~ components={#1}{#2}{#3}, + spath/maybe~ spot~ weld~ globally=#1, + spath/render~ components=#1 + }, +} +\tikzdeclarecoordinatesystem{spath}{% + \group_begin: + \tl_set:Nn \l__spath_tmpa_tl {#1} + \tl_trim_spaces:N \l__spath_tmpa_tl + + \seq_set_split:NnV \l__spath_tmpa_seq {~} \l__spath_tmpa_tl + \seq_pop_right:NN \l__spath_tmpa_seq \l__spath_tmpb_tl + + \tl_set:Nx \l__spath_tmpa_tl { \seq_use:Nn \l__spath_tmpa_seq {~} } + \tl_if_exist:cTF + { + \tl_use:N \l__spath_prefix_tl + \tl_use:N \l__spath_tmpa_tl + \tl_use:N \l__spath_suffix_tl + } + { + + \tl_set_eq:Nc + \l__spath_tmpa_tl + { + \tl_use:N \l__spath_prefix_tl + \tl_use:N \l__spath_tmpa_tl + \tl_use:N \l__spath_suffix_tl + } + + \tl_if_empty:NTF \l__spath_tmpa_tl + { + \tl_gset_eq:NN \g__spath_smuggle_tl \pgfpointorigin + } + { + \spath_reallength:NV \l__spath_tmpa_int \l__spath_tmpa_tl + \tl_set:Nx \l__spath_tmpb_tl + {\fp_to_decimal:n {(\l__spath_tmpb_tl) * (\l__spath_tmpa_int)}} + \spath_point_at:NVV \l__spath_tmpc_tl \l__spath_tmpa_tl \l__spath_tmpb_tl + + \tl_clear:N \l__spath_tmpd_tl + \tl_put_right:Nn \l__spath_tmpd_tl {\pgf@x=} + \tl_put_right:Nx \l__spath_tmpd_tl {\tl_item:Nn \l__spath_tmpc_tl {1}} + \tl_put_right:Nn \l__spath_tmpd_tl {\relax} + \tl_put_right:Nn \l__spath_tmpd_tl {\pgf@y=} + \tl_put_right:Nx \l__spath_tmpd_tl {\tl_item:Nn \l__spath_tmpc_tl {2}} + \tl_put_right:Nn \l__spath_tmpd_tl {\relax} + \tl_gset_eq:NN \g__spath_smuggle_tl \l__spath_tmpd_tl + } + } + { + \msg_warning:nnx { spath3 } { missing soft path } { \tl_use:N \l__spath_tmpa_tl } + \tl_gset_eq:NN \g__spath_smuggle_tl \pgfpointorigin + } + \group_end: + \use:c {pgf@process}{% + \tl_use:N \g__spath_smuggle_tl + \pgftransforminvert + \use:c {pgf@pos@transform@glob} + } +} + +\ExplSyntaxOff +%% +%% Copyright (C) 2011-2021 by Andrew Stacey <loopspace@mathforge.org> +%% +%% 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_code.dtx +%% calligraphy_doc.tex +%% knots_doc.tex +%% spath3.tex +%% and the derived files spath3.ins, +%% spath3_code.pdf, +%% spath3.sty, +%% tikzlibrarycalligraphy.code.tex +%% tikzlibraryknots.code.tex +%% tikzlibraryspath3.code.tex +%% calligraphy.pdf +%% knots.pdf +%% spath3.pdf +%% README +%% +%% +%% End of file `tikzlibraryspath3.code.tex'. |