diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/spath3/spath3.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/spath3/spath3.sty | 2146 |
1 files changed, 1488 insertions, 658 deletions
diff --git a/Master/texmf-dist/tex/latex/spath3/spath3.sty b/Master/texmf-dist/tex/latex/spath3/spath3.sty index 155441947b0..868e648f570 100644 --- a/Master/texmf-dist/tex/latex/spath3/spath3.sty +++ b/Master/texmf-dist/tex/latex/spath3/spath3.sty @@ -15,7 +15,7 @@ \NeedsTeXFormat{LaTeX2e} \RequirePackage{expl3} \RequirePackage{pgf} -\ProvidesExplPackage {spath3} {2021/01/19} {2.0} {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 @@ -40,29 +40,40 @@ manipulating PGF soft paths} \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_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 - -\tl_new:N \g__spath_output_tl -\int_new:N \g__spath_output_int -\seq_new:N \g__spath_output_seq +\seq_new:N \l__spath_tmpc_seq \dim_new:N \l__spath_tmpa_dim \dim_new:N \l__spath_tmpb_dim -\dim_new:N \l__spath_move_x_dim -\dim_new:N \l__spath_move_y_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 \l__spath_tmpb_int -\bool_new:N \g__spath_output_bool +\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} @@ -71,143 +82,136 @@ manipulating PGF soft paths} \tl_const:Nn \c_spath_closepath_tl {\pgfsyssoftpath@closepathtoken} \int_new:N \g__spath_anon_int \int_gzero:N \g__spath_anon_int -\tl_new:N \l__spath_itera_tl -\tl_new:N \l__spath_iterb_tl -\tl_new:N \l__spath_iterc_tl -\tl_new:N \l__spath_iterd_tl -\tl_new:N \l__spath_iterp_tl -\dim_new:N \l__spath_itera_dim -\dim_new:N \l__spath_iterb_dim -\seq_new:N \l__spath_iter_seq -\msg_new:nnn { spath3 } { unknown path construction } { The~ path~ construction~ element~ #1~ is~ not~ currently~ supported.} +\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 { \group_begin: - \tl_set:Nn \l__spath_itera_tl {#1} - \tl_clear:N \l__spath_iterb_tl - \seq_clear:N \l__spath_iter_seq - \dim_zero:N \l__spath_itera_dim - \dim_zero:N \l__spath_iterb_dim + \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_itera_tl + \tl_if_empty_p:N \l__spath_tmpa_tl } { - \tl_set:Nx \l__spath_iterc_tl {\tl_head:N \l__spath_itera_tl} - \tl_set:Nx \l__spath_itera_tl {\tl_tail:N \l__spath_itera_tl} - \tl_case:NnF \l__spath_iterc_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_iterb_tl \c_spath_moveto_tl - \tl_put_right:Nx \l__spath_iterb_tl {{\tl_head:N \l__spath_itera_tl}} - \dim_set:Nn \l__spath_itera_dim {\tl_head:N \l__spath_itera_tl} - \tl_set:Nx \l__spath_itera_tl {\tl_tail:N \l__spath_itera_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_iterb_tl {{\tl_head:N \l__spath_itera_tl}} - \dim_set:Nn \l__spath_iterb_dim {\tl_head:N \l__spath_itera_tl} - \tl_set:Nx \l__spath_itera_tl {\tl_tail:N \l__spath_itera_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_iterd_tl {\tl_head:N \l__spath_itera_tl} - \tl_if_eq:NNF \l__spath_iterd_tl \c_spath_moveto_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_iterb_tl + \tl_clear:N \l__spath_tmpb_tl } } \c_spath_lineto_tl { - \tl_set_eq:NN \l__spath_iterb_tl \c_spath_moveto_tl - \tl_put_right:Nx \l__spath_iterb_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_itera_dim} - {\dim_use:N \l__spath_iterb_dim} + {\dim_use:N \l__spath_tmpa_dim} + {\dim_use:N \l__spath_tmpb_dim} } - \tl_put_right:NV \l__spath_iterb_tl \c_spath_lineto_tl + \tl_put_right:NV \l__spath_tmpb_tl \c_spath_lineto_tl - \tl_put_right:Nx \l__spath_iterb_tl {{\tl_head:N \l__spath_itera_tl}} - \dim_set:Nn \l__spath_itera_dim {\tl_head:N \l__spath_itera_tl} - \tl_set:Nx \l__spath_itera_tl {\tl_tail:N \l__spath_itera_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_iterb_tl {{\tl_head:N \l__spath_itera_tl}} - \dim_set:Nn \l__spath_iterb_dim {\tl_head:N \l__spath_itera_tl} - \tl_set:Nx \l__spath_itera_tl {\tl_tail:N \l__spath_itera_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_iterb_tl \c_spath_moveto_tl - \tl_put_right:Nx \l__spath_iterb_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_itera_dim} - {\dim_use:N \l__spath_iterb_dim} + {\dim_use:N \l__spath_tmpa_dim} + {\dim_use:N \l__spath_tmpb_dim} } - \tl_put_right:NV \l__spath_iterb_tl \c_spath_curvetoa_tl + \tl_put_right:NV \l__spath_tmpb_tl \c_spath_curvetoa_tl \prg_replicate:nn {2} { - \tl_put_right:Nx \l__spath_iterb_tl {{\tl_head:N \l__spath_itera_tl}} - \tl_set:Nx \l__spath_itera_tl {\tl_tail:N \l__spath_itera_tl} - \tl_put_right:Nx \l__spath_iterb_tl {{\tl_head:N \l__spath_itera_tl}} - \tl_set:Nx \l__spath_itera_tl {\tl_tail:N \l__spath_itera_tl} - \tl_put_right:Nx \l__spath_iterb_tl {\tl_head:N \l__spath_itera_tl} - \tl_set:Nx \l__spath_itera_tl {\tl_tail:N \l__spath_itera_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} + \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} } - \tl_put_right:Nx \l__spath_iterb_tl {{\tl_head:N \l__spath_itera_tl}} - \dim_set:Nn \l__spath_itera_dim {\tl_head:N \l__spath_itera_tl} - \tl_set:Nx \l__spath_itera_tl {\tl_tail:N \l__spath_itera_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_iterb_tl {{\tl_head:N \l__spath_itera_tl}} - \dim_set:Nn \l__spath_iterb_dim {\tl_head:N \l__spath_itera_tl} - \tl_set:Nx \l__spath_itera_tl {\tl_tail:N \l__spath_itera_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_iterb_tl \c_spath_moveto_tl - \tl_put_right:Nx \l__spath_iterb_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_itera_dim} - {\dim_use:N \l__spath_iterb_dim} + {\dim_use:N \l__spath_tmpa_dim} + {\dim_use:N \l__spath_tmpb_dim} } - \tl_put_right:NV \l__spath_iterb_tl \c_spath_lineto_tl + \tl_put_right:NV \l__spath_tmpb_tl \c_spath_lineto_tl - \tl_put_right:Nx \l__spath_iterb_tl {{\tl_head:N \l__spath_itera_tl}} - \dim_set:Nn \l__spath_itera_dim {\tl_head:N \l__spath_itera_tl} - \tl_set:Nx \l__spath_itera_tl {\tl_tail:N \l__spath_itera_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_iterb_tl {{\tl_head:N \l__spath_itera_tl}} - \dim_set:Nn \l__spath_iterb_dim {\tl_head:N \l__spath_itera_tl} - \tl_set:Nx \l__spath_itera_tl {\tl_tail:N \l__spath_itera_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_iterb_tl \l__spath_iterc_tl - \tl_put_right:Nx \l__spath_iterb_tl {{\tl_head:N \l__spath_itera_tl}} - \dim_set:Nn \l__spath_itera_dim {\tl_head:N \l__spath_itera_tl} - \tl_set:Nx \l__spath_itera_tl {\tl_tail:N \l__spath_itera_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_iterb_tl {{\tl_head:N \l__spath_itera_tl}} - \dim_set:Nn \l__spath_iterb_dim {\tl_head:N \l__spath_itera_tl} - \tl_set:Nx \l__spath_itera_tl {\tl_tail:N \l__spath_itera_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_iterb_tl + \tl_if_empty:NF \l__spath_tmpb_tl { - \seq_put_right:NV \l__spath_iter_seq \l__spath_iterb_tl + \seq_put_right:NV \l__spath_tmpa_seq \l__spath_tmpb_tl } - \tl_clear:N \l__spath_iterb_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_iter_seq + \seq_gset_eq:NN \g__spath_output_seq \l__spath_tmpa_seq \group_end: } \cs_new_protected_nopar:Npn \spath_segments_to_seq:Nn #1#2 @@ -229,33 +233,33 @@ manipulating PGF soft paths} \cs_new_protected_nopar:Npn \__spath_components_to_seq:n #1 { \group_begin: - \tl_set:Nn \l__spath_itera_tl {#1} - \seq_clear:N \l__spath_iter_seq - \tl_set:Nx \l__spath_itera_tl {\tl_tail:N \l__spath_itera_tl} - \tl_put_right:NV \l__spath_itera_tl \c_spath_moveto_tl - \tl_set_eq:NN \l__spath_iterb_tl \c_spath_moveto_tl + \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_itera_tl + \tl_if_empty_p:N \l__spath_tmpa_tl } { - \tl_set:Nx \l__spath_iterc_tl {\tl_head:N \l__spath_itera_tl} - \tl_if_eq:NNT \l__spath_iterc_tl \c_spath_moveto_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_iter_seq \l__spath_iterb_tl - \tl_clear:N \l__spath_iterb_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_iterc_tl + \tl_if_single:NTF \l__spath_tmpc_tl { - \tl_put_right:NV \l__spath_iterb_tl \l__spath_iterc_tl + \tl_put_right:NV \l__spath_tmpb_tl \l__spath_tmpc_tl } { - \tl_put_right:Nx \l__spath_iterb_tl {{\l__spath_iterc_tl}} + \tl_put_right:Nx \l__spath_tmpb_tl {{\l__spath_tmpc_tl}} } - \tl_set:Nx \l__spath_itera_tl {\tl_tail:N \l__spath_itera_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_iter_seq + \seq_gset_eq:NN \g__spath_output_seq \l__spath_tmpa_seq \group_end: } \cs_new_protected_nopar:Npn \spath_components_to_seq:Nn #1#2 @@ -300,8 +304,8 @@ manipulating PGF soft paths} \group_begin: \int_set:Nn \l__spath_tmpa_int {0} \tl_map_inline:nn {#1} { - \tl_set:Nn \l__spath_tmpc_tl {##1} - \tl_case:NnT \l__spath_tmpc_tl + \tl_set:Nn \l__spath_tmpa_tl {##1} + \tl_case:NnT \l__spath_tmpa_tl { \c_spath_lineto_tl {} \c_spath_curveto_tl {} @@ -353,24 +357,24 @@ manipulating PGF soft paths} \int_set_eq:NN #1 \g__spath_output_int \int_gzero:N \g__spath_output_int } -\cs_generate_variant:Nn \spath_numberofcomponents:Nn {NV, cn, cV} +\cs_generate_variant:Nn \spath_numberofcomponents:Nn {NV, cn, cV, Nv} \cs_new_protected_nopar:Npn \spath_gnumberofcomponents:Nn #1#2 { \__spath_numberofcomponents:n {#2} \int_gset_eq:NN #1 \g__spath_output_int \int_gzero:N \g__spath_output_int } -\cs_generate_variant:Nn \spath_gnumberofcomponents:Nn {NV, cn, cV} +\cs_generate_variant:Nn \spath_gnumberofcomponents:Nn {NV, cn, cV, Nv} \cs_new_protected_nopar:Npn \__spath_initialpoint:n #1 { \group_begin: - \tl_clear:N \l__spath_tmpb_tl - \tl_set:Nx \l__spath_tmpb_tl + \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_tmpb_tl + \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpa_tl \group_end: } \cs_new_protected_nopar:Npn \spath_initialpoint:Nn #1#2 @@ -415,6 +419,50 @@ manipulating PGF soft paths} \tl_gclear:N \g__spath_output_tl } \cs_generate_variant:Nn \spath_gfinalpoint:Nn {NV, cn, cV, Nv} +\cs_new_protected_nopar:Npn \__spath_finalmovepoint:n #1 +{ + \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 + { + \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} } + } + } + } + \prg_replicate:nn {3} + { + \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} + } + } + \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpc_tl + \group_end: +} +\cs_new_protected_nopar:Npn \spath_finalmovepoint:Nn #1#2 +{ + \__spath_finalmovepoint:n {#2} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\cs_generate_variant:Nn \spath_finalmovepoint:Nn {NV, cn, cV} +\cs_new_protected_nopar:Npn \spath_gfinalmovepoint:Nn #1#2 +{ + \__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_gfinalmovepoint:Nn {NV, cn, cV} \cs_new_protected_nopar:Npn \__spath_reverse:n #1 { \group_begin: @@ -495,7 +543,10 @@ manipulating PGF soft paths} \bool_set_true:N \l__spath_closed_bool } { - \msg_warning:nnx { spath3 } { unknown path construction } {\l__spath_tmpc_tl } + \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} @@ -629,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 @@ -671,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 @@ -752,6 +807,7 @@ manipulating PGF soft paths} \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} @@ -786,6 +842,61 @@ manipulating PGF soft paths} \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} + + \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: @@ -865,8 +976,10 @@ manipulating PGF soft paths} \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} + \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} @@ -883,7 +996,8 @@ manipulating PGF soft paths} \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_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} @@ -922,39 +1036,276 @@ manipulating PGF soft paths} \spath_gtransform:NVnnnnnn #1#1#2 } \cs_generate_variant:Nn \spath_gtransform:Nn {cn, cV, NV} -\cs_new_protected_nopar:Npn \__spath_weld:nn #1#2 +\cs_new_protected_nopar:Npn \__spath_span:nnn #1#2#3 { \group_begin: - \tl_set:Nn \l__spath_tmpa_tl {#1} - \tl_set:Nn \l__spath_tmpb_tl {#2} - - \spath_finalpoint:NV \l__spath_tmpc_tl \l__spath_tmpa_tl - \spath_initialpoint:NV \l__spath_tmpd_tl \l__spath_tmpb_tl + \spath_initialpoint:Nn \l__spath_tmpa_tl {#1} + \spath_finalpoint:Nn \l__spath_tmpb_tl {#1} - \dim_set:Nn \l__spath_tmpa_dim + \fp_set:Nn \l__spath_tmpa_fp { - \tl_item:Nn \l__spath_tmpc_tl {1} - - - \tl_item:Nn \l__spath_tmpd_tl {1} + (\tl_item:Nn \l__spath_tmpb_tl {1}) - + (\tl_item:Nn \l__spath_tmpa_tl {1}) } - \dim_set:Nn \l__spath_tmpb_dim + \fp_set:Nn \l__spath_tmpb_fp { - \tl_item:Nn \l__spath_tmpc_tl {2} - - - \tl_item:Nn \l__spath_tmpd_tl {2} + (\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) } - \spath_translate:NVV \l__spath_tmpb_tl \l__spath_tmpa_dim \l__spath_tmpb_dim - - \prg_replicate:nn {3} + \fp_compare:nTF + { + \l__spath_tmpc_fp < 0.001 + } { - \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl} + \spath_translate_to:Nnnn \l__spath_tmpd_tl {#1} #2 } + { + \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_put_right:NV \l__spath_tmpa_tl \l__spath_tmpb_tl + \tl_set:Nx \l__spath_tmpc_tl + { + { + \fp_to_decimal:N \l__spath_tmpa_fp + } + { + \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 + { + \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_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_new_protected_nopar:Npn \spath_span:Nnnn #1#2#3#4 +{ + \__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_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 +{ + \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 + { + \dim_abs:n + { + \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} @@ -992,18 +1343,19 @@ manipulating PGF soft paths} \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} +\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} +\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} @@ -1015,7 +1367,7 @@ manipulating PGF soft paths} { \spath_gappend_no_move:NVn #1#1{#2} } -\cs_generate_variant:Nn \spath_gappend_no_move:Nn {NV, cv} +\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} @@ -1026,7 +1378,7 @@ manipulating PGF soft paths} { \spath_append:NVn #1#1{#2} } -\cs_generate_variant:Nn \spath_append:Nn {NV, Nv} +\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} @@ -1037,7 +1389,7 @@ manipulating PGF soft paths} { \spath_gappend:NVn #1#1{#2} } -\cs_generate_variant:Nn \spath_gappend:Nn {NV, Nv} +\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} @@ -1114,12 +1466,13 @@ manipulating PGF soft paths} { \group_begin: \tl_set:Nn \l__spath_tmpa_tl {#1} - \spath_initialpoint:NV \l__spath_tmpb_tl \l__spath_tmpa_tl + \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} @@ -1291,7 +1644,10 @@ manipulating PGF soft paths} \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} + \int_compare:nNnTF + {\tl_count:N \l__spath_tmpa_tl} + = + {\tl_count:N \l__spath_tmpb_tl} { \int_step_inline:nnnn {1} {3} {\tl_count:N \l__spath_tmpa_tl} { @@ -1303,13 +1659,27 @@ manipulating PGF soft paths} } \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 { \dim_abs:n { \l__spath_tmpa_dim - \l__spath_tmpb_dim} < 0.001pt } + \dim_compare:nF + { + \dim_abs:n + { + \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 } + \dim_compare:nF + { + \dim_abs:n + { + \l__spath_tmpa_dim - \l__spath_tmpb_dim + } + < 0.001pt + } { \bool_gset_false:N \g__spath_tmpa_bool } @@ -1354,11 +1724,15 @@ manipulating PGF soft paths} { {\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} + (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} + (1 - #2)^2 * \tl_item:nn {#1} {3} + + 2 * (1 - #2) * (#2) * \tl_item:nn {#1} {6} + + (#2)^2 * \tl_item:nn {#1} {9} }} } @@ -1367,11 +1741,17 @@ manipulating PGF soft paths} { {\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} + (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} + (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} }} } @@ -1384,11 +1764,17 @@ manipulating PGF soft paths} { {\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} + (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} + (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} }} } @@ -1397,11 +1783,15 @@ manipulating PGF soft paths} { {\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} + (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} + (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 @@ -1425,6 +1815,7 @@ manipulating PGF soft paths} \__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} @@ -1441,6 +1832,201 @@ manipulating PGF soft paths} \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 + { + \l__spath_tmpb_fp != 0 + } + { + \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 + } + { + \tl_set:Nx \l__spath_tmpc_tl {\tl_head:N \l__spath_tmpa_tl} + \tl_case:NnF \l__spath_tmpc_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} + } + } + + \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 + { + \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_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: @@ -1502,179 +2088,168 @@ manipulating PGF soft paths} \tl_gclear:N \g__spath_output_tl } \cs_generate_variant:Nn \spath_gsplit_line:NNnn {NNnV, NNVn, NNVV} -\int_new:N \l__spath_split_int -\int_new:N \l__spath_splitat_int -\fp_new:N \l__spath_split_fp -\bool_new:N \l__spath_split_bool -\tl_new:N \l__spath_split_path_tl -\tl_new:N \l__spath_split_patha_tl -\tl_new:N \l__spath_split_pathb_tl -\tl_new:N \l__spath_split_intoa_tl -\tl_new:N \l__spath_split_intob_tl -\dim_new:N \l__spath_splitx_dim -\dim_new:N \l__spath_splity_dim \cs_new_protected_nopar:Npn \__spath_split_at:nn #1#2 { \group_begin: - \int_set:Nn \l__spath_splitat_int {\fp_to_int:n {floor(#2) + 1}} - \fp_set:Nn \l__spath_split_fp {#2 - floor(#2)} + \int_set:Nn \l__spath_tmpa_int {\fp_to_int:n {floor(#2) + 1}} + \fp_set:Nn \l__spath_tmpa_fp {#2 - floor(#2)} % Is split point near one end or other of a component? \fp_compare:nT { - \l__spath_split_fp < 0.01 + \l__spath_tmpa_fp < 0.01 } { % Near the start, so we'll place it at the start - \fp_set:Nn \l__spath_split_fp {0} + \fp_set:Nn \l__spath_tmpa_fp {0} } \fp_compare:nT { - \l__spath_split_fp > 0.99 + \l__spath_tmpa_fp > 0.99 } { % Near the end, so we'll place it at the end - \fp_set:Nn \l__spath_split_fp {0} - \int_incr:N \l__spath_splitat_int + \fp_set:Nn \l__spath_tmpa_fp {0} + \int_incr:N \l__spath_tmpa_int } - \int_zero:N \l__spath_split_int - \bool_set_true:N \l__spath_split_bool + \int_zero:N \l__spath_tmpb_int + \bool_set_true:N \l__spath_tmpa_bool - \tl_set:Nn \l__spath_split_path_tl {#1} - \tl_clear:N \l__spath_split_patha_tl + \tl_set:Nn \l__spath_tmpe_tl {#1} + \tl_clear:N \l__spath_tmpc_tl - \dim_zero:N \l__spath_splitx_dim - \dim_zero:N \l__spath_splity_dim + \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_split_path_tl + \tl_if_empty_p:N \l__spath_tmpe_tl || - \int_compare_p:n { \l__spath_splitat_int == \l__spath_split_int } + \int_compare_p:n { \l__spath_tmpa_int == \l__spath_tmpb_int } } { - \tl_set:Nx \l__spath_tmpc_tl {\tl_head:N \l__spath_split_path_tl} - \tl_set:Nx \l__spath_split_path_tl {\tl_tail:N \l__spath_split_path_tl } - \tl_case:Nn \l__spath_tmpc_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_split_int + \int_incr:N \l__spath_tmpb_int } \c_spath_curvetoa_tl { - \int_incr:N \l__spath_split_int + \int_incr:N \l__spath_tmpb_int } } - \int_compare:nT { \l__spath_split_int < \l__spath_splitat_int } + \int_compare:nT { \l__spath_tmpb_int < \l__spath_tmpa_int } { - \tl_put_right:NV \l__spath_split_patha_tl \l__spath_tmpc_tl + \tl_put_right:NV \l__spath_tmpc_tl \l__spath_tmpf_tl - \tl_put_right:Nx \l__spath_split_patha_tl - {{ \tl_head:N \l__spath_split_path_tl }} - \dim_set:Nn \l__spath_splitx_dim {\tl_head:N \l__spath_split_path_tl} - \tl_set:Nx \l__spath_split_path_tl {\tl_tail:N \l__spath_split_path_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_split_patha_tl - {{ \tl_head:N \l__spath_split_path_tl }} - \dim_set:Nn \l__spath_splity_dim {\tl_head:N \l__spath_split_path_tl} - \tl_set:Nx \l__spath_split_path_tl {\tl_tail:N \l__spath_split_path_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 } } } - \tl_clear:N \l__spath_split_pathb_tl - \tl_put_right:NV \l__spath_split_pathb_tl \c_spath_moveto_tl - \tl_put_right:Nx \l__spath_split_pathb_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 { - {\dim_use:N \l__spath_splitx_dim} - {\dim_use:N \l__spath_splity_dim} + {\dim_use:N \l__spath_tmpa_dim} + {\dim_use:N \l__spath_tmpb_dim} } \fp_compare:nTF { - \l__spath_split_fp == 0 + \l__spath_tmpa_fp == 0 } { - \tl_set_eq:NN \l__spath_split_intob_tl \l__spath_split_pathb_tl - \tl_if_empty:NF \l__spath_split_path_tl + \tl_set_eq:NN \l__spath_tmpb_tl \l__spath_tmpd_tl + \tl_if_empty:NF \l__spath_tmpe_tl { - \tl_put_right:NV \l__spath_split_intob_tl \l__spath_tmpc_tl - \tl_put_right:NV \l__spath_split_intob_tl \l__spath_split_path_tl + \tl_put_right:NV \l__spath_tmpb_tl \l__spath_tmpf_tl + \tl_put_right:NV \l__spath_tmpb_tl \l__spath_tmpe_tl } } { - \tl_case:Nn \l__spath_tmpc_tl + \tl_case:Nn \l__spath_tmpf_tl { \c_spath_lineto_tl { - \tl_put_right:NV \l__spath_split_pathb_tl \l__spath_tmpc_tl - \tl_put_right:Nx \l__spath_split_pathb_tl - {{ \tl_head:N \l__spath_split_path_tl }} - \tl_set:Nx \l__spath_split_path_tl {\tl_tail:N \l__spath_split_path_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_split_pathb_tl - {{ \tl_head:N \l__spath_split_path_tl }} - \tl_set:Nx \l__spath_split_path_tl {\tl_tail:N \l__spath_split_path_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_split_intoa_tl - \l__spath_split_intob_tl - \l__spath_split_pathb_tl - \l__spath_split_fp + \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_split_intoa_tl {\tl_tail:N \l__spath_split_intoa_tl} + \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} } - \tl_put_right:NV \l__spath_split_patha_tl \l__spath_split_intoa_tl - \tl_put_right:NV \l__spath_split_intob_tl \l__spath_split_path_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_split_pathb_tl \l__spath_tmpc_tl - \tl_put_right:Nx \l__spath_split_pathb_tl - {{ \tl_head:N \l__spath_split_path_tl }} - \tl_set:Nx \l__spath_split_path_tl {\tl_tail:N \l__spath_split_path_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_split_pathb_tl - {{ \tl_head:N \l__spath_split_path_tl }} - \tl_set:Nx \l__spath_split_path_tl {\tl_tail:N \l__spath_split_path_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_split_pathb_tl - { \tl_head:N \l__spath_split_path_tl } - \tl_set:Nx \l__spath_split_path_tl {\tl_tail:N \l__spath_split_path_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_split_pathb_tl - {{ \tl_head:N \l__spath_split_path_tl }} - \tl_set:Nx \l__spath_split_path_tl {\tl_tail:N \l__spath_split_path_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_split_pathb_tl - {{ \tl_head:N \l__spath_split_path_tl }} - \tl_set:Nx \l__spath_split_path_tl {\tl_tail:N \l__spath_split_path_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_split_intoa_tl - \l__spath_split_intob_tl - \l__spath_split_pathb_tl \l__spath_split_fp + \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_split_intoa_tl {\tl_tail:N \l__spath_split_intoa_tl} + \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} } - \tl_put_right:NV \l__spath_split_patha_tl \l__spath_split_intoa_tl - \tl_put_right:NV \l__spath_split_intob_tl \l__spath_split_path_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_split_patha_tl - \__spath_tl_gput_right_braced:NV \g__spath_output_tl \l__spath_split_intob_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 @@ -1696,7 +2271,11 @@ manipulating PGF soft paths} \cs_new_protected_nopar:Npn \spath_split_at:Nnn #1#2#3 { \__spath_split_at:nn {#2}{#3} - \tl_set:Nx #1 {\tl_item:Nn \g__spath_output_tl {1} \tl_item:Nn \g__spath_output_tl {2}} + \tl_set: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_split_at:Nnn {NVn, NVV} @@ -1707,7 +2286,11 @@ manipulating PGF soft paths} \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_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} @@ -1715,15 +2298,6 @@ manipulating PGF soft paths} { \spath_gsplit_at:NVn #1#1{#2} } -\tl_new:N \l__spath_shorten_fa_tl -\tl_new:N \l__spath_shorten_path_tl -\tl_new:N \l__spath_shorten_last_tl -\tl_new:N \l__spath_shorten_lasta_tl -\tl_new:N \l__spath_shorten_lastb_tl -\int_new:N \l__spath_shorten_int -\fp_new:N \l__spath_shorten_x_fp -\fp_new:N \l__spath_shorten_y_fp -\fp_new:N \l__spath_shorten_len_fp \cs_new_protected_nopar:Npn \__spath_shorten_at_end:nn #1#2 { \int_compare:nTF @@ -1732,121 +2306,121 @@ manipulating PGF soft paths} } { \group_begin: - \tl_set:Nn \l__spath_shorten_path_tl {#1} - \tl_reverse:N \l__spath_shorten_path_tl + \tl_set:Nn \l__spath_tmpa_tl {#1} + \tl_reverse:N \l__spath_tmpa_tl - \tl_set:Nx \l__spath_shorten_fa_tl {\tl_item:Nn \l__spath_shorten_path_tl {3}} + \tl_set:Nx \l__spath_tmpb_tl {\tl_item:Nn \l__spath_tmpa_tl {3}} - \tl_clear:N \l__spath_shorten_last_tl - \tl_if_eq:NNTF \l__spath_shorten_fa_tl \c_spath_curveto_tl + \tl_clear:N \l__spath_tmpe_tl + \tl_if_eq:NNTF \l__spath_tmpb_tl \c_spath_curveto_tl { - \int_set:Nn \l__spath_shorten_int {3} + \int_set:Nn \l__spath_tmpa_int {3} } { - \int_set:Nn \l__spath_shorten_int {1} + \int_set:Nn \l__spath_tmpa_int {1} } - \prg_replicate:nn { \l__spath_shorten_int } + \prg_replicate:nn { \l__spath_tmpa_int } { - \tl_put_right:Nx \l__spath_shorten_last_tl + \tl_put_right:Nx \l__spath_tmpe_tl { - {\tl_head:N \l__spath_shorten_path_tl} + {\tl_head:N \l__spath_tmpa_tl} } - \tl_set:Nx \l__spath_shorten_path_tl {\tl_tail:N \l__spath_shorten_path_tl} - \tl_put_right:Nx \l__spath_shorten_last_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_shorten_path_tl} + {\tl_head:N \l__spath_tmpa_tl} } - \tl_set:Nx \l__spath_shorten_path_tl {\tl_tail:N \l__spath_shorten_path_tl} - \tl_put_right:Nx \l__spath_shorten_last_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_shorten_path_tl + \tl_head:N \l__spath_tmpa_tl } - \tl_set:Nx \l__spath_shorten_path_tl {\tl_tail:N \l__spath_shorten_path_tl} + \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} } - \tl_put_right:Nx \l__spath_shorten_last_tl + \tl_put_right:Nx \l__spath_tmpe_tl { - {\tl_item:Nn \l__spath_shorten_path_tl {1}} - {\tl_item:Nn \l__spath_shorten_path_tl {2}} + {\tl_item:Nn \l__spath_tmpa_tl {1}} + {\tl_item:Nn \l__spath_tmpa_tl {2}} } - \tl_put_right:NV \l__spath_shorten_last_tl \c_spath_moveto_tl + \tl_put_right:NV \l__spath_tmpe_tl \c_spath_moveto_tl - \tl_reverse:N \l__spath_shorten_path_tl + \tl_reverse:N \l__spath_tmpa_tl - \fp_set:Nn \l__spath_shorten_x_fp + \fp_set:Nn \l__spath_tmpa_fp { - \dim_to_fp:n {\tl_item:Nn \l__spath_shorten_last_tl {4}} + \dim_to_fp:n {\tl_item:Nn \l__spath_tmpe_tl {4}} - - \dim_to_fp:n {\tl_item:Nn \l__spath_shorten_last_tl {1}} + \dim_to_fp:n {\tl_item:Nn \l__spath_tmpe_tl {1}} } - \fp_set:Nn \l__spath_shorten_y_fp + \fp_set:Nn \l__spath_tmpb_fp { - \dim_to_fp:n {\tl_item:Nn \l__spath_shorten_last_tl {5}} + \dim_to_fp:n {\tl_item:Nn \l__spath_tmpe_tl {5}} - - \dim_to_fp:n {\tl_item:Nn \l__spath_shorten_last_tl {2}} + \dim_to_fp:n {\tl_item:Nn \l__spath_tmpe_tl {2}} } - \fp_set:Nn \l__spath_shorten_len_fp + \fp_set:Nn \l__spath_tmpc_fp { - sqrt( \l__spath_shorten_x_fp * \l__spath_shorten_x_fp + \l__spath_shorten_y_fp * \l__spath_shorten_y_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_shorten_len_fp > #2 + \l__spath_tmpc_fp > #2 } { - \fp_set:Nn \l__spath_shorten_len_fp + \fp_set:Nn \l__spath_tmpc_fp { - (\l__spath_shorten_len_fp - #2)/ \l__spath_shorten_len_fp + (\l__spath_tmpc_fp - #2)/ \l__spath_tmpc_fp } - \tl_reverse:N \l__spath_shorten_last_tl + \tl_reverse:N \l__spath_tmpe_tl - \tl_if_eq:NNTF \l__spath_shorten_fa_tl \c_spath_curveto_tl + \tl_if_eq:NNTF \l__spath_tmpb_tl \c_spath_curveto_tl { - \fp_set:Nn \l__spath_shorten_len_fp - { - 1 - (1 -\l__spath_shorten_len_fp)/3 - } \spath_split_curve:NNVV - \l__spath_shorten_lasta_tl - \l__spath_shorten_lastb_tl - \l__spath_shorten_last_tl - \l__spath_shorten_len_fp + \l__spath_tmpc_tl + \l__spath_tmpd_tl + \l__spath_tmpe_tl + \l__spath_tmpc_fp } { \spath_split_line:NNVV - \l__spath_shorten_lasta_tl - \l__spath_shorten_lastb_tl - \l__spath_shorten_last_tl - \l__spath_shorten_len_fp + \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_shorten_lasta_tl {\tl_tail:N \l__spath_shorten_lasta_tl} + \tl_set:Nx \l__spath_tmpc_tl {\tl_tail:N \l__spath_tmpc_tl} } - \tl_put_right:NV \l__spath_shorten_path_tl \l__spath_shorten_lasta_tl + \tl_put_right:NV \l__spath_tmpa_tl \l__spath_tmpc_tl } { \int_compare:nT { - \tl_count:N \l__spath_shorten_path_tl > 3 + \tl_count:N \l__spath_tmpa_tl > 3 } { - \dim_set:Nn \l__spath_tmpa_dim {\fp_to_dim:n {#2 - \l__spath_shorten_len_fp } } - \spath_shorten_at_end:NV \l__spath_shorten_path_tl \l__spath_tmpa_dim + \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_shorten_path_tl + \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpa_tl \group_end: } { @@ -1885,110 +2459,120 @@ manipulating PGF soft paths} } { \group_begin: - \tl_set:Nn \l__spath_shorten_path_tl {#1} + \tl_set:Nn \l__spath_tmpa_tl {#1} - \tl_set:Nx \l__spath_shorten_fa_tl {\tl_item:Nn \l__spath_shorten_path_tl {4}} + \tl_set:Nx \l__spath_tmpb_tl {\tl_item:Nn \l__spath_tmpa_tl {4}} - \tl_clear:N \l__spath_shorten_last_tl + \tl_clear:N \l__spath_tmpe_tl - \tl_if_eq:NNTF \l__spath_shorten_fa_tl \c_spath_curvetoa_tl + \tl_if_eq:NNTF \l__spath_tmpb_tl \c_spath_curvetoa_tl { - \int_set:Nn \l__spath_shorten_int {3} + \int_set:Nn \l__spath_tmpa_int {3} } { - \int_set:Nn \l__spath_shorten_int {1} + \int_set:Nn \l__spath_tmpa_int {1} } - \tl_set_eq:NN \l__spath_shorten_last_tl \c_spath_moveto_tl - \tl_set:Nx \l__spath_shorten_path_tl {\tl_tail:N \l__spath_shorten_path_tl } + \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_shorten_int } + \prg_replicate:nn { \l__spath_tmpa_int } { - \__spath_tl_put_right_braced:Nx \l__spath_shorten_last_tl {\tl_item:Nn \l__spath_shorten_path_tl {1}} - \__spath_tl_put_right_braced:Nx \l__spath_shorten_last_tl {\tl_item:Nn \l__spath_shorten_path_tl {2}} - \tl_put_right:Nx \l__spath_shorten_last_tl {\tl_item:Nn \l__spath_shorten_path_tl {3}} + \__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} { - \tl_set:Nx \l__spath_shorten_path_tl {\tl_tail:N \l__spath_shorten_path_tl } + \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl } } } - \__spath_tl_put_right_braced:Nx \l__spath_shorten_last_tl {\tl_item:Nn \l__spath_shorten_path_tl {1}} - \__spath_tl_put_right_braced:Nx \l__spath_shorten_last_tl {\tl_item:Nn \l__spath_shorten_path_tl {2}} + \__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_shorten_x_fp + \fp_set:Nn \l__spath_tmpa_fp { - \dim_to_fp:n {\tl_item:Nn \l__spath_shorten_last_tl {5}} + \dim_to_fp:n {\tl_item:Nn \l__spath_tmpe_tl {5}} - - \dim_to_fp:n {\tl_item:Nn \l__spath_shorten_last_tl {2}} + \dim_to_fp:n {\tl_item:Nn \l__spath_tmpe_tl {2}} } - \fp_set:Nn \l__spath_shorten_y_fp + \fp_set:Nn \l__spath_tmpb_fp { - \dim_to_fp:n {\tl_item:Nn \l__spath_shorten_last_tl {6}} + \dim_to_fp:n {\tl_item:Nn \l__spath_tmpe_tl {6}} - - \dim_to_fp:n {\tl_item:Nn \l__spath_shorten_last_tl {3}} + \dim_to_fp:n {\tl_item:Nn \l__spath_tmpe_tl {3}} } - \fp_set:Nn \l__spath_shorten_len_fp + \fp_set:Nn \l__spath_tmpc_fp { - sqrt( \l__spath_shorten_x_fp * \l__spath_shorten_x_fp + \l__spath_shorten_y_fp * \l__spath_shorten_y_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_shorten_len_fp > #2 + \l__spath_tmpc_fp > #2 } { - \fp_set:Nn \l__spath_shorten_len_fp + \fp_set:Nn \l__spath_tmpc_fp { - #2/ \l__spath_shorten_len_fp + #2/ \l__spath_tmpc_fp } - \tl_if_eq:NNTF \l__spath_shorten_fa_tl \c_spath_curvetoa_tl + \tl_if_eq:NNTF \l__spath_tmpb_tl \c_spath_curvetoa_tl { - \fp_set:Nn \l__spath_shorten_len_fp - { - \l__spath_shorten_len_fp/3 - } \spath_split_curve:NNVV - \l__spath_shorten_lasta_tl - \l__spath_shorten_lastb_tl - \l__spath_shorten_last_tl - \l__spath_shorten_len_fp + \l__spath_tmpc_tl + \l__spath_tmpd_tl + \l__spath_tmpe_tl + \l__spath_tmpc_fp } { \spath_split_line:NNVV - \l__spath_shorten_lasta_tl - \l__spath_shorten_lastb_tl - \l__spath_shorten_last_tl - \l__spath_shorten_len_fp + \l__spath_tmpc_tl + \l__spath_tmpd_tl + \l__spath_tmpe_tl + \l__spath_tmpc_fp } \prg_replicate:nn {2} { - \tl_set:Nx \l__spath_shorten_path_tl {\tl_tail:N \l__spath_shorten_path_tl} + \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl} } - \tl_put_left:NV \l__spath_shorten_path_tl \l__spath_shorten_lastb_tl + \tl_put_left:NV \l__spath_tmpa_tl \l__spath_tmpd_tl } { - \tl_put_left:NV \l__spath_shorten_path_tl \c_spath_moveto_tl + \tl_put_left:NV \l__spath_tmpa_tl \c_spath_moveto_tl \int_compare:nT { - \tl_count:N \l__spath_shorten_path_tl > 3 + \tl_count:N \l__spath_tmpa_tl > 3 } { - \dim_set:Nn \l__spath_tmpa_dim {\fp_to_dim:n {#2 - \l__spath_shorten_len_fp } } - \spath_shorten_at_start:NV \l__spath_shorten_path_tl \l__spath_tmpa_dim + \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_shorten_path_tl + \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpa_tl \group_end: } { @@ -2044,7 +2628,9 @@ manipulating PGF soft paths} } { - \tl_set:Nx \l__spath_tmpa_tl {\seq_item:Nn \l__spath_tmpa_seq { \l__spath_tmpa_int} } + \tl_set:Nx + \l__spath_tmpa_tl + {\seq_item:Nn \l__spath_tmpa_seq { \l__spath_tmpa_int} } \int_compare:nTF { @@ -2122,11 +2708,21 @@ manipulating PGF soft paths} { {\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} + (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} + (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} }} } } @@ -2177,7 +2773,9 @@ manipulating PGF soft paths} } { - \tl_set:Nx \l__spath_tmpa_tl {\seq_item:Nn \l__spath_tmpa_seq { \l__spath_tmpa_int} } + \tl_set:Nx + \l__spath_tmpa_tl + {\seq_item:Nn \l__spath_tmpa_seq { \l__spath_tmpa_int} } \int_compare:nTF { @@ -2255,16 +2853,24 @@ manipulating PGF soft paths} { {\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}) + 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}) + 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}) }} } } @@ -2296,15 +2902,24 @@ manipulating PGF soft paths} \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_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 } + \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 { @@ -2332,22 +2947,6 @@ manipulating PGF soft paths} \tl_gclear:N \g__spath_output_tl } \cs_generate_variant:Nn \spath_gtransformation_at:Nnn {NVn, NVV, NnV} -\tl_new:N \l__spath_split_path_a_tl -\tl_new:N \l__spath_split_path_b_tl -\tl_new:N \l__spath_split_path_a_start_tl -\tl_new:N \l__spath_split_path_b_start_tl -\tl_new:N \l__spath_split_path_a_end_tl -\tl_new:N \l__spath_split_path_b_end_tl -\tl_new:N \l__spath_split_path_a_final_tl -\tl_new:N \l__spath_split_path_b_final_tl - -\tl_new:N \l__spath_split_prev_first_tl -\tl_new:N \l__spath_split_prev_second_tl - -\seq_new:N \l__spath_split_first_seq -\seq_new:N \l__spath_split_second_seq - -\int_new:N \l__spath_split_segment_int \cs_new_protected_nopar:Npn \spath_intersect:NN #1#2 { \pgfintersectionofpaths% @@ -2357,152 +2956,199 @@ manipulating PGF soft paths} \pgfsetpath #2 } } -\tl_new:N \l__spath_intersecta_tl -\tl_new:N \l__spath_intersectb_tl \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_at_intersections:nn #1#2 +\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 - % Clear some token lists and sequences - \tl_clear:N \l__spath_split_path_a_final_tl - \tl_clear:N \l__spath_split_path_b_final_tl - \seq_clear:N \l__spath_split_first_seq - \seq_clear:N \l__spath_split_second_seq - - \pgfintersectionsortbyfirstpath % Find the intersections of these segments - \tl_set:Nn \l__spath_split_path_a_tl {#1} - \tl_set:Nn \l__spath_split_path_b_tl {#2} - % Remove empty components + \tl_set:Nn \l__spath_tmpb_tl {#1} + \tl_set:Nn \l__spath_tmpc_tl {#2} - \spath_intersect:NN \l__spath_split_path_a_tl \l__spath_split_path_b_tl + \spath_reallength:Nn \l__spath_tmpa_int {#1} - % If we get intersections - \int_compare:nT {\pgfintersectionsolutions > 0} + % Remember if the component is closed + \spath_finalaction:NV \l__spath_tmpa_tl \l__spath_tmpb_tl + + \bool_set:Nn \l__spath_closed_bool { - % Find the times of the intersections on each path - \int_step_inline:nnnn {1} {1} {\pgfintersectionsolutions} - { - \pgfintersectiongetsolutiontimes{##1}{\l__spath_split_first_tl}{\l__spath_split_second_tl} - \seq_put_left:NV \l__spath_split_first_seq \l__spath_split_first_tl - } + \tl_if_eq_p:NN \l__spath_tmpa_tl \c_spath_closepath_tl } - \spath_intersect:NN \l__spath_split_path_b_tl \l__spath_split_path_a_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 each path + % Find the times of the intersections on the component \int_step_inline:nnnn {1} {1} {\pgfintersectionsolutions} { - \pgfintersectiongetsolutiontimes{##1}{\l__spath_split_first_tl}{\l__spath_split_second_tl} - \seq_put_left:NV \l__spath_split_second_seq \l__spath_split_first_tl + \pgfintersectiongetsolutiontimes{##1}{\l__spath_tmph_tl}{\l__spath_tmpi_tl} + \seq_put_left:NV \l__spath_tmpb_seq \l__spath_tmph_tl } - } - - \tl_set:Nn \l__spath_split_prev_first_tl {-1} - - \seq_map_inline:Nn \l__spath_split_first_seq - { - \tl_set:Nn \l__spath_split_first_tl {##1} - \tl_set_eq:NN \l__spath_tmpa_tl \l__spath_split_first_tl - \int_compare:nT + \seq_get_left:NN \l__spath_tmpb_seq \l__spath_tmpa_tl + \fp_compare:nT { - \fp_to_int:n {floor( \l__spath_split_first_tl) } - = - \fp_to_int:n {floor( \l__spath_split_prev_first_tl) } + \l__spath_tmpa_tl > \l__spath_tmpa_int - .01 } { - \tl_set:Nx \l__spath_split_first_tl - { - \fp_eval:n { - floor( \l__spath_split_first_tl ) - + - ( \l__spath_split_first_tl - floor( \l__spath_split_first_tl) ) - / - ( \l__spath_split_prev_first_tl - floor( \l__spath_split_prev_first_tl) ) - } - } + \bool_set_false:N \l__spath_closed_bool } - \tl_set_eq:NN \l__spath_split_prev_first_tl \l__spath_tmpa_tl - - \spath_split_at:NNVV \l__spath_split_path_a_start_tl \l__spath_split_path_a_end_tl \l__spath_split_path_a_tl \l__spath_split_first_tl - - \tl_put_left:NV \l__spath_split_path_a_final_tl \l__spath_split_path_a_end_tl - \tl_set_eq:NN \l__spath_split_path_a_tl \l__spath_split_path_a_start_tl - - } - - \tl_set:Nn \l__spath_split_prev_second_tl {-1} - - \seq_map_inline:Nn \l__spath_split_second_seq - { - \tl_set:Nn \l__spath_split_second_tl {##1} - - \tl_set_eq:NN \l__spath_tmpa_tl \l__spath_split_second_tl - \int_compare:nT + \seq_get_right:NN \l__spath_tmpb_seq \l__spath_tmpa_tl + \fp_compare:nT { - \fp_to_int:n {floor( \l__spath_split_second_tl) } - = - \fp_to_int:n {floor( \l__spath_split_prev_second_tl) } + \l__spath_tmpa_tl < .01 } { - \tl_set:Nx \l__spath_split_second_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 + { + \tl_set:Nn \l__spath_tmph_tl {##1} + + \tl_set_eq:NN \l__spath_tmpa_tl \l__spath_tmph_tl + \int_compare:nT { - \fp_eval:n { - floor( \l__spath_split_second_tl ) - + - ( \l__spath_split_second_tl - floor( \l__spath_split_second_tl) ) - / - ( \l__spath_split_prev_second_tl - floor( \l__spath_split_prev_second_tl) ) + \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_set_eq:NN \l__spath_split_prev_second_tl \l__spath_tmpa_tl - \spath_split_at:NNVV \l__spath_split_path_b_start_tl \l__spath_split_path_b_end_tl \l__spath_split_path_b_tl\l__spath_split_second_tl + \tl_put_left:NV \l__spath_tmpe_tl \l__spath_tmpb_tl - \tl_put_left:NV \l__spath_split_path_b_final_tl \l__spath_split_path_b_end_tl - \tl_set_eq:NN \l__spath_split_path_b_tl \l__spath_split_path_b_start_tl + \spath_remove_empty_components:N \l__spath_tmpe_tl + \tl_set_eq:NN \l__spath_tmpb_tl \l__spath_tmpe_tl } - \tl_put_left:NV \l__spath_split_path_a_final_tl \l__spath_split_path_a_tl - \tl_put_left:NV \l__spath_split_path_b_final_tl \l__spath_split_path_b_tl - - \tl_if_empty:NT \l__spath_split_path_a_final_tl + \bool_if:NT \l__spath_closed_bool { - \tl_set_eq:NN \l__spath_split_path_a_final_tl \l__spath_split_path_a_tl + \spath_join_component:Nn \l__spath_tmpb_tl {1} } - \tl_if_empty:NT \l__spath_split_path_b_final_tl + + \tl_gclear:N \g__spath_output_tl + \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpb_tl + + \group_end: +} +\cs_new_protected_nopar:Npn \spath_split_component_at_intersections:Nnn #1#2#3 +{ + \__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_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_split_component_at_intersections:NVn #1#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 +{ + \__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_eq:NN \l__spath_split_path_b_final_tl \l__spath_split_path_b_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 } - \spath_remove_empty_components:N \l__spath_split_path_a_final_tl - \spath_remove_empty_components:N \l__spath_split_path_b_final_tl - \tl_gclear:N \g__spath_output_tl - \__spath_tl_gput_right_braced:NV \g__spath_output_tl \l__spath_split_path_a_final_tl - \__spath_tl_gput_right_braced:NV \g__spath_output_tl \l__spath_split_path_b_final_tl + \tl_gset:Nx \g__spath_output_tl {\seq_use:Nn \l__spath_tmpb_seq {} } \group_end: } +\cs_new_protected_nopar:Npn \spath_split_path_at_intersections:Nnn #1#2#3 +{ + \__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_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 +{ + \spath_split_path_at_intersections:NVn #1#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_split_path_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_path_at_intersections:Nnn +{NVn, NVV, cVn, cVV, cvn, cvv} +\cs_new_protected_nopar:Npn \spath_gsplit_path_at_intersections:Nn #1#2 +{ + \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_at_intersections: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}} + \__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 {NNVV, ccVV, ccvv} +\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 @@ -2510,213 +3156,283 @@ manipulating PGF soft paths} \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_at_intersections: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}} + \__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 {NNVV, ccVV, ccvv} +\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_at_self_intersections:n #1 +\cs_new_protected_nopar:Npn \__spath_split_component_at_self_intersections:n #1 { \group_begin: + \tl_set:Nn \l__spath_tmpe_tl {#1} + + % Remember if the component is closed + \spath_finalaction:NV \l__spath_tmpa_tl \l__spath_tmpe_tl + + \bool_set:Nn \l__spath_closed_bool + { + \tl_if_eq_p:NN \l__spath_tmpa_tl \c_spath_closepath_tl + } % Copy the path - \tl_set:Nn \l__spath_split_path_b_tl {#1} + \tl_set:Nn \l__spath_tmpe_tl {#1} % Open the path - \spath_open:N \l__spath_split_path_b_tl - % Remove empty components - \spath_remove_empty_components:N \l__spath_split_path_b_tl + \spath_open:N \l__spath_tmpe_tl + % Ensure beziers don't self-intersect + \spath_split_curves:N \l__spath_tmpe_tl + % Make a copy for later - \tl_set_eq:NN \l__spath_split_path_b_final_tl \l__spath_split_path_b_tl + \tl_set_eq:NN \l__spath_tmpg_tl \l__spath_tmpe_tl % Clear some token lists and sequences - \tl_clear:N \l__spath_split_path_a_tl - \seq_clear:N \l__spath_split_first_seq - \int_zero:N \l__spath_split_segment_int + \tl_clear:N \l__spath_tmpd_tl + \seq_clear:N \l__spath_tmpb_seq + \int_zero:N \l__spath_tmpa_int \pgfintersectionsortbyfirstpath - \bool_do_until:nn - { - \int_compare_p:n - { - \tl_count:N \l__spath_split_path_b_tl < 4 - } - } - { - \tl_clear:N \l__spath_split_path_a_tl - \tl_put_right:Nx \l__spath_split_path_a_tl - { - \tl_item:Nn \l__spath_split_path_b_tl {1} - {\tl_item:Nn \l__spath_split_path_b_tl {2}} - {\tl_item:Nn \l__spath_split_path_b_tl {3}} - } + % Split the path into a sequence of segments + \spath_segments_to_seq:NV \l__spath_tmpa_seq \l__spath_tmpe_tl - \tl_set:Nx \l__spath_tmpa_tl { \tl_item:Nn \l__spath_split_path_b_tl {4} } - - \tl_set:Nx \l__spath_split_path_b_tl {\tl_tail:N \l__spath_split_path_b_tl} - - \int_zero:N \l__spath_tmpa_int - - \tl_case:Nn \l__spath_tmpa_tl + \seq_map_indexed_inline:Nn \l__spath_tmpa_seq + { + \seq_map_indexed_inline:Nn \l__spath_tmpa_seq { - \c_spath_moveto_tl + % Don't intersect a segment with itself + \int_compare:nF { - \tl_clear:N \l__spath_split_path_a_tl - \tl_set:Nx \l__spath_split_path_b_tl {\tl_tail:N \l__spath_split_path_b_tl} - \tl_set:Nx \l__spath_split_path_b_tl {\tl_tail:N \l__spath_split_path_b_tl} - \tl_set:Nx \l__spath_split_path_b_tl {\tl_tail:N \l__spath_split_path_b_tl} + ##1 == ####1 } - \c_spath_lineto_tl - { - \int_set:Nn \l__spath_tmpa_int {1} - } - \c_spath_curvetoa_tl { - \int_set:Nn \l__spath_tmpa_int {3} - } - } - - \prg_replicate:nn { \l__spath_tmpa_int } - { - \tl_set:Nx \l__spath_split_path_b_tl {\tl_tail:N \l__spath_split_path_b_tl} - \tl_set:Nx \l__spath_split_path_b_tl {\tl_tail:N \l__spath_split_path_b_tl} - - \tl_put_right:Nx \l__spath_split_path_a_tl - { - \tl_item:Nn \l__spath_split_path_b_tl {1} - {\tl_item:Nn \l__spath_split_path_b_tl {2}} - {\tl_item:Nn \l__spath_split_path_b_tl {3}} - } - - \tl_set:Nx \l__spath_split_path_b_tl {\tl_tail:N \l__spath_split_path_b_tl} - } + \spath_intersect:nn {##2} {####2} - \tl_put_left:NV \l__spath_split_path_b_tl \c_spath_moveto_tl - - \tl_if_empty:NF \l__spath_split_path_a_tl - { - % Intersect the current segment with the rest of the path - \spath_intersect:NN \l__spath_split_path_a_tl \l__spath_split_path_b_tl - - % If we get intersections - \int_compare:nT {\pgfintersectionsolutions > 0} - { - % Find the times of the intersections on each path - \int_step_inline:nnnn {1} {1} {\pgfintersectionsolutions} + \int_compare:nT {\pgfintersectionsolutions > 0} { - \pgfintersectiongetsolutiontimes{##1}{\l__spath_split_first_tl}{\l__spath_split_second_tl} - \fp_compare:nT - { - \l__spath_split_first_tl < .99 - } + % Find the times of the intersections on each path + \int_step_inline:nnnn {1} {1} {\pgfintersectionsolutions} { - \tl_set:Nx \l__spath_tmpa_tl {\fp_to_decimal:n {\l__spath_split_first_tl + \l__spath_split_segment_int}} - \seq_put_right:NV \l__spath_split_first_seq \l__spath_tmpa_tl - } - } - } + \pgfintersectiongetsolutiontimes + {########1}{\l__spath_tmpb_tl}{\l__spath_tmpc_tl} - \spath_intersect:NN \l__spath_split_path_b_tl \l__spath_split_path_a_tl - - % If we get intersections - \int_compare:nT {\pgfintersectionsolutions > 0} - { - % Find the times of the intersections on each path - \int_step_inline:nnnn {1} {1} {\pgfintersectionsolutions} - { - \pgfintersectiongetsolutiontimes{##1}{\l__spath_split_first_tl}{\l__spath_split_second_tl} - \fp_compare:nT - { - \l__spath_split_first_tl > .01 - } - { - \tl_set:Nx \l__spath_tmpa_tl {\fp_to_decimal:n {\l__spath_split_first_tl + \l__spath_split_segment_int + 1}} - \seq_put_right:NV \l__spath_split_first_seq \l__spath_tmpa_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 + } } } } - } - % Increment the segment counter - \int_incr:N \l__spath_split_segment_int } % Sort the sequence by reverse order along the path - \seq_sort:Nn \l__spath_split_first_seq + \seq_sort:Nn \l__spath_tmpb_seq { \fp_compare:nNnTF { ##1 } < { ##2 } { \sort_return_swapped: } { \sort_return_same: } } + \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_split_path_b_tl \l__spath_split_path_b_final_tl + \tl_set_eq:NN \l__spath_tmpe_tl \l__spath_tmpg_tl % Clear the token lists - \tl_clear:N \l__spath_split_path_b_start_tl - \tl_clear:N \l__spath_split_path_b_end_tl - \tl_clear:N \l__spath_split_path_b_final_tl + \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_split_prev_first_tl {-1} + \tl_set:Nn \l__spath_tmpi_tl {-1} - \seq_map_inline:Nn \l__spath_split_first_seq + \seq_map_inline:Nn \l__spath_tmpb_seq { - \tl_set:Nn \l__spath_split_first_tl {##1} - \tl_set_eq:NN \l__spath_tmpa_tl \l__spath_split_first_tl + \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_split_first_tl ) } + \fp_to_int:n {floor( \l__spath_tmpb_tl ) } = - \fp_to_int:n {floor( \l__spath_split_prev_first_tl) } + \fp_to_int:n {floor( \l__spath_tmpi_tl) } } { - \tl_set:Nx \l__spath_split_first_tl + \tl_set:Nx \l__spath_tmpb_tl { \fp_eval:n { - floor( \l__spath_split_first_tl ) + floor( \l__spath_tmpb_tl ) + - ( \l__spath_split_first_tl - floor( \l__spath_split_first_tl) ) + ( \l__spath_tmpb_tl - floor( \l__spath_tmpb_tl) ) / - ( \l__spath_split_prev_first_tl - floor( \l__spath_split_prev_first_tl) ) + ( \l__spath_tmpi_tl - floor( \l__spath_tmpi_tl) ) } } } - \tl_set_eq:NN \l__spath_split_prev_first_tl \l__spath_tmpa_tl + \tl_set_eq:NN \l__spath_tmpi_tl \l__spath_tmpa_tl - \spath_split_at:NNVV \l__spath_split_path_b_start_tl \l__spath_split_path_b_end_tl \l__spath_split_path_b_tl \l__spath_split_first_tl + \spath_split_at:NNVV + \l__spath_tmpf_tl + \l__spath_tmph_tl + \l__spath_tmpe_tl + \l__spath_tmpb_tl - \tl_put_left:NV \l__spath_split_path_b_final_tl \l__spath_split_path_b_end_tl - \tl_set_eq:NN \l__spath_split_path_b_tl \l__spath_split_path_b_start_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 } - \tl_put_left:NV \l__spath_split_path_b_final_tl \l__spath_split_path_b_tl + \tl_put_left:NV \l__spath_tmpg_tl \l__spath_tmpe_tl - \tl_if_empty:NT \l__spath_split_path_b_final_tl + \tl_if_empty:NT \l__spath_tmpg_tl { - \tl_set_eq:NN \l__spath_split_path_b_final_tl \l__spath_split_path_b_tl + \tl_set_eq:NN \l__spath_tmpg_tl \l__spath_tmpe_tl } - \spath_remove_empty_components:N \l__spath_split_path_b_final_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_split_path_b_final_tl + \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpg_tl \group_end: } +\cs_new_protected_nopar:Npn \spath_split_component_at_self_intersections:Nn #1#2 +{ + \__spath_split_component_at_self_intersections:n {#2} + \tl_set_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\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_split_component_at_self_intersections:NV #1#1 +} +\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_split_component_at_self_intersections:n {#2} + \tl_gset_eq:NN #1 \g__spath_output_tl + \tl_gclear:N \g__spath_output_tl +} +\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_gsplit_component_at_self_intersections:NV #1#1 +} +\cs_generate_variant:Nn \spath_gsplit_component_at_self_intersections:N {c} +\cs_new_protected_nopar:Npn \__spath_split_at_self_intersections:n #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 + { + \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: +} +\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 { \__spath_split_at_self_intersections:n {#2} \tl_set_eq:NN #1 \g__spath_output_tl \tl_gclear:N \g__spath_output_tl } -\cs_generate_variant:Nn \spath_split_at_self_intersections:Nn {NV} +\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_split_at_self_intersections:NV #1#1 @@ -2728,64 +3444,82 @@ manipulating PGF soft paths} \tl_gset_eq:NN #1 \g__spath_output_tl \tl_gclear:N \g__spath_output_tl } -\cs_generate_variant:Nn \spath_gsplit_at_self_intersections:Nn {NV} +\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_gsplit_at_self_intersections:NV #1#1 } \cs_generate_variant:Nn \spath_gsplit_at_self_intersections:N {c} -\tl_new:N \l__spath_tmpj_tl \cs_new_protected_nopar:Npn \__spath_join_component:nn #1#2 { \group_begin: - \spath_components_to_seq:Nn \l__spath_tmpa_seq {#1} - \int_compare:nT + \spath_numberofcomponents:Nn \l__spath_tmpa_int {#1} + + \bool_if:nTF { - #2 == 1 + \int_compare_p:n { #2 >= 1 } + && + \int_compare_p:n { #2 <= \l__spath_tmpa_int } } { - \tl_clear:N \l__spath_tmpj_tl - \seq_pop_left:NN \l__spath_tmpa_seq \l__spath_tmpj_tl - - \prg_replicate:nn {3} + \int_compare:nTF { - \tl_set:Nx \l__spath_tmpj_tl {\tl_tail:N \l__spath_tmpj_tl} + #2 == 1 } - - \seq_put_right:NV \l__spath_tmpb_seq \l__spath_tmpj_tl - } - \bool_if:nT - { - \int_compare_p:n { - #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 {}} + } } - && - \int_compare_p:n { - #2 <= \seq_count:N \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_tmpj_tl {##2} - \int_compare:nT {##1 = #2} + \seq_clear:N \l__spath_tmpb_seq + \seq_map_indexed_inline:Nn \l__spath_tmpa_seq { - \prg_replicate:nn {3} + \tl_set:Nn \l__spath_tmpa_tl {##2} + \int_compare:nT {##1 = #2} { - \tl_set:Nx \l__spath_tmpj_tl {\tl_tail:N \l__spath_tmpj_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_tmpb_seq \l__spath_tmpa_tl } - \seq_put_right:NV \l__spath_tmpb_seq \l__spath_tmpj_tl - } - \seq_set_eq:NN \l__spath_tmpa_seq \l__spath_tmpb_seq + \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} } - \tl_gset:Nx \g__spath_output_tl {\seq_use:Nn \l__spath_tmpa_seq {} } \group_end: } \cs_new_protected_nopar:Npn \spath_join_component:Nnn #1#2#3 @@ -2832,12 +3566,16 @@ manipulating PGF soft paths} { \dim_compare_p:n { - \dim_abs:n {\l__spath_move_x_dim - \tl_item:Nn \l__spath_tmpa_tl {2} } < 0.01pt + \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 + \dim_abs:n + {\l__spath_move_y_dim - \tl_item:Nn \l__spath_tmpa_tl {3} } + < 0.01pt } } { @@ -2864,12 +3602,22 @@ manipulating PGF soft paths} { \dim_compare_p:n { - \dim_abs:n {\tl_item:Nn \l__spath_tmpa_tl {1} - \tl_item:Nn \l__spath_tmpb_tl {1} } < 0.01pt + \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 { - \dim_abs:n {\tl_item:Nn \l__spath_tmpa_tl {2} - \tl_item:Nn \l__spath_tmpb_tl {2} } < 0.01pt + \dim_abs:n + { + \tl_item:Nn \l__spath_tmpa_tl {2} - \tl_item:Nn \l__spath_tmpb_tl {2} + } + < + 0.01pt } } { @@ -2976,7 +3724,7 @@ manipulating PGF soft paths} <path~ d=" } \tl_set:Nn \l__spath_tmpc_tl {use:n} - \tl_map_inline:Nn #1 + \tl_map_inline:nn {#1} { \tl_set:Nn \l__spath_tmpb_tl {##1} \tl_case:NnF \l__spath_tmpb_tl @@ -3009,7 +3757,9 @@ manipulating PGF soft paths} } } { - \tl_put_right:Nx \l__spath_tmpa_tl {\use:c { \l__spath_tmpc_tl } {\dim_to_decimal:n {##1}} ~} + \tl_put_right:Nx + \l__spath_tmpa_tl + {\use:c { \l__spath_tmpc_tl } {\dim_to_decimal:n {##1}} ~} } } \tl_put_right:Nn \l__spath_tmpa_tl @@ -3037,22 +3787,25 @@ manipulating PGF soft paths} \iow_new:N \g__spath_stream \cs_new_protected_nopar:Npn \spath_export_to_svg:nn #1#2 { - \spath_convert_path_to_svg:Nn \l__spath_iterp_tl {#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_iterp_tl + \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 \l__spath_tmpa_tl {##1} - {\tl_item:Nn \l__spath_tmpa_tl {##1+1}} - {\tl_item:Nn \l__spath_tmpa_tl {##1+2}} + \tl_item:nn {#1} {##1} + {\tl_item:nn {#1} {##1+1}} + {\tl_item:nn {#1} {##1+2}} } } } @@ -3101,21 +3854,98 @@ manipulating PGF soft paths} }; } \cs_generate_variant:Nn \spath_tikz_path:nn {Vn, VV, nv, Vv, nV} -\cs_new_protected_nopar:Npn \spath_set_tikz_coords:n #1 +\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 {tikz@lastx}=\tl_item:Nn \l__spath_tmpa_tl {1} - \exp_not:c {tikz@lasty}=\tl_item:Nn \l__spath_tmpa_tl {2} - \exp_not:c {tikz@lastxsaved}=\tl_item:Nn \l__spath_tmpa_tl {1} - \exp_not:c {tikz@lastysaved}=\tl_item:Nn \l__spath_tmpa_tl {2} + \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 + + \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_coords:n {V, v} +\cs_generate_variant:Nn \spath_set_tikz_data:n {V, v} %% -%% Copyright (C) 2011-2019 by Andrew Stacey <loopspace@mathforge.org> +%% 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 @@ -3127,7 +3957,7 @@ 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 |