%%
%% This is file `spath3.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% spath3_code.dtx (with options: `spath3')
%% ----------------------------------------------------------------
%% spath3 --- Functions for manipulating PGF soft paths
%% E-mail: loopspace@mathforge.org
%% Released under the LaTeX Project Public License v1.3c or later
%% See http://www.latex-project.org/lppl.txt
%% ----------------------------------------------------------------
%%
\NeedsTeXFormat{LaTeX2e}
\RequirePackage{expl3}
\RequirePackage{pgf}
\ProvidesExplPackage {spath3} {2021/02/21} {2.4} {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_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 \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
{
\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_protected_nopar:Npn \spath_segments_to_seq:Nn #1#2
{
\__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_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
{
\__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_generate_variant:Nn \spath_segments_gto_seq:Nn {NV, cn, cV, Nv, cv}
\cs_new_protected_nopar:Npn \__spath_components_to_seq:n #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_protected_nopar:Npn \spath_components_to_seq:Nn #1#2
{
\__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_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
{
\__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_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
{
\__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_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
{
\__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
}
\cs_generate_variant:Nn \spath_components_gto_clist:Nn {NV, cn, cV, cv, Nv}
\cs_new_protected_nopar:Npn \spath_length:n #1
{
\int_eval:n {\tl_count:n {#1} / 3}
}
\cs_generate_variant:Nn \spath_length:n {V}
\cs_new_protected_nopar:Npn \__spath_reallength: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:NnT \l__spath_tmpa_tl
{
\c_spath_lineto_tl {}
\c_spath_curveto_tl {}
\c_spath_closepath_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_reallength:Nn #1#2
{
\__spath_reallength:n {#2}
\int_set_eq:NN #1 \g__spath_output_int
\int_gzero:N \g__spath_output_int
}
\cs_generate_variant:Nn \spath_reallength:Nn {NV, cn, cV, Nv, cv}
\cs_new_protected_nopar:Npn \spath_greallength:Nn #1#2
{
\__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
{
\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_numberofcomponents:Nn #1#2
{
\__spath_numberofcomponents:n {#2}
\int_set_eq:NN #1 \g__spath_output_int
\int_gzero:N \g__spath_output_int
}
\cs_generate_variant:Nn \spath_numberofcomponents:Nn {NV, cn, cV, Nv}
\cs_new_protected_nopar:Npn \spath_gnumberofcomponents:Nn #1#2
{
\__spath_numberofcomponents:n {#2}
\int_gset_eq:NN #1 \g__spath_output_int
\int_gzero:N \g__spath_output_int
}
\cs_generate_variant:Nn \spath_gnumberofcomponents:Nn {NV, cn, cV, Nv}
\cs_new_protected_nopar:Npn \__spath_initialpoint:n #1
{
\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_initialpoint:Nn #1#2
{
\__spath_initialpoint:n {#2}
\tl_set_eq:NN #1 \g__spath_output_tl
\tl_gclear:N \g__spath_output_tl
}
\cs_generate_variant:Nn \spath_initialpoint:Nn {NV, cn, cV, Nv}
\cs_new_protected_nopar:Npn \spath_ginitialpoint:Nn #1#2
{
\__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_ginitialpoint:Nn {NV, cn, cV, Nv}
\cs_new_protected_nopar:Npn \__spath_finalpoint:n #1
{
\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
{
{ \tl_item:Nn \l__spath_tmpa_tl {2} }
{ \tl_item:Nn \l__spath_tmpa_tl {1} }
}
\tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpb_tl
\group_end:
}
\cs_new_protected_nopar:Npn \spath_finalpoint:Nn #1#2
{
\__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_finalpoint:Nn {NV, cn, cV, Nv}
\cs_new_protected_nopar:Npn \spath_gfinalpoint:Nn #1#2
{
\__spath_finalpoint:n {#2}
\tl_gset_eq:NN #1 \g__spath_output_tl
\tl_gclear:N \g__spath_output_tl
}
\cs_generate_variant:Nn \spath_gfinalpoint:Nn {NV, cn, cV, Nv}
\cs_new_protected_nopar:Npn \__spath_finalmovepoint:n #1
{
\group_begin:
\tl_set:Nn \l__spath_tmpc_tl { {0pt} {0pt} }
\tl_set:Nn \l__spath_tmpa_tl {#1}
\bool_do_until:nn
{
\tl_if_empty_p:N \l__spath_tmpa_tl
}
{
\tl_set:Nx \l__spath_tmpb_tl {\tl_head:N \l__spath_tmpa_tl}
\tl_case:Nn \l__spath_tmpb_tl
{
\c_spath_moveto_tl
{
\tl_set:Nx \l__spath_tmpc_tl
{
{ \tl_item:Nn \l__spath_tmpa_tl {2} }
{ \tl_item:Nn \l__spath_tmpa_tl {3} }
}
}
}
\prg_replicate:nn {3}
{
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
}
}
\tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpc_tl
\group_end:
}
\cs_new_protected_nopar:Npn \spath_finalmovepoint:Nn #1#2
{
\__spath_finalmovepoint:n {#2}
\tl_set_eq:NN #1 \g__spath_output_tl
\tl_gclear:N \g__spath_output_tl
}
\cs_generate_variant:Nn \spath_finalmovepoint:Nn {NV, cn, cV}
\cs_new_protected_nopar:Npn \spath_gfinalmovepoint:Nn #1#2
{
\__spath_finalmovepoint:n {#2}
\tl_gset_eq:NN #1 \g__spath_output_tl
\tl_gclear:N \g__spath_output_tl
}
\cs_generate_variant:Nn \spath_gfinalmovepoint:Nn {NV, cn, cV}
\cs_new_protected_nopar:Npn \__spath_reverse:n #1
{
\group_begin:
\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_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_case:NnTF \l__spath_tmpc_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_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_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 }
}
}
\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_protected_nopar:Npn \spath_reverse:Nn #1#2
{
\__spath_reverse:n {#2}
\tl_set_eq:NN #1 \g__spath_output_tl
\tl_gclear:N \g__spath_output_tl
}
\cs_generate_variant:Nn \spath_reverse:Nn {NV, cn, cV, Nv}
\cs_new_protected_nopar:Npn \spath_reverse:N #1
{
\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
{
\tl_count:n {#1} > 3
}
{
\tl_set:Nx \l__spath_tmpa_tl
{
\tl_item:Nn {#1} {4}
}
}
\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_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
}
}
\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_generate_variant:Nn \spath_gfinalaction:Nn {NV}
\cs_new_protected_nopar:Npn \__spath_minbb:n #1
{
\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}
\dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
\bool_until_do:nn {
\tl_if_empty_p:N \l__spath_tmpa_tl
}
{
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
\dim_set:Nn \l__spath_tmpa_dim
{\dim_min:nn {\tl_head:N \l__spath_tmpa_tl} {\l__spath_tmpa_dim}}
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
\dim_set:Nn \l__spath_tmpb_dim
{\dim_min:nn {\tl_head:N \l__spath_tmpa_tl} {\l__spath_tmpb_dim}}
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
}
\tl_clear:N \l__spath_tmpb_tl
\tl_put_right:Nx \l__spath_tmpb_tl
{
{\dim_use:N \l__spath_tmpa_dim}
{\dim_use:N \l__spath_tmpb_dim}
}
\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_generate_variant:Nn \spath_gminbb:Nn {NV, cn, cV}
\cs_new_protected_nopar:Npn \__spath_maxbb:n #1
{
\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}
\dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
\bool_until_do:nn {
\tl_if_empty_p:N \l__spath_tmpa_tl
}
{
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
\dim_set:Nn \l__spath_tmpa_dim
{\dim_max:nn {\tl_head:N \l__spath_tmpa_tl} {\l__spath_tmpa_dim}}
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
\dim_set:Nn \l__spath_tmpb_dim
{\dim_max:nn {\tl_head:N \l__spath_tmpa_tl} {\l__spath_tmpb_dim}}
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
}
\tl_clear:N \l__spath_tmpb_tl
\tl_put_right:Nx \l__spath_tmpb_tl
{
{\dim_use:N \l__spath_tmpa_dim}
{\dim_use:N \l__spath_tmpb_dim}
}
\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}
{
\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
}
}
}
\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
{
\spath_save_to_aux:NV #1#1
}
}
\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_put_right:Nx \l__spath_tmpb_tl {\tl_head:N \l__spath_tmpa_tl}
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
\dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl + #2}
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
\dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl + #3}
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
\tl_put_right:Nx \l__spath_tmpb_tl
{
{\dim_use:N \l__spath_tmpa_dim}
{\dim_use:N \l__spath_tmpb_dim}
}
}
\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}
\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}
\fp_set:Nn \l__spath_tmpa_fp {\tl_head:N \l__spath_tmpa_tl * #2}
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
\fp_set:Nn \l__spath_tmpb_fp {\tl_head:N \l__spath_tmpa_tl * #3}
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
\tl_put_right:Nx \l__spath_tmpb_tl
{
{\fp_to_dim:N \l__spath_tmpa_fp}
{\fp_to_dim:N \l__spath_tmpb_fp}
}
}
\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
\bool_until_do:nn {
\tl_if_empty_p:N \l__spath_tmpa_tl
}
{
\tl_put_right:Nx \l__spath_tmpb_tl {\tl_head:N \l__spath_tmpa_tl}
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
\tl_set:Nx \l__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}
}
}
\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_generate_variant:Nn \spath_transform:Nnnnnnn {cnnnnnn}
\cs_new_protected_nopar:Npn \spath_transform:Nnn #1#2#3
{
\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
{
(\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)
}
\fp_compare:nTF
{
\l__spath_tmpc_fp < 0.001
}
{
\spath_translate_to:Nnnn \l__spath_tmpd_tl {#1} #2
}
{
\fp_set:Nn \l__spath_tmpa_fp
{
(
((\tl_item:nn {#3} {1})
-
(\tl_item:nn {#2} {1}))
*
((\tl_item:Nn \l__spath_tmpb_tl {1})
-
(\tl_item:Nn \l__spath_tmpa_tl {1}))
+
((\tl_item:nn {#3} {2})
-
(\tl_item:nn {#2} {2}))
*
((\tl_item:Nn \l__spath_tmpb_tl {2})
-
(\tl_item:Nn \l__spath_tmpa_tl {2}))
)
/
\l__spath_tmpc_fp
}
\fp_set:Nn \l__spath_tmpb_fp
{
(
((\tl_item:nn {#3} {2})
-
(\tl_item:nn {#2} {2}))
*
((\tl_item:Nn \l__spath_tmpb_tl {1})
-
(\tl_item:Nn \l__spath_tmpa_tl {1}))
-
((\tl_item:nn {#3} {1})
-
(\tl_item:nn {#2} {1}))
*
((\tl_item:Nn \l__spath_tmpb_tl {2})
-
(\tl_item:Nn \l__spath_tmpa_tl {2}))
)
/
\l__spath_tmpc_fp
}
\tl_set:Nx \l__spath_tmpc_tl
{
{
\fp_to_decimal:N \l__spath_tmpa_fp
}
{
\fp_to_decimal:N \l__spath_tmpb_fp
}
{
\fp_eval:n { - \l__spath_tmpb_fp }
}
{
\fp_to_decimal:N \l__spath_tmpa_fp
}
{
\fp_to_dim:n
{
\tl_item:nn {#2} {1}
-
\l__spath_tmpa_fp * (\tl_item:Nn \l__spath_tmpa_tl {1})
+
\l__spath_tmpb_fp * (\tl_item:Nn \l__spath_tmpa_tl {2})
}
}
{
\fp_to_dim:n
{
\tl_item:nn {#2} {2}
-
\l__spath_tmpb_fp * (\tl_item:Nn \l__spath_tmpa_tl {1})
-
\l__spath_tmpa_fp * (\tl_item:Nn \l__spath_tmpa_tl {2})
}
}
}
\spath_transform:NnV \l__spath_tmpd_tl {#1} \l__spath_tmpc_tl
}
\tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpd_tl
\group_end:
}
\cs_new_protected_nopar:Npn \spath_span:Nnnn #1#2#3#4
{
\__spath_span:nnn {#2}{#3}{#4}
\tl_set_eq:NN #1 \g__spath_output_tl
\tl_gclear:N \g__spath_output_tl
}
\cs_generate_variant:Nn \spath_span:Nnnn {NVnn, NVVV, NnVV}
\cs_new_protected_nopar:Npn \spath_span:Nnn #1#2#3
{
\spath_span:NVnn #1#1{#2}{#3}
}
\cs_generate_variant:Nn \spath_span:Nnn {NVV, cnn, cvv, cVV}
\cs_new_protected_nopar:Npn \spath_gspan:Nnnn #1#2#3#4
{
\__spath_span:nnn {#2}{#3}{#4}
\tl_gset_eq:NN #1 \g__spath_output_tl
\tl_gclear:N \g__spath_output_tl
}
\cs_generate_variant:Nn \spath_gspan:Nnnn {NVnn, NVVV}
\cs_new_protected_nopar:Npn \spath_gspan:Nnn #1#2#3
{
\spath_gspan:NVnn #1#1{#2}{#3}
}
\cs_generate_variant:Nn \spath_gspan:Nnn {NVV, cnn, cvv, cVV}
\cs_new_protected_nopar:Npn \__spath_normalise:n #1
{
\__spath_span:nnn {#1}{{0pt}{0pt}}{{1pt}{0pt}}
}
\cs_new_protected_nopar:Npn \spath_normalise:Nn #1#2
{
\__spath_normalise:n {#2}
\tl_set_eq:NN #1 \g__spath_output_tl
\tl_gclear:N \g__spath_output_tl
}
\cs_generate_variant:Nn \spath_normalise:Nn {cn,NV, cV, cv}
\cs_new_protected_nopar:Npn \spath_normalise:N #1
{
\spath_normalise:NV #1#1
}
\cs_generate_variant:Nn \spath_normalise:N {c}
\cs_new_protected_nopar:Npn \spath_gnormalise:Nn #1#2
{
\__spath_normalise:n {#2}
\tl_gset_eq:NN #1 \g__spath_output_tl
\tl_gclear:N \g__spath_output_tl
}
\cs_generate_variant:Nn \spath_gnormalise:Nn {cn,NV, cV, cv}
\cs_new_protected_nopar:Npn \spath_gnormalise:N #1
{
\spath_gnormalise:NV #1#1
}
\cs_generate_variant:Nn \spath_gnormalise:N {c}
\cs_new_protected_nopar:Npn \__spath_splice_between:nnn #1#2#3
{
\group_begin:
\spath_finalpoint:NV \l__spath_tmpd_tl {#1}
\spath_initialpoint:NV \l__spath_tmpe_tl {#3}
\spath_span:NnVV \l__spath_tmpb_tl {#2} \l__spath_tmpd_tl \l__spath_tmpe_tl
\spath_append_no_move:NnV \l__spath_tmpa_tl {#1} \l__spath_tmpb_tl
\spath_append_no_move:Nn \l__spath_tmpa_tl {#3}
\tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpa_tl
\group_end:
}
\cs_new_protected_nopar:Npn \spath_splice_between:Nnnn #1#2#3#4
{
\__spath_splice_between:nnn {#2}{#3}{#4}
\tl_set_eq:NN #1 \g__spath_output_tl
\tl_gclear:N \g__spath_output_tl
}
\cs_generate_variant:Nn \spath_splice_between:Nnnn {NVnn, NVVV}
\cs_new_protected_nopar:Npn \spath_splice_between:Nnn #1#2#3
{
\spath_splice_between:NVnn #1#1{#2}{#3}
}
\cs_generate_variant:Nn \spath_splice_between:Nnn {NVV, cnn, cvv, Nvn, 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, Nvn, NVn}
\cs_new_protected_nopar:Npn \__spath_close_with:nn #1#2
{
\group_begin:
\spath_finalmovepoint:Nn \l__spath_tmpa_tl {#1}
\spath_finalpoint:Nn \l__spath_tmpb_tl {#1}
\dim_compare:nTF
{
\dim_abs:n
{
\tl_item:Nn \l__spath_tmpa_tl {1}
-
\tl_item:Nn \l__spath_tmpb_tl {1}
}
+
\dim_abs:n
{
\tl_item:Nn \l__spath_tmpa_tl {2}
-
\tl_item:Nn \l__spath_tmpb_tl {2}
}
< 0.01pt
}
{
\__spath_close:n {#1}
}
{
\spath_span:NnVV \l__spath_tmpc_tl {#2} \l__spath_tmpb_tl \l__spath_tmpa_tl
\spath_append_no_move:NnV \l__spath_tmpd_tl {#1} \l__spath_tmpc_tl
\__spath_close:V \l__spath_tmpd_tl
}
\group_end:
}
\cs_new_protected_nopar:Npn \spath_close_with:Nnn #1#2#3
{
\__spath_close_with:nn {#2}{#3}
\tl_set_eq:NN #1 \g__spath_output_tl
\tl_gclear:N \g__spath_output_tl
}
\cs_generate_variant:Nn \spath_close_with:Nnn {cnn, cVV, cvv, NVn}
\cs_new_protected_nopar:Npn \spath_close_with:Nn #1#2
{
\spath_close_with:NVn #1#1{#2}
}
\cs_generate_variant:Nn \spath_close_with:Nn {cn, cV, cv, NV}
\cs_new_protected_nopar:Npn \spath_gclose_with:Nnn #1#2#3
{
\__spath_close_with:nn {#2}{#3}
\tl_gset_eq:NN #1 \g__spath_output_tl
\tl_gclear:N \g__spath_output_tl
}
\cs_generate_variant:Nn \spath_gclose_with:Nnn {cnn, cVV, cvv, NVn}
\cs_new_protected_nopar:Npn \spath_gclose_with:Nn #1#2
{
\spath_gclose_with:NVn #1#1{#2}
}
\cs_generate_variant:Nn \spath_gclose_with:Nn {cn, cV, cv, NV}
\cs_new_protected_nopar:Npn \__spath_weld:nn #1#2
{
\group_begin:
\tl_set:Nn \l__spath_tmpa_tl {#1}
\tl_set:Nn \l__spath_tmpb_tl {#2}
\spath_finalpoint:Nn \l__spath_tmpc_tl {#1}
\spath_translate_to:NV \l__spath_tmpb_tl \l__spath_tmpc_tl
\__spath_append_no_move:VV \l__spath_tmpa_tl \l__spath_tmpb_tl
\group_end:
}
\cs_new_protected_nopar:Npn \spath_weld:Nnn #1#2#3
{
\__spath_weld:nn {#2}{#3}
\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, cV}
\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, cV}
\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, 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, 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_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_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
\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
\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 {
{ \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 }
}
}
}
\tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpb_tl
\group_end:
}
\cs_new_protected_nopar:Npn \spath_open:Nn #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_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
{
\__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_replace_lines:n #1
{
\group_begin:
\tl_set:Nn \l__spath_tmpa_tl {#1}
\tl_clear:N \l__spath_tmpb_tl
\dim_set:Nn \l__spath_tmpa_dim {0pt}
\dim_set:Nn \l__spath_tmpb_dim {0pt}
\bool_do_until: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_tmpa_tl {2}}
\tl_set:Nx \l__spath_tmpe_tl {\tl_item:Nn \l__spath_tmpa_tl {3}}
\tl_if_eq:NNTF \l__spath_tmpc_tl \c_spath_lineto_tl
{
\tl_put_right:NV \l__spath_tmpb_tl \c_spath_curvetoa_tl
\tl_put_right:Nx \l__spath_tmpb_tl
{
{
\fp_to_dim:n
{
2/3 * (\l__spath_tmpa_dim)
+
1/3 * (\l__spath_tmpd_tl)
}
}
}
\tl_put_right:Nx \l__spath_tmpb_tl
{
{
\fp_to_dim:n
{
2/3 * (\l__spath_tmpb_dim)
+
1/3 * (\l__spath_tmpe_tl)
}
}
}
\tl_put_right:NV \l__spath_tmpb_tl \c_spath_curvetob_tl
\tl_put_right:Nx \l__spath_tmpb_tl
{
{
\fp_to_dim:n
{
1/3 * (\l__spath_tmpa_dim)
+
2/3 * (\l__spath_tmpd_tl)
}
}
}
\tl_put_right:Nx \l__spath_tmpb_tl
{
{
\fp_to_dim:n
{
1/3 * (\l__spath_tmpb_dim)
+
2/3 * (\l__spath_tmpe_tl)
}
}
}
\tl_put_right:NV \l__spath_tmpb_tl \c_spath_curveto_tl
\__spath_tl_put_right_braced:NV \l__spath_tmpb_tl \l__spath_tmpd_tl
\__spath_tl_put_right_braced:NV \l__spath_tmpb_tl \l__spath_tmpe_tl
}
{
\tl_put_right:NV \l__spath_tmpb_tl \l__spath_tmpc_tl
\__spath_tl_put_right_braced:NV \l__spath_tmpb_tl \l__spath_tmpd_tl
\__spath_tl_put_right_braced:NV \l__spath_tmpb_tl \l__spath_tmpe_tl
}
\dim_set:Nn \l__spath_tmpa_dim {\l__spath_tmpd_tl}
\dim_set:Nn \l__spath_tmpb_dim {\l__spath_tmpe_tl}
\prg_replicate:nn {3}
{
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
}
}
\tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpb_tl
\group_end:
}
\cs_generate_variant:Nn \__spath_replace_lines:n {V}
\cs_new_protected_nopar:Npn \spath_replace_lines:Nn #1#2
{
\__spath_replace_lines:n {#2}
\tl_set_eq:NN #1 \g__spath_output_tl
\tl_gclear:N \g__spath_output_tl
}
\cs_generate_variant:Nn \spath_replace_lines:Nn {NV, cV, cv, Nv}
\cs_new_protected_nopar:Npn \spath_replace_lines:N #1
{
\spath_replace_lines:NV #1#1
}
\cs_generate_variant:Nn \spath_replace_lines:N {c}
\cs_new_protected_nopar:Npn \spath_greplace_lines:Nn #1#2
{
\__spath_replace_lines:n {#2}
\tl_gset_eq:NN #1 \g__spath_output_tl
\tl_gclear:N \g__spath_output_tl
}
\cs_generate_variant:Nn \spath_greplace_lines:Nn {NV, cV, cv, Nv}
\cs_new_protected_nopar:Npn \spath_greplace_lines:N #1
{
\spath_greplace_lines:NV #1#1
}
\cs_generate_variant:Nn \spath_greplace_lines:N {c}
\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
{
\int_compare:nF
{
\tl_count:n {##1} == 3
}
{
\tl_put_right:Nn \l__spath_tmpa_tl {##1}
}
}
\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}
{
\int_step_inline:nnnn {1} {3} {\tl_count: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
{
\dim_abs:n
{
\l__spath_tmpa_dim - \l__spath_tmpb_dim
}
< 0.001pt
}
{
\bool_gset_false:N \g__spath_tmpa_bool
}
\dim_set:Nn \l__spath_tmpa_dim {\tl_item:Nn \l__spath_tmpa_tl {##1+2}}
\dim_set:Nn \l__spath_tmpb_dim {\tl_item:Nn \l__spath_tmpb_tl {##1+2}}
\dim_compare:nF
{
\dim_abs:n
{
\l__spath_tmpa_dim - \l__spath_tmpb_dim
}
< 0.001pt
}
{
\bool_gset_false:N \g__spath_tmpa_bool
}
}
}
{
\bool_gset_false:N \g__spath_tmpa_bool
}
\group_end:
\bool_if:NTF \g__spath_tmpa_bool
{
\prg_return_true:
}
{
\prg_return_false:
}
}
\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
{
\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}
}}
}
\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}
}}
}
\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}
}}
}
\tl_gclear:N \g__spath_output_tl
\__spath_tl_gput_right_braced:NV \g__spath_output_tl \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}
}}
}
\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)^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
{
{\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_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
{
\l__spath_tmpb_fp != 0
}
{
\fp_set:Nn \l__spath_tmpa_fp {.5 * \l__spath_tmpa_fp / \l__spath_tmpb_fp}
\fp_compare:nTF
{
0 < \l__spath_tmpa_fp && \l__spath_tmpa_fp < 1
}
{
\__spath_split_curve:nV {#1} \l__spath_tmpa_fp
}
{
\tl_gset:Nn \g__spath_output_tl { {#1} {} }
}
}
{
\tl_gset:Nn \g__spath_output_tl { {#1} {} }
}
\group_end:
}
\cs_new_protected_nopar:Npn \spath_maybe_split_curve:NNn #1#2#3
{
\__spath_maybe_split_curve:n {#3}
\tl_set:Nx #1 {\tl_item:Nn \g__spath_output_tl {1}}
\tl_set:Nx #2 {\tl_item:Nn \g__spath_output_tl {2}}
\tl_gclear:N \g__spath_output_tl
}
\cs_generate_variant:Nn \spath_maybe_split_curve:NNn {NNn, NNV }
\cs_new_protected_nopar:Npn \spath_maybe_gsplit_curve:NNn #1#2#3
{
\__spath_maybe_split_curve:n {#3}
\tl_gset:Nx #1 {\tl_item:Nn \g__spath_output_tl {1}}
\tl_gset:Nx #2 {\tl_item:Nn \g__spath_output_tl {2}}
\tl_gclear:N \g__spath_output_tl
}
\cs_generate_variant:Nn \spath_maybe_gsplit_curve:NNn {NNn, NNV}
\cs_new_protected_nopar:Npn \__spath_split_curves:n #1
{
\group_begin:
\tl_set:Nn \l__spath_tmpa_tl {#1}
\tl_clear:N \l__spath_tmpb_tl
\tl_clear:N \l__spath_tmpc_tl
\bool_do_until:nn
{
\tl_if_empty_p:N \l__spath_tmpa_tl
}
{
\tl_set:Nx \l__spath_tmpc_tl {\tl_head:N \l__spath_tmpa_tl}
\tl_case:NnF \l__spath_tmpc_tl
{
\c_spath_curvetoa_tl
{
\tl_clear:N \l__spath_tmpd_tl
\tl_set_eq:NN \l__spath_tmpd_tl \c_spath_moveto_tl
\tl_put_right:Nx \l__spath_tmpd_tl
{
{ \dim_use:N \l__spath_tmpa_dim }
{ \dim_use:N \l__spath_tmpb_dim }
}
\dim_set:Nn \l__spath_tmpa_dim
{
\tl_item:Nn \l__spath_tmpa_tl {8}
}
\dim_set:Nn \l__spath_tmpb_dim
{
\tl_item:Nn \l__spath_tmpa_tl {9}
}
\prg_replicate:nn {3}
{
\tl_put_right:Nx \l__spath_tmpd_tl
{
\tl_item:Nn \l__spath_tmpa_tl {1}
{\tl_item:Nn \l__spath_tmpa_tl {2}}
{\tl_item:Nn \l__spath_tmpa_tl {3}}
}
\prg_replicate:nn {3}
{
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
}
}
\spath_maybe_split_curve:NNV
\l__spath_tmpd_tl
\l__spath_tmpe_tl
\l__spath_tmpd_tl
\prg_replicate:nn {3}
{
\tl_set:Nx \l__spath_tmpd_tl {\tl_tail:N \l__spath_tmpd_tl}
\tl_set:Nx \l__spath_tmpe_tl {\tl_tail:N \l__spath_tmpe_tl}
}
\tl_put_right:NV \l__spath_tmpb_tl \l__spath_tmpd_tl
\tl_put_right:NV \l__spath_tmpb_tl \l__spath_tmpe_tl
}
}
{
\dim_set:Nn \l__spath_tmpa_dim
{
\tl_item:Nn \l__spath_tmpa_tl {2}
}
\dim_set:Nn \l__spath_tmpb_dim
{
\tl_item:Nn \l__spath_tmpa_tl {3}
}
\tl_put_right:Nx \l__spath_tmpb_tl
{
\tl_item:Nn \l__spath_tmpa_tl {1}
{\tl_item:Nn \l__spath_tmpa_tl {2}}
{\tl_item:Nn \l__spath_tmpa_tl {3}}
}
\prg_replicate:nn {3}
{
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
}
}
}
\tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpb_tl
\group_end:
}
\cs_new_protected_nopar:Npn \spath_split_curves:Nn #1#2
{
\__spath_split_curves:n {#2}
\tl_set_eq:NN #1 \g__spath_output_tl
\tl_gclear:N \g__spath_output_tl
}
\cs_generate_variant:Nn \spath_split_curves:Nn {NV, cV, cn, cv }
\cs_new_protected_nopar:Npn \spath_split_curves:N #1
{
\spath_split_curves:NV #1#1
}
\cs_generate_variant:Nn \spath_split_curves:N {c}
\cs_new_protected_nopar:Npn \spath_gsplit_curves:Nn #1#2
{
\__spath_split_curves:n {#2}
\tl_gset_eq:NN #1 \g__spath_output_tl
\tl_gclear:N \g__spath_output_tl
}
\cs_generate_variant:Nn \spath_gsplit_curves:Nn {NV, cV, cn, cv }
\cs_new_protected_nopar:Npn \spath_gsplit_curves:N #1
{
\spath_gsplit_curves:NV #1#1
}
\cs_generate_variant:Nn \spath_gsplit_curves:N {c}
\cs_new_protected_nopar:Npn \__spath_split_line:nn #1#2
{
\group_begin:
\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
\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) * \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}}
}
\__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)}
% 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
\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 }
}
{
\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_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 }
}
}
\tl_clear:N \l__spath_tmpd_tl
\tl_put_right:NV \l__spath_tmpd_tl \c_spath_moveto_tl
\tl_put_right:Nx \l__spath_tmpd_tl
{
{\dim_use:N \l__spath_tmpa_dim}
{\dim_use:N \l__spath_tmpb_dim}
}
\fp_compare:nTF
{
\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
{
\tl_put_right:NV \l__spath_tmpb_tl \l__spath_tmpf_tl
\tl_put_right:NV \l__spath_tmpb_tl \l__spath_tmpe_tl
}
}
{
\tl_case:Nn \l__spath_tmpf_tl
{
\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_generate_variant:Nn \spath_split_at:NNnn {NNVn, NNVV, NNnV}
\cs_new_protected_nopar:Npn \spath_gsplit_at:NNnn #1#2#3#4
{
\__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
{
\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
\tl_set:Nx \l__spath_tmpb_tl {\tl_item:Nn \l__spath_tmpa_tl {3}}
\tl_clear:N \l__spath_tmpe_tl
\tl_if_eq:NNTF \l__spath_tmpb_tl \c_spath_curveto_tl
{
\int_set:Nn \l__spath_tmpa_int {3}
}
{
\int_set:Nn \l__spath_tmpa_int {1}
}
\prg_replicate:nn { \l__spath_tmpa_int }
{
\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
{
{\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
{
\dim_to_fp:n {\tl_item:Nn \l__spath_tmpe_tl {4}}
-
\dim_to_fp:n {\tl_item:Nn \l__spath_tmpe_tl {1}}
}
\fp_set:Nn \l__spath_tmpb_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_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
{
(\l__spath_tmpc_fp - #2)/ \l__spath_tmpc_fp
}
\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
}
{
\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_protected_nopar:Npn \spath_shorten_at_end:Nnn #1#2#3
{
\__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
{
\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}
{
\tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl }
}
}
\__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
{
#2/ \l__spath_tmpc_fp
}
\tl_if_eq:NNTF \l__spath_tmpb_tl \c_spath_curvetoa_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 {2}
{
\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
{
\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_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
{
\l__spath_tmpa_int > \seq_count:N \l__spath_tmpa_seq
}
{
\spath_finalpoint:Nn \l__spath_tmpc_tl {#1}
}
{
\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
{
\l__spath_tmpa_int > \seq_count:N \l__spath_tmpa_seq
}
{
\spath_finalpoint:Nn \l__spath_tmpc_tl {#1}
}
{
\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}
{
\pgfintersectiongetsolutiontimes{##1}{\l__spath_tmph_tl}{\l__spath_tmpi_tl}
\seq_put_left:NV \l__spath_tmpb_seq \l__spath_tmph_tl
}
\seq_get_left:NN \l__spath_tmpb_seq \l__spath_tmpa_tl
\fp_compare:nT
{
\l__spath_tmpa_tl > \l__spath_tmpa_int - .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
}
\tl_set:Nn \l__spath_tmpg_tl {-1}
\seq_map_inline:Nn \l__spath_tmpb_seq
{
\tl_set:Nn \l__spath_tmph_tl {##1}
\tl_set_eq:NN \l__spath_tmpa_tl \l__spath_tmph_tl
\int_compare:nT
{
\fp_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_protected_nopar:Npn \spath_split_component_at_intersections:Nnn #1#2#3
{
\__spath_split_component_at_intersections:nn {#2}{#3}
\tl_set_eq:NN #1 \g__spath_output_tl
\tl_gclear:N \g__spath_output_tl
}
\cs_generate_variant:Nn \spath_split_component_at_intersections:Nnn {NVn, NVV}
\cs_new_protected_nopar:Npn \spath_split_component_at_intersections:Nn #1#2
{
\spath_split_component_at_intersections:NVn #1#1{#2}
}
\cs_generate_variant:Nn \spath_split_component_at_intersections:Nn {cn, cv}
\cs_new_protected_nopar:Npn \spath_gsplit_component_at_intersections:Nnn #1#2#3
{
\__spath_split_component_at_intersections:nn {#2}{#3}
\tl_gset_eq:NN #1 \g__spath_output_tl
\tl_gclear:N \g__spath_output_tl
}
\cs_generate_variant:Nn \spath_gsplit_component_at_intersections:Nnn {NVn, NVV}
\cs_new_protected_nopar:Npn \spath_gsplit_component_at_intersections:Nn #1#2
{
\spath_gsplit_component_at_intersections:NVn #1#1{#2}
}
\cs_generate_variant:Nn \spath_gsplit_component_at_intersections:Nn {cn, cv}
\cs_new_protected_nopar:Npn \__spath_split_path_at_intersections:nn #1#2
{
\group_begin:
\seq_clear:N \l__spath_tmpa_seq
\seq_clear:N \l__spath_tmpb_seq
\spath_components_to_seq:Nn \l__spath_tmpa_seq {#1}
\seq_map_inline:Nn \l__spath_tmpa_seq
{
\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_protected_nopar:Npn \spath_split_path_at_intersections:Nnn #1#2#3
{
\__spath_split_path_at_intersections:nn {#2}{#3}
\tl_set_eq:NN #1 \g__spath_output_tl
\tl_gclear:N \g__spath_output_tl
}
\cs_generate_variant:Nn \spath_split_path_at_intersections:Nnn
{NVn, NVV, cVn, cVV, cvn, cvv}
\cs_new_protected_nopar:Npn \spath_split_path_at_intersections:Nn #1#2
{
\spath_split_path_at_intersections:NVn #1#1{#2}
}
\cs_generate_variant:Nn \spath_split_path_at_intersections:Nn {cv, NV}
\cs_new_protected_nopar:Npn \spath_gsplit_path_at_intersections:Nnn #1#2#3
{
\__spath_split_path_at_intersections:nn {#2}{#3}
\tl_gset_eq:NN #1 \g__spath_output_tl
\tl_gclear:N \g__spath_output_tl
}
\cs_generate_variant:Nn \spath_gsplit_path_at_intersections:Nnn
{NVn, NVV, cVn, cVV, cvn, cvv}
\cs_new_protected_nopar:Npn \spath_gsplit_path_at_intersections:Nn #1#2
{
\spath_gsplit_path_at_intersections:NVn #1#1{#2}
}
\cs_generate_variant:Nn \spath_gsplit_path_at_intersections:Nn {cv, NV}
\cs_new_protected_nopar:Npn \spath_split_at_intersections:NNnn #1#2#3#4
{
\__spath_split_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}
% Remember if the component is closed
\spath_finalaction:NV \l__spath_tmpa_tl \l__spath_tmpe_tl
\bool_set:Nn \l__spath_closed_bool
{
\tl_if_eq_p:NN \l__spath_tmpa_tl \c_spath_closepath_tl
}
% Copy the path
\tl_set:Nn \l__spath_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
% Make a copy for later
\tl_set_eq:NN \l__spath_tmpg_tl \l__spath_tmpe_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
\pgfintersectionsortbyfirstpath
% 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
}
{
\spath_intersect:nn {##2} {####2}
\int_compare:nT {\pgfintersectionsolutions > 0}
{
% Find the times of the intersections on each path
\int_step_inline:nnnn {1} {1} {\pgfintersectionsolutions}
{
\pgfintersectiongetsolutiontimes
{########1}{\l__spath_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
}
}
}
}
}
}
% 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: }
}
\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
\spath_split_at:NNVV
\l__spath_tmpf_tl
\l__spath_tmph_tl
\l__spath_tmpe_tl
\l__spath_tmpb_tl
\tl_put_left:NV \l__spath_tmpg_tl \l__spath_tmph_tl
\tl_set_eq:NN \l__spath_tmpe_tl \l__spath_tmpf_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_new_protected_nopar:Npn \spath_split_component_at_self_intersections:Nn #1#2
{
\__spath_split_component_at_self_intersections:n {#2}
\tl_set_eq:NN #1 \g__spath_output_tl
\tl_gclear:N \g__spath_output_tl
}
\cs_generate_variant:Nn \spath_split_component_at_self_intersections:Nn {NV}
\cs_new_protected_nopar:Npn \spath_split_component_at_self_intersections:N #1
{
\spath_split_component_at_self_intersections:NV #1#1
}
\cs_generate_variant:Nn \spath_split_component_at_self_intersections:N {c}
\cs_new_protected_nopar:Npn \spath_gsplit_component_at_self_intersections:Nn #1#2
{
\__spath_split_component_at_self_intersections:n {#2}
\tl_gset_eq:NN #1 \g__spath_output_tl
\tl_gclear:N \g__spath_output_tl
}
\cs_generate_variant:Nn \spath_gsplit_component_at_self_intersections:Nn {NV}
\cs_new_protected_nopar:Npn \spath_gsplit_component_at_self_intersections:N #1
{
\spath_gsplit_component_at_self_intersections:NV #1#1
}
\cs_generate_variant:Nn \spath_gsplit_component_at_self_intersections:N {c}
\cs_new_protected_nopar:Npn \__spath_split_at_self_intersections:n #1
{
\group_begin:
\spath_components_to_seq:Nn \l__spath_tmpa_seq {#1}
\seq_clear:N \l__spath_tmpb_seq
\seq_clear:N \l__spath_tmpc_seq
% Iterate over the components of the original path.
\bool_do_until:nn
{
\seq_if_empty_p:N \l__spath_tmpa_seq
}
{
% Get the next component
\seq_pop_left:NN \l__spath_tmpa_seq \l__spath_tmpa_tl
% Copy for later
\tl_set_eq:NN \l__spath_tmpc_tl \l__spath_tmpa_tl
\int_compare:nT
{
\tl_count:N \l__spath_tmpa_tl > 3
}
{
% Split against itself
\spath_split_component_at_self_intersections:N \l__spath_tmpa_tl
% Grab the rest of the path
\tl_set:Nx \l__spath_tmpb_tl
{
\seq_use:Nn \l__spath_tmpb_seq {}
\seq_use:Nn \l__spath_tmpa_seq {}
}
% Split against the rest of the path
\spath_split_path_at_intersections:NV \l__spath_tmpa_tl \l__spath_tmpb_tl
}
% Save the split path
\seq_put_right:NV \l__spath_tmpc_seq \l__spath_tmpa_tl
% Add the original copy to the sequence of processed components
\seq_put_right:NV \l__spath_tmpb_seq \l__spath_tmpc_tl
}
\tl_gclear:N \g__spath_output_tl
\tl_gset:Nx \g__spath_output_tl {\seq_use:Nn \l__spath_tmpc_seq {} }
\group_end:
}
\cs_generate_variant:Nn \__spath_split_at_self_intersections:n {V, v}
\cs_new_protected_nopar:Npn \spath_split_at_self_intersections:Nn #1#2
{
\__spath_split_at_self_intersections:n {#2}
\tl_set_eq:NN #1 \g__spath_output_tl
\tl_gclear:N \g__spath_output_tl
}
\cs_generate_variant:Nn \spath_split_at_self_intersections:Nn {NV, cn, cV, cv}
\cs_new_protected_nopar:Npn \spath_split_at_self_intersections:N #1
{
\spath_split_at_self_intersections:NV #1#1
}
\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_split_at_self_intersections:n {#2}
\tl_gset_eq:NN #1 \g__spath_output_tl
\tl_gclear:N \g__spath_output_tl
}
\cs_generate_variant:Nn \spath_gsplit_at_self_intersections:Nn {NV, cn, cV, cv}
\cs_new_protected_nopar:Npn \spath_gsplit_at_self_intersections:N #1
{
\spath_gsplit_at_self_intersections:NV #1#1
}
\cs_generate_variant:Nn \spath_gsplit_at_self_intersections:N {c}
\cs_new_protected_nopar:Npn \__spath_join_component:nn #1#2
{
\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:
}
\cs_new_protected_nopar:Npn \spath_join_component:Nnn #1#2#3
{
\__spath_join_component:nn {#2}{#3}
\tl_set_eq:NN #1 \g__spath_output_tl
\tl_gclear:N \g__spath_output_tl
}
\cs_generate_variant:Nn \spath_join_component:Nnn {NVn, NVV}
\cs_new_protected_nopar:Npn \spath_join_component:Nn #1#2
{
\spath_join_component:NVn #1#1{#2}
}
\cs_generate_variant:Nn \spath_join_component:Nn {cn, NV, cV}
\cs_new_protected_nopar:Npn \spath_gjoin_component:Nnn #1#2#3
{
\__spath_join_component:nn {#2}{#3}
\tl_gset_eq:NN #1 \g__spath_output_tl
\tl_gclear:N \g__spath_output_tl
}
\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_generate_variant:Nn \spath_gjoin_component:Nn {cn, NV, cV}
\cs_new_protected_nopar:Npn \__spath_spot_weld_components:n #1
{
\group_begin:
\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
{
\tl_set:Nn \l__spath_tmpa_tl {##1}
\bool_if:nT
{
\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
}
}
{
\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_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
{
\dim_compare_p:n
{
\dim_abs:n
{
\tl_item:Nn \l__spath_tmpa_tl {1} - \tl_item:Nn \l__spath_tmpb_tl {1}
}
<
0.01pt
}
&&
\dim_compare_p:n
{
\dim_abs:n
{
\tl_item:Nn \l__spath_tmpa_tl {2} - \tl_item:Nn \l__spath_tmpb_tl {2}
}
<
0.01pt
}
}
{
\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}
{
\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
}
{
\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:Nx \g__spath_output_tl {\seq_use:Nn \l__spath_tmpb_seq {}}
\group_end:
}
\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_clear:N \l__spath_tmpa_tl
\tl_put_right:Nn \l__spath_tmpa_tl
{
\iow_newline:
\iow_newline:
\iow_newline:
}
\tl_gset_eq:NN \g__spath_output_tl \l__spath_tmpa_tl
\group_end:
}
\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}
{
\pgftransformreset
\spath_reallength:Nn \l__spath_tmpa_int {#1}
\tl_set_eq:Nc \l__spath_tmpb_tl {tikz@time}
\tl_set:Nx \l__spath_tmpb_tl
{\fp_to_decimal:n {(\l__spath_tmpb_tl) * (\l__spath_tmpa_int)}}
\spath_transformation_at:NnV \l__spath_tmpc_tl {#1} \l__spath_tmpb_tl
\tl_set:Nx \l__spath_tmpa_tl
{
\exp_not:N \pgfpoint
{ \tl_item:Nn \l__spath_tmpc_tl {5} }
{ \tl_item:Nn \l__spath_tmpc_tl {6} }
}
\exp_args:NV \pgftransformshift \l__spath_tmpa_tl
\ifpgfresetnontranslationattime
\pgftransformresetnontranslations
\fi
\ifpgfslopedattime
\tl_set:Nx \l__spath_tmpa_tl
{
{ \tl_item:Nn \l__spath_tmpc_tl {1} }
{ \tl_item:Nn \l__spath_tmpc_tl {2} }
{ \tl_item:Nn \l__spath_tmpc_tl {3} }
{ \tl_item:Nn \l__spath_tmpc_tl {4} }
}
\ifpgfallowupsidedownattime
\else
\fp_compare:nT { \tl_item:Nn \l__spath_tmpc_tl {4} < 0}
{
\tl_set:Nx \l__spath_tmpa_tl
{
{ \fp_eval:n { - (\tl_item:Nn \l__spath_tmpc_tl {1})} }
{ \fp_eval:n { - (\tl_item:Nn \l__spath_tmpc_tl {2})} }
{ \fp_eval:n { - (\tl_item:Nn \l__spath_tmpc_tl {3})} }
{ \fp_eval:n { - (\tl_item:Nn \l__spath_tmpc_tl {4})} }
}
}
\fi
\tl_put_right:Nn \l__spath_tmpa_tl {{\pgfpointorigin}}
\exp_last_unbraced:NV \pgftransformcm \l__spath_tmpa_tl
\fi
}
}
\cs_generate_variant:Nn \spath_set_tikz_data:n {V, v}
%%
%% Copyright (C) 2011-2021 by Andrew Stacey
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License (LPPL), either
%% version 1.3c of this license or (at your option) any later
%% version. The latest version of this license is in the file:
%%
%% http://www.latex-project.org/lppl.txt
%%
%% This work is "maintained" (as per LPPL maintenance status) by
%% Andrew Stacey.
%%
%% This work consists of the files spath3_code.dtx
%% calligraphy_doc.tex
%% knots_doc.tex
%% spath3.tex
%% and the derived files spath3.ins,
%% spath3_code.pdf,
%% spath3.sty,
%% tikzlibrarycalligraphy.code.tex
%% tikzlibraryknots.code.tex
%% tikzlibraryspath3.code.tex
%% calligraphy.pdf
%% knots.pdf
%% spath3.pdf
%% README
%%
%%
%% End of file `spath3.sty'.