summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/spath3/spath3.sty
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/latex/spath3/spath3.sty')
-rw-r--r--Master/texmf-dist/tex/latex/spath3/spath3.sty4513
1 files changed, 3488 insertions, 1025 deletions
diff --git a/Master/texmf-dist/tex/latex/spath3/spath3.sty b/Master/texmf-dist/tex/latex/spath3/spath3.sty
index 43fd64cf5e2..868e648f570 100644
--- a/Master/texmf-dist/tex/latex/spath3/spath3.sty
+++ b/Master/texmf-dist/tex/latex/spath3/spath3.sty
@@ -4,10 +4,10 @@
%%
%% The original source files were:
%%
-%% spath3.dtx (with options: `spath3')
+%% spath3_code.dtx (with options: `spath3')
%% ----------------------------------------------------------------
%% spath3 --- Functions for manipulating PGF soft paths
-%% E-mail: stacey@math.ntnu.no
+%% E-mail: loopspace@mathforge.org
%% Released under the LaTeX Project Public License v1.3c or later
%% See http://www.latex-project.org/lppl.txt
%% ----------------------------------------------------------------
@@ -15,335 +15,661 @@
\NeedsTeXFormat{LaTeX2e}
\RequirePackage{expl3}
\RequirePackage{pgf}
-\ProvidesExplPackage {spath3} {2019/02/12} {1.2} {Functions for
+\ProvidesExplPackage {spath3} {2021/02/05} {2.2} {Functions for
manipulating PGF soft paths}
\RequirePackage{xparse}
+\cs_new_protected:Nn \__spath_tl_put_right_braced:Nn
+{
+ \tl_put_right:Nn #1 { { #2 } }
+}
+\cs_generate_variant:Nn \__spath_tl_put_right_braced:Nn { NV, cV, cv, Nx, cx }
+
+\cs_new_protected:Nn \__spath_tl_gput_right_braced:Nn
+{
+ \tl_gput_right:Nn #1 { { #2 } }
+}
+\cs_generate_variant:Nn \__spath_tl_gput_right_braced:Nn { NV, cV, cv, Nx, cx }
+\cs_new_protected:Nn \__spath_tl_put_left_braced:Nn
+{
+ \tl_put_left:Nn #1 { { #2 } }
+}
+\cs_generate_variant:Nn \__spath_tl_put_left_braced:Nn { NV, cV, cv, Nx, cx }
+
+\cs_new_protected:Nn \__spath_tl_gput_left_braced:Nn
+{
+ \tl_gput_left:Nn #1 { { #2 } }
+}
+\cs_generate_variant:Nn \__spath_tl_gput_left_braced:Nn { NV, cV, cv, Nx, cx }
+\tl_new:N \g__spath_output_tl
+\int_new:N \g__spath_output_int
+\seq_new:N \g__spath_output_seq
+\bool_new:N \g__spath_output_bool
\tl_new:N \l__spath_tmpa_tl
\tl_new:N \l__spath_tmpb_tl
\tl_new:N \l__spath_tmpc_tl
\tl_new:N \l__spath_tmpd_tl
-\tl_new:N \l__spath_smuggle_tl
+\tl_new:N \l__spath_tmpe_tl
+\tl_new:N \l__spath_tmpf_tl
+\tl_new:N \l__spath_tmpg_tl
+\tl_new:N \l__spath_tmph_tl
+\tl_new:N \l__spath_tmpi_tl
+
+\seq_new:N \l__spath_tmpa_seq
+\seq_new:N \l__spath_tmpb_seq
+\seq_new:N \l__spath_tmpc_seq
+
\dim_new:N \l__spath_tmpa_dim
\dim_new:N \l__spath_tmpb_dim
+
\fp_new:N \l__spath_tmpa_fp
\fp_new:N \l__spath_tmpb_fp
+\fp_new:N \l__spath_tmpc_fp
+
\int_new:N \l__spath_tmpa_int
-\int_new:N \g__spath_map_int
-\tl_new:N \g__spath_moveto_tl
-\tl_new:N \g__spath_lineto_tl
-\tl_new:N \g__spath_curveto_tl
-\tl_new:N \g__spath_curvetoa_tl
-\tl_new:N \g__spath_curvetob_tl
-\tl_new:N \g__spath_closepath_tl
-\tl_set:Nn \g__spath_moveto_tl {\pgfsyssoftpath@movetotoken}
-\tl_set:Nn \g__spath_lineto_tl {\pgfsyssoftpath@linetotoken}
-\tl_set:Nn \g__spath_curveto_tl {\pgfsyssoftpath@curvetotoken}
-\tl_set:Nn \g__spath_curvetoa_tl {\pgfsyssoftpath@curvetosupportatoken}
-\tl_set:Nn \g__spath_curvetob_tl {\pgfsyssoftpath@curvetosupportbtoken}
-\tl_set:Nn \g__spath_closepath_tl {\pgfsyssoftpath@closepathtoken}
-\tl_new:N \g__spath_attributes
-\tl_new:N \g__spath_moveable_attributes
-\tl_new:N \g__spath_path_attributes
-\tl_set:Nn \g__spath_attributes {
- {path}
- {reverse path}
- {length}
- {real length}
- {number of components}
- {initial point}
- {final point}
- {initial action}
- {final action}
- {min bb}
- {max bb}
-}
-\tl_set:Nn \g__spath_moveable_attributes {
- {initial point}
- {final point}
- {min bb}
- {max bb}
-}
-\tl_set:Nn \g__spath_path_attributes {
- {path}
- {reverse path}
-}
-\cs_new_nopar:Npn \spath_new:n #1
+\int_new:N \l__spath_tmpb_int
+
+\bool_new:N \l__spath_tmpa_bool
+\dim_new:N \l__spath_move_x_dim
+\dim_new:N \l__spath_move_y_dim
+\bool_new:N \l__spath_closed_bool
+\tl_new:N \l__spath_intersecta_tl
+\tl_new:N \l__spath_intersectb_tl
+\tl_const:Nn \c_spath_moveto_tl {\pgfsyssoftpath@movetotoken}
+\tl_const:Nn \c_spath_lineto_tl {\pgfsyssoftpath@linetotoken}
+\tl_const:Nn \c_spath_curveto_tl {\pgfsyssoftpath@curvetotoken}
+\tl_const:Nn \c_spath_curvetoa_tl {\pgfsyssoftpath@curvetosupportatoken}
+\tl_const:Nn \c_spath_curvetob_tl {\pgfsyssoftpath@curvetosupportbtoken}
+\tl_const:Nn \c_spath_closepath_tl {\pgfsyssoftpath@closepathtoken}
+\int_new:N \g__spath_anon_int
+\int_gzero:N \g__spath_anon_int
+\msg_new:nnn { spath3 } { unknown path construction }
+{ The~ path~ construction~ element~ #1~ is~ not~ currently~ supported.}
+\cs_new_protected_nopar:Npn \__spath_segments_to_seq:n #1
{
- \prop_new:c {l__spath_#1}
+ \group_begin:
+ \tl_set:Nn \l__spath_tmpa_tl {#1}
+ \tl_clear:N \l__spath_tmpb_tl
+ \seq_clear:N \l__spath_tmpa_seq
+ \dim_zero:N \l__spath_tmpa_dim
+ \dim_zero:N \l__spath_tmpb_dim
+
+ \bool_until_do:nn {
+ \tl_if_empty_p:N \l__spath_tmpa_tl
+ }
+ {
+ \tl_set:Nx \l__spath_tmpc_tl {\tl_head:N \l__spath_tmpa_tl}
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ \tl_case:NnF \l__spath_tmpc_tl
+ {
+ \c_spath_moveto_tl
+ {
+ \tl_set_eq:NN \l__spath_tmpb_tl \c_spath_moveto_tl
+ \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
+ \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+
+ \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
+ \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+
+ \tl_set:Nx \l__spath_tmpd_tl {\tl_head:N \l__spath_tmpa_tl}
+ \tl_if_eq:NNF \l__spath_tmpd_tl \c_spath_moveto_tl
+ {
+ \tl_clear:N \l__spath_tmpb_tl
+ }
+
+ }
+
+ \c_spath_lineto_tl
+ {
+ \tl_set_eq:NN \l__spath_tmpb_tl \c_spath_moveto_tl
+ \tl_put_right:Nx \l__spath_tmpb_tl
+ {
+ {\dim_use:N \l__spath_tmpa_dim}
+ {\dim_use:N \l__spath_tmpb_dim}
+ }
+ \tl_put_right:NV \l__spath_tmpb_tl \c_spath_lineto_tl
+
+ \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
+ \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+
+ \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
+ \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+
+ }
+
+ \c_spath_curvetoa_tl
+ {
+ \tl_set_eq:NN \l__spath_tmpb_tl \c_spath_moveto_tl
+ \tl_put_right:Nx \l__spath_tmpb_tl
+ {
+ {\dim_use:N \l__spath_tmpa_dim}
+ {\dim_use:N \l__spath_tmpb_dim}
+ }
+ \tl_put_right:NV \l__spath_tmpb_tl \c_spath_curvetoa_tl
+
+ \prg_replicate:nn {2} {
+ \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ \tl_put_right:Nx \l__spath_tmpb_tl {\tl_head:N \l__spath_tmpa_tl}
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ }
+
+ \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
+ \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+
+ \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
+ \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+
+ }
+
+ \c_spath_closepath_tl
+ {
+ \tl_set_eq:NN \l__spath_tmpb_tl \c_spath_moveto_tl
+ \tl_put_right:Nx \l__spath_tmpb_tl
+ {
+ {\dim_use:N \l__spath_tmpa_dim}
+ {\dim_use:N \l__spath_tmpb_dim}
+ }
+ \tl_put_right:NV \l__spath_tmpb_tl \c_spath_lineto_tl
+
+ \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
+ \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+
+ \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
+ \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+
+ }
+
+ }
+ {
+
+ \tl_set_eq:NN \l__spath_tmpb_tl \l__spath_tmpc_tl
+ \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
+ \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+
+ \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
+ \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+
+ }
+
+ \tl_if_empty:NF \l__spath_tmpb_tl
+ {
+ \seq_put_right:NV \l__spath_tmpa_seq \l__spath_tmpb_tl
+ }
+ \tl_clear:N \l__spath_tmpb_tl
+ }
+
+ \seq_gclear:N \g__spath_output_seq
+ \seq_gset_eq:NN \g__spath_output_seq \l__spath_tmpa_seq
+ \group_end:
}
-\cs_new_nopar:Npn \spath_clear:n #1
+\cs_new_protected_nopar:Npn \spath_segments_to_seq:Nn #1#2
{
- \prop_gclear:c {l__spath_#1}
+ \__spath_segments_to_seq:n {#2}
+ \seq_clear_new:N #1
+ \seq_set_eq:NN #1 \g__spath_output_seq
+ \seq_gclear:N \g__spath_output_seq
}
-\cs_new_nopar:Npn \spath_clear_new:n #1
+\cs_generate_variant:Nn \spath_segments_to_seq:Nn {NV, cn, cV, Nv, cv}
+\cs_new_protected_nopar:Npn \spath_segments_gto_seq:Nn #1#2
{
- \prop_gclear_new:c {l__spath_#1}
+ \__spath_segments_to_seq:n {#2}
+ \seq_clear_new:N #1
+ \seq_gset_eq:NN #1 \g__spath_output_seq
+ \seq_gclear:N \g__spath_output_seq
}
-\cs_new_nopar:Npn \spath_show:n #1
+\cs_generate_variant:Nn \spath_segments_gto_seq:Nn {NV, cn, cV, Nv, cv}
+\cs_new_protected_nopar:Npn \__spath_components_to_seq:n #1
{
- \prop_show:c {l__spath_#1}
+ \group_begin:
+ \tl_set:Nn \l__spath_tmpa_tl {#1}
+ \seq_clear:N \l__spath_tmpa_seq
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ \tl_put_right:NV \l__spath_tmpa_tl \c_spath_moveto_tl
+ \tl_set_eq:NN \l__spath_tmpb_tl \c_spath_moveto_tl
+ \bool_do_until:nn {
+ \tl_if_empty_p:N \l__spath_tmpa_tl
+ }
+ {
+ \tl_set:Nx \l__spath_tmpc_tl {\tl_head:N \l__spath_tmpa_tl}
+ \tl_if_eq:NNT \l__spath_tmpc_tl \c_spath_moveto_tl
+ {
+ \seq_put_right:NV \l__spath_tmpa_seq \l__spath_tmpb_tl
+ \tl_clear:N \l__spath_tmpb_tl
+ }
+ \tl_if_single:NTF \l__spath_tmpc_tl
+ {
+ \tl_put_right:NV \l__spath_tmpb_tl \l__spath_tmpc_tl
+ }
+ {
+ \tl_put_right:Nx \l__spath_tmpb_tl {{\l__spath_tmpc_tl}}
+ }
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ }
+
+ \seq_gclear:N \g__spath_output_seq
+ \seq_gset_eq:NN \g__spath_output_seq \l__spath_tmpa_seq
+ \group_end:
}
-\cs_new_nopar:Npn \spath_put:nnn #1#2#3
+\cs_new_protected_nopar:Npn \spath_components_to_seq:Nn #1#2
{
- \prop_gput:cnn {l__spath_#1} {#2} {#3}
+ \__spath_components_to_seq:n {#2}
+ \seq_clear_new:N #1
+ \seq_set_eq:NN #1 \g__spath_output_seq
+ \seq_gclear:N \g__spath_output_seq
}
-\cs_new_nopar:Npn \spath_remove:nn #1#2
+\cs_generate_variant:Nn \spath_components_to_seq:Nn {NV, cn, cV, cv, Nv}
+\cs_new_protected_nopar:Npn \spath_components_gto_seq:Nn #1#2
{
- \prop_gremove:cn {l__spath_#1} {#2}
+ \__spath_components_to_seq:n {#2}
+ \seq_clear_new:N #1
+ \seq_gset_eq:NN #1 \g__spath_output_seq
+ \seq_gclear:N \g__spath_output_seq
}
-\cs_new_nopar:Npn \__spath_get:nn #1#2
+\cs_generate_variant:Nn \spath_components_gto_seq:Nn {NV, cn, cV, cv, Nv}
+\cs_new_protected_nopar:Npn \spath_components_to_clist:Nn #1#2
{
- \prop_item:cn {l__spath_#1} {#2}
+ \__spath_components_to_seq:n {#2}
+ \clist_clear_new:N #1
+ \clist_set_from_seq:NN #1 \g__spath_output_seq
+ \seq_gclear:N \g__spath_output_seq
}
-\cs_new_nopar:Npn \__spath_get:nnN #1#2#3
+\cs_generate_variant:Nn \spath_components_to_clist:Nn {NV, cn, cV, cv, Nv}
+\cs_new_protected_nopar:Npn \spath_components_gto_clist:Nn #1#2
{
- \prop_get:cnN {l__spath_#1} {#2} #3
+ \__spath_components_to_seq:n {#2}
+ \clist_clear_new:N #1
+ \clist_gset_from_seq:NN #1 \g__spath_output_seq
+ \seq_gclear:N \g__spath_output_seq
}
-\prg_new_conditional:Npnn \spath_if_in:nn #1#2 {p, T, F, TF}
+\cs_generate_variant:Nn \spath_components_gto_clist:Nn {NV, cn, cV, cv, Nv}
+\cs_new_protected_nopar:Npn \spath_length:n #1
{
- \prop_if_in:cnTF {l__spath_#1} {#2}
- { \prg_return_true: }
- { \prg_return_false: }
+ \int_eval:n {\tl_count:n {#1} / 3}
}
-\cs_generate_variant:Nn \__prop_split:NnTF {cnTF}
-\prg_new_protected_conditional:Npnn \__spath_get:nnN #1#2#3 {T, F, TF}
+\cs_generate_variant:Nn \spath_length:n {V}
+\cs_new_protected_nopar:Npn \__spath_reallength:n #1
{
- \__prop_split:cnTF {l__spath_#1} {#2}
- {
- \tl_set:Nn #3 {##2}
- \prg_return_true:
+ \group_begin:
+ \int_set:Nn \l__spath_tmpa_int {0}
+ \tl_map_inline:nn {#1} {
+ \tl_set:Nn \l__spath_tmpa_tl {##1}
+ \tl_case:NnT \l__spath_tmpa_tl
+ {
+ \c_spath_lineto_tl {}
+ \c_spath_curveto_tl {}
+ \c_spath_closepath_tl {}
+ }
+ {
+ \int_incr:N \l__spath_tmpa_int
+ }
}
- { \prg_return_false: }
+ \int_gzero:N \g__spath_output_int
+ \int_gset_eq:NN \g__spath_output_int \l__spath_tmpa_int
+ \group_end:
}
-\cs_generate_variant:Nn \spath_put:nnn {nnV, nnx, nno}
-\cs_generate_variant:Nn \__spath_get:nn {Vn}
-\cs_generate_variant:Nn \__spath_get:nnN {VnN}
-\prg_new_conditional:Npnn \spath_if_exist:n #1 {p,T,F,TF}
+\cs_new_protected_nopar:Npn \spath_reallength:Nn #1#2
{
- \prop_if_exist:cTF {l__spath_#1}
- {
- \prg_return_true:
- }
- {
- \prg_return_false:
- }
+ \__spath_reallength:n {#2}
+ \int_set_eq:NN #1 \g__spath_output_int
+ \int_gzero:N \g__spath_output_int
}
-\cs_new_nopar:Npn \spath_clone:nn #1 #2
+\cs_generate_variant:Nn \spath_reallength:Nn {NV, cn, cV, Nv, cv}
+\cs_new_protected_nopar:Npn \spath_greallength:Nn #1#2
{
- \spath_clear_new:n {#2}
- \tl_map_inline:Nn \g__spath_attributes
- {
- \spath_if_in:nnT {#1} {##1}
+ \__spath_reallength:n {#2}
+ \int_gset_eq:NN #1 \g__spath_output_int
+ \int_gzero:N \g__spath_output_int
+}
+\cs_generate_variant:Nn \spath_greallength:Nn {NV, cn, cV}
+\cs_new_protected_nopar:Npn \__spath_numberofcomponents:n #1
+{
+ \group_begin:
+ \int_set:Nn \l__spath_tmpa_int {0}
+ \tl_map_inline:nn {#1} {
+ \tl_set:Nn \l__spath_tmpa_tl {##1}
+ \tl_case:Nn \l__spath_tmpa_tl
{
- \__spath_get:nnN {#1} {##1} \l__spath_tmpa_tl
- \spath_put:nnV {#2} {##1} \l__spath_tmpa_tl
+ \c_spath_moveto_tl
+ {
+ \int_incr:N \l__spath_tmpa_int
+ }
}
}
+ \int_gzero:N \g__spath_output_int
+ \int_gset_eq:NN \g__spath_output_int \l__spath_tmpa_int
+ \group_end:
}
-\cs_new_protected_nopar:Npn \spath_get_current_path:n #1
+\cs_new_protected_nopar:Npn \spath_numberofcomponents:Nn #1#2
{
- \pgfsyssoftpath@getcurrentpath\l__spath_tmpa_tl
- \spath_clear_new:n {#1}
- \spath_put:nnV {#1} {path} \l__spath_tmpa_tl
+ \__spath_numberofcomponents:n {#2}
+ \int_set_eq:NN #1 \g__spath_output_int
+ \int_gzero:N \g__spath_output_int
}
-\cs_new_protected_nopar:Npn \spath_set_current_path:n #1
+\cs_generate_variant:Nn \spath_numberofcomponents:Nn {NV, cn, cV, Nv}
+\cs_new_protected_nopar:Npn \spath_gnumberofcomponents:Nn #1#2
{
- \spath_get:nnN {#1} {min bb} \l__spath_tmpa_tl
- \exp_last_unbraced:NV \pgf@protocolsizes\l__spath_tmpa_tl
-
- \spath_get:nnN {#1} {max bb} \l__spath_tmpa_tl
- \exp_last_unbraced:NV \pgf@protocolsizes\l__spath_tmpa_tl
-
- \spath_get:nnN {#1} {path} \l__spath_tmpa_tl
- \pgfsyssoftpath@setcurrentpath\l__spath_tmpa_tl
- \pgfsyssoftpath@flushcurrentpath
+ \__spath_numberofcomponents:n {#2}
+ \int_gset_eq:NN #1 \g__spath_output_int
+ \int_gzero:N \g__spath_output_int
}
-\cs_new_protected_nopar:Npn \spath_use_path:nn #1#2
+\cs_generate_variant:Nn \spath_gnumberofcomponents:Nn {NV, cn, cV, Nv}
+\cs_new_protected_nopar:Npn \__spath_initialpoint:n #1
{
- \spath_set_current_path:n {#1}
- \pgfusepath{#2}
+ \group_begin:
+ \tl_clear:N \l__spath_tmpa_tl
+ \tl_set:Nx \l__spath_tmpa_tl
+ {
+ { \tl_item:nn {#1} {2} }
+ { \tl_item:nn {#1} {3} }
+ }
+ \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpa_tl
+ \group_end:
}
-\cs_new_protected_nopar:Npn \spath_protocol_path:n #1
+\cs_new_protected_nopar:Npn \spath_initialpoint:Nn #1#2
{
- \spath_get:nnN {#1} {min bb} \l__spath_tmpa_tl
- \exp_last_unbraced:NV \pgf@protocolsizes\l__spath_tmpa_tl
-
- \spath_get:nnN {#1} {max bb} \l__spath_tmpa_tl
- \exp_last_unbraced:NV \pgf@protocolsizes\l__spath_tmpa_tl
+ \__spath_initialpoint:n {#2}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
}
-\cs_new_protected_nopar:Npn \spath_tikz_path:nn #1#2
+\cs_generate_variant:Nn \spath_initialpoint:Nn {NV, cn, cV, Nv}
+\cs_new_protected_nopar:Npn \spath_ginitialpoint:Nn #1#2
{
- \path[#1] \pgfextra{
- \spath_get:nnN {#2} {path} \l__spath_tmpa_tl
- \pgfsyssoftpath@setcurrentpath \l__spath_tmpa_tl
- };
+ \__spath_initialpoint:n {#2}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
}
-\cs_generate_variant:Nn \spath_tikz_path:nn {Vn}
-\cs_new_nopar:Npn \spath_get:nn #1#2
+\cs_generate_variant:Nn \spath_ginitialpoint:Nn {NV, cn, cV, Nv}
+\cs_new_protected_nopar:Npn \__spath_finalpoint:n #1
{
- \spath_if_in:nnF {#1} {#2}
+ \group_begin:
+ \tl_set:Nn \l__spath_tmpa_tl {#1}
+ \tl_reverse:N \l__spath_tmpa_tl
+ \tl_clear:N \l__spath_tmpb_tl
+ \tl_set:Nx \l__spath_tmpb_tl
{
- \cs_if_exist_use:cT {spath_generate_#2:n} {{#1}}
+ { \tl_item:Nn \l__spath_tmpa_tl {2} }
+ { \tl_item:Nn \l__spath_tmpa_tl {1} }
}
- \__spath_get:nn {#1} {#2}
+ \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpb_tl
+ \group_end:
}
-\cs_new_nopar:Npn \spath_get:nnN #1#2#3
+\cs_new_protected_nopar:Npn \spath_finalpoint:Nn #1#2
{
- \spath_if_in:nnF {#1} {#2}
- {
- \cs_if_exist_use:cT {spath_generate_#2:n} {{#1}}
- }
- \__spath_get:nnN {#1} {#2} #3
+ \__spath_finalpoint:n {#2}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
}
-\cs_generate_variant:Nn \spath_get:nnN {VnN}
-\cs_new_nopar:Npn \spath_generate_length:n #1
+\cs_generate_variant:Nn \spath_finalpoint:Nn {NV, cn, cV, Nv}
+\cs_new_protected_nopar:Npn \spath_gfinalpoint:Nn #1#2
{
- \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl
- \spath_put:nnx {#1} {length} {\int_eval:n {\tl_count:N \l__spath_tmpa_tl /3 }}
+ \__spath_finalpoint:n {#2}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
}
-\cs_new_nopar:Npn \spath_generate_reallength:n #1
+\cs_generate_variant:Nn \spath_gfinalpoint:Nn {NV, cn, cV, Nv}
+\cs_new_protected_nopar:Npn \__spath_finalmovepoint:n #1
{
- \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl
- \int_set:Nn \l__spath_tmpa_int {0}
- \tl_map_inline:Nn \l__spath_tmpa_tl {
- \tl_if_eq:nnT {##1} {\pgfsyssoftpath@linetotoken}
- {
- \int_incr:N \l__spath_tmpa_int
- }
- \tl_if_eq:nnT {##1} {\pgfsyssoftpath@curvetotoken}
+ \group_begin:
+ \tl_set:Nn \l__spath_tmpc_tl { {0pt} {0pt} }
+ \tl_set:Nn \l__spath_tmpa_tl {#1}
+ \bool_do_until:nn
+ {
+ \tl_if_empty_p:N \l__spath_tmpa_tl
+ }
+ {
+ \tl_set:Nx \l__spath_tmpb_tl {\tl_head:N \l__spath_tmpa_tl}
+ \tl_case:Nn \l__spath_tmpb_tl
{
- \int_incr:N \l__spath_tmpa_int
+ \c_spath_moveto_tl
+ {
+ \tl_set:Nx \l__spath_tmpc_tl
+ {
+ { \tl_item:Nn \l__spath_tmpa_tl {2} }
+ { \tl_item:Nn \l__spath_tmpa_tl {3} }
+ }
+ }
}
- }
- \spath_put:nnx {#1} {real length} {\int_use:N \l__spath_tmpa_int}
-}
-\cs_new_nopar:Npn \spath_generate_numberofcomponents:n #1
-{
- \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl
- \int_set:Nn \l__spath_tmpa_int {0}
- \tl_map_inline:Nn \l__spath_tmpa_tl {
- \tl_if_eq:nnT {##1} {\pgfsyssoftpath@movetotoken}
+ \prg_replicate:nn {3}
{
- \int_incr:N \l__spath_tmpa_int
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
}
}
- \spath_put:nnx {#1} {number of components} {\int_use:N \l__spath_tmpa_int}
+ \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpc_tl
+ \group_end:
}
-\cs_new_nopar:Npn \spath_generate_initialpoint:n #1
+\cs_new_protected_nopar:Npn \spath_finalmovepoint:Nn #1#2
{
- \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl
- \tl_clear:N \l__spath_tmpb_tl
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
- \spath_put:nnV {#1} {initial point} \l__spath_tmpb_tl
+ \__spath_finalmovepoint:n {#2}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
}
-\cs_new_nopar:Npn \spath_generate_finalpoint:n #1
+\cs_generate_variant:Nn \spath_finalmovepoint:Nn {NV, cn, cV}
+\cs_new_protected_nopar:Npn \spath_gfinalmovepoint:Nn #1#2
{
- \tl_clear:N \l__spath_tmpb_tl
- \spath_if_in:nnTF {#1} {reverse path}
- {
- \__spath_get:nnN {#1} {reverse path} \l__spath_tmpa_tl
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
- }
- {
- \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl
- \tl_reverse:N \l__spath_tmpa_tl
- \tl_put_left:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_put_left:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
- }
- \spath_put:nnV {#1} {final point} \l__spath_tmpb_tl
+ \__spath_finalmovepoint:n {#2}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
}
-\cs_generate_variant:Nn \spath_generate_finalpoint:n {V}
-\cs_new_nopar:Npn \spath_generate_reversepath:n #1
+\cs_generate_variant:Nn \spath_gfinalmovepoint:Nn {NV, cn, cV}
+\cs_new_protected_nopar:Npn \__spath_reverse:n #1
{
- \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl
+ \group_begin:
+ \tl_set:Nn \l__spath_tmpa_tl {#1}
+
\tl_clear:N \l__spath_tmpb_tl
+ \tl_clear:N \l__spath_tmpd_tl
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
\dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
\dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_put_left:Nx \l__spath_tmpb_tl
+
+ \tl_put_left:Nx \l__spath_tmpd_tl
{
{\dim_use:N \l__spath_tmpa_dim}
{\dim_use:N \l__spath_tmpb_dim}
}
+
+ \bool_set_false:N \l__spath_closed_bool
+
\bool_until_do:nn {
\tl_if_empty_p:N \l__spath_tmpa_tl
}
{
\tl_set:Nx \l__spath_tmpc_tl {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nn \l__spath_tmpd_tl {}
- \tl_case:NnF \l__spath_tmpc_tl
+
+ \tl_case:NnTF \l__spath_tmpc_tl
{
- \g__spath_moveto_tl {\tl_set_eq:NN \l__spath_tmpd_tl \g__spath_moveto_tl }
- \g__spath_lineto_tl {\tl_set_eq:NN \l__spath_tmpd_tl \g__spath_lineto_tl }
- \g__spath_curveto_tl {\tl_set_eq:NN \l__spath_tmpd_tl \g__spath_curvetoa_tl }
- \g__spath_curvetoa_tl {\tl_set_eq:NN \l__spath_tmpd_tl \g__spath_curveto_tl }
- \g__spath_curvetob_tl {\tl_set_eq:NN \l__spath_tmpd_tl \g__spath_curvetob_tl }
+ \c_spath_moveto_tl {
+
+ \bool_if:NT \l__spath_closed_bool
+ {
+ \tl_put_right:NV \l__spath_tmpd_tl \c_spath_closepath_tl
+ \tl_set:Nx \l__spath_tmpe_tl {\tl_tail:N \l__spath_tmpd_tl}
+ \tl_put_right:Nx \l__spath_tmpd_tl
+ {
+ { \tl_head:N \l__spath_tmpd_tl }
+ { \tl_head:N \l__spath_tmpe_tl }
+ }
+ }
+ \bool_set_false:N \l__spath_closed_bool
+ \tl_put_left:NV \l__spath_tmpd_tl \c_spath_moveto_tl
+ \tl_put_left:NV \l__spath_tmpb_tl \l__spath_tmpd_tl
+ \tl_clear:N \l__spath_tmpd_tl
+ }
+ \c_spath_lineto_tl {
+ \tl_put_left:NV \l__spath_tmpd_tl \c_spath_lineto_tl
+ }
+ \c_spath_curveto_tl {
+ \tl_put_left:NV \l__spath_tmpd_tl \c_spath_curvetoa_tl
+ }
+ \c_spath_curvetoa_tl {
+ \tl_put_left:NV \l__spath_tmpd_tl \c_spath_curveto_tl
+ }
+ \c_spath_curvetob_tl {
+ \tl_put_left:NV \l__spath_tmpd_tl \c_spath_curvetob_tl
+ }
}
{
- \tl_show:N \l__spath_tmpc_tl
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+
+ \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+
+ \tl_put_left:Nx \l__spath_tmpd_tl
+ {
+ {\dim_use:N \l__spath_tmpa_dim}
+ {\dim_use:N \l__spath_tmpb_dim}
+ }
+
}
- \tl_put_left:NV \l__spath_tmpb_tl \l__spath_tmpd_tl
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_put_left:Nx \l__spath_tmpb_tl
{
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
+ \tl_if_eq:NNTF \l__spath_tmpc_tl \c_spath_closepath_tl
+ {
+ \bool_set_true:N \l__spath_closed_bool
+ }
+ {
+ \msg_warning:nnx
+ { spath3 }
+ { unknown path construction }
+ {\l__spath_tmpc_tl }
+ }
+
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+
+ }
+ }
+
+ \bool_if:NT \l__spath_closed_bool
+ {
+ \tl_put_right:NV \l__spath_tmpd_tl \c_spath_closepath_tl
+ \tl_set:Nx \l__spath_tmpe_tl {\tl_tail:N \l__spath_tmpd_tl}
+ \tl_put_right:Nx \l__spath_tmpd_tl
+ {
+ { \tl_head:N \l__spath_tmpd_tl }
+ { \tl_head:N \l__spath_tmpe_tl }
}
}
- \tl_put_left:NV \l__spath_tmpb_tl \g__spath_moveto_tl
- \spath_put:nnV {#1} {reverse path} \l__spath_tmpb_tl
+
+ \bool_set_false:N \l__spath_closed_bool
+ \tl_put_left:NV \l__spath_tmpd_tl \c_spath_moveto_tl
+ \tl_put_left:NV \l__spath_tmpb_tl \l__spath_tmpd_tl
+
+ \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpb_tl
+ \group_end:
}
-\cs_new_nopar:Npn \spath_generate_initialaction:n #1
+\cs_new_protected_nopar:Npn \spath_reverse:Nn #1#2
{
- \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl
- \tl_clear:N \l__spath_tmpb_tl
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_if_empty:NF \l__spath_tmpa_tl {
- \tl_set:Nx \l__spath_tmpb_tl {\tl_head:N \l__spath_tmpa_tl}
- }
- \spath_put:nnV {#1} {initial action} \l__spath_tmpb_tl
+ \__spath_reverse:n {#2}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
}
-\cs_new_nopar:Npn \spath_generate_finalaction:n #1
+\cs_generate_variant:Nn \spath_reverse:Nn {NV, cn, cV, Nv}
+\cs_new_protected_nopar:Npn \spath_reverse:N #1
{
- \tl_clear:N \l__spath_tmpb_tl
- \spath_if_in:nnTF {#1} {reverse path}
+ \spath_reverse:NV #1#1
+}
+\cs_generate_variant:Nn \spath_reverse:N {c}
+\cs_new_protected_nopar:Npn \spath_greverse:Nn #1#2
+{
+ \__spath_reverse:n {#2}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_greverse:Nn {NV, cn, cV, Nv}
+\cs_new_protected_nopar:Npn \spath_greverse:N #1
+{
+ \spath_greverse:NV #1#1
+}
+\cs_generate_variant:Nn \spath_greverse:N {c}
+\cs_new_protected_nopar:Npn \__spath_initialaction:n #1
+{
+ \group_begin:
+ \tl_clear:N \l__spath_tmpa_tl
+ \int_compare:nT
{
- \__spath_get:nnN {#1} {reverse path} \l__spath_tmpa_tl
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ \tl_count:n {#1} > 3
}
{
- \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl
- \tl_reverse:N \l__spath_tmpa_tl
+ \tl_set:Nx \l__spath_tmpa_tl
+ {
+ \tl_item:Nn {#1} {4}
+ }
}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_if_empty:NF \l__spath_tmpa_tl {
- \tl_set:Nx \l__spath_tmpb_tl {\tl_head:N \l__spath_tmpa_tl}
+ \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpa_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_initialaction:Nn #1#2
+{
+ \__spath_initialaction:n {#2}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_initialaction:Nn {NV}
+\cs_new_protected_nopar:Npn \spath_ginitialaction:Nn #1#2
+{
+ \__spath_initialaction:n {#2}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_ginitialaction:Nn {NV}
+\cs_new_protected_nopar:Npn \__spath_finalaction:n #1
+{
+ \group_begin:
+ \tl_clear:N \l__spath_tmpb_tl
+ \int_compare:nT
+ {
+ \tl_count:n {#1} > 3
}
- \tl_if_eq:NNT \l__spath_tmpa_tl \g__spath_curvetoa_tl
{
- \tl_set_eq:NN \l__spath_tmpa_tl \g__spath_curveto_tl
+ \tl_set:Nn \l__spath_tmpa_tl {#1}
+ \tl_reverse:N \l__spath_tmpa_tl
+ \tl_set:Nx \l__spath_tmpb_tl
+ {
+ \tl_item:Nn \l__spath_tmpa_tl {3}
+ }
+ \tl_if_eq:NNT \l__spath_tmpb_tl \c_spath_curvetoa_tl
+ {
+ \tl_set_eq:NN \l__spath_tmpb_tl \c_spath_curveto_tl
+ }
}
- \spath_put:nnV {#1} {final action} \l__spath_tmpb_tl
+ \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpb_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_finalaction:Nn #1#2
+{
+ \__spath_finalaction:n {#2}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_finalaction:Nn {NV}
+\cs_new_protected_nopar:Npn \spath_gfinalaction:Nn #1#2
+{
+ \__spath_finalaction:n {#2}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
}
-\cs_new_nopar:Npn \spath_generate_minbb:n #1
+\cs_generate_variant:Nn \spath_gfinalaction:Nn {NV}
+\cs_new_protected_nopar:Npn \__spath_minbb:n #1
{
- \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl
+ \group_begin:
+ \tl_set:Nn \l__spath_tmpa_tl {#1}
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
\dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
@@ -354,9 +680,11 @@ manipulating PGF soft paths}
}
{
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpa_dim {\dim_min:nn {\tl_head:N \l__spath_tmpa_tl} {\l__spath_tmpa_dim}}
+ \dim_set:Nn \l__spath_tmpa_dim
+ {\dim_min:nn {\tl_head:N \l__spath_tmpa_tl} {\l__spath_tmpa_dim}}
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpb_dim {\dim_min:nn {\tl_head:N \l__spath_tmpa_tl} {\l__spath_tmpb_dim}}
+ \dim_set:Nn \l__spath_tmpb_dim
+ {\dim_min:nn {\tl_head:N \l__spath_tmpa_tl} {\l__spath_tmpb_dim}}
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
}
\tl_clear:N \l__spath_tmpb_tl
@@ -365,11 +693,27 @@ manipulating PGF soft paths}
{\dim_use:N \l__spath_tmpa_dim}
{\dim_use:N \l__spath_tmpb_dim}
}
- \spath_put:nnV {#1} {min bb} \l__spath_tmpb_tl
+ \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpb_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_minbb:Nn #1#2
+{
+ \__spath_minbb:n {#2}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_minbb:Nn {NV, cn, cV}
+\cs_new_protected_nopar:Npn \spath_gminbb:Nn #1#2
+{
+ \__spath_minbb:n {#2}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
}
-\cs_new_nopar:Npn \spath_generate_maxbb:n #1
+\cs_generate_variant:Nn \spath_gminbb:Nn {NV, cn, cV}
+\cs_new_protected_nopar:Npn \__spath_maxbb:n #1
{
- \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl
+ \group_begin:
+ \tl_set:Nn \l__spath_tmpa_tl {#1}
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
\dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
@@ -380,9 +724,11 @@ manipulating PGF soft paths}
}
{
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpa_dim {\dim_max:nn {\tl_head:N \l__spath_tmpa_tl} {\l__spath_tmpa_dim}}
+ \dim_set:Nn \l__spath_tmpa_dim
+ {\dim_max:nn {\tl_head:N \l__spath_tmpa_tl} {\l__spath_tmpa_dim}}
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpb_dim {\dim_max:nn {\tl_head:N \l__spath_tmpa_tl} {\l__spath_tmpb_dim}}
+ \dim_set:Nn \l__spath_tmpb_dim
+ {\dim_max:nn {\tl_head:N \l__spath_tmpa_tl} {\l__spath_tmpb_dim}}
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
}
\tl_clear:N \l__spath_tmpb_tl
@@ -391,1101 +737,3215 @@ manipulating PGF soft paths}
{\dim_use:N \l__spath_tmpa_dim}
{\dim_use:N \l__spath_tmpb_dim}
}
- \spath_put:nnV {#1} {max bb} \l__spath_tmpb_tl
-}
-\tl_new:N \l__spath_rp_tl
-\int_new:N \l__spath_l_int
-\int_new:N \l__spath_rl_int
-\int_new:N \l__spath_nc_int
-\tl_new:N \l__spath_ip_tl
-\tl_new:N \l__spath_fp_tl
-\tl_new:N \l__spath_ia_tl
-\tl_new:N \l__spath_fa_tl
-\dim_new:N \l__spath_minx_dim
-\dim_new:N \l__spath_miny_dim
-\dim_new:N \l__spath_maxx_dim
-\dim_new:N \l__spath_maxy_dim
-
-\cs_new_nopar:Npn \spath_generate_all:n #1
-{
- \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl
-
- \tl_clear:N \l__spath_rp_tl
- \int_set:Nn \l__spath_l_int {1}
- \int_zero:N \l__spath_rl_int
- \int_set:Nn \l__spath_nc_int {1}
- \tl_clear:N \l__spath_ip_tl
- \tl_clear:N \l__spath_fp_tl
- \tl_clear:N \l__spath_ia_tl
- \tl_clear:N \l__spath_fa_tl
- \dim_zero:N \l__spath_minx_dim
- \dim_zero:N \l__spath_miny_dim
- \dim_zero:N \l__spath_maxx_dim
- \dim_zero:N \l__spath_maxy_dim
-
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
-
- \tl_clear:N \l__spath_ip_tl
- \tl_put_right:Nx \l__spath_ip_tl
+ \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpb_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_maxbb:Nn #1#2
+{
+ \__spath_maxbb:n {#2}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_maxbb:Nn {NV, cn, cV}
+\cs_new_protected_nopar:Npn \spath_gmaxbb:Nn #1#2
+{
+ \__spath_maxbb:n {#2}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_gmaxbb:Nn {NV, cn, cV}
+\int_set:Nn \l__spath_tmpa_int {\char_value_catcode:n {`@}}
+\char_set_catcode_letter:N @
+\cs_new_protected_nopar:Npn \spath_save_to_aux:Nn #1#2 {
+ \tl_if_empty:nF {#2}
{
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
+ \tl_clear:N \l__spath_tmpa_tl
+ \tl_put_right:Nn \l__spath_tmpa_tl {
+ \ExplSyntaxOn
+ \tl_clear:N #1
+ \tl_set:Nn #1 {#2}
+ \ExplSyntaxOff
+ }
+ \protected@write\@auxout{}{
+ \tl_to_str:N \l__spath_tmpa_tl
+ }
}
-
- \dim_set_eq:NN \l__spath_minx_dim \l__spath_tmpa_dim
- \dim_set_eq:NN \l__spath_miny_dim \l__spath_tmpb_dim
- \dim_set_eq:NN \l__spath_maxx_dim \l__spath_tmpa_dim
- \dim_set_eq:NN \l__spath_maxy_dim \l__spath_tmpb_dim
-
- \tl_put_left:Nx \l__spath_rp_tl
+}
+\char_set_catcode:nn {`@} {\l__spath_tmpa_int}
+\cs_generate_variant:Nn \spath_save_to_aux:Nn {cn, cV, NV}
+\cs_new_protected_nopar:Npn \spath_save_to_aux:N #1
+{
+ \tl_if_exist:NT #1
{
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
+ \spath_save_to_aux:NV #1#1
}
-
- \tl_set:Nx \l__spath_ia_tl {\tl_head:N \l__spath_tmpa_tl}
-
+}
+\cs_new_protected_nopar:Npn \__spath_translate:nnn #1#2#3
+{
+ \group_begin:
+ \tl_set:Nn \l__spath_tmpa_tl {#1}
+ \tl_clear:N \l__spath_tmpb_tl
\bool_until_do:nn {
\tl_if_empty_p:N \l__spath_tmpa_tl
}
{
- \tl_set:Nx \l__spath_tmpc_tl {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nn \l__spath_tmpd_tl {}
- \tl_set_eq:NN \l__spath_fa_tl \l__spath_tmpc_tl
- \int_incr:N \l__spath_l_int
-
- \tl_case:NnF \l__spath_tmpc_tl
- {
- \g__spath_moveto_tl {
- \tl_set_eq:NN \l__spath_tmpd_tl \g__spath_moveto_tl
- \int_incr:N \l__spath_nc_int
- }
- \g__spath_lineto_tl {
- \tl_set_eq:NN \l__spath_tmpd_tl \g__spath_lineto_tl
- \int_incr:N \l__spath_rl_int
- }
- \g__spath_curveto_tl {
- \tl_set_eq:NN \l__spath_tmpd_tl \g__spath_curvetoa_tl
- \int_incr:N \l__spath_rl_int
- }
- \g__spath_curvetoa_tl {
- \tl_set_eq:NN \l__spath_tmpd_tl \g__spath_curveto_tl
- }
- \g__spath_curvetob_tl {
- \tl_set_eq:NN \l__spath_tmpd_tl \g__spath_curvetob_tl
- }
- }
- {
- \tl_show:N \l__spath_tmpc_tl
- }
- \tl_put_left:NV \l__spath_rp_tl \l__spath_tmpd_tl
+ \tl_put_right:Nx \l__spath_tmpb_tl {\tl_head:N \l__spath_tmpa_tl}
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
+ \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl + #2}
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_minx_dim {\dim_min:nn { \l__spath_minx_dim} {\l__spath_tmpa_dim}}
- \dim_set:Nn \l__spath_miny_dim {\dim_min:nn { \l__spath_miny_dim} {\l__spath_tmpb_dim}}
- \dim_set:Nn \l__spath_maxx_dim {\dim_max:nn { \l__spath_maxx_dim} {\l__spath_tmpa_dim}}
- \dim_set:Nn \l__spath_maxy_dim {\dim_max:nn { \l__spath_maxy_dim} {\l__spath_tmpb_dim}}
+ \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl + #3}
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_put_left:Nx \l__spath_rp_tl
+ \tl_put_right:Nx \l__spath_tmpb_tl
{
{\dim_use:N \l__spath_tmpa_dim}
{\dim_use:N \l__spath_tmpb_dim}
}
+ }
+ \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpb_tl
+ \group_end:
+}
+\cs_generate_variant:Nn \__spath_translate:nnn {nVV}
+\cs_new_protected_nopar:Npn \spath_translate:Nnnn #1#2#3#4
+{
+ \__spath_translate:nnn {#2}{#3}{#4}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_translate:Nnnn {NVxx, NVVV, NVnn}
+\cs_new_protected_nopar:Npn \spath_translate:Nnn #1#2#3
+{
+ \spath_translate:NVnn #1#1{#2}{#3}
+}
+\cs_generate_variant:Nn \spath_translate:Nnn {NVV, cnn, cVV}
+\cs_new_protected_nopar:Npn \spath_gtranslate:Nnnn #1#2#3#4
+{
+ \__spath_translate:nnn {#2}{#3}{#4}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_gtranslate:Nnnn {NVxx, NVVV, NVnn}
+\cs_new_protected_nopar:Npn \spath_gtranslate:Nnn #1#2#3
+{
+ \spath_gtranslate:NVnn #1#1{#2}{#3}
+}
+\cs_generate_variant:Nn \spath_gtranslate:Nnn {NVV, cnn, cVV}
+\cs_new_protected_nopar:Npn \spath_translate:Nn #1#2
+{
+ \spath_translate:Nnn #1 #2
+}
+\cs_generate_variant:Nn \spath_translate:Nn {NV}
+\cs_new_protected_nopar:Npn \spath_gtranslate:Nn #1#2
+{
+ \spath_gtranslate:Nnn #1 #2
+}
+\cs_generate_variant:Nn \spath_gtranslate:Nn {NV}
+\cs_new_protected_nopar:Npn \__spath_translate_to:nnn #1#2#3
+{
+ \group_begin:
+ \spath_initialpoint:Nn \l__spath_tmpa_tl {#1}
- \tl_set:Nx \l__spath_fp_tl
- {
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
- }
+ \dim_set:Nn \l__spath_tmpa_dim
+ {
+ #2
+ -
+ \tl_item:Nn \l__spath_tmpa_tl {1}
+ }
+ \dim_set:Nn \l__spath_tmpb_dim
+ {
+ #3
+ -
+ \tl_item:Nn \l__spath_tmpa_tl {2}
+ }
+ \__spath_translate:nVV {#1} \l__spath_tmpa_dim \l__spath_tmpb_dim
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_translate_to:Nnnn #1#2#3#4
+{
+ \__spath_translate_to:nnn {#2}{#3}{#4}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_translate_to:Nnnn {NVxx, NVVV, NVnn}
+\cs_new_protected_nopar:Npn \spath_translate_to:Nnn #1#2#3
+{
+ \spath_translate_to:NVnn #1#1{#2}{#3}
+}
+\cs_generate_variant:Nn \spath_translate_to:Nnn {NVV, cnn, cVV}
+\cs_new_protected_nopar:Npn \spath_gtranslate_to:Nnnn #1#2#3#4
+{
+ \__spath_translate_to:nnn {#2}{#3}{#4}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_gtranslate_to:Nnnn {NVxx, NVVV, NVnn}
+\cs_new_protected_nopar:Npn \spath_gtranslate_to:Nnn #1#2#3
+{
+ \spath_gtranslate_to:NVnn #1#1{#2}{#3}
+}
+\cs_generate_variant:Nn \spath_gtranslate_to:Nnn {NVV, cnn, cVV}
+\cs_new_protected_nopar:Npn \spath_translate_to:Nn #1#2
+{
+ \spath_translate_to:Nnn #1 #2
+}
+\cs_generate_variant:Nn \spath_translate_to:Nn {NV}
+\cs_new_protected_nopar:Npn \spath_gtranslate_to:Nn #1#2
+{
+ \spath_gtranslate_to:Nnn #1 #2
+}
+\cs_generate_variant:Nn \spath_gtranslate_to:Nn {NV}
+\cs_new_protected_nopar:Npn \__spath_scale:nnn #1#2#3
+{
+ \group_begin:
+ \tl_set:Nn \l__spath_tmpa_tl {#1}
+ \tl_clear:N \l__spath_tmpb_tl
+ \bool_until_do:nn {
+ \tl_if_empty_p:N \l__spath_tmpa_tl
}
+ {
+ \tl_put_right:Nx \l__spath_tmpb_tl {\tl_head:N \l__spath_tmpa_tl}
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_put_left:NV \l__spath_rp_tl \g__spath_moveto_tl
+ \fp_set:Nn \l__spath_tmpa_fp {\tl_head:N \l__spath_tmpa_tl * #2}
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \spath_put:nnV {#1} {reverse path} \l__spath_rp_tl
- \spath_put:nnV {#1} {length} \l__spath_l_int
- \spath_put:nnV {#1} {real length} \l__spath_rl_int
- \spath_put:nnV {#1} {number of components} \l__spath_nc_int
- \spath_put:nnV {#1} {initial point} \l__spath_ip_tl
- \spath_put:nnV {#1} {final point} \l__spath_fp_tl
- \spath_put:nnV {#1} {initial action} \l__spath_ia_tl
- \spath_put:nnV {#1} {final action} \l__spath_fa_tl
+ \fp_set:Nn \l__spath_tmpb_fp {\tl_head:N \l__spath_tmpa_tl * #3}
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_clear:N \l__spath_tmpb_tl
- \tl_put_right:Nx \l__spath_tmpb_tl
- {
- {\dim_use:N \l__spath_minx_dim}
- {\dim_use:N \l__spath_miny_dim}
+ \tl_put_right:Nx \l__spath_tmpb_tl
+ {
+ {\fp_to_dim:N \l__spath_tmpa_fp}
+ {\fp_to_dim:N \l__spath_tmpb_fp}
+ }
}
- \spath_put:nnV {#1} {min bb} \l__spath_tmpb_tl
+ \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpb_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_scale:Nnnn #1#2#3#4
+{
+ \__spath_scale:nnn {#2}{#3}{#4}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_scale:Nnnn {NVnn, Nnxx}
+\cs_new_protected_nopar:Npn \spath_scale:Nnn #1#2#3
+{
+ \spath_scale:NVnn #1#1{#2}{#3}
+}
+\cs_generate_variant:Nn \spath_scale:Nnn {cnn, cVV, NVV}
+\cs_new_protected_nopar:Npn \spath_gscale:Nnnn #1#2#3#4
+{
+ \__spath_scale:nnn {#2}{#3}{#4}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_gscale:Nnnn {NVnn, Nnxx}
+\cs_new_protected_nopar:Npn \spath_gscale:Nnn #1#2#3
+{
+ \spath_gscale:NVnn #1#1{#2}{#3}
+}
+\cs_generate_variant:Nn \spath_gscale:Nnn {cnn, cVV, NVV}
+\cs_new_protected_nopar:Npn \spath_scale:Nn #1#2
+{
+ \spath_scale:Nnn #1 #2
+}
+
+\cs_generate_variant:Nn \spath_scale:Nn {NV}
+\cs_new_protected_nopar:Npn \spath_gscale:Nn #1#2
+{
+ \spath_gscale:Nnn #1 #2
+}
+\cs_generate_variant:Nn \spath_gscale:Nn {NV}
+\cs_new_protected_nopar:Npn \__spath_transform:nnnnnnn #1#2#3#4#5#6#7
+{
+ \group_begin:
+ \tl_set:Nn \l__spath_tmpa_tl {#1}
\tl_clear:N \l__spath_tmpb_tl
- \tl_put_right:Nx \l__spath_tmpb_tl
+ \bool_until_do:nn {
+ \tl_if_empty_p:N \l__spath_tmpa_tl
+ }
{
- {\dim_use:N \l__spath_maxx_dim}
- {\dim_use:N \l__spath_maxy_dim}
+ \tl_put_right:Nx \l__spath_tmpb_tl {\tl_head:N \l__spath_tmpa_tl}
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ \tl_set:Nx \l__spath_tmpc_tl {\tl_head:N \l__spath_tmpa_tl}
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ \tl_set:Nx \l__spath_tmpd_tl {\tl_head:N \l__spath_tmpa_tl}
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+
+ \fp_set:Nn \l__spath_tmpa_fp
+ {\l__spath_tmpc_tl * #2 + \l__spath_tmpd_tl * #4 + #6}
+ \fp_set:Nn \l__spath_tmpb_fp
+ {\l__spath_tmpc_tl * #3 + \l__spath_tmpd_tl * #5 + #7}
+ \tl_put_right:Nx \l__spath_tmpb_tl
+ {
+ {\fp_to_dim:N \l__spath_tmpa_fp}
+ {\fp_to_dim:N \l__spath_tmpb_fp}
+ }
}
- \spath_put:nnV {#1} {max bb} \l__spath_tmpb_tl
+ \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpb_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_transform:Nnnnnnnn #1#2#3#4#5#6#7#8
+{
+ \__spath_transform:nnnnnnn {#2}{#3}{#4}{#5}{#6}{#7}{#8}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_transform:Nnnnnnnn
+{NVnnnnnn, Nnxxxxxx, cnnnnnnn}
+\cs_new_protected_nopar:Npn \spath_transform:Nnnnnnn #1#2#3#4#5#6#7
+{
+ \spath_transform:NVnnnnnn #1#1{#2}{#3}{#4}{#5}{#6}{#7}
}
-\cs_new_nopar:Npn \spath_translate:nnn #1#2#3
+\cs_generate_variant:Nn \spath_transform:Nnnnnnn {cnnnnnn}
+\cs_new_protected_nopar:Npn \spath_transform:Nnn #1#2#3
{
- \tl_map_inline:Nn \g__spath_moveable_attributes
+ \spath_transform:Nnnnnnnn #1{#2}#3
+}
+\cs_generate_variant:Nn \spath_transform:Nnn {cnn, cVn, NVn, NnV}
+\cs_new_protected_nopar:Npn \spath_transform:Nn #1#2
+{
+ \spath_transform:NVnnnnnn #1#1#2
+}
+\cs_generate_variant:Nn \spath_transform:Nn {cn, cV, NV}
+
+\cs_new_protected_nopar:Npn \spath_gtransform:Nnnnnnnn #1#2#3#4#5#6#7#8
+{
+ \__spath_transform:nnnnnnn {#2}{#3}{#4}{#5}{#6}{#7}{#8}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_gtransform:Nnnnnnnn {NVnnnnnn, Nnxxxxxx, cnnnnnnn}
+\cs_new_protected_nopar:Npn \spath_gtransform:Nnnnnnn #1#2#3#4#5#6#7
+{
+ \spath_gtransform:NVnnnnnn #1#1{#2}{#3}{#4}{#5}{#6}{#7}
+}
+\cs_generate_variant:Nn \spath_gtransform:Nnnnnnn {cnnnnnn}
+\cs_new_protected_nopar:Npn \spath_gtransform:Nnn #1#2#3
+{
+ \spath_gtransform:Nnnnnnnn #1{#2}#3
+}
+\cs_generate_variant:Nn \spath_gtransform:Nnn {cnn, cVn, NVn, NnV}
+\cs_new_protected_nopar:Npn \spath_gtransform:Nn #1#2
+{
+ \spath_gtransform:NVnnnnnn #1#1#2
+}
+\cs_generate_variant:Nn \spath_gtransform:Nn {cn, cV, NV}
+\cs_new_protected_nopar:Npn \__spath_span:nnn #1#2#3
+{
+ \group_begin:
+ \spath_initialpoint:Nn \l__spath_tmpa_tl {#1}
+ \spath_finalpoint:Nn \l__spath_tmpb_tl {#1}
+
+ \fp_set:Nn \l__spath_tmpa_fp
{
- \spath_if_in:nnT {#1} {##1}
- {
- \__spath_get:nnN {#1} {##1} \l__spath_tmpa_tl
+ (\tl_item:Nn \l__spath_tmpb_tl {1}) -
+ (\tl_item:Nn \l__spath_tmpa_tl {1})
+ }
+ \fp_set:Nn \l__spath_tmpb_fp
+ {
+ (\tl_item:Nn \l__spath_tmpb_tl {2}) -
+ (\tl_item:Nn \l__spath_tmpa_tl {2})
+ }
+ \fp_set:Nn \l__spath_tmpc_fp
+ {
+ (\l__spath_tmpa_fp) * (\l__spath_tmpa_fp)
+ +
+ (\l__spath_tmpb_fp * \l__spath_tmpb_fp)
+ }
- \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl + #2}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl + #3}
- \tl_clear:N \l__spath_tmpb_tl
- \tl_put_right:Nx \l__spath_tmpb_tl
- {
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
- }
- \spath_put:nnV {#1} {##1} \l__spath_tmpb_tl
- }
+ \fp_compare:nTF
+ {
+ \l__spath_tmpc_fp < 0.001
+ }
+ {
+ \spath_translate_to:Nnnn \l__spath_tmpd_tl {#1} #2
}
- \tl_map_inline:Nn \g__spath_path_attributes
{
- \spath_if_in:nnT {#1} {##1}
+ \fp_set:Nn \l__spath_tmpa_fp
+ {
+ (
+ ((\tl_item:nn {#3} {1})
+ -
+ (\tl_item:nn {#2} {1}))
+ *
+ ((\tl_item:Nn \l__spath_tmpb_tl {1})
+ -
+ (\tl_item:Nn \l__spath_tmpa_tl {1}))
+ +
+ ((\tl_item:nn {#3} {2})
+ -
+ (\tl_item:nn {#2} {2}))
+ *
+ ((\tl_item:Nn \l__spath_tmpb_tl {2})
+ -
+ (\tl_item:Nn \l__spath_tmpa_tl {2}))
+ )
+ /
+ \l__spath_tmpc_fp
+ }
+ \fp_set:Nn \l__spath_tmpb_fp
+ {
+ (
+ ((\tl_item:nn {#3} {2})
+ -
+ (\tl_item:nn {#2} {2}))
+ *
+ ((\tl_item:Nn \l__spath_tmpb_tl {1})
+ -
+ (\tl_item:Nn \l__spath_tmpa_tl {1}))
+ -
+ ((\tl_item:nn {#3} {1})
+ -
+ (\tl_item:nn {#2} {1}))
+ *
+ ((\tl_item:Nn \l__spath_tmpb_tl {2})
+ -
+ (\tl_item:Nn \l__spath_tmpa_tl {2}))
+ )
+ /
+ \l__spath_tmpc_fp
+ }
+
+ \tl_set:Nx \l__spath_tmpc_tl
{
- \__spath_get:nnN {#1} {##1} \l__spath_tmpa_tl
- \tl_clear:N \l__spath_tmpb_tl
- \bool_until_do:nn {
- \tl_if_empty_p:N \l__spath_tmpa_tl
+ {
+ \fp_to_decimal:N \l__spath_tmpa_fp
}
{
- \tl_put_right:Nx \l__spath_tmpb_tl {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
-
- \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl + #2}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
-
- \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl + #3}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
-
- \tl_put_right:Nx \l__spath_tmpb_tl
+ \fp_to_decimal:N \l__spath_tmpb_fp
+ }
+ {
+ \fp_eval:n { - \l__spath_tmpb_fp }
+ }
+ {
+ \fp_to_decimal:N \l__spath_tmpa_fp
+ }
+ {
+ \fp_to_dim:n
{
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
+ \tl_item:nn {#2} {1}
+ -
+ \l__spath_tmpa_fp * (\tl_item:Nn \l__spath_tmpa_tl {1})
+ +
+ \l__spath_tmpb_fp * (\tl_item:Nn \l__spath_tmpa_tl {2})
+ }
+ }
+ {
+ \fp_to_dim:n
+ {
+ \tl_item:nn {#2} {2}
+ -
+ \l__spath_tmpb_fp * (\tl_item:Nn \l__spath_tmpa_tl {1})
+ -
+ \l__spath_tmpa_fp * (\tl_item:Nn \l__spath_tmpa_tl {2})
}
}
- \spath_put:nnV {#1} {##1} \l__spath_tmpb_tl
}
+ \spath_transform:NnV \l__spath_tmpd_tl {#1} \l__spath_tmpc_tl
}
+ \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpd_tl
+ \group_end:
}
-
-\cs_generate_variant:Nn \spath_translate:nnn {nxx}
-\cs_new_nopar:Npn \spath_translate:nn #1#2
+\cs_new_protected_nopar:Npn \spath_span:Nnnn #1#2#3#4
{
- \spath_translate:nnn {#1} #2
+ \__spath_span:nnn {#2}{#3}{#4}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
}
-
-\cs_generate_variant:Nn \spath_translate:nn {nV}
-\cs_new_nopar:Npn \spath_scale:nnn #1#2#3
+\cs_generate_variant:Nn \spath_span:Nnnn {NVnn, NVVV, NnVV}
+\cs_new_protected_nopar:Npn \spath_span:Nnn #1#2#3
+{
+ \spath_span:NVnn #1#1{#2}{#3}
+}
+\cs_generate_variant:Nn \spath_span:Nnn {NVV, cnn, cvv, cVV}
+\cs_new_protected_nopar:Npn \spath_gspan:Nnnn #1#2#3#4
+{
+ \__spath_span:nnn {#2}{#3}{#4}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_gspan:Nnnn {NVnn, NVVV}
+\cs_new_protected_nopar:Npn \spath_gspan:Nnn #1#2#3
+{
+ \spath_gspan:NVnn #1#1{#2}{#3}
+}
+\cs_generate_variant:Nn \spath_gspan:Nnn {NVV, cnn, cvv, cVV}
+\cs_new_protected_nopar:Npn \__spath_normalise:n #1
+{
+ \__spath_span:nnn {#1}{{0pt}{0pt}}{{1pt}{0pt}}
+}
+\cs_new_protected_nopar:Npn \spath_normalise:Nn #1#2
+{
+ \__spath_normalise:n {#2}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_normalise:Nn {cn,NV, cV, cv}
+\cs_new_protected_nopar:Npn \spath_normalise:N #1
+{
+ \spath_normalise:NV #1#1
+}
+\cs_generate_variant:Nn \spath_normalise:N {c}
+\cs_new_protected_nopar:Npn \spath_gnormalise:Nn #1#2
+{
+ \__spath_normalise:n {#2}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_gnormalise:Nn {cn,NV, cV, cv}
+\cs_new_protected_nopar:Npn \spath_gnormalise:N #1
+{
+ \spath_gnormalise:NV #1#1
+}
+\cs_generate_variant:Nn \spath_gnormalise:N {c}
+\cs_new_protected_nopar:Npn \__spath_splice_between:nnn #1#2#3
+{
+ \group_begin:
+ \spath_finalpoint:NV \l__spath_tmpd_tl {#1}
+ \spath_initialpoint:NV \l__spath_tmpe_tl {#3}
+ \spath_span:NnVV \l__spath_tmpb_tl {#2} \l__spath_tmpd_tl \l__spath_tmpe_tl
+ \spath_append_no_move:NnV \l__spath_tmpa_tl {#1} \l__spath_tmpb_tl
+ \spath_append_no_move:Nn \l__spath_tmpa_tl {#3}
+ \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpa_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_splice_between:Nnnn #1#2#3#4
+{
+ \__spath_splice_between:nnn {#2}{#3}{#4}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_splice_between:Nnnn {NVnn, NVVV}
+\cs_new_protected_nopar:Npn \spath_splice_between:Nnn #1#2#3
{
- \tl_map_inline:Nn \g__spath_moveable_attributes
+ \spath_splice_between:NVnn #1#1{#2}{#3}
+}
+\cs_generate_variant:Nn \spath_splice_between:Nnn {NVV, cnn, cvv, Nvn}
+\cs_new_protected_nopar:Npn \spath_gsplice_between:Nnnn #1#2#3#4
+{
+ \__spath_splice_between:nnn {#2}{#3}{#4}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_gsplice_between:Nnnn {NVnn, NVVV}
+\cs_new_protected_nopar:Npn \spath_gsplice_between:Nnn #1#2#3
+{
+ \spath_gsplice_between:NVnn #1#1{#2}{#3}
+}
+\cs_generate_variant:Nn \spath_gsplice_between:Nnn {NVV, cnn, cvv}
+\cs_new_protected_nopar:Npn \__spath_close_with:nn #1#2
+{
+ \group_begin:
+ \spath_finalmovepoint:Nn \l__spath_tmpa_tl {#1}
+ \spath_finalpoint:Nn \l__spath_tmpb_tl {#1}
+ \dim_compare:nTF
{
- \spath_if_in:nnT {#1} {##1}
+ \dim_abs:n
{
- \__spath_get:nnN {#1} {##1} \l__spath_tmpa_tl
-
- \fp_set:Nn \l__spath_tmpa_fp {\tl_head:N \l__spath_tmpa_tl * #2}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \fp_set:Nn \l__spath_tmpb_fp {\tl_head:N \l__spath_tmpa_tl * #3}
- \tl_clear:N \l__spath_tmpb_tl
- \tl_put_right:Nx \l__spath_tmpb_tl
- {
- {\fp_to_dim:N \l__spath_tmpa_fp}
- {\fp_to_dim:N \l__spath_tmpb_fp}
- }
- \spath_put:nnV {#1} {##1} \l__spath_tmpb_tl
+ \tl_item:Nn \l__spath_tmpa_tl {1}
+ -
+ \tl_item:Nn \l__spath_tmpb_tl {1}
}
+ +
+ \dim_abs:n
+ {
+ \tl_item:Nn \l__spath_tmpa_tl {2}
+ -
+ \tl_item:Nn \l__spath_tmpb_tl {2}
+ }
+ < 0.01pt
+ }
+ {
+ \__spath_close:n {#1}
+ }
+ {
+ \spath_span:NnVV \l__spath_tmpc_tl {#2} \l__spath_tmpb_tl \l__spath_tmpa_tl
+ \spath_append_no_move:NnV \l__spath_tmpd_tl {#1} \l__spath_tmpc_tl
+ \__spath_close:V \l__spath_tmpd_tl
+ }
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_close_with:Nnn #1#2#3
+{
+ \__spath_close_with:nn {#2}{#3}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_close_with:Nnn {cnn, cVV, cvv, NVn}
+\cs_new_protected_nopar:Npn \spath_close_with:Nn #1#2
+{
+ \spath_close_with:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_close_with:Nn {cn, cV, cv, NV}
+\cs_new_protected_nopar:Npn \spath_gclose_with:Nnn #1#2#3
+{
+ \__spath_close_with:nn {#2}{#3}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_gclose_with:Nnn {cnn, cVV, cvv, NVn}
+\cs_new_protected_nopar:Npn \spath_gclose_with:Nn #1#2
+{
+ \spath_gclose_with:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_gclose_with:Nn {cn, cV, cv, NV}
+\cs_new_protected_nopar:Npn \__spath_weld:nn #1#2
+{
+ \group_begin:
+ \tl_set:Nn \l__spath_tmpa_tl {#1}
+ \tl_set:Nn \l__spath_tmpb_tl {#2}
+ \spath_finalpoint:Nn \l__spath_tmpc_tl {#1}
+ \spath_translate_to:NV \l__spath_tmpb_tl \l__spath_tmpc_tl
+
+ \__spath_append_no_move:VV \l__spath_tmpa_tl \l__spath_tmpb_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_weld:Nnn #1#2#3
+{
+ \__spath_weld:nn {#2}{#3}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_weld:Nnn {NVV,NVn}
+\cs_new_protected_nopar:Npn \spath_weld:Nn #1#2
+{
+ \spath_weld:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_weld:Nn {NV, Nv, cV, cv}
+\cs_new_protected_nopar:Npn \spath_gweld:Nnn #1#2#3
+{
+ \__spath_weld:nn {#2}{#3}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_gweld:Nnn {NVV, NVn}
+\cs_new_protected_nopar:Npn \spath_gweld:Nn #1#2
+{
+ \spath_gweld:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_gweld:Nn {NV, Nv, cV, cv}
+\cs_new_protected_nopar:Npn \__spath_append_no_move:nn #1#2
+{
+ \group_begin:
+ \tl_set:Nn \l__spath_tmpa_tl {#1}
+ \tl_set:Nn \l__spath_tmpb_tl {#2}
+ \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
+ \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
+ \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
+
+ \tl_put_right:NV \l__spath_tmpa_tl \l__spath_tmpb_tl
+ \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpa_tl
+ \group_end:
+}
+\cs_generate_variant:Nn \__spath_append_no_move:nn {VV}
+\cs_new_protected_nopar:Npn \spath_append_no_move:Nnn #1#2#3
+{
+ \__spath_append_no_move:nn {#2}{#3}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_append_no_move:Nnn {NVV, NVn, NnV}
+\cs_new_protected_nopar:Npn \spath_append_no_move:Nn #1#2
+{
+ \spath_append_no_move:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_append_no_move:Nn {NV, cv, Nv}
+\cs_new_protected_nopar:Npn \spath_gappend_no_move:Nnn #1#2#3
+{
+ \__spath_append_no_move:nn {#2}{#3}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_gappend_no_move:Nnn {NVV, NVn}
+\cs_new_protected_nopar:Npn \spath_gappend_no_move:Nn #1#2
+{
+ \spath_gappend_no_move:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_gappend_no_move:Nn {NV, cv, Nv}
+\cs_new_protected_nopar:Npn \spath_append:Nnn #1#2#3
+{
+ \tl_set:Nn #1 {#2}
+ \tl_put_right:Nn #1 {#3}
+}
+\cs_generate_variant:Nn \spath_append:Nnn {NVV, NVn}
+\cs_new_protected_nopar:Npn \spath_append:Nn #1#2
+{
+ \spath_append:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_append:Nn {NV, Nv, cv}
+\cs_new_protected_nopar:Npn \spath_gappend:Nnn #1#2#3
+{
+ \tl_gset:Nn #1 {#2}
+ \tl_gput_right:Nn #1 {#3}
+}
+\cs_generate_variant:Nn \spath_gappend:Nnn {NVV, NVn}
+\cs_new_protected_nopar:Npn \spath_gappend:Nn #1#2
+{
+ \spath_gappend:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_gappend:Nn {NV, Nv, cv}
+\cs_new_protected_nopar:Npn \spath_prepend_no_move:Nnn #1#2#3
+{
+ \spath_append_no_move:Nnn #1{#3}{#2}
+}
+\cs_generate_variant:Nn \spath_prepend_no_move:Nnn {NVV, NVn}
+\cs_new_protected_nopar:Npn \spath_prepend_no_move:Nn #1#2
+{
+ \spath_prepend_no_move:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_prepend_no_move:Nn {NV, cv}
+\cs_new_protected_nopar:Npn \spath_gprepend_no_move:Nnn #1#2#3
+{
+ \spath_gappend_no_move:Nnn #1{#3}{#2}
+}
+\cs_generate_variant:Nn \spath_gprepend_no_move:Nnn {NVV, NVn}
+\cs_new_protected_nopar:Npn \spath_gprepend_no_move:Nn #1#2
+{
+ \spath_gprepend_no_move:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_gprepend_no_move:Nn {NV, cv}
+\cs_new_protected_nopar:Npn \spath_prepend:Nnn #1#2#3
+{
+ \spath_append:Nnn #1{#3}{#2}
+}
+\cs_generate_variant:Nn \spath_prepend:Nnn {NVV, NVn}
+\cs_new_protected_nopar:Npn \spath_prepend:Nn #1#2
+{
+ \spath_prepend:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_prepend:Nn {NV}
+\cs_new_protected_nopar:Npn \spath_gprepend:Nnn #1#2#3
+{
+ \spath_gappend:Nnn #1{#3}{#2}
+}
+\cs_generate_variant:Nn \spath_gprepend:Nnn {NVV, NVn}
+\cs_new_protected_nopar:Npn \spath_gprepend:Nn #1#2
+{
+ \spath_gprepend:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_gprepend:Nn {NV}
+\cs_new_protected_nopar:Npn \__spath_bake_round:n #1
+{
+ \group_begin:
+ \tl_set:Nn \l__spath_tmpa_tl {#1}
+ \pgf@@processround \l__spath_tmpa_tl\l__spath_tmpb_tl
+ \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpb_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_bake_round:Nn #1#2
+{
+ \__spath_bake_round:n {#2}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_bake_round:Nn {NV}
+\cs_new_protected_nopar:Npn \spath_bake_round:N #1
+{
+ \spath_bake_round:NV #1#1
+}
+\cs_generate_variant:Nn \spath_bake_round:N {c}
+\cs_new_protected_nopar:Npn \spath_gbake_round:Nn #1#2
+{
+ \__spath_bake_round:n {#2}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_gbake_round:Nn {NV}
+\cs_new_protected_nopar:Npn \spath_gbake_round:N #1
+{
+ \spath_gbake_round:NV #1#1
+}
+\cs_generate_variant:Nn \spath_gbake_round:N {c}
+\cs_new_protected_nopar:Npn \__spath_close:n #1
+{
+ \group_begin:
+ \tl_set:Nn \l__spath_tmpa_tl {#1}
+ \spath_finalmovepoint:NV \l__spath_tmpb_tl \l__spath_tmpa_tl
+ \tl_put_right:NV \l__spath_tmpa_tl \c_spath_closepath_tl
+ \tl_put_right:NV \l__spath_tmpa_tl \l__spath_tmpb_tl
+ \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpa_tl
+ \group_end:
+}
+\cs_generate_variant:Nn \__spath_close:n {V}
+\cs_new_protected_nopar:Npn \spath_close:Nn #1#2
+{
+ \__spath_close:n {#2}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_close:Nn {NV}
+\cs_new_protected_nopar:Npn \spath_close:N #1
+{
+ \spath_close:NV #1#1
+}
+\cs_generate_variant:Nn \spath_close:N {c}
+\cs_new_protected_nopar:Npn \spath_gclose:Nn #1#2
+{
+ \__spath_close:n {#2}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_gclose:Nn {NV}
+\cs_new_protected_nopar:Npn \spath_gclose:N #1
+{
+ \spath_gclose:NV #1#1
+}
+\cs_generate_variant:Nn \spath_gclose:N {c}
+\cs_new_protected_nopar:Npn \__spath_open:n #1
+{
+ \group_begin:
+ \tl_set:Nn \l__spath_tmpa_tl {#1}
+ \tl_clear:N \l__spath_tmpb_tl
+ \bool_until_do:nn {
+ \tl_if_empty_p:N \l__spath_tmpa_tl
}
- \tl_map_inline:Nn \g__spath_path_attributes
{
- \spath_if_in:nnT {#1} {##1}
+ \tl_set:Nx \l__spath_tmpc_tl {\tl_head:N \l__spath_tmpa_tl}
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+
+ \tl_case:NnF \l__spath_tmpc_tl
{
- \__spath_get:nnN {#1} {##1} \l__spath_tmpa_tl
- \tl_clear:N \l__spath_tmpb_tl
- \bool_until_do:nn {
- \tl_if_empty_p:N \l__spath_tmpa_tl
- }
- {
- \tl_put_right:Nx \l__spath_tmpb_tl {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ \c_spath_closepath_tl {
+
+ \bool_if:nF
+ {
+ \dim_compare_p:n
+ {
+ \l__spath_move_x_dim == \l__spath_tmpa_dim
+ }
+ &&
+ \dim_compare_p:n
+ {
+ \l__spath_move_y_dim == \l__spath_tmpb_dim
+ }
+ }
+ {
+ \tl_put_right:NV \l__spath_tmpb_tl \c_spath_lineto_tl
- \fp_set:Nn \l__spath_tmpa_fp {\tl_head:N \l__spath_tmpa_tl * #2}
+ \tl_put_right:Nx \l__spath_tmpb_tl {
+ { \dim_use:N \l__spath_move_x_dim }
+ { \dim_use:N \l__spath_move_y_dim }
+ }
+ }
+
+ \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ }
+
+ \c_spath_moveto_tl {
+ \tl_put_right:NV \l__spath_tmpb_tl \l__spath_tmpc_tl
- \fp_set:Nn \l__spath_tmpb_fp {\tl_head:N \l__spath_tmpa_tl * #3}
+ \dim_set:Nn \l__spath_move_x_dim {\tl_head:N \l__spath_tmpa_tl}
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ \dim_set:Nn \l__spath_move_y_dim {\tl_head:N \l__spath_tmpa_tl}
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_put_right:Nx \l__spath_tmpb_tl
- {
- {\fp_to_dim:N \l__spath_tmpa_fp}
- {\fp_to_dim:N \l__spath_tmpb_fp}
+ \tl_put_right:Nx \l__spath_tmpb_tl {
+ { \dim_use:N \l__spath_move_x_dim }
+ { \dim_use:N \l__spath_move_y_dim }
}
+
+ \dim_set_eq:NN \l__spath_tmpa_dim \l__spath_move_x_dim
+ \dim_set_eq:NN \l__spath_tmpb_dim \l__spath_move_y_dim
+ }
+ }
+ {
+ \tl_put_right:NV \l__spath_tmpb_tl \l__spath_tmpc_tl
+
+ \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+
+ \tl_put_right:Nx \l__spath_tmpb_tl {
+ { \dim_use:N \l__spath_tmpa_dim }
+ { \dim_use:N \l__spath_tmpb_dim }
}
- \spath_put:nnV {#1} {##1} \l__spath_tmpb_tl
}
}
+ \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpb_tl
+ \group_end:
}
-\cs_generate_variant:Nn \spath_scale:nnn {nxx}
-\cs_new_nopar:Npn \spath_scale:nn #1#2
+\cs_new_protected_nopar:Npn \spath_open:Nn #1#2
{
- \spath_scale:nnn {#1} #2
+ \__spath_open:n {#2}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
}
-
-\cs_generate_variant:Nn \spath_scale:nn {nV}
-\cs_new_nopar:Npn \spath_transform:nnnnnnn #1#2#3#4#5#6#7
+\cs_generate_variant:Nn \spath_open:Nn {NV}
+\cs_new_protected_nopar:Npn \spath_open:N #1
+{
+ \spath_open:NV #1#1
+}
+\cs_new_protected_nopar:Npn \spath_gopen:Nn #1#2
{
- \tl_map_inline:Nn \g__spath_moveable_attributes
+ \__spath_open:n {#2}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_gopen:Nn {NV}
+\cs_new_protected_nopar:Npn \spath_gopen:N #1
+{
+ \spath_gopen:NV #1#1
+}
+\cs_new_protected_nopar:Npn \__spath_remove_empty_components:n #1
+{
+ \group_begin:
+ \spath_components_to_seq:Nn \l__spath_tmpa_seq {#1}
+ \tl_clear:N \l__spath_tmpa_tl
+ \seq_map_inline:Nn \l__spath_tmpa_seq
{
- \spath_if_in:nnT {#1} {##1}
+ \int_compare:nF
{
- \__spath_get:nnN {#1} {##1} \l__spath_tmpa_tl
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpb_tl {\tl_head:N \l__spath_tmpb_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_head:N \l__spath_tmpa_tl}
- \fp_set:Nn \l__spath_tmpa_fp {\l__spath_tmpa_tl * #2 + \l__spath_tmpb_tl * #3 + #6}
- \fp_set:Nn \l__spath_tmpb_fp {\l__spath_tmpa_tl * #4 + \l__spath_tmpb_tl * #5 + #7}
- \tl_clear:N \l__spath_tmpb_tl
- \tl_put_right:Nx \l__spath_tmpb_tl
- {
- {\fp_to_dim:N \l__spath_tmpa_fp}
- {\fp_to_dim:N \l__spath_tmpb_fp}
- }
- \spath_put:nnV {#1} {##1} \l__spath_tmpb_tl
+ \tl_count:n {##1} == 3
+ }
+ {
+ \tl_put_right:Nn \l__spath_tmpa_tl {##1}
}
}
- \tl_map_inline:Nn \g__spath_path_attributes
+ \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpa_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_remove_empty_components:Nn #1#2
+{
+ \__spath_remove_empty_components:n {#2}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_remove_empty_components:Nn {NV}
+\cs_new_protected_nopar:Npn \spath_remove_empty_components:N #1
+{
+ \spath_remove_empty_components:NV #1#1
+}
+\cs_generate_variant:Nn \spath_remove_empty_components:N {c}
+\cs_new_protected_nopar:Npn \spath_gremove_empty_components:Nn #1#2
+{
+ \__spath_remove_empty_components:n {#2}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_gremove_empty_components:Nn {NV}
+\cs_new_protected_nopar:Npn \spath_gremove_empty_components:N #1
+{
+ \spath_gremove_empty_components:NV #1#1
+}
+\cs_generate_variant:Nn \spath_gremove_empty_components:N {c}
+\prg_new_protected_conditional:Npnn \spath_if_eq:nn #1#2 { T, F, TF }
+{
+ \group_begin:
+ \tl_set:Nn \l__spath_tmpa_tl {#1}
+ \tl_set:Nn \l__spath_tmpb_tl {#2}
+ \bool_gset_true:N \g__spath_tmpa_bool
+ \int_compare:nNnTF
+ {\tl_count:N \l__spath_tmpa_tl}
+ =
+ {\tl_count:N \l__spath_tmpb_tl}
{
- \spath_if_in:nnT {#1} {##1}
+ \int_step_inline:nnnn {1} {3} {\tl_count:N \l__spath_tmpa_tl}
{
- \__spath_get:nnN {#1} {##1} \l__spath_tmpa_tl
- \tl_clear:N \l__spath_tmpb_tl
- \bool_until_do:nn {
- \tl_if_empty_p:N \l__spath_tmpa_tl
+ \tl_set:Nx \l__spath_tmpc_tl {\tl_item:Nn \l__spath_tmpa_tl {##1}}
+ \tl_set:Nx \l__spath_tmpd_tl {\tl_item:Nn \l__spath_tmpb_tl {##1}}
+ \tl_if_eq:NNF \l__spath_tmpc_tl \l__spath_tmpd_tl
+ {
+ \bool_gset_false:N \g__spath_tmpa_bool
}
+ \dim_set:Nn \l__spath_tmpa_dim {\tl_item:Nn \l__spath_tmpa_tl {##1+1}}
+ \dim_set:Nn \l__spath_tmpb_dim {\tl_item:Nn \l__spath_tmpb_tl {##1+1}}
+ \dim_compare:nF
{
- \tl_put_right:Nx \l__spath_tmpb_tl {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_set:Nx \l_tmpa_tl {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_set:Nx \l_tmpb_tl {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
-
- \fp_set:Nn \l__spath_tmpa_fp {\l_tmpa_tl * #2 + \l_tmpb_tl * #3 + #6}
- \fp_set:Nn \l__spath_tmpb_fp {\l_tmpa_tl * #4 + \l_tmpb_tl * #5 + #7}
- \tl_put_right:Nx \l__spath_tmpb_tl
+ \dim_abs:n
{
- {\fp_to_dim:N \l__spath_tmpa_fp}
- {\fp_to_dim:N \l__spath_tmpb_fp}
+ \l__spath_tmpa_dim - \l__spath_tmpb_dim
}
+ < 0.001pt
+ }
+ {
+ \bool_gset_false:N \g__spath_tmpa_bool
+ }
+ \dim_set:Nn \l__spath_tmpa_dim {\tl_item:Nn \l__spath_tmpa_tl {##1+2}}
+ \dim_set:Nn \l__spath_tmpb_dim {\tl_item:Nn \l__spath_tmpb_tl {##1+2}}
+ \dim_compare:nF
+ {
+ \dim_abs:n
+ {
+ \l__spath_tmpa_dim - \l__spath_tmpb_dim
+ }
+ < 0.001pt
+ }
+ {
+ \bool_gset_false:N \g__spath_tmpa_bool
}
- \spath_put:nnV {#1} {##1} \l__spath_tmpb_tl
}
}
-}
-
-\cs_generate_variant:Nn \spath_transform:nnnnnnn {nxxxxxx}
-\cs_new_nopar:Npn \spath_transform:nn #1#2
-{
- \spath_transform:nnnnnnn {#1} #2
-}
-
-\cs_generate_variant:Nn \spath_transform:nn {nV}
-\cs_new_nopar:Npn \spath_reverse:n #1
-{
- \spath_if_in:nnF {#1} {reverse path} {
- \use:c {spath_generate_reverse path:n} {#1}
+ {
+ \bool_gset_false:N \g__spath_tmpa_bool
+ }
+ \group_end:
+ \bool_if:NTF \g__spath_tmpa_bool
+ {
+ \prg_return_true:
+ }
+ {
+ \prg_return_false:
}
- \spath_swap:nnn {#1} {path} {reverse path}
- \spath_swap:nnn {#1} {initial point} {final point}
- \spath_swap:nnn {#1} {initial action} {final action}
-}
-\cs_new_nopar:Npn \spath_swap:nnn #1#2#3
-{
- \__spath_get:nnNF {#1} {#2} \l__spath_tmpa_tl {\tl_clear:N \l__spath_tmpa_tl}
- \__spath_get:nnNF {#1} {#3} \l__spath_tmpb_tl {\tl_clear:N \l__spath_tmpb_tl}
- \tl_if_empty:NTF \l__spath_tmpb_tl
- {\spath_remove:nn {#1} {#2}}
- {\spath_put:nnV {#1} {#2} \l__spath_tmpb_tl}
- \tl_if_empty:NTF \l__spath_tmpa_tl
- {\spath_remove:nn {#1} {#3}}
- {\spath_put:nnV {#1} {#3} \l__spath_tmpa_tl}
}
-\cs_new_nopar:Npn \spath_weld:nn #1#2
+\prg_generate_conditional_variant:Nnn \spath_if_eq:nn {VV, Vn, nV, vv} {TF, T, F}
+\cs_new_protected_nopar:Npn \__spath_split_curve:nn #1#2
{
- \spath_clone:nn {#2} {tmp_path}
- \spath_get:nnN {#1} {final point} \l__spath_tmpa_tl
-
- \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
-
- \spath_get:nnN {#2} {initial point} \l__spath_tmpa_tl
+ \group_begin:
+ \tl_set_eq:NN \l__spath_tmpa_tl \c_spath_moveto_tl
+ \tl_put_right:Nx \l__spath_tmpa_tl {
+ {\tl_item:nn {#1} {2}}
+ {\tl_item:nn {#1} {3}}
+ }
+ \tl_put_right:NV \l__spath_tmpa_tl \c_spath_curvetoa_tl
+ \tl_put_right:Nx \l__spath_tmpa_tl
+ {
+ {\fp_to_dim:n
+ {
+ (1 - #2) * \tl_item:nn {#1} {2} + (#2) * \tl_item:nn {#1} {5}
+ }}
+ {\fp_to_dim:n
+ {
+ (1 - #2) * \tl_item:nn {#1} {3} + (#2) * \tl_item:nn {#1} {6}
+ }}
+ }
- \dim_sub:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_sub:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
+ \tl_put_right:NV \l__spath_tmpa_tl \c_spath_curvetob_tl
+ \tl_put_right:Nx \l__spath_tmpa_tl
+ {
+ {\fp_to_dim:n
+ {
+ (1 - #2)^2 * \tl_item:nn {#1} {2}
+ + 2 * (1 - #2) * (#2) * \tl_item:nn {#1} {5}
+ + (#2)^2 * \tl_item:nn {#1} {8}
+ }}
+ {\fp_to_dim:n
+ {
+ (1 - #2)^2 * \tl_item:nn {#1} {3}
+ + 2 * (1 - #2) * (#2) * \tl_item:nn {#1} {6}
+ + (#2)^2 * \tl_item:nn {#1} {9}
+ }}
+ }
- \spath_translate:nxx {tmp_path} {\dim_use:N \l__spath_tmpa_dim} {\dim_use:N \l__spath_tmpb_dim}
+ \tl_put_right:NV \l__spath_tmpa_tl \c_spath_curveto_tl
+ \tl_put_right:Nx \l__spath_tmpa_tl
+ {
+ {\fp_to_dim:n
+ {
+ (1 - #2)^3 * \tl_item:nn {#1} {2}
+ + 3 * (1 - #2)^2 * (#2) * \tl_item:nn {#1} {5}
+ + 3 * (1 - #2) * (#2)^2 * \tl_item:nn {#1} {8}
+ + (#2)^3 * \tl_item:nn {#1} {11}
+ }}
+ {\fp_to_dim:n
+ {
+ (1 - #2)^3 * \tl_item:nn {#1} {3}
+ + 3 * (1 - #2)^2 * (#2) * \tl_item:nn {#1} {6}
+ + 3 * (1 - #2) * (#2)^2 * \tl_item:nn {#1} {9}
+ + (#2)^3 * \tl_item:nn {#1} {12}
+ }}
+ }
- \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl
- \__spath_get:nnN {tmp_path} {path} \l__spath_tmpb_tl
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_put_right:NV \l__spath_tmpa_tl \l__spath_tmpb_tl
+ \tl_gclear:N \g__spath_output_tl
+ \__spath_tl_gput_right_braced:NV \g__spath_output_tl \l__spath_tmpa_tl
- \spath_put:nnV {#1} {path} \l__spath_tmpa_tl
+ \tl_clear:N \l__spath_tmpa_tl
+ \tl_set_eq:NN \l__spath_tmpa_tl \c_spath_moveto_tl
+ \tl_put_right:Nx \l__spath_tmpa_tl
+ {
+ {\fp_to_dim:n
+ {
+ (1 - #2)^3 * \tl_item:nn {#1} {2}
+ + 3 * (1 - #2)^2 * (#2) * \tl_item:nn {#1} {5}
+ + 3 * (1 - #2) * (#2)^2 * \tl_item:nn {#1} {8}
+ + (#2)^3 * \tl_item:nn {#1} {11}
+ }}
+ {\fp_to_dim:n
+ {
+ (1 - #2)^3 * \tl_item:nn {#1} {3}
+ + 3 * (1 - #2)^2 * (#2) * \tl_item:nn {#1} {6}
+ + 3 * (1 - #2) * (#2)^2 * \tl_item:nn {#1} {9}
+ + (#2)^3 * \tl_item:nn {#1} {12}
+ }}
+ }
- \__spath_get:nnNTF {tmp_path} {final point} \l__spath_tmpa_tl
+ \tl_put_right:NV \l__spath_tmpa_tl \c_spath_curvetoa_tl
+ \tl_put_right:Nx \l__spath_tmpa_tl
{
- \spath_put:nnV {#1} {final point} \l__spath_tmpa_tl
+ {\fp_to_dim:n
+ {
+ (1 - #2)^2 * \tl_item:nn {#1} {5}
+ + 2 * (1 - #2) * (#2) * \tl_item:nn {#1} {8}
+ + (#2)^2 * \tl_item:nn {#1} {11}
+ }}
+ {\fp_to_dim:n
+ {
+ (1 - #2)^2 * \tl_item:nn {#1} {6}
+ + 2 * (1 - #2) * (#2) * \tl_item:nn {#1} {9}
+ + (#2)^2 * \tl_item:nn {#1} {12}
+ }}
}
+ \tl_put_right:NV \l__spath_tmpa_tl \c_spath_curvetob_tl
+ \tl_put_right:Nx \l__spath_tmpa_tl
{
- \spath_remove:nn {#1} {final point}
+ {\fp_to_dim:n
+ {
+ (1 - #2) * \tl_item:nn {#1} {8} + (#2) * \tl_item:nn {#1} {11}
+ }}
+ {\fp_to_dim:n
+ {
+ (1 - #2) * \tl_item:nn {#1} {9} + (#2) * \tl_item:nn {#1} {12}
+ }}
+ }
+ \tl_put_right:NV \l__spath_tmpa_tl \c_spath_curveto_tl
+ \tl_put_right:Nx \l__spath_tmpa_tl {
+ {\tl_item:nn {#1} {11}}
+ {\tl_item:nn {#1} {12}}
}
- \__spath_get:nnNTF {tmp_path} {final action} \l__spath_tmpa_tl
+ \__spath_tl_gput_right_braced:NV \g__spath_output_tl \l__spath_tmpa_tl
+ \group_end:
+}
+\cs_generate_variant:Nn \__spath_split_curve:nn {nv, nV}
+\cs_new_protected_nopar:Npn \spath_split_curve:NNnn #1#2#3#4
+{
+ \__spath_split_curve:nn {#3}{#4}
+ \tl_set:Nx #1 {\tl_item:Nn \g__spath_output_tl {1}}
+ \tl_set:Nx #2 {\tl_item:Nn \g__spath_output_tl {2}}
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_split_curve:NNnn {NNnV, NNVn, NNVV}
+\cs_new_protected_nopar:Npn \spath_gsplit_curve:NNnn #1#2#3#4
+{
+ \__spath_split_curve:nn {#3}{#4}
+ \tl_gset:Nx #1 {\tl_item:Nn \g__spath_output_tl {1}}
+ \tl_gset:Nx #2 {\tl_item:Nn \g__spath_output_tl {2}}
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_gsplit_curve:NNnn {NNnV, NNVn, NNVV}
+\cs_new_protected_nopar:Npn \__spath_maybe_split_curve:n #1
+{
+ \group_begin:
+ \fp_set:Nn \l__spath_tmpa_fp
+ {
+ (
+ \tl_item:nn {#1} {3}
+ - 3 * \tl_item:nn {#1} {6}
+ + 3 * \tl_item:nn {#1} {9}
+ - \tl_item:nn {#1} {12}
+ )
+ *
+ (3 * \tl_item:nn {#1} {8} - 3 * \tl_item:nn {#1} {11})
+ -
+ (
+ \tl_item:nn {#1} {2}
+ - 3 * \tl_item:nn {#1} {5}
+ + 3 * \tl_item:nn {#1} {8}
+ - \tl_item:nn {#1} {11}
+ )
+ *
+ (3 * \tl_item:nn {#1} {9} - 3 * \tl_item:nn {#1} {12})
+ }
+ \fp_set:Nn \l__spath_tmpb_fp
+ {
+ (
+ \tl_item:nn {#1} {2}
+ - 3 * \tl_item:nn {#1} {5}
+ + 3 * \tl_item:nn {#1} {8}
+ - \tl_item:nn {#1} {11}
+ )
+ *
+ (
+ 3 * \tl_item:nn {#1} {6}
+ - 6 * \tl_item:nn {#1} {9}
+ + 3 * \tl_item:nn {#1} {12}
+ )
+ -
+ (
+ \tl_item:nn {#1} {3}
+ - 3 * \tl_item:nn {#1} {6}
+ + 3 * \tl_item:nn {#1} {9}
+ - \tl_item:nn {#1} {12}
+ )
+ *
+ (
+ 3 * \tl_item:nn {#1} {5}
+ - 6 * \tl_item:nn {#1} {8}
+ + 3 * \tl_item:nn {#1} {11}
+ )
+ }
+ \fp_compare:nTF
{
- \spath_put:nnV {#1} {final action} \l__spath_tmpa_tl
+ \l__spath_tmpb_fp != 0
}
{
- \spath_remove:nn {#1} {final action}
+ \fp_set:Nn \l__spath_tmpa_fp {.5 * \l__spath_tmpa_fp / \l__spath_tmpb_fp}
+ \fp_compare:nTF
+ {
+ 0 < \l__spath_tmpa_fp && \l__spath_tmpa_fp < 1
+ }
+ {
+ \__spath_split_curve:nV {#1} \l__spath_tmpa_fp
+ }
+ {
+ \tl_gset:Nn \g__spath_output_tl { {#1} {} }
+ }
+ }
+ {
+ \tl_gset:Nn \g__spath_output_tl { {#1} {} }
+ }
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_maybe_split_curve:NNn #1#2#3
+{
+ \__spath_maybe_split_curve:n {#3}
+ \tl_set:Nx #1 {\tl_item:Nn \g__spath_output_tl {1}}
+ \tl_set:Nx #2 {\tl_item:Nn \g__spath_output_tl {2}}
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_maybe_split_curve:NNn {NNn, NNV }
+\cs_new_protected_nopar:Npn \spath_maybe_gsplit_curve:NNn #1#2#3
+{
+ \__spath_maybe_split_curve:n {#3}
+ \tl_gset:Nx #1 {\tl_item:Nn \g__spath_output_tl {1}}
+ \tl_gset:Nx #2 {\tl_item:Nn \g__spath_output_tl {2}}
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_maybe_gsplit_curve:NNn {NNn, NNV}
+\cs_new_protected_nopar:Npn \__spath_split_curves:n #1
+{
+ \group_begin:
+ \tl_set:Nn \l__spath_tmpa_tl {#1}
+ \tl_clear:N \l__spath_tmpb_tl
+ \tl_clear:N \l__spath_tmpc_tl
+ \bool_do_until:nn
+ {
+ \tl_if_empty_p:N \l__spath_tmpa_tl
}
-
- \__spath_get:nnNT {tmp_path} {min bb} \l__spath_tmpa_tl
{
- \__spath_get:nnNT {#1} {min bb} \l__spath_tmpb_tl
+ \tl_set:Nx \l__spath_tmpc_tl {\tl_head:N \l__spath_tmpa_tl}
+ \tl_case:NnF \l__spath_tmpc_tl
{
- \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
-
- \dim_set:Nn \l__spath_tmpa_dim {\dim_min:nn {\l__spath_tmpa_dim} {\tl_head:N \l__spath_tmpb_tl}}
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \dim_set:Nn \l__spath_tmpb_dim {\dim_min:nn {\l__spath_tmpb_dim} {\tl_head:N \l__spath_tmpb_tl}}
+ \c_spath_curvetoa_tl
+ {
+ \tl_clear:N \l__spath_tmpd_tl
+ \tl_set_eq:NN \l__spath_tmpd_tl \c_spath_moveto_tl
+ \tl_put_right:Nx \l__spath_tmpd_tl
+ {
+ { \dim_use:N \l__spath_tmpa_dim }
+ { \dim_use:N \l__spath_tmpb_dim }
+ }
+ \dim_set:Nn \l__spath_tmpa_dim
+ {
+ \tl_item:Nn \l__spath_tmpa_tl {8}
+ }
+ \dim_set:Nn \l__spath_tmpb_dim
+ {
+ \tl_item:Nn \l__spath_tmpa_tl {9}
+ }
+ \prg_replicate:nn {3}
+ {
+ \tl_put_right:Nx \l__spath_tmpd_tl
+ {
+ \tl_item:Nn \l__spath_tmpa_tl {1}
+ {\tl_item:Nn \l__spath_tmpa_tl {2}}
+ {\tl_item:Nn \l__spath_tmpa_tl {3}}
+ }
+ \prg_replicate:nn {3}
+ {
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ }
+ }
- \tl_clear:N \l__spath_tmpb_tl
+ \spath_maybe_split_curve:NNV
+ \l__spath_tmpd_tl
+ \l__spath_tmpe_tl
+ \l__spath_tmpd_tl
+ \prg_replicate:nn {3}
+ {
+ \tl_set:Nx \l__spath_tmpd_tl {\tl_tail:N \l__spath_tmpd_tl}
+ \tl_set:Nx \l__spath_tmpe_tl {\tl_tail:N \l__spath_tmpe_tl}
+ }
+ \tl_put_right:NV \l__spath_tmpb_tl \l__spath_tmpd_tl
+ \tl_put_right:NV \l__spath_tmpb_tl \l__spath_tmpe_tl
+ }
+ }
+ {
+ \dim_set:Nn \l__spath_tmpa_dim
+ {
+ \tl_item:Nn \l__spath_tmpa_tl {2}
+ }
+ \dim_set:Nn \l__spath_tmpb_dim
+ {
+ \tl_item:Nn \l__spath_tmpa_tl {3}
+ }
\tl_put_right:Nx \l__spath_tmpb_tl
{
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
+ \tl_item:Nn \l__spath_tmpa_tl {1}
+ {\tl_item:Nn \l__spath_tmpa_tl {2}}
+ {\tl_item:Nn \l__spath_tmpa_tl {3}}
+ }
+ \prg_replicate:nn {3}
+ {
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
}
- \spath_put:nnV {#1} {min bb} \l__spath_tmpb_tl
}
}
+ \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpb_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_split_curves:Nn #1#2
+{
+ \__spath_split_curves:n {#2}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_split_curves:Nn {NV, cV, cn, cv }
+\cs_new_protected_nopar:Npn \spath_split_curves:N #1
+{
+ \spath_split_curves:NV #1#1
+}
+\cs_generate_variant:Nn \spath_split_curves:N {c}
+\cs_new_protected_nopar:Npn \spath_gsplit_curves:Nn #1#2
+{
+ \__spath_split_curves:n {#2}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_gsplit_curves:Nn {NV, cV, cn, cv }
+\cs_new_protected_nopar:Npn \spath_gsplit_curves:N #1
+{
+ \spath_gsplit_curves:NV #1#1
+}
+\cs_generate_variant:Nn \spath_gsplit_curves:N {c}
+\cs_new_protected_nopar:Npn \__spath_split_line:nn #1#2
+{
+ \group_begin:
+ \tl_set_eq:NN \l__spath_tmpa_tl \c_spath_moveto_tl
+ \tl_put_right:Nx \l__spath_tmpa_tl {
+ {\tl_item:nn {#1} {2}}
+ {\tl_item:nn {#1} {3}}
+ }
+ \tl_put_right:NV \l__spath_tmpa_tl \c_spath_lineto_tl
+ \tl_put_right:Nx \l__spath_tmpa_tl
+ {
+ {\fp_to_dim:n
+ {
+ (1 - #2) * \tl_item:nn {#1} {2} + (#2) * \tl_item:nn {#1} {5}
+ }}
+ {\fp_to_dim:n
+ {
+ (1 - #2) * \tl_item:nn {#1} {3} + (#2) * \tl_item:nn {#1} {6}
+ }}
+ }
+ \tl_gclear:N \g__spath_output_tl
+ \__spath_tl_gput_right_braced:NV \g__spath_output_tl \l__spath_tmpa_tl
- \__spath_get:nnNT {tmp_path} {max bb} \l__spath_tmpa_tl
+ \tl_clear:N \l__spath_tmpa_tl
+ \tl_set_eq:NN \l__spath_tmpa_tl \c_spath_moveto_tl
+ \tl_put_right:Nx \l__spath_tmpa_tl
{
- \__spath_get:nnNT {#1} {max bb} \l__spath_tmpb_tl
+ {\fp_to_dim:n
{
- \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
+ (1 - #2) * \tl_item:nn {#1} {2} + (#2) * \tl_item:nn {#1} {5}
+ }}
+ {\fp_to_dim:n
+ {
+ (1 - #2) * \tl_item:nn {#1} {3} + (#2) * \tl_item:nn {#1} {6}
+ }}
+ }
+ \tl_put_right:NV \l__spath_tmpa_tl \c_spath_lineto_tl
+ \tl_put_right:Nx \l__spath_tmpa_tl {
+ {\tl_item:nn {#1} {5}}
+ {\tl_item:nn {#1} {6}}
+ }
- \dim_set:Nn \l__spath_tmpa_dim {\dim_max:nn {\l__spath_tmpa_dim} {\tl_head:N \l__spath_tmpb_tl}}
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \dim_set:Nn \l__spath_tmpb_dim {\dim_max:nn {\l__spath_tmpb_dim} {\tl_head:N \l__spath_tmpb_tl}}
+ \__spath_tl_gput_right_braced:NV \g__spath_output_tl \l__spath_tmpa_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_split_line:NNnn #1#2#3#4
+{
+ \__spath_split_line:nn {#3}{#4}
+ \tl_set:Nx #1 {\tl_item:Nn \g__spath_output_tl {1}}
+ \tl_set:Nx #2 {\tl_item:Nn \g__spath_output_tl {2}}
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_split_line:NNnn {NNnV, NNVn, NNVV}
+\cs_new_protected_nopar:Npn \spath_gsplit_line:NNnn #1#2#3#4
+{
+ \__spath_split_line:nn {#3}{#4}
+ \tl_gset:Nx #1 {\tl_item:Nn \g__spath_output_tl {1}}
+ \tl_gset:Nx #2 {\tl_item:Nn \g__spath_output_tl {2}}
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_gsplit_line:NNnn {NNnV, NNVn, NNVV}
+\cs_new_protected_nopar:Npn \__spath_split_at:nn #1#2
+{
+ \group_begin:
+ \int_set:Nn \l__spath_tmpa_int {\fp_to_int:n {floor(#2) + 1}}
+ \fp_set:Nn \l__spath_tmpa_fp {#2 - floor(#2)}
- \tl_clear:N \l__spath_tmpb_tl
- \tl_put_right:Nx \l__spath_tmpb_tl
- {
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
- }
- \spath_put:nnV {#1} {max bb} \l__spath_tmpb_tl
- }
+ % Is split point near one end or other of a component?
+ \fp_compare:nT
+ {
+ \l__spath_tmpa_fp < 0.01
+ }
+ {
+ % Near the start, so we'll place it at the start
+ \fp_set:Nn \l__spath_tmpa_fp {0}
}
+ \fp_compare:nT
+ {
+ \l__spath_tmpa_fp > 0.99
+ }
+ {
+ % Near the end, so we'll place it at the end
+ \fp_set:Nn \l__spath_tmpa_fp {0}
+ \int_incr:N \l__spath_tmpa_int
+ }
+
+ \int_zero:N \l__spath_tmpb_int
+ \bool_set_true:N \l__spath_tmpa_bool
- \__spath_get:nnNT {tmp_path} {reverse path} \l__spath_tmpa_tl
+ \tl_set:Nn \l__spath_tmpe_tl {#1}
+ \tl_clear:N \l__spath_tmpc_tl
+
+ \dim_zero:N \l__spath_tmpa_dim
+ \dim_zero:N \l__spath_tmpb_dim
+
+ \bool_until_do:nn {
+ \tl_if_empty_p:N \l__spath_tmpe_tl
+ ||
+ \int_compare_p:n { \l__spath_tmpa_int == \l__spath_tmpb_int }
+ }
{
- \__spath_get:nnNT {#1} {reverse path} \l__spath_tmpb_tl
+ \tl_set:Nx \l__spath_tmpf_tl {\tl_head:N \l__spath_tmpe_tl}
+ \tl_set:Nx \l__spath_tmpe_tl {\tl_tail:N \l__spath_tmpe_tl }
+ \tl_case:Nn \l__spath_tmpf_tl
+ {
+ \c_spath_lineto_tl
+ {
+ \int_incr:N \l__spath_tmpb_int
+ }
+ \c_spath_curvetoa_tl
+ {
+ \int_incr:N \l__spath_tmpb_int
+ }
+ }
+ \int_compare:nT { \l__spath_tmpb_int < \l__spath_tmpa_int }
{
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_put_right:NV \l__spath_tmpa_tl \l__spath_tmpb_tl
+ \tl_put_right:NV \l__spath_tmpc_tl \l__spath_tmpf_tl
+
+ \tl_put_right:Nx \l__spath_tmpc_tl
+ {{ \tl_head:N \l__spath_tmpe_tl }}
+ \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpe_tl}
+ \tl_set:Nx \l__spath_tmpe_tl {\tl_tail:N \l__spath_tmpe_tl }
+
+ \tl_put_right:Nx \l__spath_tmpc_tl
+ {{ \tl_head:N \l__spath_tmpe_tl }}
+ \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpe_tl}
+ \tl_set:Nx \l__spath_tmpe_tl {\tl_tail:N \l__spath_tmpe_tl }
- \spath_put:nnV {#1} {reverse path} \l__spath_tmpa_tl
}
}
- \__spath_get:nnNT {tmp_path} {length} \l__spath_tmpa_tl
+ \tl_clear:N \l__spath_tmpd_tl
+ \tl_put_right:NV \l__spath_tmpd_tl \c_spath_moveto_tl
+ \tl_put_right:Nx \l__spath_tmpd_tl
{
- \__spath_get:nnNT {#1} {length} \l__spath_tmpb_tl
- {
- \int_set:Nn \l__spath_tmpa_int {\l__spath_tmpa_tl + \l__spath_tmpb_tl - 1}
- \spath_put:nnV {#1} {length} \l__spath_tmpa_int
- }
+ {\dim_use:N \l__spath_tmpa_dim}
+ {\dim_use:N \l__spath_tmpb_dim}
}
- \__spath_get:nnNT {tmp_path} {real length} \l__spath_tmpa_tl
+ \fp_compare:nTF
{
- \__spath_get:nnNT {#1} {real length} \l__spath_tmpb_tl
+ \l__spath_tmpa_fp == 0
+ }
+ {
+ \tl_set_eq:NN \l__spath_tmpb_tl \l__spath_tmpd_tl
+ \tl_if_empty:NF \l__spath_tmpe_tl
{
- \int_set:Nn \l__spath_tmpa_int {\l__spath_tmpa_tl + \l__spath_tmpb_tl}
- \spath_put:nnV {#1} {real length} \l__spath_tmpa_int
+ \tl_put_right:NV \l__spath_tmpb_tl \l__spath_tmpf_tl
+ \tl_put_right:NV \l__spath_tmpb_tl \l__spath_tmpe_tl
}
}
-
- \__spath_get:nnNT {tmp_path} {number of components} \l__spath_tmpa_tl
{
- \__spath_get:nnNT {#1} {number of components} \l__spath_tmpb_tl
+
+ \tl_case:Nn \l__spath_tmpf_tl
{
- \int_set:Nn \l__spath_tmpa_int {\l__spath_tmpa_tl + \l__spath_tmpb_tl - 1}
- \spath_put:nnV {#1} {number of components} \l__spath_tmpa_int
+ \c_spath_lineto_tl
+ {
+ \tl_put_right:NV \l__spath_tmpd_tl \l__spath_tmpf_tl
+ \tl_put_right:Nx \l__spath_tmpd_tl
+ {{ \tl_head:N \l__spath_tmpe_tl }}
+ \tl_set:Nx \l__spath_tmpe_tl {\tl_tail:N \l__spath_tmpe_tl }
+
+ \tl_put_right:Nx \l__spath_tmpd_tl
+ {{ \tl_head:N \l__spath_tmpe_tl }}
+ \tl_set:Nx \l__spath_tmpe_tl {\tl_tail:N \l__spath_tmpe_tl }
+
+ \spath_split_line:NNVV
+ \l__spath_tmpa_tl
+ \l__spath_tmpb_tl
+ \l__spath_tmpd_tl
+ \l__spath_tmpa_fp
+
+ \prg_replicate:nn {3} {
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ }
+
+ \tl_put_right:NV \l__spath_tmpc_tl \l__spath_tmpa_tl
+ \tl_put_right:NV \l__spath_tmpb_tl \l__spath_tmpe_tl
+ }
+ \c_spath_curvetoa_tl
+ {
+ \tl_put_right:NV \l__spath_tmpd_tl \l__spath_tmpf_tl
+ \tl_put_right:Nx \l__spath_tmpd_tl
+ {{ \tl_head:N \l__spath_tmpe_tl }}
+ \tl_set:Nx \l__spath_tmpe_tl {\tl_tail:N \l__spath_tmpe_tl }
+
+ \tl_put_right:Nx \l__spath_tmpd_tl
+ {{ \tl_head:N \l__spath_tmpe_tl }}
+ \tl_set:Nx \l__spath_tmpe_tl {\tl_tail:N \l__spath_tmpe_tl }
+
+ \prg_replicate:nn {2} {
+
+ \tl_put_right:Nx \l__spath_tmpd_tl
+ { \tl_head:N \l__spath_tmpe_tl }
+ \tl_set:Nx \l__spath_tmpe_tl {\tl_tail:N \l__spath_tmpe_tl }
+
+ \tl_put_right:Nx \l__spath_tmpd_tl
+ {{ \tl_head:N \l__spath_tmpe_tl }}
+ \tl_set:Nx \l__spath_tmpe_tl {\tl_tail:N \l__spath_tmpe_tl }
+
+ \tl_put_right:Nx \l__spath_tmpd_tl
+ {{ \tl_head:N \l__spath_tmpe_tl }}
+ \tl_set:Nx \l__spath_tmpe_tl {\tl_tail:N \l__spath_tmpe_tl }
+ }
+
+ \spath_split_curve:NNVV
+ \l__spath_tmpa_tl
+ \l__spath_tmpb_tl
+ \l__spath_tmpd_tl \l__spath_tmpa_fp
+
+ \prg_replicate:nn {3} {
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ }
+
+ \tl_put_right:NV \l__spath_tmpc_tl \l__spath_tmpa_tl
+ \tl_put_right:NV \l__spath_tmpb_tl \l__spath_tmpe_tl
+ }
}
}
+ \tl_gclear:N \g__spath_output_tl
+ \__spath_tl_gput_right_braced:NV \g__spath_output_tl \l__spath_tmpc_tl
+ \__spath_tl_gput_right_braced:NV \g__spath_output_tl \l__spath_tmpb_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_split_at:NNnn #1#2#3#4
+{
+ \__spath_split_at:nn {#3}{#4}
+ \tl_set:Nx #1 {\tl_item:Nn \g__spath_output_tl {1}}
+ \tl_set:Nx #2 {\tl_item:Nn \g__spath_output_tl {2}}
+ \tl_gclear:N \g__spath_output_tl
}
-\cs_new_nopar:Npn \spath_prepend_no_move:nn #1#2
+\cs_generate_variant:Nn \spath_split_at:NNnn {NNVn, NNVV, NNnV}
+\cs_new_protected_nopar:Npn \spath_gsplit_at:NNnn #1#2#3#4
{
- \spath_if_exist:nT {#2}
+ \__spath_split_at:nn {#3}{#4}
+ \tl_gset:Nx #1 {\tl_item:Nn \g__spath_output_tl {1}}
+ \tl_gset:Nx #2 {\tl_item:Nn \g__spath_output_tl {2}}
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_gsplit_at:NNnn {NNVn, NNVV, NNnV}
+\cs_new_protected_nopar:Npn \spath_split_at:Nnn #1#2#3
+{
+ \__spath_split_at:nn {#2}{#3}
+ \tl_set:Nx #1
{
- \__spath_get:nnN {#2} {path} \l__spath_tmpa_tl
- \__spath_get:nnN {#1} {path} \l__spath_tmpb_tl
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_put_right:NV \l__spath_tmpa_tl \l__spath_tmpb_tl
- \spath_put:nnV {#1} {path} \l__spath_tmpa_tl
+ \tl_item:Nn \g__spath_output_tl {1}
+ \tl_item:Nn \g__spath_output_tl {2}
+ }
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_split_at:Nnn {NVn, NVV}
+\cs_new_protected_nopar:Npn \spath_split_at:Nn #1#2
+{
+ \spath_split_at:NVn #1#1{#2}
+}
+\cs_new_protected_nopar:Npn \spath_gsplit_at:Nnn #1#2#3
+{
+ \__spath_split_at:nn {#2}{#3}
+ \tl_gset:Nx #1
+ {
+ \tl_item:Nn \g__spath_output_tl {1}
+ \tl_item:Nn \g__spath_output_tl {2}
+ }
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_gsplit_at:Nnn {NVn, NVV}
+\cs_new_protected_nopar:Npn \spath_gsplit_at:Nn #1#2
+{
+ \spath_gsplit_at:NVn #1#1{#2}
+}
+\cs_new_protected_nopar:Npn \__spath_shorten_at_end:nn #1#2
+{
+ \int_compare:nTF
+ {
+ \tl_count:n {#1} > 3
+ }
+ {
+ \group_begin:
+ \tl_set:Nn \l__spath_tmpa_tl {#1}
+ \tl_reverse:N \l__spath_tmpa_tl
- \spath_if_in:nnTF {#2} {initial point}
- {
- \__spath_get:nnN {#2} {initial point} \l__spath_tmpa_tl
- \spath_put:nnV {#1} {initial point} \l__spath_tmpa_tl
- }
- {
- \spath_remove:nn {#1} {initial point}
- }
+ \tl_set:Nx \l__spath_tmpb_tl {\tl_item:Nn \l__spath_tmpa_tl {3}}
- \spath_if_in:nnTF {#2} {initial action}
+ \tl_clear:N \l__spath_tmpe_tl
+ \tl_if_eq:NNTF \l__spath_tmpb_tl \c_spath_curveto_tl
{
- \__spath_get:nnN {#2} {initial action} \l__spath_tmpa_tl
- \spath_put:nnV {#1} {initial action} \l__spath_tmpa_tl
+ \int_set:Nn \l__spath_tmpa_int {3}
}
{
- \spath_remove:nn {#1} {initial action}
+ \int_set:Nn \l__spath_tmpa_int {1}
}
- \bool_if:nTF
+ \prg_replicate:nn { \l__spath_tmpa_int }
{
- \spath_if_in_p:nn {#1} {length}
- &&
- \spath_if_in_p:nn {#2} {length}
- }
- {
- \__spath_get:nnN {#1} {length} \l__spath_tmpa_tl
- \__spath_get:nnN {#2} {length} \l__spath_tmpb_tl
- \spath_put:nnx {#1} {length} {\int_eval:n {\l__spath_tmpa_tl +
- \l__spath_tmpb_tl - 1}}
- }
- {
- \spath_remove:nn {#1} {length}
- }
- \bool_if:nTF
- {
- \spath_if_in_p:nn {#1} {real length}
- &&
- \spath_if_in_p:nn {#2} {real length}
+ \tl_put_right:Nx \l__spath_tmpe_tl
+ {
+ {\tl_head:N \l__spath_tmpa_tl}
+ }
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ \tl_put_right:Nx \l__spath_tmpe_tl
+ {
+ {\tl_head:N \l__spath_tmpa_tl}
+ }
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ \tl_put_right:Nx \l__spath_tmpe_tl
+ {
+ \tl_head:N \l__spath_tmpa_tl
+ }
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
}
+
+ \tl_put_right:Nx \l__spath_tmpe_tl
{
- \__spath_get:nnN {#1} {real length} \l__spath_tmpa_tl
- \__spath_get:nnN {#2} {real length} \l__spath_tmpb_tl
- \spath_put:nnx {#1} {real length} {\int_eval:n {\l__spath_tmpa_tl +
- \l__spath_tmpb_tl }}
+ {\tl_item:Nn \l__spath_tmpa_tl {1}}
+ {\tl_item:Nn \l__spath_tmpa_tl {2}}
}
+ \tl_put_right:NV \l__spath_tmpe_tl \c_spath_moveto_tl
+
+ \tl_reverse:N \l__spath_tmpa_tl
+
+ \fp_set:Nn \l__spath_tmpa_fp
{
- \spath_remove:nn {#1} {real length}
+ \dim_to_fp:n {\tl_item:Nn \l__spath_tmpe_tl {4}}
+ -
+ \dim_to_fp:n {\tl_item:Nn \l__spath_tmpe_tl {1}}
}
- \bool_if:nTF
+
+ \fp_set:Nn \l__spath_tmpb_fp
{
- \spath_if_in_p:nn {#1} {number of components}
- &&
- \spath_if_in_p:nn {#2} {number of components}
+ \dim_to_fp:n {\tl_item:Nn \l__spath_tmpe_tl {5}}
+ -
+ \dim_to_fp:n {\tl_item:Nn \l__spath_tmpe_tl {2}}
}
+
+ \fp_set:Nn \l__spath_tmpc_fp
{
- \__spath_get:nnN {#1} {number of components} \l__spath_tmpa_tl
- \__spath_get:nnN {#2} {number of components} \l__spath_tmpb_tl
- \spath_put:nnx {#1} {number of components} {\int_eval:n {\l__spath_tmpa_tl +
- \l__spath_tmpb_tl - 1}}
+ sqrt(
+ \l__spath_tmpa_fp * \l__spath_tmpa_fp
+ +
+ \l__spath_tmpb_fp * \l__spath_tmpb_fp
+ ) * \l__spath_tmpa_int
}
+
+ \fp_compare:nTF
{
- \spath_remove:nn {#1} {number of components}
+ \l__spath_tmpc_fp > #2
}
- \bool_if:nTF
{
- \spath_if_in_p:nn {#1} {min bb}
- &&
- \spath_if_in_p:nn {#2} {min bb}
- }
- {
- \__spath_get:nnN {#1} {min bb} \l__spath_tmpa_tl
- \__spath_get:nnN {#2} {min bb} \l__spath_tmpb_tl
- \dim_set:Nn \l__spath_tmpa_dim {\dim_min:nn {\tl_item:Nn
- \l__spath_tmpa_tl {1}} {\tl_item:Nn
- \l__spath_tmpb_tl {1}}}
- \dim_set:Nn \l__spath_tmpb_dim {\dim_min:nn {\tl_item:Nn
- \l__spath_tmpa_tl {2}} {\tl_item:Nn
- \l__spath_tmpb_tl {2}}}
- \spath_put:nnx {#1} {min bb} {
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
+
+ \fp_set:Nn \l__spath_tmpc_fp
+ {
+ (\l__spath_tmpc_fp - #2)/ \l__spath_tmpc_fp
}
- }
- {
- \spath_remove:nn {#1} {min bb}
- }
- \bool_if:nTF
- {
- \spath_if_in_p:nn {#1} {max bb}
- &&
- \spath_if_in_p:nn {#2} {max bb}
- }
- {
- \__spath_get:nnN {#1} {max bb} \l__spath_tmpa_tl
- \__spath_get:nnN {#2} {max bb} \l__spath_tmpb_tl
- \dim_set:Nn \l__spath_tmpa_dim {\dim_min:nn {\tl_item:Nn
- \l__spath_tmpa_tl {1}} {\tl_item:Nn
- \l__spath_tmpb_tl {1}}}
- \dim_set:Nn \l__spath_tmpb_dim {\dim_min:nn {\tl_item:Nn
- \l__spath_tmpa_tl {2}} {\tl_item:Nn
- \l__spath_tmpb_tl {2}}}
- \spath_put:nnx {#1} {max bb} {
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
+
+ \tl_reverse:N \l__spath_tmpe_tl
+
+ \tl_if_eq:NNTF \l__spath_tmpb_tl \c_spath_curveto_tl
+ {
+ \spath_split_curve:NNVV
+ \l__spath_tmpc_tl
+ \l__spath_tmpd_tl
+ \l__spath_tmpe_tl
+ \l__spath_tmpc_fp
}
+ {
+ \spath_split_line:NNVV
+ \l__spath_tmpc_tl
+ \l__spath_tmpd_tl
+ \l__spath_tmpe_tl
+ \l__spath_tmpc_fp
+ }
+
+ \prg_replicate:nn {3}
+ {
+ \tl_set:Nx \l__spath_tmpc_tl {\tl_tail:N \l__spath_tmpc_tl}
+ }
+
+ \tl_put_right:NV \l__spath_tmpa_tl \l__spath_tmpc_tl
+
}
{
- \spath_remove:nn {#1} {max bb}
- }
- \bool_if:nTF
- {
- \spath_if_in_p:nn {#1} {reverse path}
- &&
- \spath_if_in_p:nn {#2} {reverse path}
- }
- {
- \__spath_get:nnN {#1} {reverse path} \l__spath_tmpa_tl
- \__spath_get:nnN {#2} {reverse path} \l__spath_tmpb_tl
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_put_right:NV \l__spath_tmpa_tl \l__spath_tmpb_tl
- \spath_put:nnV {#1} {reverse path} \l__spath_tmpb_tl
- }
- {
- \spath_remove:nn {#1} {reverse path}
+
+ \int_compare:nT
+ {
+ \tl_count:N \l__spath_tmpa_tl > 3
+ }
+ {
+ \dim_set:Nn \l__spath_tmpa_dim {\fp_to_dim:n {#2 - \l__spath_tmpc_fp } }
+ \spath_shorten_at_end:NV \l__spath_tmpa_tl \l__spath_tmpa_dim
+ }
}
+ \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpa_tl
+ \group_end:
+ }
+ {
+ \tl_gset:Nn \g__spath_output_tl {#1}
}
}
-\cs_new_nopar:Npn \spath_append_no_move:nn #1#2
+\cs_new_protected_nopar:Npn \spath_shorten_at_end:Nnn #1#2#3
{
- \spath_if_exist:nT {#2}
+ \__spath_shorten_at_end:nn {#2}{#3}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_shorten_at_end:Nnn {NVV, cnn, cVV, NVn}
+\cs_new_protected_nopar:Npn \spath_shorten_at_end:Nn #1#2
+{
+ \spath_shorten_at_end:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_shorten_at_end:Nn {cn, cV, NV}
+\cs_new_protected_nopar:Npn \spath_gshorten_at_end:Nnn #1#2#3
+{
+ \__spath_shorten_at_end:nn {#2}{#3}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_gshorten_at_end:Nnn {NVV, cnn, cVV, NVn}
+\cs_new_protected_nopar:Npn \spath_gshorten_at_end:Nn #1#2
+{
+ \spath_gshorten_at_end:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_gshorten_at_end:Nn {cn, cV, NV}
+\cs_new_protected_nopar:Npn \__spath_shorten_at_start:nn #1#2
+{
+ \int_compare:nTF
{
- \spath_get:nnN {#1} {path} \l__spath_tmpa_tl
- \spath_get:nnN {#2} {path} \l__spath_tmpb_tl
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_put_right:NV \l__spath_tmpa_tl \l__spath_tmpb_tl
- \spath_put:nnV {#1} {path} \l__spath_tmpa_tl
- \spath_if_in:nnTF {#2} {final point}
- {
- \__spath_get:nnN {#2} {final point} \l__spath_tmpa_tl
- \spath_put:nnV {#1} {final point} \l__spath_tmpa_tl
- }
+ \tl_count:n {#1} > 3
+ }
+ {
+ \group_begin:
+ \tl_set:Nn \l__spath_tmpa_tl {#1}
+
+ \tl_set:Nx \l__spath_tmpb_tl {\tl_item:Nn \l__spath_tmpa_tl {4}}
+
+ \tl_clear:N \l__spath_tmpe_tl
+
+ \tl_if_eq:NNTF \l__spath_tmpb_tl \c_spath_curvetoa_tl
+ {
+ \int_set:Nn \l__spath_tmpa_int {3}
+ }
+ {
+ \int_set:Nn \l__spath_tmpa_int {1}
+ }
+
+ \tl_set_eq:NN \l__spath_tmpe_tl \c_spath_moveto_tl
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl }
+
+ \prg_replicate:nn { \l__spath_tmpa_int }
+ {
+ \__spath_tl_put_right_braced:Nx
+ \l__spath_tmpe_tl
+ {\tl_item:Nn \l__spath_tmpa_tl {1}}
+ \__spath_tl_put_right_braced:Nx
+ \l__spath_tmpe_tl
+ {\tl_item:Nn \l__spath_tmpa_tl {2}}
+ \tl_put_right:Nx \l__spath_tmpe_tl {\tl_item:Nn \l__spath_tmpa_tl {3}}
+
+ \prg_replicate:nn {3}
{
- \spath_remove:nn {#1} {final point}
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl }
}
- \spath_if_in:nnTF {#2} {final action}
+ }
+ \__spath_tl_put_right_braced:Nx
+ \l__spath_tmpe_tl
+ {\tl_item:Nn \l__spath_tmpa_tl {1}}
+ \__spath_tl_put_right_braced:Nx
+ \l__spath_tmpe_tl
+ {\tl_item:Nn \l__spath_tmpa_tl {2}}
+
+ \fp_set:Nn \l__spath_tmpa_fp
+ {
+ \dim_to_fp:n {\tl_item:Nn \l__spath_tmpe_tl {5}}
+ -
+ \dim_to_fp:n {\tl_item:Nn \l__spath_tmpe_tl {2}}
+ }
+
+ \fp_set:Nn \l__spath_tmpb_fp
+ {
+ \dim_to_fp:n {\tl_item:Nn \l__spath_tmpe_tl {6}}
+ -
+ \dim_to_fp:n {\tl_item:Nn \l__spath_tmpe_tl {3}}
+ }
+
+ \fp_set:Nn \l__spath_tmpc_fp
+ {
+ sqrt(
+ \l__spath_tmpa_fp * \l__spath_tmpa_fp
+ +
+ \l__spath_tmpb_fp * \l__spath_tmpb_fp
+ )
+ *
+ \l__spath_tmpa_int
+ }
+
+ \fp_compare:nTF
+ {
+ \l__spath_tmpc_fp > #2
+ }
+ {
+
+ \fp_set:Nn \l__spath_tmpc_fp
{
- \__spath_get:nnN {#2} {final action} \l__spath_tmpa_tl
- \spath_put:nnV {#1} {final action} \l__spath_tmpa_tl
+ #2/ \l__spath_tmpc_fp
}
+
+ \tl_if_eq:NNTF \l__spath_tmpb_tl \c_spath_curvetoa_tl
{
- \spath_remove:nn {#1} {final action}
+ \spath_split_curve:NNVV
+ \l__spath_tmpc_tl
+ \l__spath_tmpd_tl
+ \l__spath_tmpe_tl
+ \l__spath_tmpc_fp
}
- \bool_if:nTF
{
- \spath_if_in_p:nn {#1} {length}
- &&
- \spath_if_in_p:nn {#2} {length}
+ \spath_split_line:NNVV
+ \l__spath_tmpc_tl
+ \l__spath_tmpd_tl
+ \l__spath_tmpe_tl
+ \l__spath_tmpc_fp
}
+
+ \prg_replicate:nn {2}
{
- \__spath_get:nnN {#1} {length} \l__spath_tmpa_tl
- \__spath_get:nnN {#2} {length} \l__spath_tmpb_tl
- \spath_put:nnx {#1} {length} {\int_eval:n {\l__spath_tmpa_tl +
- \l__spath_tmpb_tl - 1}}
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
}
+
+ \tl_put_left:NV \l__spath_tmpa_tl \l__spath_tmpd_tl
+
+ }
+ {
+
+ \tl_put_left:NV \l__spath_tmpa_tl \c_spath_moveto_tl
+
+ \int_compare:nT
{
- \spath_remove:nn {#1} {length}
+ \tl_count:N \l__spath_tmpa_tl > 3
}
- \bool_if:nTF
{
- \spath_if_in_p:nn {#1} {real length}
- &&
- \spath_if_in_p:nn {#2} {real length}
+ \dim_set:Nn \l__spath_tmpa_dim {\fp_to_dim:n {#2 - \l__spath_tmpc_fp } }
+ \spath_shorten_at_start:NV \l__spath_tmpa_tl \l__spath_tmpa_dim
}
+ }
+
+ \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpa_tl
+ \group_end:
+ }
+ {
+ \tl_gset:Nn \g__spath_output_tl {#1}
+ }
+}
+\cs_new_protected_nopar:Npn \spath_shorten_at_start:Nnn #1#2#3
+{
+ \__spath_shorten_at_start:nn {#2}{#3}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_shorten_at_start:Nnn {NVV, cnn, cVV, NVn}
+\cs_new_protected_nopar:Npn \spath_shorten_at_start:Nn #1#2
+{
+ \spath_shorten_at_start:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_shorten_at_start:Nn {cn, cV, NV}
+\cs_new_protected_nopar:Npn \spath_gshorten_at_start:Nnn #1#2#3
+{
+ \__spath_shorten_at_start:nn {#2}{#3}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_gshorten_at_start:Nnn {NVV, cnn, cVV, NVn}
+\cs_new_protected_nopar:Npn \spath_gshorten_at_start:Nn #1#2
+{
+ \spath_gshorten_at_start:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_gshorten_at_start:Nn {cn, cV, NV}
+\cs_new_protected_nopar:Npn \__spath_point_at:nn #1#2
+{
+ \group_begin:
+ \int_set:Nn \l__spath_tmpa_int {\fp_to_int:n {floor(#2) + 1}}
+ \fp_set:Nn \l__spath_tmpa_fp {#2 - floor(#2)}
+
+ \spath_segments_to_seq:Nn \l__spath_tmpa_seq {#1}
+
+ \int_compare:nTF
+ {
+ \l__spath_tmpa_int < 1
+ }
+ {
+ \spath_initialpoint:Nn \l__spath_tmpc_tl {#1}
+ }
+ {
+ \int_compare:nTF
{
- \__spath_get:nnN {#1} {real length} \l__spath_tmpa_tl
- \__spath_get:nnN {#2} {real length} \l__spath_tmpb_tl
- \spath_put:nnx {#1} {real length} {\int_eval:n {\l__spath_tmpa_tl +
- \l__spath_tmpb_tl }}
+ \l__spath_tmpa_int > \seq_count:N \l__spath_tmpa_seq
}
{
- \spath_remove:nn {#1} {real length}
+ \spath_finalpoint:Nn \l__spath_tmpc_tl {#1}
}
- \bool_if:nTF
{
- \spath_if_in_p:nn {#1} {number of components}
- &&
- \spath_if_in_p:nn {#2} {number of components}
+
+ \tl_set:Nx
+ \l__spath_tmpa_tl
+ {\seq_item:Nn \l__spath_tmpa_seq { \l__spath_tmpa_int} }
+
+ \int_compare:nTF
+ {
+ \tl_count:N \l__spath_tmpa_tl > 3
+ }
+ {
+ \tl_set:Nx \l__spath_tmpb_tl {\tl_item:Nn \l__spath_tmpa_tl {4}}
+ }
+ {
+ \tl_set:Nx \l__spath_tmpb_tl {\tl_item:Nn \l__spath_tmpa_tl {1}}
+ }
+
+ \tl_clear:N \l__spath_tmpc_tl
+
+ \tl_case:Nn \l__spath_tmpb_tl
+ {
+ \c_spath_moveto_tl
+ {
+ \tl_set:Nx \l__spath_tmpc_tl
+ {
+ {
+ \tl_item:Nn \l__spath_tmpa_tl {2}
+ }
+ {
+ \tl_item:Nn \l__spath_tmpa_tl {3}
+ }
+ }
+ }
+
+ \c_spath_lineto_tl
+ {
+ \tl_set:Nx \l__spath_tmpc_tl
+ {
+ {\fp_to_dim:n
+ {
+ (1 - \l__spath_tmpa_fp) * ( \tl_item:Nn \l__spath_tmpa_tl {2} )
+ +
+ \l__spath_tmpa_fp * ( \tl_item:Nn \l__spath_tmpa_tl {5} )
+ }
+ }
+ {\fp_to_dim:n
+ {
+ (1 - \l__spath_tmpa_fp) * ( \tl_item:Nn \l__spath_tmpa_tl {3} )
+ +
+ \l__spath_tmpa_fp * ( \tl_item:Nn \l__spath_tmpa_tl {6} )
+ }
+ }
+ }
+ }
+
+ \c_spath_closepath_tl
+ {
+ \tl_set:Nx \l__spath_tmpc_tl
+ {
+ {\fp_to_dim:n
+ {
+ (1 - \l__spath_tmpa_fp) * ( \tl_item:Nn \l__spath_tmpa_tl {2} )
+ +
+ \l__spath_tmpa_fp * ( \tl_item:Nn \l__spath_tmpa_tl {5} )
+ }
+ }
+ {\fp_to_dim:n
+ {
+ (1 - \l__spath_tmpa_fp) * ( \tl_item:Nn \l__spath_tmpa_tl {3} )
+ +
+ \l__spath_tmpa_fp * ( \tl_item:Nn \l__spath_tmpa_tl {6} )
+ }
+ }
+ }
+ }
+
+ \c_spath_curvetoa_tl
+ {
+ \tl_set:Nx \l__spath_tmpc_tl
+ {
+ {\fp_to_dim:n
+ {
+ (1 - \l__spath_tmpa_fp)^3 * \tl_item:Nn \l__spath_tmpa_tl {2}
+ + 3 * (1 - \l__spath_tmpa_fp)^2 * (\l__spath_tmpa_fp)
+ * \tl_item:Nn \l__spath_tmpa_tl {5}
+ + 3 * (1 - \l__spath_tmpa_fp) * (\l__spath_tmpa_fp)^2
+ * \tl_item:Nn \l__spath_tmpa_tl {8}
+ + (\l__spath_tmpa_fp)^3 * \tl_item:Nn \l__spath_tmpa_tl {11}
+ }}
+ {\fp_to_dim:n
+ {
+ (1 - \l__spath_tmpa_fp)^3 * \tl_item:Nn \l__spath_tmpa_tl {3}
+ + 3 * (1 - \l__spath_tmpa_fp)^2 * (\l__spath_tmpa_fp)
+ * \tl_item:Nn \l__spath_tmpa_tl {6}
+ + 3 * (1 - \l__spath_tmpa_fp) * (\l__spath_tmpa_fp)^2
+ * \tl_item:Nn \l__spath_tmpa_tl {9}
+ + (\l__spath_tmpa_fp)^3 * \tl_item:Nn \l__spath_tmpa_tl {12}
+ }}
+ }
+ }
+ }
}
+ }
+
+ \tl_gclear:N \g__spath_output_tl
+ \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpc_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_point_at:Nnn #1#2#3
+{
+ \__spath_point_at:nn {#2}{#3}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_point_at:Nnn {NVn, NVV, NnV}
+\cs_new_protected_nopar:Npn \spath_gpoint_at:Nnn #1#2#3
+{
+ \__spath_point_at:nn {#2}{#3}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_gpoint_at:Nnn {NVn, NVV, NnV}
+\cs_new_protected_nopar:Npn \__spath_tangent_at:nn #1#2
+{
+ \group_begin:
+ \int_set:Nn \l__spath_tmpa_int {\fp_to_int:n {floor(#2) + 1}}
+ \fp_set:Nn \l__spath_tmpa_fp {#2 - floor(#2)}
+
+ \spath_segments_to_seq:Nn \l__spath_tmpa_seq {#1}
+
+ \int_compare:nTF
+ {
+ \l__spath_tmpa_int < 1
+ }
+ {
+ \spath_initialpoint:Nn \l__spath_tmpc_tl {#1}
+ }
+ {
+ \int_compare:nTF
{
- \__spath_get:nnN {#1} {number of components} \l__spath_tmpa_tl
- \__spath_get:nnN {#2} {number of components} \l__spath_tmpb_tl
- \spath_put:nnx {#1} {number of components} {\int_eval:n {\l__spath_tmpa_tl +
- \l__spath_tmpb_tl - 1}}
+ \l__spath_tmpa_int > \seq_count:N \l__spath_tmpa_seq
}
{
- \spath_remove:nn {#1} {number of components}
+ \spath_finalpoint:Nn \l__spath_tmpc_tl {#1}
}
- \bool_if:nTF
{
- \spath_if_in_p:nn {#1} {min bb}
- &&
- \spath_if_in_p:nn {#2} {min bb}
- }
- {
- \__spath_get:nnN {#1} {min bb} \l__spath_tmpa_tl
- \__spath_get:nnN {#2} {min bb} \l__spath_tmpb_tl
- \dim_set:Nn \l__spath_tmpa_dim {\dim_min:nn {\tl_item:Nn
- \l__spath_tmpa_tl {1}} {\tl_item:Nn
- \l__spath_tmpb_tl {1}}}
- \dim_set:Nn \l__spath_tmpb_dim {\dim_min:nn {\tl_item:Nn
- \l__spath_tmpa_tl {2}} {\tl_item:Nn
- \l__spath_tmpb_tl {2}}}
- \spath_put:nnx {#1} {min bb} {
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
+
+ \tl_set:Nx
+ \l__spath_tmpa_tl
+ {\seq_item:Nn \l__spath_tmpa_seq { \l__spath_tmpa_int} }
+
+ \int_compare:nTF
+ {
+ \tl_count:N \l__spath_tmpa_tl > 3
+ }
+ {
+ \tl_set:Nx \l__spath_tmpb_tl {\tl_item:Nn \l__spath_tmpa_tl {4}}
+ }
+ {
+ \tl_set:Nx \l__spath_tmpb_tl {\tl_item:Nn \l__spath_tmpa_tl {1}}
+ }
+
+ \tl_clear:N \l__spath_tmpc_tl
+
+ \tl_case:Nn \l__spath_tmpb_tl
+ {
+ \c_spath_moveto_tl
+ {
+ \tl_set:Nx \l__spath_tmpc_tl
+ {
+ {
+ \tl_item:Nn \l__spath_tmpa_tl {2}
+ }
+ {
+ \tl_item:Nn \l__spath_tmpa_tl {3}
+ }
+ }
+ }
+
+ \c_spath_lineto_tl
+ {
+ \tl_set:Nx \l__spath_tmpc_tl
+ {
+ {\fp_to_dim:n
+ {
+ ( \tl_item:Nn \l__spath_tmpa_tl {5} )
+ -
+ ( \tl_item:Nn \l__spath_tmpa_tl {2} )
+ }
+ }
+ {\fp_to_dim:n
+ {
+ ( \tl_item:Nn \l__spath_tmpa_tl {6} )
+ -
+ ( \tl_item:Nn \l__spath_tmpa_tl {3} )
+ }
+ }
+ }
+ }
+
+ \c_spath_closepath_tl
+ {
+ \tl_set:Nx \l__spath_tmpc_tl
+ {
+ {\fp_to_dim:n
+ {
+ ( \tl_item:Nn \l__spath_tmpa_tl {5} )
+ -
+ ( \tl_item:Nn \l__spath_tmpa_tl {2} )
+ }
+ }
+ {\fp_to_dim:n
+ {
+ ( \tl_item:Nn \l__spath_tmpa_tl {6} )
+ -
+ ( \tl_item:Nn \l__spath_tmpa_tl {3} )
+ }
+ }
+ }
+ }
+
+ \c_spath_curvetoa_tl
+ {
+ \tl_set:Nx \l__spath_tmpc_tl
+ {
+ {\fp_to_dim:n
+ {
+ 3*(1 - \l__spath_tmpa_fp)^2 * (\tl_item:Nn \l__spath_tmpa_tl {5}
+ - \tl_item:Nn \l__spath_tmpa_tl {2})
+ + 6 * (1 - \l__spath_tmpa_fp) * (\l__spath_tmpa_fp) *
+ (\tl_item:Nn \l__spath_tmpa_tl {8}
+ - \tl_item:Nn \l__spath_tmpa_tl {5})
+ + 3*(\l__spath_tmpa_fp)^2 * (\tl_item:Nn \l__spath_tmpa_tl {11}
+ - \tl_item:Nn \l__spath_tmpa_tl {8})
+ }
+ }
+ {\fp_to_dim:n
+ {
+ 3*(1 - \l__spath_tmpa_fp)^2 * (\tl_item:Nn \l__spath_tmpa_tl {6}
+ - \tl_item:Nn \l__spath_tmpa_tl {3})
+ + 6 * (1 - \l__spath_tmpa_fp) * (\l__spath_tmpa_fp) *
+ (\tl_item:Nn \l__spath_tmpa_tl {9}
+ - \tl_item:Nn \l__spath_tmpa_tl {6})
+ + 3*(\l__spath_tmpa_fp)^2 * (\tl_item:Nn \l__spath_tmpa_tl {12}
+ - \tl_item:Nn \l__spath_tmpa_tl {9})
+ }}
+ }
+ }
}
}
+ }
+
+ \tl_gclear:N \g__spath_output_tl
+ \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpc_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_tangent_at:Nnn #1#2#3
+{
+ \__spath_tangent_at:nn {#2}{#3}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_tangent_at:Nnn {NVn, NVV, NnV}
+\cs_new_protected_nopar:Npn \spath_gtangent_at:Nnn #1#2#3
+{
+ \__spath_tangent_at:nn {#2}{#3}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_gtangent_at:Nnn {NVn, NVV, NnV}
+\cs_new_protected_nopar:Npn \__spath_transformation_at:nn #1#2
+{
+ \group_begin:
+ \tl_clear:N \l__spath_tmpa_tl
+ \__spath_tangent_at:nn {#1}{#2}
+ \tl_set_eq:NN \l__spath_tmpb_tl \g__spath_output_tl
+ \fp_set:Nn \l__spath_tmpa_fp
+ {
+ sqrt(
+ (\tl_item:Nn \l__spath_tmpb_tl {1})^2
+ +
+ (\tl_item:Nn \l__spath_tmpb_tl {2})^2
+ )
+ }
+ \fp_compare:nTF {\l__spath_tmpa_fp = 0}
+ {
+ \fp_set:Nn \l__spath_tmpa_fp {1}
+ \fp_set:Nn \l__spath_tmpb_fp {0}
+ }
+ {
+ \fp_set:Nn \l__spath_tmpb_fp
+ { (\tl_item:Nn \l__spath_tmpb_tl {2}) / \l__spath_tmpa_fp }
+ \fp_set:Nn \l__spath_tmpa_fp
+ { (\tl_item:Nn \l__spath_tmpb_tl {1}) / \l__spath_tmpa_fp }
+ }
+ \tl_set:Nx \l__spath_tmpa_tl
+ {
+ { \fp_to_decimal:n { \l__spath_tmpa_fp } }
+ { \fp_to_decimal:n { \l__spath_tmpb_fp } }
+ { \fp_to_decimal:n {- \l__spath_tmpb_fp } }
+ { \fp_to_decimal:n { \l__spath_tmpa_fp } }
+ }
+ \__spath_point_at:nn {#1}{#2}
+ \tl_put_right:NV \l__spath_tmpa_tl \g__spath_output_tl
+ \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpa_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_transformation_at:Nnn #1#2#3
+{
+ \__spath_transformation_at:nn {#2}{#3}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_transformation_at:Nnn {NVn, NVV, NnV, NvV}
+\cs_new_protected_nopar:Npn \spath_gtransformation_at:Nnn #1#2#3
+{
+ \__spath_transformation_at:nn {#2}{#3}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_gtransformation_at:Nnn {NVn, NVV, NnV}
+\cs_new_protected_nopar:Npn \spath_intersect:NN #1#2
+{
+ \pgfintersectionofpaths%
+ {%
+ \pgfsetpath #1
+ }{%
+ \pgfsetpath #2
+ }
+}
+\cs_new_protected_nopar:Npn \spath_intersect:nn #1#2
+{
+ \tl_set:Nn \l__spath_intersecta_tl {#1}
+ \tl_set:Nn \l__spath_intersectb_tl {#2}
+ \spath_intersect:NN \l__spath_intersecta_tl \l__spath_intersectb_tl
+}
+\cs_new_protected_nopar:Npn \__spath_split_component_at_intersections:nn #1#2
+{
+ \group_begin:
+ \tl_clear:N \l__spath_tmpe_tl
+ \seq_clear:N \l__spath_tmpb_seq
+
+ % Find the intersections of these segments
+ \tl_set:Nn \l__spath_tmpb_tl {#1}
+ \tl_set:Nn \l__spath_tmpc_tl {#2}
+
+ \spath_reallength:Nn \l__spath_tmpa_int {#1}
+
+ % Remember if the component is closed
+ \spath_finalaction:NV \l__spath_tmpa_tl \l__spath_tmpb_tl
+
+ \bool_set:Nn \l__spath_closed_bool
+ {
+ \tl_if_eq_p:NN \l__spath_tmpa_tl \c_spath_closepath_tl
+ }
+
+ % Open it
+ \spath_open:N \l__spath_tmpb_tl
+
+ % Sort intersections along the component
+ \pgfintersectionsortbyfirstpath
+ \spath_intersect:NN \l__spath_tmpb_tl \l__spath_tmpc_tl
+
+ % If we get intersections
+ \int_compare:nT {\pgfintersectionsolutions > 0}
+ {
+ % Find the times of the intersections on the component
+ \int_step_inline:nnnn {1} {1} {\pgfintersectionsolutions}
{
- \spath_remove:nn {#1} {min bb}
+ \pgfintersectiongetsolutiontimes{##1}{\l__spath_tmph_tl}{\l__spath_tmpi_tl}
+ \seq_put_left:NV \l__spath_tmpb_seq \l__spath_tmph_tl
}
- \bool_if:nTF
+
+ \seq_get_left:NN \l__spath_tmpb_seq \l__spath_tmpa_tl
+ \fp_compare:nT
{
- \spath_if_in_p:nn {#1} {max bb}
- &&
- \spath_if_in_p:nn {#2} {max bb}
- }
- {
- \__spath_get:nnN {#1} {max bb} \l__spath_tmpa_tl
- \__spath_get:nnN {#2} {max bb} \l__spath_tmpb_tl
- \dim_set:Nn \l__spath_tmpa_dim {\dim_min:nn {\tl_item:Nn
- \l__spath_tmpa_tl {1}} {\tl_item:Nn
- \l__spath_tmpb_tl {1}}}
- \dim_set:Nn \l__spath_tmpb_dim {\dim_min:nn {\tl_item:Nn
- \l__spath_tmpa_tl {2}} {\tl_item:Nn
- \l__spath_tmpb_tl {2}}}
- \spath_put:nnx {#1} {max bb} {
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
- }
+ \l__spath_tmpa_tl > \l__spath_tmpa_int - .01
}
{
- \spath_remove:nn {#1} {max bb}
+ \bool_set_false:N \l__spath_closed_bool
}
- \bool_if:nTF
+ \seq_get_right:NN \l__spath_tmpb_seq \l__spath_tmpa_tl
+ \fp_compare:nT
{
- \spath_if_in_p:nn {#1} {reverse path}
- &&
- \spath_if_in_p:nn {#2} {reverse path}
+ \l__spath_tmpa_tl < .01
}
{
- \__spath_get:nnN {#2} {reverse path} \l__spath_tmpa_tl
- \__spath_get:nnN {#1} {reverse path} \l__spath_tmpb_tl
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_put_right:NV \l__spath_tmpa_tl \l__spath_tmpb_tl
- \spath_put:nnV {#1} {reverse path} \l__spath_tmpb_tl
+ \bool_set_false:N \l__spath_closed_bool
}
+
+ \tl_set:Nn \l__spath_tmpg_tl {-1}
+
+ \seq_map_inline:Nn \l__spath_tmpb_seq
{
- \spath_remove:nn {#1} {reverse path}
+ \tl_set:Nn \l__spath_tmph_tl {##1}
+
+ \tl_set_eq:NN \l__spath_tmpa_tl \l__spath_tmph_tl
+ \int_compare:nT
+ {
+ \fp_to_int:n {floor( \l__spath_tmph_tl) }
+ =
+ \fp_to_int:n {floor( \l__spath_tmpg_tl) }
+ }
+ {
+ \tl_set:Nx \l__spath_tmph_tl
+ {
+ \fp_eval:n {
+ floor( \l__spath_tmph_tl )
+ +
+ ( \l__spath_tmph_tl - floor( \l__spath_tmph_tl) )
+ /
+ ( \l__spath_tmpg_tl - floor( \l__spath_tmpg_tl) )
+ }
+ }
+ }
+ \tl_set_eq:NN \l__spath_tmpg_tl \l__spath_tmpa_tl
+
+ \spath_split_at:NNVV
+ \l__spath_tmpd_tl
+ \l__spath_tmpf_tl
+ \l__spath_tmpb_tl
+ \l__spath_tmph_tl
+
+ \tl_put_left:NV \l__spath_tmpe_tl \l__spath_tmpf_tl
+ \tl_set_eq:NN \l__spath_tmpb_tl \l__spath_tmpd_tl
+
}
+
+ \tl_put_left:NV \l__spath_tmpe_tl \l__spath_tmpb_tl
+
+ \spath_remove_empty_components:N \l__spath_tmpe_tl
+
+ \tl_set_eq:NN \l__spath_tmpb_tl \l__spath_tmpe_tl
}
+
+ \bool_if:NT \l__spath_closed_bool
+ {
+ \spath_join_component:Nn \l__spath_tmpb_tl {1}
+ }
+
+ \tl_gclear:N \g__spath_output_tl
+ \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpb_tl
+
+ \group_end:
}
-\cs_new_nopar:Npn \spath_bake_round:n #1
+\cs_new_protected_nopar:Npn \spath_split_component_at_intersections:Nnn #1#2#3
{
- \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl
- \pgf@@processround\l__spath_tmpa_tl\l__spath_tmpb_tl
- \spath_put:nnV {#1} {path} \l__spath_tmpb_tl
+ \__spath_split_component_at_intersections:nn {#2}{#3}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
}
-\cs_new_nopar:Npn \spath_close_path:n #1
+\cs_generate_variant:Nn \spath_split_component_at_intersections:Nnn {NVn, NVV}
+\cs_new_protected_nopar:Npn \spath_split_component_at_intersections:Nn #1#2
{
- \spath_get:nnN {#1} {initial point} \l__spath_tmpb_tl
- \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl
- \tl_put_right:NV \l__spath_tmpa_tl \g__spath_closepath_tl
- \tl_put_right:NV \l__spath_tmpa_tl \l__spath_tmpb_tl
- \spath_put:nnV {#1} {path} \l__spath_tmpa_tl
- \spath_if_in:nnT {#1} {reverse path}
- {
- \spath_get:nnN {#1} {final point} \l__spath_tmpb_tl
- \__spath_get:nnN {#1} {reverse path} \l__spath_tmpa_tl
- \tl_put_right:NV \l__spath_tmpa_tl \g__spath_closepath_tl
- \tl_put_right:NV \l__spath_tmpa_tl \l__spath_tmpb_tl
- \spath_put:nnV {#1} {reverse path} \l__spath_tmpa_tl
- }
+ \spath_split_component_at_intersections:NVn #1#1{#2}
}
-\cs_new_nopar:Npn \spath_map_component:Nn #1#2
+\cs_generate_variant:Nn \spath_split_component_at_intersections:Nn {cn, cv}
+\cs_new_protected_nopar:Npn \spath_gsplit_component_at_intersections:Nnn #1#2#3
{
- \int_gincr:N \g__spath_map_int
- \cs_gset:cpn { __spath_map_ \int_use:N \g__spath_map_int :w } ##1 {#2}
- \tl_set:NV \l__spath_tmpa_tl #1
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_put_right:NV \l__spath_tmpa_tl \g__spath_moveto_tl
- \tl_set_eq:NN \l__spath_tmpb_tl \g__spath_moveto_tl
- \bool_until_do:nn {
- \tl_if_empty_p:N \l__spath_tmpa_tl
- }
+ \__spath_split_component_at_intersections:nn {#2}{#3}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_gsplit_component_at_intersections:Nnn {NVn, NVV}
+\cs_new_protected_nopar:Npn \spath_gsplit_component_at_intersections:Nn #1#2
+{
+ \spath_gsplit_component_at_intersections:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_gsplit_component_at_intersections:Nn {cn, cv}
+\cs_new_protected_nopar:Npn \__spath_split_path_at_intersections:nn #1#2
+{
+ \group_begin:
+
+ \seq_clear:N \l__spath_tmpa_seq
+ \seq_clear:N \l__spath_tmpb_seq
+
+ \spath_components_to_seq:Nn \l__spath_tmpa_seq {#1}
+ \seq_map_inline:Nn \l__spath_tmpa_seq
{
- \tl_set:Nx \l__spath_tmpc_tl {\tl_head:N \l__spath_tmpa_tl}
- \tl_if_eq:NNT \l__spath_tmpc_tl \g__spath_moveto_tl
- {
- \exp_args:NnV \use:c { __spath_map_ \int_use:N \g__spath_map_int :w } \l__spath_tmpb_tl
-\tl_clear:N \l__spath_tmpb_tl
- }
- \tl_if_single:NTF \l__spath_tmpc_tl
- {
- \tl_put_right:NV \l__spath_tmpb_tl \l__spath_tmpc_tl
- }
- {
- \tl_put_right:Nx \l__spath_tmpb_tl {{\l__spath_tmpc_tl}}
- }
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ \spath_split_component_at_intersections:Nnn \l__spath_tmpa_tl {##1} {#2}
+ \seq_put_right:NV \l__spath_tmpb_seq \l__spath_tmpa_tl
}
+
+ \tl_gclear:N \g__spath_output_tl
+ \tl_gset:Nx \g__spath_output_tl {\seq_use:Nn \l__spath_tmpb_seq {} }
+ \group_end:
}
-\cs_new_nopar:Npn \spath_map_segment_inline:Nn #1#2
+\cs_new_protected_nopar:Npn \spath_split_path_at_intersections:Nnn #1#2#3
{
- \int_gincr:N \g__spath_map_int
- \cs_gset:cpn { __spath_map_ \int_use:N \g__spath_map_int :w } ##1 ##2 {#2}
- \spath_map_segment_function:Nc #1 { __spath_map_ \int_use:N \g__spath_map_int :w }
+ \__spath_split_path_at_intersections:nn {#2}{#3}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
}
-\cs_new_nopar:Npn \spath_map_segment_inline:nn #1#2
+\cs_generate_variant:Nn \spath_split_path_at_intersections:Nnn
+{NVn, NVV, cVn, cVV, cvn, cvv}
+\cs_new_protected_nopar:Npn \spath_split_path_at_intersections:Nn #1#2
{
- \int_gincr:N \g__spath_map_int
- \cs_gset:cpn { __spath_map_ \int_use:N \g__spath_map_int :w } ##1 ##2 {#2}
- \spath_get:nnN {#1} {path} \l__spath_tmpd_tl
- \spath_map_segment_function:Nc \l__spath_tmpd_tl { __spath_map_ \int_use:N \g__spath_map_int :w }
+ \spath_split_path_at_intersections:NVn #1#1{#2}
}
-\cs_new_nopar:Npn \spath_map_segment_function:nN #1#2
+\cs_generate_variant:Nn \spath_split_path_at_intersections:Nn {cv, NV}
+\cs_new_protected_nopar:Npn \spath_gsplit_path_at_intersections:Nnn #1#2#3
{
- \spath_get:nnN {#1} {path} \l__spath_tmpd_tl
- \spath_map_segment_function:NN \l__spath_tmpd_tl #2
+ \__spath_split_path_at_intersections:nn {#2}{#3}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
}
-\cs_new_nopar:Npn \spath_map_segment_function:NN #1#2
+\cs_generate_variant:Nn \spath_gsplit_path_at_intersections:Nnn
+{NVn, NVV, cVn, cVV, cvn, cvv}
+\cs_new_protected_nopar:Npn \spath_gsplit_path_at_intersections:Nn #1#2
{
- \tl_set_eq:NN \l__spath_tmpa_tl #1
- \tl_clear:N \l__spath_tmpb_tl
- \dim_zero:N \l__spath_tmpa_dim
- \dim_zero:N \l__spath_tmpb_dim
+ \spath_gsplit_path_at_intersections:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_gsplit_path_at_intersections:Nn {cv, NV}
+\cs_new_protected_nopar:Npn \spath_split_at_intersections:NNnn #1#2#3#4
+{
+ \__spath_split_path_at_intersections:nn {#3}{#4}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \__spath_split_path_at_intersections:nn {#4}{#3}
+ \tl_set_eq:NN #2 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_split_at_intersections:NNnn
+{NNVn, NNVV, ccVn, ccVV, ccvn, ccvv}
+\cs_new_protected_nopar:Npn \spath_split_at_intersections:NN #1#2
+{
+ \spath_split_at_intersections:NNVV #1#2#1#2
+}
+\cs_generate_variant:Nn \spath_split_at_intersections:NN {cc}
+\cs_new_protected_nopar:Npn \spath_gsplit_at_intersections:NNnn #1#2#3#4
+{
+ \__spath_split_path_at_intersections:nn {#3}{#4}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \__spath_split_path_at_intersections:nn {#4}{#3}
+ \tl_gset_eq:NN #2 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_gsplit_at_intersections:NNnn
+{NNVn, NNVV, ccVn, ccVV, ccvn, ccvv}
+\cs_new_protected_nopar:Npn \spath_gsplit_at_intersections:NN #1#2
+{
+ \spath_gsplit_at_intersections:NNVV #1#2#1#2
+}
+\cs_generate_variant:Nn \spath_gsplit_at_intersections:NN {cc}
+\cs_new_protected_nopar:Npn \__spath_split_component_at_self_intersections:n #1
+{
+ \group_begin:
+ \tl_set:Nn \l__spath_tmpe_tl {#1}
- \bool_until_do:nn {
- \tl_if_empty_p:N \l__spath_tmpa_tl
- }
- {
- \tl_set:Nx \l__spath_tmpc_tl {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_case:NnF \l__spath_tmpc_tl
- {
- \g__spath_lineto_tl
- {
- \tl_set_eq:NN \l__spath_tmpb_tl \g__spath_moveto_tl
- \tl_put_right:Nx \l__spath_tmpb_tl
- {
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
- }
- \tl_put_right:NV \l__spath_tmpb_tl \g__spath_lineto_tl
+ % Remember if the component is closed
+ \spath_finalaction:NV \l__spath_tmpa_tl \l__spath_tmpe_tl
- \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
- \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ \bool_set:Nn \l__spath_closed_bool
+ {
+ \tl_if_eq_p:NN \l__spath_tmpa_tl \c_spath_closepath_tl
+ }
- \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
- \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ % Copy the path
+ \tl_set:Nn \l__spath_tmpe_tl {#1}
- }
+ % Open the path
+ \spath_open:N \l__spath_tmpe_tl
+ % Ensure beziers don't self-intersect
+ \spath_split_curves:N \l__spath_tmpe_tl
- \g__spath_curvetoa_tl
- {
- \tl_set_eq:NN \l__spath_tmpb_tl \g__spath_moveto_tl
- \tl_put_right:Nx \l__spath_tmpb_tl
- {
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
- }
- \tl_put_right:NV \l__spath_tmpb_tl \g__spath_curvetoa_tl
+ % Make a copy for later
+ \tl_set_eq:NN \l__spath_tmpg_tl \l__spath_tmpe_tl
- \prg_replicate:nn {2} {
- \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_put_right:Nx \l__spath_tmpb_tl {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- }
+ % Clear some token lists and sequences
+ \tl_clear:N \l__spath_tmpd_tl
+ \seq_clear:N \l__spath_tmpb_seq
+ \int_zero:N \l__spath_tmpa_int
- \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
- \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ \pgfintersectionsortbyfirstpath
- \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
- \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ % Split the path into a sequence of segments
+ \spath_segments_to_seq:NV \l__spath_tmpa_seq \l__spath_tmpe_tl
+ \seq_map_indexed_inline:Nn \l__spath_tmpa_seq
+ {
+ \seq_map_indexed_inline:Nn \l__spath_tmpa_seq
+ {
+ % Don't intersect a segment with itself
+ \int_compare:nF
+ {
+ ##1 == ####1
}
-
- \g__spath_closepath_tl
{
- \tl_set_eq:NN \l__spath_tmpb_tl \g__spath_moveto_tl
- \tl_put_right:Nx \l__spath_tmpb_tl
+ \spath_intersect:nn {##2} {####2}
+
+ \int_compare:nT {\pgfintersectionsolutions > 0}
{
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
+ % Find the times of the intersections on each path
+ \int_step_inline:nnnn {1} {1} {\pgfintersectionsolutions}
+ {
+ \pgfintersectiongetsolutiontimes
+ {########1}{\l__spath_tmpb_tl}{\l__spath_tmpc_tl}
+
+ \bool_if:nT
+ {
+ !(
+ \fp_compare_p:n { \l__spath_tmpb_tl > .99 }
+ &&
+ \int_compare_p:n {##1 + 1 == ####1}
+ )
+ &&
+ !(
+ \fp_compare_p:n { \l__spath_tmpb_tl < .01 }
+ &&
+ \int_compare_p:n {##1 - 1 == ####1}
+ )
+ &&
+ !(
+ \l__spath_closed_bool
+ &&
+ \fp_compare_p:n { \l__spath_tmpb_tl < .01 }
+ &&
+ \int_compare_p:n {##1 == 1}
+ &&
+ \int_compare_p:n {\seq_count:N \l__spath_tmpa_seq == ####1}
+ )
+ &&
+ !(
+ \l__spath_closed_bool
+ &&
+ \fp_compare_p:n { \l__spath_tmpb_tl > .99 }
+ &&
+ \int_compare_p:n {####1 == 1}
+ &&
+ \int_compare_p:n {\seq_count:N \l__spath_tmpa_seq == ##1}
+ )
+ }
+ {
+ \tl_set:Nx \l__spath_tmpa_tl
+ {\fp_to_decimal:n {\l__spath_tmpb_tl + ##1 - 1}}
+ \seq_put_right:NV \l__spath_tmpb_seq \l__spath_tmpa_tl
+ }
+ }
}
- \tl_put_right:NV \l__spath_tmpb_tl \g__spath_lineto_tl
+ }
+ }
+ }
- \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
- \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ % Sort the sequence by reverse order along the path
+ \seq_sort:Nn \l__spath_tmpb_seq
+ {
+ \fp_compare:nNnTF { ##1 } < { ##2 }
+ { \sort_return_swapped: }
+ { \sort_return_same: }
+ }
- \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
- \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ \seq_get_left:NN \l__spath_tmpb_seq \l__spath_tmpa_tl
+ \fp_compare:nT
+ {
+ \l__spath_tmpa_tl > \seq_count:N \l__spath_tmpa_seq - .01
+ }
+ {
+ \bool_set_false:N \l__spath_closed_bool
+ }
+ \seq_get_right:NN \l__spath_tmpb_seq \l__spath_tmpa_tl
+ \fp_compare:nT
+ {
+ \l__spath_tmpa_tl < .01
+ }
+ {
+ \bool_set_false:N \l__spath_closed_bool
+ }
- }
+ % Restore the original copy of the path
+ \tl_set_eq:NN \l__spath_tmpe_tl \l__spath_tmpg_tl
+
+ % Clear the token lists
+ \tl_clear:N \l__spath_tmpf_tl
+ \tl_clear:N \l__spath_tmph_tl
+ \tl_clear:N \l__spath_tmpg_tl
+ \tl_set:Nn \l__spath_tmpi_tl {-1}
+
+ \seq_map_inline:Nn \l__spath_tmpb_seq
+ {
+ \tl_set:Nn \l__spath_tmpb_tl {##1}
+ \tl_set_eq:NN \l__spath_tmpa_tl \l__spath_tmpb_tl
+ \int_compare:nT
+ {
+ \fp_to_int:n {floor( \l__spath_tmpb_tl ) }
+ =
+ \fp_to_int:n {floor( \l__spath_tmpi_tl) }
}
{
+ \tl_set:Nx \l__spath_tmpb_tl
+ {
+ \fp_eval:n {
+ floor( \l__spath_tmpb_tl )
+ +
+ ( \l__spath_tmpb_tl - floor( \l__spath_tmpb_tl) )
+ /
+ ( \l__spath_tmpi_tl - floor( \l__spath_tmpi_tl) )
+ }
+ }
+ }
+ \tl_set_eq:NN \l__spath_tmpi_tl \l__spath_tmpa_tl
- \tl_set_eq:NN \l__spath_tmpb_tl \l__spath_tmpc_tl
- \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
- \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ \spath_split_at:NNVV
+ \l__spath_tmpf_tl
+ \l__spath_tmph_tl
+ \l__spath_tmpe_tl
+ \l__spath_tmpb_tl
- \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
- \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ \tl_put_left:NV \l__spath_tmpg_tl \l__spath_tmph_tl
+ \tl_set_eq:NN \l__spath_tmpe_tl \l__spath_tmpf_tl
- }
+ }
- #2 \l__spath_tmpc_tl \l__spath_tmpb_tl
- \tl_clear:N \l__spath_tmpb_tl
+ \tl_put_left:NV \l__spath_tmpg_tl \l__spath_tmpe_tl
+ \tl_if_empty:NT \l__spath_tmpg_tl
+ {
+ \tl_set_eq:NN \l__spath_tmpg_tl \l__spath_tmpe_tl
}
+
+ \spath_remove_empty_components:N \l__spath_tmpg_tl
+
+ % Do something with closed
+ \bool_if:NT \l__spath_closed_bool
+ {
+ \spath_join_component:Nn \l__spath_tmpg_tl {1}
+ }
+
+ \tl_gclear:N \g__spath_output_tl
+ \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpg_tl
+ \group_end:
}
-\cs_generate_variant:Nn \spath_map_segment_function:NN {Nc}
-\NewDocumentCommand \MakeSPath { m m }
-{
- \spath_clear_new:n {#1}
- \spath_put:nno {#1} {path} {#2}
-}
-\NewDocumentCommand \MakeSPathList { m m }
+\cs_new_protected_nopar:Npn \spath_split_component_at_self_intersections:Nn #1#2
{
- \tl_gclear_new:c {l__spath_list_#1}
- \int_zero:N \l__spath_tmpa_int
- \spath_map_component:Nn #2 {
- \spath_clear_new:n {#1 _ \int_use:N \l__spath_tmpa_int}
- \spath_put:nnn {#1 _ \int_use:N \l__spath_tmpa_int} {path} {##1}
- \tl_gput_right:cx {l__spath_list_#1} {{#1 _ \int_use:N \l__spath_tmpa_int}}
- \int_incr:N \l__spath_tmpa_int
- }
+ \__spath_split_component_at_self_intersections:n {#2}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
}
-\NewDocumentCommand \CloneSPath { m m }
+\cs_generate_variant:Nn \spath_split_component_at_self_intersections:Nn {NV}
+\cs_new_protected_nopar:Npn \spath_split_component_at_self_intersections:N #1
{
- \spath_clone:nn {#1} {#2}
+ \spath_split_component_at_self_intersections:NV #1#1
}
-\NewDocumentCommand \SPathInfo { m m }
+\cs_generate_variant:Nn \spath_split_component_at_self_intersections:N {c}
+\cs_new_protected_nopar:Npn \spath_gsplit_component_at_self_intersections:Nn #1#2
{
- \spath_get:nn {#1} {#2}
+ \__spath_split_component_at_self_intersections:n {#2}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
}
-\NewDocumentCommand \SPathPrepare { m }
+\cs_generate_variant:Nn \spath_gsplit_component_at_self_intersections:Nn {NV}
+\cs_new_protected_nopar:Npn \spath_gsplit_component_at_self_intersections:N #1
{
- \spath_generate_all:n {#1}
+ \spath_gsplit_component_at_self_intersections:NV #1#1
}
-\NewDocumentCommand \SPathListPrepare { m }
+\cs_generate_variant:Nn \spath_gsplit_component_at_self_intersections:N {c}
+\cs_new_protected_nopar:Npn \__spath_split_at_self_intersections:n #1
{
- \tl_map_inline:cn {l__spath_list_#1}
+ \group_begin:
+ \spath_components_to_seq:Nn \l__spath_tmpa_seq {#1}
+ \seq_clear:N \l__spath_tmpb_seq
+ \seq_clear:N \l__spath_tmpc_seq
+
+ % Iterate over the components of the original path.
+ \bool_do_until:nn
{
- \spath_generate_all:n {##1}
+ \seq_if_empty_p:N \l__spath_tmpa_seq
}
+ {
+ % Get the next component
+ \seq_pop_left:NN \l__spath_tmpa_seq \l__spath_tmpa_tl
+ % Copy for later
+ \tl_set_eq:NN \l__spath_tmpc_tl \l__spath_tmpa_tl
+ \int_compare:nT
+ {
+ \tl_count:N \l__spath_tmpa_tl > 3
+ }
+ {
+
+ % Split against itself
+ \spath_split_component_at_self_intersections:N \l__spath_tmpa_tl
+ % Grab the rest of the path
+ \tl_set:Nx \l__spath_tmpb_tl
+ {
+ \seq_use:Nn \l__spath_tmpb_seq {}
+ \seq_use:Nn \l__spath_tmpa_seq {}
+ }
+ % Split against the rest of the path
+ \spath_split_path_at_intersections:NV \l__spath_tmpa_tl \l__spath_tmpb_tl
+ }
+ % Save the split path
+ \seq_put_right:NV \l__spath_tmpc_seq \l__spath_tmpa_tl
+ % Add the original copy to the sequence of processed components
+ \seq_put_right:NV \l__spath_tmpb_seq \l__spath_tmpc_tl
+ }
+
+ \tl_gclear:N \g__spath_output_tl
+ \tl_gset:Nx \g__spath_output_tl {\seq_use:Nn \l__spath_tmpc_seq {} }
+ \group_end:
}
-\NewDocumentCommand \SPathInfoInto { m m m }
+\cs_generate_variant:Nn \__spath_split_at_self_intersections:n {V, v}
+\cs_new_protected_nopar:Npn \spath_split_at_self_intersections:Nn #1#2
{
- \tl_clear_new:N #3
- \spath_get:nnN {#1} {#2} #3
+ \__spath_split_at_self_intersections:n {#2}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
}
-\NewDocumentCommand \SPathShow { m }
+\cs_generate_variant:Nn \spath_split_at_self_intersections:Nn {NV, cn, cV, cv}
+\cs_new_protected_nopar:Npn \spath_split_at_self_intersections:N #1
{
- \spath_show:n {#1}
+ \spath_split_at_self_intersections:NV #1#1
}
-\NewDocumentCommand \SPathTranslate { m m m }
+\cs_generate_variant:Nn \spath_split_at_self_intersections:N {c}
+\cs_new_protected_nopar:Npn \spath_gsplit_at_self_intersections:Nn #1#2
{
- \spath_translate:nnn {#1} {#2} {#3}
+ \__spath_split_at_self_intersections:n {#2}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
}
-\NewDocumentCommand \SPathTranslateInto { m m m m }
+\cs_generate_variant:Nn \spath_gsplit_at_self_intersections:Nn {NV, cn, cV, cv}
+\cs_new_protected_nopar:Npn \spath_gsplit_at_self_intersections:N #1
{
- \spath_clone:nn {#1} {#2}
- \spath_translate:nnn {#2} {#3} {#4}
+ \spath_gsplit_at_self_intersections:NV #1#1
}
-\NewDocumentCommand \SPathScale { m m m }
+\cs_generate_variant:Nn \spath_gsplit_at_self_intersections:N {c}
+\cs_new_protected_nopar:Npn \__spath_join_component:nn #1#2
{
- \spath_scale:nnn {#1} {#2} {#3}
+ \group_begin:
+ \spath_numberofcomponents:Nn \l__spath_tmpa_int {#1}
+
+ \bool_if:nTF
+ {
+ \int_compare_p:n { #2 >= 1 }
+ &&
+ \int_compare_p:n { #2 <= \l__spath_tmpa_int }
+ }
+ {
+ \int_compare:nTF
+ {
+ #2 == 1
+ }
+ {
+ \int_compare:nTF
+ {
+ \l__spath_tmpa_int == 1
+ }
+ {
+ \tl_set:Nn \l__spath_tmpa_tl {#1}
+ \spath_initialpoint:Nn \l__spath_tmpb_tl {#1}
+ \tl_put_right:NV \l__spath_tmpa_tl \c_spath_closepath_tl
+ \tl_put_right:NV \l__spath_tmpa_tl \l__spath_tmpb_tl
+ \tl_gclear:N \g__spath_output_tl
+ \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpa_tl
+ }
+ {
+ \spath_components_to_seq:Nn \l__spath_tmpa_seq {#1}
+ \seq_pop_left:NN \l__spath_tmpa_seq \l__spath_tmpa_tl
+
+ \prg_replicate:nn {3}
+ {
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ }
+
+ \seq_put_right:NV \l__spath_tmpa_seq \l__spath_tmpa_tl
+
+ \tl_gclear:N \g__spath_output_tl
+ \tl_gset:Nx \g__spath_output_tl {\seq_use:Nn \l__spath_tmpa_seq {}}
+ }
+ }
+ {
+ \spath_components_to_seq:Nn \l__spath_tmpa_seq {#1}
+
+ \seq_clear:N \l__spath_tmpb_seq
+ \seq_map_indexed_inline:Nn \l__spath_tmpa_seq
+ {
+ \tl_set:Nn \l__spath_tmpa_tl {##2}
+ \int_compare:nT {##1 = #2}
+ {
+ \prg_replicate:nn {3}
+ {
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ }
+ }
+ \seq_put_right:NV \l__spath_tmpb_seq \l__spath_tmpa_tl
+ }
+
+ \tl_gclear:N \g__spath_output_tl
+ \tl_gset:Nx \g__spath_output_tl {\seq_use:Nn \l__spath_tmpb_seq {}}
+ }
+ }
+ {
+ \tl_gclear:N \g__spath_output_tl
+ \tl_gset:Nn \g__spath_output_tl {#1}
+ }
+
+ \group_end:
}
-\NewDocumentCommand \SPathScaleInto { m m m m }
+\cs_new_protected_nopar:Npn \spath_join_component:Nnn #1#2#3
{
- \spath_clone:nn {#1} {#2}
- \spath_scale:nnn {#2} {#3} {#4}
+ \__spath_join_component:nn {#2}{#3}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
}
-\NewDocumentCommand \SPathWeld { m m }
+\cs_generate_variant:Nn \spath_join_component:Nnn {NVn, NVV}
+\cs_new_protected_nopar:Npn \spath_join_component:Nn #1#2
{
- \spath_weld:nn {#1} {#2}
+ \spath_join_component:NVn #1#1{#2}
}
-\NewDocumentCommand \SPathWeldInto { m m m }
+\cs_generate_variant:Nn \spath_join_component:Nn {cn, NV, cV}
+\cs_new_protected_nopar:Npn \spath_gjoin_component:Nnn #1#2#3
{
- \spath_clone:nn {#1} {#2}
- \spath_weld:nn {#2} {#3}
+ \__spath_join_component:nn {#2}{#3}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
}
-\tikzset{
- save~spath/.code={
- \tikz@addmode{
- \spath_get_current_path:n {#1}
- }
- },
- restore~spath/.code={
- \spath_set_current_path:n {#1}
- }
+\cs_generate_variant:Nn \spath_gjoin_component:Nnn {NVn, NVV}
+\cs_new_protected_nopar:Npn \spath_gjoin_component:Nn #1#2
+{
+ \spath_gjoin_component:NVn #1#1{#2}
}
-\cs_new_nopar:Npn \spath_split_curve:nnNN #1#2#3#4
+\cs_generate_variant:Nn \spath_gjoin_component:Nn {cn, NV, cV}
+\cs_new_protected_nopar:Npn \__spath_spot_weld_components:n #1
{
\group_begin:
- \tl_gclear:N \l__spath_smuggle_tl
- \tl_set_eq:NN \l__spath_tmpa_tl \g__spath_moveto_tl
- \tl_put_right:Nx \l__spath_tmpa_tl {
- {\tl_item:nn {#2} {2}}
- {\tl_item:nn {#2} {3}}
- }
- \tl_put_right:NV \l__spath_tmpa_tl \g__spath_curvetoa_tl
- \tl_put_right:Nx \l__spath_tmpa_tl
+ \dim_zero:N \l__spath_move_x_dim
+ \dim_zero:N \l__spath_move_y_dim
+
+ \spath_components_to_seq:Nn \l__spath_tmpa_seq {#1}
+ \seq_clear:N \l__spath_tmpb_seq
+ \dim_set:Nn \l__spath_move_x_dim {\tl_item:nn {#1} {2} + 10 pt}
+ \dim_set:Nn \l__spath_move_y_dim {\tl_item:nn {#1} {3} + 10 pt}
+
+ \int_set:Nn \l__spath_tmpa_int {\seq_count:N \l__spath_tmpa_seq}
+
+ \seq_map_inline:Nn \l__spath_tmpa_seq
{
- {\fp_to_dim:n
+ \tl_set:Nn \l__spath_tmpa_tl {##1}
+ \bool_if:nT
{
- (1 - #1) * \tl_item:nn {#2} {2} + (#1) * \tl_item:nn {#2} {5}
- }}
- {\fp_to_dim:n
+ \dim_compare_p:n
+ {
+ \dim_abs:n
+ {\l__spath_move_x_dim - \tl_item:Nn \l__spath_tmpa_tl {2} }
+ < 0.01pt
+ }
+ &&
+ \dim_compare_p:n
+ {
+ \dim_abs:n
+ {\l__spath_move_y_dim - \tl_item:Nn \l__spath_tmpa_tl {3} }
+ < 0.01pt
+ }
+ }
{
- (1 - #1) * \tl_item:nn {#2} {3} + (#1) * \tl_item:nn {#2} {6}
- }}
+ \prg_replicate:nn {3}
+ {
+ \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
+ }
+ \int_decr:N \l__spath_tmpa_int
+ }
+ \tl_reverse:N \l__spath_tmpa_tl
+ \dim_set:Nn \l__spath_move_x_dim {\tl_item:Nn \l__spath_tmpa_tl {2}}
+ \dim_set:Nn \l__spath_move_y_dim {\tl_item:Nn \l__spath_tmpa_tl {1}}
+ \tl_reverse:N \l__spath_tmpa_tl
+ \seq_put_right:NV \l__spath_tmpb_seq \l__spath_tmpa_tl
}
- \tl_put_right:NV \l__spath_tmpa_tl \g__spath_curvetob_tl
- \tl_put_right:Nx \l__spath_tmpa_tl
+
+ \tl_set:Nx \l__spath_tmpa_tl {\seq_use:Nn \l__spath_tmpb_seq {} }
+ \spath_components_to_seq:NV \l__spath_tmpb_seq \l__spath_tmpa_tl
+
+ \spath_initialpoint:Nn \l__spath_tmpa_tl {#1}
+ \spath_finalpoint:Nn \l__spath_tmpb_tl {#1}
+
+ \bool_if:nT
{
- {\fp_to_dim:n
+ \dim_compare_p:n
{
- (1 - #1)^2 * \tl_item:nn {#2} {2} + 2 * (1 - #1) * (#1) * \tl_item:nn {#2} {5} + (#1)^2 * \tl_item:nn {#2} {8}
- }}
- {\fp_to_dim:n
+ \dim_abs:n
+ {
+ \tl_item:Nn \l__spath_tmpa_tl {1} - \tl_item:Nn \l__spath_tmpb_tl {1}
+ }
+ <
+ 0.01pt
+ }
+ &&
+ \dim_compare_p:n
{
- (1 - #1)^2 * \tl_item:nn {#2} {3} + 2 * (1 - #1) * (#1) * \tl_item:nn {#2} {6} + (#1)^2 * \tl_item:nn {#2} {9}
- }}
+ \dim_abs:n
+ {
+ \tl_item:Nn \l__spath_tmpa_tl {2} - \tl_item:Nn \l__spath_tmpb_tl {2}
+ }
+ <
+ 0.01pt
+ }
}
- \tl_put_right:NV \l__spath_tmpa_tl \g__spath_curveto_tl
- \tl_put_right:Nx \l__spath_tmpa_tl
{
- {\fp_to_dim:n
+ \int_compare:nTF
+ {
+ \seq_count:N \l__spath_tmpb_seq > 1
+ }
+ {
+ \seq_pop_left:NN \l__spath_tmpb_seq \l__spath_tmpb_tl
+
+ \prg_replicate:nn {3}
{
- (1 - #1)^3 * \tl_item:nn {#2} {2} + 3 * (1 - #1)^2 * (#1) * \tl_item:nn {#2} {5} + 3 * (1 - #1) * (#1)^2 * \tl_item:nn {#2} {8} + (#1)^3 * \tl_item:nn {#2} {11}
- }}
- {\fp_to_dim:n
+ \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
+ }
+ \seq_put_right:NV \l__spath_tmpb_seq \l__spath_tmpb_tl
+ }
{
- (1 - #1)^3 * \tl_item:nn {#2} {3} + 3 * (1 - #1)^2 * (#1) * \tl_item:nn {#2} {6} + 3 * (1 - #1) * (#1)^2 * \tl_item:nn {#2} {9} + (#1)^3 * \tl_item:nn {#2} {12}
- }}
+ \tl_set:NV \l__spath_tmpb_tl \c_spath_closepath_tl
+ \tl_put_right:Nx \l__spath_tmpb_tl
+ {
+ { \tl_item:Nn \l__spath_tmpa_tl {1} }
+ { \tl_item:Nn \l__spath_tmpa_tl {2} }
+ }
+ \seq_put_right:NV \l__spath_tmpb_seq \l__spath_tmpb_tl
+ }
}
- \tl_gset_eq:NN \l__spath_smuggle_tl \l__spath_tmpa_tl
+
+ \tl_gset:Nx \g__spath_output_tl {\seq_use:Nn \l__spath_tmpb_seq {}}
\group_end:
- \tl_set_eq:NN #3 \l__spath_smuggle_tl
+}
+\cs_new_protected_nopar:Npn \spath_spot_weld_components:Nn #1#2
+{
+ \__spath_spot_weld_components:n {#2}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_spot_weld_components:Nn {NV, cV, cn}
+\cs_new_protected_nopar:Npn \spath_spot_weld_components:N #1
+{
+ \spath_spot_weld_components:NV #1#1
+}
+\cs_generate_variant:Nn \spath_spot_weld_components:N {c}
+\cs_new_protected_nopar:Npn \spath_spot_gweld_components:Nn #1#2
+{
+ \__spath_spot_weld_components:n {#2}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_generate_variant:Nn \spath_spot_gweld_components:Nn {NV, cV, cn}
+\cs_new_protected_nopar:Npn \spath_spot_gweld_components:N #1
+{
+ \spath_spot_gweld_components:NV #1#1
+}
+\cs_generate_variant:Nn \spath_spot_gweld_components:N {c}
+\cs_new_protected_nopar:Npn \__spath_convert_to_svg:n #1
+{
\group_begin:
- \tl_set_eq:NN \l__spath_tmpa_tl \g__spath_moveto_tl
- \tl_put_right:Nx \l__spath_tmpa_tl
+ \tl_clear:N \l__spath_tmpa_tl
+ \tl_put_right:Nn \l__spath_tmpa_tl
{
- {\fp_to_dim:n
- {
- (1 - #1)^3 * \tl_item:nn {#2} {2} + 3 * (1 - #1)^2 * (#1) * \tl_item:nn {#2} {5} + 3 * (1 - #1) * (#1)^2 * \tl_item:nn {#2} {8} + (#1)^3 * \tl_item:nn {#2} {11}
- }}
- {\fp_to_dim:n
- {
- (1 - #1)^3 * \tl_item:nn {#2} {3} + 3 * (1 - #1)^2 * (#1) * \tl_item:nn {#2} {6} + 3 * (1 - #1) * (#1)^2 * \tl_item:nn {#2} {9} + (#1)^3 * \tl_item:nn {#2} {12}
- }}
+ <?xml~ version="1.0"~ standalone="no"?>
+ \iow_newline:
+ <!DOCTYPE~ svg~ PUBLIC~ "-//W3C//DTD SVG 1.1//EN"~
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+ \iow_newline:
+ <svg~ xmlns="http://www.w3.org/2000/svg"~ version="1.1"~viewBox="
}
- \tl_put_right:NV \l__spath_tmpa_tl \g__spath_curvetoa_tl
+
+ \spath_minbb:Nn \l__spath_tmpb_tl {#1}
+ \spath_maxbb:Nn \l__spath_tmpc_tl {#1}
\tl_put_right:Nx \l__spath_tmpa_tl
{
- {\fp_to_dim:n
+ \dim_to_decimal:n
{
- (1 - #1)^2 * \tl_item:nn {#2} {5} + 2 * (1 - #1) * (#1) * \tl_item:nn {#2} {8} + (#1)^2 * \tl_item:nn {#2} {11}
- }}
- {\fp_to_dim:n
+ \tl_item:Nn \l__spath_tmpb_tl {1} - 10pt
+ }
+ \exp_not:n {~}
+ \dim_to_decimal:n
{
- (1 - #1)^2 * \tl_item:nn {#2} {6} + 2 * (1 - #1) * (#1) * \tl_item:nn {#2} {9} + (#1)^2 * \tl_item:nn {#2} {12}
- }}
+ \tl_item:Nn \l__spath_tmpb_tl {2} - 10pt
+ }
+ \exp_not:n {~}
+ \dim_to_decimal:n
+ {
+ \tl_item:Nn \l__spath_tmpc_tl {1}
+ -
+ \tl_item:Nn \l__spath_tmpb_tl {1}
+ + 20pt
+ }
+ \exp_not:n {~}
+ \dim_to_decimal:n
+ {
+ \tl_item:Nn \l__spath_tmpc_tl {2}
+ -
+ \tl_item:Nn \l__spath_tmpb_tl {2}
+ + 20pt
+ }
}
- \tl_put_right:NV \l__spath_tmpa_tl \g__spath_curvetob_tl
- \tl_put_right:Nx \l__spath_tmpa_tl
+
+ \tl_put_right:Nn \l__spath_tmpa_tl
{
- {\fp_to_dim:n
+ ">
+ \iow_newline:
+ <path~ d="
+ }
+ \tl_set:Nn \l__spath_tmpc_tl {use:n}
+ \tl_map_inline:nn {#1}
+ {
+ \tl_set:Nn \l__spath_tmpb_tl {##1}
+ \tl_case:NnF \l__spath_tmpb_tl
{
- (1 - #1) * \tl_item:nn {#2} {8} + (#1) * \tl_item:nn {#2} {11}
- }}
- {\fp_to_dim:n
+ \c_spath_moveto_tl
+ {
+ \tl_put_right:Nn \l__spath_tmpa_tl {M~}
+ \tl_set:Nn \l__spath_tmpc_tl {use:n}
+ }
+ \c_spath_lineto_tl
+ {
+ \tl_put_right:Nn \l__spath_tmpa_tl {L~}
+ \tl_set:Nn \l__spath_tmpc_tl {use:n}
+ }
+ \c_spath_closepath_tl
+ {
+ \tl_put_right:Nn \l__spath_tmpa_tl {Z~}
+ \tl_set:Nn \l__spath_tmpc_tl {use_none:n}
+ }
+ \c_spath_curvetoa_tl
+ {
+ \tl_put_right:Nn \l__spath_tmpa_tl {C~}
+ \tl_set:Nn \l__spath_tmpc_tl {use:n}
+ }
+ \c_spath_curvetob_tl {
+ \tl_set:Nn \l__spath_tmpc_tl {use:n}
+ }
+ \c_spath_curveto_tl {
+ \tl_set:Nn \l__spath_tmpc_tl {use:n}
+ }
+ }
{
- (1 - #1) * \tl_item:nn {#2} {9} + (#1) * \tl_item:nn {#2} {12}
- }}
+ \tl_put_right:Nx
+ \l__spath_tmpa_tl
+ {\use:c { \l__spath_tmpc_tl } {\dim_to_decimal:n {##1}} ~}
+ }
}
- \tl_put_right:NV \l__spath_tmpa_tl \g__spath_curveto_tl
- \tl_put_right:Nx \l__spath_tmpa_tl {
- {\tl_item:nn {#2} {11}}
- {\tl_item:nn {#2} {12}}
+ \tl_put_right:Nn \l__spath_tmpa_tl
+ {
+ "~ fill="none"~ stroke="black"~ />
+ \iow_newline:
+ </svg>
+ \iow_newline:
}
- \tl_gset_eq:NN \l__spath_smuggle_tl \l__spath_tmpa_tl
+ \tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpa_tl
\group_end:
- \tl_set_eq:NN #4 \l__spath_smuggle_tl
}
+\cs_new_protected_nopar:Npn \spath_convert_to_svg:Nn #1#2
+{
+ \__spath_convert_to_svg:n {#2}
+ \tl_set_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\cs_new_protected_nopar:Npn \spath_gconvert_to_svg:Nn #1#2
+{
+ \__spath_convert_to_svg:n {#2}
+ \tl_gset_eq:NN #1 \g__spath_output_tl
+ \tl_gclear:N \g__spath_output_tl
+}
+\iow_new:N \g__spath_stream
+\cs_new_protected_nopar:Npn \spath_export_to_svg:nn #1#2
+{
+ \group_begin:
+ \spath_convert_to_svg:Nn \l__spath_tmpa_tl {#2}
+ \iow_open:Nn \g__spath_stream {#1 .svg}
+ \iow_now:Nx \g__spath_stream
+ {
+ \tl_use:N \l__spath_tmpa_tl
+ }
+ \iow_close:N \g__spath_stream
+ \group_end:
+}
+\cs_generate_variant:Nn \spath_export_to_svg:nn {nv, nV}
+\cs_new_protected_nopar:Npn \spath_show:n #1
+{
+ \int_step_inline:nnnn {1} {3} {\tl_count:n {#1}}
+ {
+ \iow_term:x {
+ \tl_item:nn {#1} {##1}
+ {\tl_item:nn {#1} {##1+1}}
+ {\tl_item:nn {#1} {##1+2}}
+ }
+ }
+}
+\cs_generate_variant:Nn \spath_show:n {V, v}
+
+\cs_new_protected_nopar:Npn \spath_get_current_path:N #1
+{
+ \pgfsyssoftpath@getcurrentpath #1
+}
+\cs_new_protected_nopar:Npn \spath_gget_current_path:N #1
+{
+ \pgfsyssoftpath@getcurrentpath #1
+ \tl_gset_eq:NN #1 #1
+}
+\cs_new_protected_nopar:Npn \spath_protocol_path:n #1
+{
+ \spath_minbb:Nn \l__spath_tmpa_tl {#1}
+ \exp_last_unbraced:NV \pgf@protocolsizes\l__spath_tmpa_tl
+
+ \spath_maxbb:Nn \l__spath_tmpa_tl {#1}
+ \exp_last_unbraced:NV \pgf@protocolsizes\l__spath_tmpa_tl
+}
+\cs_generate_variant:Nn \spath_protocol_path:n {V}
+\cs_new_protected_nopar:Npn \spath_set_current_path:n #1
+{
+ \spath_protocol_path:n {#1}
+ \tl_set:Nn \l__spath_tmpa_tl {#1}
+ \pgfsyssoftpath@setcurrentpath\l__spath_tmpa_tl
+}
+\cs_new_protected_nopar:Npn \spath_set_current_path:N #1
+{
+ \spath_protocol_path:V #1
+ \pgfsyssoftpath@setcurrentpath #1
+}
+\cs_generate_variant:Nn \spath_set_current_path:N {c}
+\cs_new_protected_nopar:Npn \spath_use_path:nn #1#2
+{
+ \spath_set_current_path:n {#1}
+ \pgfusepath{#2}
+}
+\cs_new_protected_nopar:Npn \spath_tikz_path:nn #1#2
+{
+ \path[#1] \pgfextra{
+ \spath_set_current_path:n {#2}
+ \tl_put_right:Nn \tikz@preactions {\def\tikz@actions@path{#2}}
+ };
+}
+\cs_generate_variant:Nn \spath_tikz_path:nn {Vn, VV, nv, Vv, nV}
+\cs_new_protected_nopar:Npn \spath_set_tikz_data:n #1
+{
+ \spath_finalpoint:Nn \l__spath_tmpa_tl {#1}
+ \tl_set:Nx \l__spath_tmpa_tl
+ {
+ \exp_not:c {pgf@x}=\tl_item:Nn \l__spath_tmpa_tl {1}
+ \exp_not:c {pgf@y}=\tl_item:Nn \l__spath_tmpa_tl {2}
+ }
+ \use:c {pgf@process}{%
+ \tl_use:N \l__spath_tmpa_tl
+ \pgftransforminvert
+ \use:c {pgf@pos@transform@glob}
+ }
+ \tl_set:Nx \l__spath_tmpa_tl
+ {
+ \exp_not:c {tikz@lastx}=\exp_not:c {pgf@x}
+ \exp_not:c {tikz@lasty}=\exp_not:c {pgf@y}
+ \exp_not:c {tikz@lastxsaved}=\exp_not:c {pgf@x}
+ \exp_not:c {tikz@lastysaved}=\exp_not:c {pgf@y}
+ }
+ \tl_use:N \l__spath_tmpa_tl
+ \spath_finalmovepoint:Nn \l__spath_tmpa_tl {#1}
+ \ifpgfsyssoftpathmovetorelevant%
+ \tl_gset_eq:cN {pgfsyssoftpath@lastmoveto} \l__spath_tmpa_tl
+ \fi
+ \tl_set:Nx \l__spath_tmpa_tl
+ {
+ \exp_not:c {pgf@x}=\tl_item:Nn \l__spath_tmpa_tl {1}
+ \exp_not:c {pgf@y}=\tl_item:Nn \l__spath_tmpa_tl {2}
+ }
+ \use:c {pgf@process}{%
+ \tl_use:N \l__spath_tmpa_tl
+ \pgftransforminvert
+ \use:c {pgf@pos@transform@glob}
+ }
+ \tl_set:Nx \l__spath_tmpa_tl
+ {
+ \exp_not:c {tikz@lastmovetox}=\exp_not:c {pgf@x}
+ \exp_not:c {tikz@lastmovetoy}=\exp_not:c {pgf@y}
+ }
+ \tl_use:N \l__spath_tmpa_tl
+ \tl_clear_new:c {tikz@timer}
+ \tl_set:cn {tikz@timer}
+ {
+ \spath_reallength:Nn \l__spath_tmpa_int {#1}
+ \tl_set_eq:Nc \l__spath_tmpb_tl {tikz@time}
+ \tl_set:Nx \l__spath_tmpb_tl
+ {\fp_to_decimal:n {(\l__spath_tmpb_tl) * (\l__spath_tmpa_int)}}
+ \spath_transformation_at:NnV \l__spath_tmpc_tl {#1} \l__spath_tmpb_tl
-\cs_generate_variant:Nn \spath_split_curve:nnNN {nVNN, VVNN}
+ \tl_set:Nx \l__spath_tmpa_tl
+ {
+ \exp_not:N \pgfpoint
+ { \tl_item:Nn \l__spath_tmpc_tl {5} }
+ { \tl_item:Nn \l__spath_tmpc_tl {6} }
+ }
+ \exp_args:NV \pgftransformshift \l__spath_tmpa_tl
+
+ \ifpgfresetnontranslationattime
+ \pgftransformresetnontranslations
+ \fi
+
+ \ifpgfslopedattime
+
+ \tl_set:Nx \l__spath_tmpa_tl
+ {
+ { \tl_item:Nn \l__spath_tmpc_tl {1} }
+ { \tl_item:Nn \l__spath_tmpc_tl {2} }
+ { \tl_item:Nn \l__spath_tmpc_tl {3} }
+ { \tl_item:Nn \l__spath_tmpc_tl {4} }
+ }
+ \ifpgfallowupsidedownattime
+ \else
+ \fp_compare:nT { \tl_item:Nn \l__spath_tmpc_tl {4} < 0}
+ {
+ \tl_set:Nx \l__spath_tmpa_tl
+ {
+ { \fp_eval:n { - (\tl_item:Nn \l__spath_tmpc_tl {1})} }
+ { \fp_eval:n { - (\tl_item:Nn \l__spath_tmpc_tl {2})} }
+ { \fp_eval:n { - (\tl_item:Nn \l__spath_tmpc_tl {3})} }
+ { \fp_eval:n { - (\tl_item:Nn \l__spath_tmpc_tl {4})} }
+ }
+ }
+ \fi
+ \tl_put_right:Nn \l__spath_tmpa_tl {{\pgfpointorigin}}
+ \exp_last_unbraced:NV \pgftransformcm \l__spath_tmpa_tl
+ \fi
+ }
+}
+\cs_generate_variant:Nn \spath_set_tikz_data:n {V, v}
%%
-%% Copyright (C) 2011-2019 by Andrew Stacey <stacey@math.ntnu.no>
+%% Copyright (C) 2011-2021 by Andrew Stacey <loopspace@mathforge.org>
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License (LPPL), either
@@ -1497,16 +3957,19 @@ manipulating PGF soft paths}
%% This work is "maintained" (as per LPPL maintenance status) by
%% Andrew Stacey.
%%
-%% This work consists of the files spath3.dtx
+%% This work consists of the files spath3_code.dtx
%% calligraphy_doc.tex
%% knots_doc.tex
+%% spath3.tex
%% and the derived files spath3.ins,
%% spath3_code.pdf,
%% spath3.sty,
%% tikzlibrarycalligraphy.code.tex
%% tikzlibraryknots.code.tex
+%% tikzlibraryspath3.code.tex
%% calligraphy.pdf
%% knots.pdf
+%% spath3.pdf
%% README
%%
%%