%% %% This is file `tikzlibraryspath3.code.tex', %% generated with the docstrip utility. %% %% The original source files were: %% %% spath3_code.dtx (with options: `tikzspath3') %% ---------------------------------------------------------------- %% spath3 --- Functions for manipulating PGF soft paths %% E-mail: Andrew Stacey %% Released under the LaTeX Project Public License v1.3c or later %% See http://www.latex-project.org/lppl.txt %% ---------------------------------------------------------------- %% \RequirePackage{spath3} \RequirePackage{expl3} \ExplSyntaxOn \tl_new:N \l__tikzspath_tmpa_tl \tl_new:N \l__tikzspath_tmpb_tl \tl_new:N \l__tikzspath_tmpc_tl \tl_new:N \l__tikzspath_tmpd_tl \tl_new:N \l__tikzspath_tmpe_tl \tl_new:N \l__tikzspath_tmpf_tl \int_new:N \l__tikzspath_tmpa_int \seq_new:N \l__tikzspath_tmpa_seq \seq_new:N \l__tikzspath_tmpb_seq \seq_new:N \l__tikzspath_tmpc_seq \seq_new:N \l__tikzspath_tmpd_seq \tl_new:N \l__tikzspath_current_tl \tl_new:N \l__tikzspath_reverse_tl \tl_new:N \l__tikzspath_prefix_tl \tl_new:N \l__tikzspath_suffix_tl \tl_new:N \g__tikzspath_smuggle_tl \tl_new:N \g__tikzspath_output_tl \tl_new:N \l__tikzspath_check_tl \clist_new:N \g__tikzspath_output_clist \seq_new:N \g__tikzspath_tmpa_seq \seq_new:N \g__tikzspath_tmpb_seq \seq_new:N \g__tikzspath_output_seq \bool_new:N \l__tikzspath_draft_bool \msg_new:nnn { spath3 } { missing soft path } { Soft~ path~ #1~ doesn't~ exist~ \msg_line_context:} \msg_new:nnnn { spath3 } { empty soft path } { Soft~ path~ #1~ is~ empty~ \msg_line_context:} {If~ it~ was~ defined~ inside~ a~ group,~ try~ using~ "save~ global". } \msg_new:nnn { spath3 } { load intersections } { You~ need~ to~ load~ the~ "intersections"~ library~ to~ work~ with~ intersections } \tl_set:Nn \l__tikzspath_prefix_tl {tikz@intersect@path@name@} \tl_set:Nn \l__tikzspath_suffix_tl {} \tl_new:N \g__tikzspath_tikzfinish_tl \tl_new:N \l__tikzspath_tikzfinish_outside_tl \cs_new_protected_nopar:Npn \spath_at_end_of_path: { \tl_use:N \g__tikzspath_tikzfinish_tl \tl_gclear:N \g__tikzspath_tikzfinish_tl } \tl_put_right:Nn \tikz@finish {\spath_at_end_of_path:} \tikzset{ every~ scope/.append~ style={ execute~ at~ begin~ scope={ \tl_set_eq:NN \l__tikzspath_tikzfinish_outside_tl \g__tikzspath_tikzfinish_tl }, execute~ at~ end~ scope={ \tl_use:N \g__tikzspath_tikzfinish_tl \tl_gclear:N \g__tikzspath_tikzfinish_tl \tl_gset_eq:NN \g__tikzspath_tikzfinish_tl \l__tikzspath_tikzfinish_outside_tl }, }, } \tl_new:N \l__tikzspath_tikzpath_finish_tl \cs_new_protected_nopar:Npn \__tikzspath_at_end_of_path_construction: { \tl_use:N \l__tikzspath_tikzpath_finish_tl \tl_clear:N \l__tikzspath_tikzpath_finish_tl } \tl_put_left:Nn \tikz@finish {\__tikzspath_at_end_of_path_construction:} \cs_new_protected_nopar:Npn \spath_save_path:Nn #1#2 { \tl_if_empty:NF \g__tikzspath_tikzfinish_tl { \tl_use:N \g__tikzspath_tikzfinish_tl } \tl_gput_right:Nn \g__tikzspath_tikzfinish_tl { \tl_clear_new:N #1 \tl_set:Nn #1 {#2} } } \cs_generate_variant:Nn \spath_save_path:Nn {cn, NV, cV} \cs_new_protected_nopar:Npn \spath_gsave_path:Nn #1#2 { \tl_gput_right:Nn \g__tikzspath_tikzfinish_tl { \tl_gclear_new:N #1 \tl_gset:Nn #1 {#2} } } \cs_generate_variant:Nn \spath_gsave_path:Nn {cn, NV, cV} \cs_new_protected_nopar:Npn \__tikzspath_process_tikz_point:Nn #1#2 { \group_begin: \use:c {tikz@scan@one@point} \use:n #2 \scan_stop: \tl_gset:Nx \g__tikzspath_output_tl { { \dim_use:c {pgf@x} } { \dim_use:c {pgf@y} } } \group_end: \tl_set_eq:NN #1 \g__tikzspath_output_tl \tl_gclear:N \g__tikzspath_output_tl } \cs_set_eq:NN \__tikzspath_tikzset:n \tikzset \cs_generate_variant:Nn \__tikzspath_tikzset:n {V, v} \cs_new_protected_nopar:Npn \__tikzspath_check_path:nnn #1#2#3 { \tl_set:Nn \l__tikzspath_check_tl {#3} \tl_if_exist:cTF {\__tikzspath_path_name:n {#2}} { \tl_if_empty:cTF {\__tikzspath_path_name:n {#2}} { \msg_warning:nnn { spath3 } { empty soft path } { #2 } } { \tl_set:Nn \l__tikzspath_check_tl { #1 {\__tikzspath_path_name:n {#2}} } } } { \msg_warning:nnx { spath3 } { missing soft path } { #2 } } \tl_use:N \l__tikzspath_check_tl } \cs_new_protected_nopar:Npn \__tikzspath_check_two_paths:nnnn #1#2#3#4 { \__tikzspath_check_path:nnn { \__tikzspath_check_path:nnn {#1}{#2}{#4} }{#3}{#4} } \cs_new_protected_nopar:Npn \__tikzspath_check_three_paths:nnnnn #1#2#3#4#5 { \__tikzspath_check_path:nnn { \__tikzspath_check_path:nnn { \__tikzspath_check_path:nnn {#1}{#2}{#5} }{#3}{#5} }{#4}{#5} } \cs_generate_variant:Nn \__tikzspath_check_path:nnn {nVn} \cs_generate_variant:Nn \__tikzspath_check_two_paths:nnnn {nnVn} \cs_new_protected_nopar:Npn \__tikzspath_maybe_current_path:nn #1#2 { \tl_if_eq:nnT {#2} {current} { \spath_get_current_path:c {\__tikzspath_path_name:n {#2}} } #1 {#2} } \cs_new_protected_nopar:Npn \__tikzspath_maybe_current_path_reuse:nnn #1#2#3 { \bool_set_true:N \l_spath_movetorelevant_bool \tl_if_eq:nnT {#2} {current} { \spath_get_current_path:c {\__tikzspath_path_name:n {#2}} } #1 {#2} #3 \tl_if_eq:nnT {#2} {current} { \tl_if_empty:cF {\__tikzspath_path_name:n {#2}} { \spath_set_current_path:c {\__tikzspath_path_name:n {#2}} \spath_set_tikz_data:v {\__tikzspath_path_name:n {#2}} } } } \cs_new_protected_nopar:Npn \__tikzspath_maybe_current_two_paths_reuse_both:nnnn #1#2#3#4 { \bool_set_true:N \l_spath_movetorelevant_bool \tl_if_eq:nnT {#2} {current} { \spath_get_current_path:c {\__tikzspath_path_name:n {#2}} } \tl_if_eq:nnT {#3} {current} { \spath_get_current_path:c {\__tikzspath_path_name:n {#3}} } #1 {#2} {#3} #4 \tl_if_eq:nnT {#2} {current} { \tl_if_empty:cF {\__tikzspath_path_name:n {#2}} { \spath_set_current_path:c {\__tikzspath_path_name:n {#2}} \spath_set_tikz_data:v {\__tikzspath_path_name:n {#2}} } } \tl_if_eq:nnT {#3} {current} { \tl_if_empty:cF {\__tikzspath_path_name:n {#3}} { \spath_set_current_path:c {\__tikzspath_path_name:n {#3}} \spath_set_tikz_data:v {\__tikzspath_path_name:n {#3}} } } } \cs_new_protected_nopar:Npn \__tikzspath_maybe_current_two_paths_reuse_first:nnnn #1#2#3#4 { \bool_set_true:N \l_spath_movetorelevant_bool \tl_if_eq:nnT {#2} {current} { \spath_get_current_path:c {\__tikzspath_path_name:n {#2}} } \tl_if_eq:nnT {#3} {current} { \spath_get_current_path:c {\__tikzspath_path_name:n {#3}} } #1 {#2} {#3} #4 \tl_if_eq:nnT {#2} {current} { \tl_if_empty:cF {\__tikzspath_path_name:n {#2}} { \spath_set_current_path:c {\__tikzspath_path_name:n {#2}} \spath_set_tikz_data:v {\__tikzspath_path_name:n {#2}} } } } \cs_new_protected_nopar:Npn \__tikzspath_maybe_current_two_paths_reuse_second:nnnn #1#2#3#4 { \bool_set_true:N \l_spath_movetorelevant_bool \tl_if_eq:nnT {#2} {current} { \spath_get_current_path:c {\__tikzspath_path_name:n {#2}} } \tl_if_eq:nnT {#3} {current} { \spath_get_current_path:c {\__tikzspath_path_name:n {#3}} } #1 {#2} {#3} #4 \tl_if_eq:nnT {#3} {current} { \tl_if_empty:cF {\__tikzspath_path_name:n {#3}} { \spath_set_current_path:c {\__tikzspath_path_name:n {#3}} \spath_set_tikz_data:v {\__tikzspath_path_name:n {#3}} } } } \cs_generate_variant:Nn \__tikzspath_maybe_current_path:nn {nV} \cs_generate_variant:Nn \__tikzspath_maybe_current_path_reuse:nnn {nVn} \cs_new_protected_nopar:Npn \__tikzspath_seq_from_foreach:Nnn #1#2#3 { \group_begin: \seq_gclear:N \g__tikzspath_output_seq \tl_if_empty:nTF {#3} { \int_step_inline:nnnn {1}{1} {#2} { \seq_gput_right:Nn \g__tikzspath_output_seq {##1} } } { \foreach \l__tikzspath_tmpa_tl in {#3} { \int_compare:nTF { \l__tikzspath_tmpa_tl > 0 } { \seq_gput_right:NV \g__tikzspath_output_seq \l__tikzspath_tmpa_tl } { \seq_gput_right:Nx \g__tikzspath_output_seq {\int_eval:n {#2 - \l__tikzspath_tmpa_tl}} } } \seq_gsort:Nn \g__tikzspath_output_seq { \int_compare:nNnTF {##1} < {##2} { \sort_return_same: } { \sort_return_swapped: } } } \group_end: \seq_set_eq:NN #1 \g__tikzspath_output_seq \seq_gclear:N \g__tikzspath_output_seq } \cs_generate_variant:Nn \__tikzspath_seq_from_foreach:Nnn {NVV, NVn} \cs_new:Npn \__tikzspath_path_name:n #1 { \tl_use:N \l__tikzspath_prefix_tl #1 \tl_use:N \l__tikzspath_suffix_tl } \cs_generate_variant:Nn \__tikzspath_path_name:n {V} \bool_new:N \l__tikzspath_reverse_bool \bool_new:N \l__tikzspath_weld_bool \bool_new:N \l__tikzspath_move_bool \bool_new:N \l__tikzspath_global_bool \bool_new:N \l__tikzspath_current_transformation_bool \tl_new:N \l__tikzspath_joinpath_tl \tl_new:N \l__tikzspath_transformation_tl \cs_new_protected_nopar:Npn \__tikzspath_set_bool:Nn #1#2 { \tl_if_eq:nnTF {#2}{false} { \bool_set_false:N #1 } { \bool_set_true:N #1 } } \tikzset { spath/join/.is~ family, spath/join/.cd, reverse/.code = { \__tikzspath_set_bool:Nn \l__tikzspath_reverse_bool {#1} }, reverse/.default = true, weld/.code = { \__tikzspath_set_bool:Nn \l__tikzspath_weld_bool {#1} }, weld/.default = true, no~ weld/.code = { \__tikzspath_set_bool:Nn \l__tikzspath_weld_bool {#1} \bool_set:Nn \l__tikzspath_weld_bool {! \l__tikzspath_weld_bool} }, no~ weld/.default = true, move/.code = { \__tikzspath_set_bool:Nn \l__tikzspath_move_bool {#1} }, move/.default = true, no~ move/.code = { \__tikzspath_set_bool:Nn \l__tikzspath_move_bool {#1} \bool_set:Nn \l__tikzspath_move_bool {! \l__tikzspath_move_bool} }, no~ move/.default = true, global/.code = { \__tikzspath_set_bool:Nn \l__tikzspath_global_bool {#1} }, global/.default = true, use~ current~ transformation/.code={ \__tikzspath_set_bool:Nn \l__tikzspath_current_transformation_bool {#1} }, use~ current~ transformation/.default = true, transform/.store~in=\l__tikzspath_transformation_tl, .unknown/.code = { \tl_set_eq:NN \l__tikzspath_joinpath_tl \pgfkeyscurrentname } } \cs_set_eq:NN \getComponentOf \clist_item:Nn \cs_new_protected_nopar:Npn \__tikzspath_use_path:n #1 { \tl_set:Nn \l__tikzspath_joinpath_tl {#1} \spath_get_current_path:N \l__tikzspath_current_tl \bool_if:NT \l__tikzspath_reverse_bool { \spath_reverse:N \l__tikzspath_joinpath_tl } \bool_if:NT \l__tikzspath_current_transformation_bool { \pgfgettransform \l__tikzspath_tmpa_tl \spath_transform:NV \l__tikzspath_joinpath_tl \l__tikzspath_tmpa_tl } \tl_if_empty:NF \l__tikzspath_transformation_tl { \group_begin: \pgftransformreset \__tikzspath_tikzset:V \l__tikzspath_transformation_tl \pgfgettransform \l__tikzspath_tmpa_tl \tl_gset:Nn \g__tikzspath_smuggle_tl { \spath_transform:Nnnnnnn \l__tikzspath_joinpath_tl } \tl_gput_right:NV \g__tikzspath_smuggle_tl \l__tikzspath_tmpa_tl \group_end: \tl_use:N \g__tikzspath_smuggle_tl } \bool_if:NT \l__tikzspath_move_bool { \tl_if_empty:NTF \l__tikzspath_current_tl { \tl_set:Nn \l__tikzspath_tmpc_tl { {0pt} {0pt} } } { \spath_finalpoint:NV \l__tikzspath_tmpc_tl \l__tikzspath_current_tl } \spath_translate_to:NV \l__tikzspath_joinpath_tl \l__tikzspath_tmpc_tl } \tl_if_empty:NTF \l__tikzspath_current_tl { \tl_if_empty:NTF \l__tikzspath_joinpath_tl { \tl_set_eq:NN \l__tikzspath_current_tl \c_spath_moveto_tl \tl_put_right:Nn \l__tikzspath_current_tl {{0pt}{0pt}} } { \tl_set_eq:NN \l__tikzspath_current_tl \l__tikzspath_joinpath_tl } } { \tl_clear:N \l__tikzspath_tmpa_tl \tl_set:Nn \l__tikzspath_tmpa_tl {spath_} \tl_put_right:Nn \l__tikzspath_tmpa_tl {append} \bool_if:NT \l__tikzspath_weld_bool { \tl_put_right:Nn \l__tikzspath_tmpa_tl {_no_move} \spath_numberofcomponents:NV \l__tikzspath_tmpa_int \l__tikzspath_joinpath_tl \int_compare:nT {\l__tikzspath_tmpa_int == 1} { \bool_set_false:N \l_spath_movetorelevant_bool } } \tl_put_right:Nn \l__tikzspath_tmpa_tl {:NV} \use:c {\tl_use:N \l__tikzspath_tmpa_tl } \l__tikzspath_current_tl \l__tikzspath_joinpath_tl } \spath_set_current_path:N \l__tikzspath_current_tl \spath_set_tikz_data:V \l__tikzspath_joinpath_tl } \cs_generate_variant:Nn \__tikzspath_use_path:n {V, v} \cs_new_protected_nopar:Npn \__tikzspath_join_with:Nn #1#2 { \tl_set:Nn \l__tikzspath_joinpath_tl {#2} \bool_if:NT \l__tikzspath_reverse_bool { \spath_reverse:N \l__tikzspath_joinpath_tl } \tl_if_empty:NF \l__tikzspath_transformation_tl { \group_begin: \pgftransformreset \__tikzspath_tikzset:V \l__tikzspath_transformation_tl \pgfgettransform \l__tikzspath_tmpa_tl \tl_gset:Nn \g__tikzspath_smuggle_tl { \spath_transform:Nnnnnnn \l__tikzspath_joinpath_tl } \tl_gput_right:NV \g__tikzspath_smuggle_tl \l__tikzspath_tmpa_tl \group_end: \tl_use:N \g__tikzspath_smuggle_tl } \bool_if:NT \l__tikzspath_move_bool { \spath_finalpoint:NV \l__tikzspath_tmpc_tl #1 \spath_translate_to:NV \l__tikzspath_joinpath_tl \l__tikzspath_tmpc_tl } \tl_clear:N \l__tikzspath_tmpa_tl \tl_set:Nn \l__tikzspath_tmpa_tl {spath_} \bool_if:NT \l__tikzspath_global_bool { \tl_put_right:Nn \l__tikzspath_tmpa_tl {g} } \tl_put_right:Nn \l__tikzspath_tmpa_tl {append} \bool_if:NT \l__tikzspath_weld_bool { \tl_put_right:Nn \l__tikzspath_tmpa_tl {_no_move} } \tl_put_right:Nn \l__tikzspath_tmpa_tl {:NV} \cs_if_exist:cF {\tl_use:N \l__tikzspath_tmpa_tl} { \tl_show:N \l__tikzspath_tmpa_tl } \use:c {\tl_use:N \l__tikzspath_tmpa_tl } #1 \l__tikzspath_joinpath_tl } \cs_generate_variant:Nn \__tikzspath_join_with:Nn {cv, cn} \cs_new_protected_nopar:Npn \__tikzspath_join_components_with_aux:nnn #1#2#3 { \group_begin: \tl_set:Nn \l__tikzspath_tmpc_tl {#1} \tl_if_empty:nT {#3} { \spath_spot_weld_components:N \l__tikzspath_tmpc_tl } \spath_numberofcomponents:NV \l__tikzspath_tmpa_int \l__tikzspath_tmpc_tl \__tikzspath_seq_from_foreach:NVn \l__tikzspath_tmpb_seq \l__tikzspath_tmpa_int {#3} \spath_components_to_seq:NV \l__tikzspath_tmpa_seq \l__tikzspath_tmpc_tl \seq_pop_left:NN \l__tikzspath_tmpa_seq \l__tikzspath_tmpa_tl \seq_pop_left:NN \l__tikzspath_tmpb_seq \l__tikzspath_tmpb_tl \seq_map_indexed_inline:Nn \l__tikzspath_tmpa_seq { \int_compare:nTF { ##1 == \l__tikzspath_tmpb_tl } { \seq_pop_left:NNF \l__tikzspath_tmpb_seq \l__tikzspath_tmpb_tl { \tl_set:Nn \l__tikzspath_tmpb_tl {-1} } \spath_splice_between:Nnn \l__tikzspath_tmpa_tl {#2} {##2} } { \tl_put_right:Nn \l__tikzspath_tmpa_tl {##2} } } \tl_gset_eq:NN \g__tikzspath_output_tl \l__tikzspath_tmpa_tl \group_end: } \cs_new_protected_nopar:Npn \__tikzspath_join_components_with:Nnnn #1#2#3#4 { \__tikzspath_join_components_with_aux:nnn {#2}{#3}{#4} \tl_set_eq:NN #1 \g__tikzspath_output_tl \tl_gclear:N \g__tikzspath_output_tl } \cs_generate_variant:Nn \__tikzspath_join_components_with:Nnnn {NVnn} \cs_new_protected_nopar:Npn \__tikzspath_join_components_with:Nnn #1#2#3 { \__tikzspath_join_components_with:NVnn #1#1{#2}{#3} } \cs_generate_variant:Nn \__tikzspath_join_components_with:Nnn {cvV} \cs_new_protected_nopar:Npn \__tikzspath_gjoin_components_with:Nnnn #1#2#3#4 { \__tikzspath_join_components_with_aux:nnn {#2}{#3}{#4} \tl_gset_eq:NN #1 \g__tikzspath_output_tl \tl_gclear:N \g__tikzspath_output_tl } \cs_generate_variant:Nn \__tikzspath_gjoin_components_with:Nnnn {NVnn} \cs_new_protected_nopar:Npn \__tikzspath_gjoin_components_with:Nnn #1#2#3 { \__tikzspath_gjoin_components_with:NVnn #1#1{#2}{#3} } \cs_generate_variant:Nn \__tikzspath_gjoin_components_with:Nnn {cvV} \cs_new_protected_nopar:Npn \__tikzspath_join_components_upright_with_aux:nnn #1#2#3 { \group_begin: \tl_set:Nn \l__tikzspath_tmpc_tl {#1} \tl_if_empty:nT {#3} { \spath_spot_weld_components:N \l__tikzspath_tmpc_tl } \spath_numberofcomponents:NV \l__tikzspath_tmpa_int \l__tikzspath_tmpc_tl \__tikzspath_seq_from_foreach:NVn \l__tikzspath_tmpb_seq \l__tikzspath_tmpa_int {#3} \spath_components_to_seq:NV \l__tikzspath_tmpa_seq \l__tikzspath_tmpc_tl \seq_pop_left:NN \l__tikzspath_tmpa_seq \l__tikzspath_tmpa_tl \seq_pop_left:NN \l__tikzspath_tmpb_seq \l__tikzspath_tmpb_tl \tl_set:Nn \l__tikzspath_tmpc_tl {#2} \spath_transform:NVnnnnnn \l__tikzspath_tmpd_tl \l__tikzspath_tmpc_tl {1}{0}{0}{-1}{0pt}{0pt} \seq_map_indexed_inline:Nn \l__tikzspath_tmpa_seq { \int_compare:nTF { ##1 == \l__tikzspath_tmpb_tl } { \seq_pop_left:NNF \l__tikzspath_tmpb_seq \l__tikzspath_tmpb_tl { \tl_set:Nn \l__tikzspath_tmpb_tl {-1} } \spath_finalpoint:NV \l__tikzspath_tmpe_tl \l__tikzspath_tmpa_tl \spath_initialpoint:Nn \l__tikzspath_tmpf_tl {##2} \dim_compare:nTF { \tl_item:Nn \l__tikzspath_tmpe_tl {1} > \tl_item:Nn \l__tikzspath_tmpf_tl {1} } { \spath_splice_between:NVn \l__tikzspath_tmpa_tl \l__tikzspath_tmpd_tl {##2} } { \spath_splice_between:NVn \l__tikzspath_tmpa_tl \l__tikzspath_tmpc_tl {##2} } } { \tl_put_right:Nn \l__tikzspath_tmpa_tl {##2} } } \tl_gset_eq:NN \g__tikzspath_output_tl \l__tikzspath_tmpa_tl \group_end: } \cs_new_protected_nopar:Npn \__tikzspath_join_components_upright_with:Nnnn #1#2#3#4 { \__tikzspath_join_components_upright_with_aux:nnn {#2}{#3}{#4} \tl_set_eq:NN #1 \g__tikzspath_output_tl \tl_gclear:N \g__tikzspath_output_tl } \cs_generate_variant:Nn \__tikzspath_join_components_upright_with:Nnnn {NVnn} \cs_new_protected_nopar:Npn \__tikzspath_join_components_upright_with:Nnn #1#2#3 { \__tikzspath_join_components_upright_with:NVnn #1#1{#2}{#3} } \cs_generate_variant:Nn \__tikzspath_join_components_upright_with:Nnn {cvV} \cs_new_protected_nopar:Npn \__tikzspath_gjoin_components_upright_with:Nnnn #1#2#3#4 { \__tikzspath_join_components_upright_with_aux:nnn {#2}{#3}{#4} \tl_gset_eq:NN #1 \g__tikzspath_output_tl \tl_gclear:N \g__tikzspath_output_tl } \cs_generate_variant:Nn \__tikzspath_gjoin_components_upright_with:Nnnn {NVnn} \cs_new_protected_nopar:Npn \__tikzspath_gjoin_components_upright_with:Nnn #1#2#3 { \__tikzspath_gjoin_components_upright_with:NVnn #1#1{#2}{#3} } \cs_generate_variant:Nn \__tikzspath_gjoin_components_upright_with:Nnn {cvV} \cs_new_protected_nopar:Npn \__tikzspath_get_components_aux:n #1 { \clist_gclear_new:N \g__tikzspath_output_clist \spath_components_to_seq:Nn \l__tikzspath_tmpa_seq {#1} \seq_map_inline:Nn \l__tikzspath_tmpa_seq { \spath_anonymous:N \l__tikzspath_tmpa_tl \tl_new:c {\__tikzspath_path_name:V \l__tikzspath_tmpa_tl} \tl_set:cn {\__tikzspath_path_name:V \l__tikzspath_tmpa_tl} {##1} \clist_gput_right:NV \g__tikzspath_output_clist \l__tikzspath_tmpa_tl } } \cs_new_protected_nopar:Npn \__tikzspath_get_components:Nn #1#2 { \clist_clear_new:N #1 \__tikzspath_get_components_aux:n {#2} \clist_set_eq:NN #1 \g__tikzspath_output_clist \clist_gclear:N \g__tikzspath_output_clist } \cs_generate_variant:Nn \__tikzspath_get_components:Nn {NV, Nv} \cs_new_protected_nopar:Npn \__tikzspath_gget_components:Nn #1#2 { \clist_gclear_new:N #1 \__tikzspath_get_components_aux:n {#2} \clist_gset_eq:NN #1 \g__tikzspath_output_clist \clist_gclear:N \g__tikzspath_output_clist } \cs_generate_variant:Nn \__tikzspath_gget_components:Nn {NV, Nv} \cs_new_protected_nopar:Npn \__tikzspath_render_components:nn #1#2 { \group_begin: \spath_components_to_seq:Nn \l__tikzspath_tmpa_seq {#2} \seq_map_indexed_inline:Nn \l__tikzspath_tmpa_seq { \spath_tikz_path:nn { every~ spath~ component/.try, spath ~component~ ##1/.try, spath ~component/.try={##1}, every~ #1~ component/.try, #1 ~component~ ##1/.try, #1 ~component/.try={##1}, } { ##2 } } \group_end: } \cs_generate_variant:Nn \__tikzspath_render_components:nn {nv} \cs_new_protected_nopar:Npn \__tikzspath_insert_gaps_after_components_aux:nnn #1#2#3 { \group_begin: \spath_numberofcomponents:Nn \l__tikzspath_tmpa_int {#1} \__tikzspath_seq_from_foreach:NVn \l__tikzspath_tmpa_seq \l__tikzspath_tmpa_int {#3} \tl_if_empty:nT {#3} { \seq_pop_right:NN \l__tikzspath_tmpa_seq \l__tikzspath_tmpa_tl } \seq_clear:N \l__tikzspath_tmpb_seq \seq_map_inline:Nn \l__tikzspath_tmpa_seq { \seq_put_right:Nx \l__tikzspath_tmpb_seq {\int_eval:n { \int_mod:nn { ##1 }{ \l__tikzspath_tmpa_int } + 1 } } } \spath_components_to_seq:Nn \l__tikzspath_tmpc_seq {#1} \seq_clear:N \l__tikzspath_tmpd_seq \seq_map_indexed_inline:Nn \l__tikzspath_tmpc_seq { \tl_set:Nn \l__tikzspath_tmpa_tl {##2} \seq_if_in:NnT \l__tikzspath_tmpa_seq {##1} { \spath_shorten_at_end:Nn \l__tikzspath_tmpa_tl {(#2)/2} } \seq_if_in:NnT \l__tikzspath_tmpb_seq {##1} { \spath_shorten_at_start:Nn \l__tikzspath_tmpa_tl {(#2)/2} } \seq_put_right:NV \l__tikzspath_tmpd_seq \l__tikzspath_tmpa_tl } \tl_gset:Nx \g__tikzspath_output_tl {\seq_use:Nn \l__tikzspath_tmpd_seq {} } \group_end: } \cs_new_protected_nopar:Npn \__tikzspath_insert_gaps_after_components:Nnnn #1#2#3#4 { \__tikzspath_insert_gaps_after_components_aux:nnn {#2}{#3}{#4} \tl_set_eq:NN #1 \g__tikzspath_output_tl \tl_gclear:N \g__tikzspath_output_tl } \cs_generate_variant:Nn \__tikzspath_insert_gaps_after_components:Nnnn {NVnn} \cs_new_protected_nopar:Npn \__tikzspath_insert_gaps_after_components:Nnn #1#2#3 { \__tikzspath_insert_gaps_after_components:NVnn #1#1{#2}{#3} } \cs_generate_variant:Nn \__tikzspath_insert_gaps_after_components:Nnn {cnn, cVV} \cs_new_protected_nopar:Npn \__tikzspath_ginsert_gaps_after_components:Nnnn #1#2#3#4 { \__tikzspath_insert_gaps_after_components_aux:nnn {#2}{#3}{#4} \tl_gset_eq:NN #1 \g__tikzspath_output_tl \tl_gclear:N \g__tikzspath_output_tl } \cs_generate_variant:Nn \__tikzspath_ginsert_gaps_after_components:Nnnn {NVnn} \cs_new_protected_nopar:Npn \__tikzspath_ginsert_gaps_after_components:Nnn #1#2#3 { \__tikzspath_ginsert_gaps_after_components:NVnn #1#1{#2}{#3} } \cs_generate_variant:Nn \__tikzspath_ginsert_gaps_after_components:Nnn {cnn, cVV} \cs_new_protected_nopar:Npn \__tikzspath_insert_gaps_after_segments_aux:nnn #1#2#3 { \group_begin: \spath_reallength:Nn \l__tikzspath_tmpa_int {#1} \__tikzspath_seq_from_foreach:NVn \l__tikzspath_tmpa_seq \l__tikzspath_tmpa_int {#3} \tl_if_empty:nT {#3} { \seq_pop_right:NN \l__tikzspath_tmpb_seq \l__tikzspath_tmpa_tl } \seq_clear:N \l__tikzspath_tmpb_seq \seq_map_inline:Nn \l__tikzspath_tmpa_seq { \seq_put_right:Nx \l__tikzspath_tmpb_seq {\int_eval:n { \int_mod:nn { ##1 }{ \l__tikzspath_tmpa_int } + 1 } } } \spath_segments_to_seq:Nn \l__tikzspath_tmpc_seq {#1} \seq_clear:N \l__tikzspath_tmpd_seq \seq_map_indexed_inline:Nn \l__tikzspath_tmpc_seq { \tl_set:Nn \l__tikzspath_tmpa_tl {##2} \seq_if_in:NnT \l__tikzspath_tmpa_seq {##1} { \spath_shorten_at_end:Nn \l__tikzspath_tmpa_tl {(#2)/2} } \seq_if_in:NnT \l__tikzspath_tmpb_seq {##1} { \spath_shorten_at_start:Nn \l__tikzspath_tmpa_tl {(#2)/2} } \seq_put_right:NV \l__tikzspath_tmpd_seq \l__tikzspath_tmpa_tl } \tl_gset:Nx \g__tikzspath_output_tl {\seq_use:Nn \l__tikzspath_tmpd_seq {} } \group_end: } \cs_new_protected_nopar:Npn \__tikzspath_insert_gaps_after_segments:Nnnn #1#2#3#4 { \__tikzspath_insert_gaps_after_segments_aux:nnn {#2}{#3}{#4} \tl_set_eq:NN #1 \g__tikzspath_output_tl \tl_gclear:N \g__tikzspath_output_tl } \cs_generate_variant:Nn \__tikzspath_insert_gaps_after_segments:Nnnn {NVnn} \cs_new_protected_nopar:Npn \__tikzspath_insert_gaps_after_segments:Nnn #1#2#3 { \__tikzspath_insert_gaps_after_segments:NVnn #1#1{#2}{#3} } \cs_generate_variant:Nn \__tikzspath_insert_gaps_after_segments:Nnn {cnn, cVV} \cs_new_protected_nopar:Npn \__tikzspath_ginsert_gaps_after_segments:Nnnn #1#2#3#4 { \__tikzspath_insert_gaps_after_segments_aux:nnn {#2}{#3}{#4} \tl_gset_eq:NN #1 \g__tikzspath_output_tl \tl_gclear:N \g__tikzspath_output_tl } \cs_generate_variant:Nn \__tikzspath_ginsert_gaps_after_segments:Nnnn {NVnn} \cs_new_protected_nopar:Npn \__tikzspath_ginsert_gaps_after_segments:Nnn #1#2#3 { \__tikzspath_ginsert_gaps_after_segments:NVnn #1#1{#2}{#3} } \cs_generate_variant:Nn \__tikzspath_ginsert_gaps_after_segments:Nnn {cnn, cVV} \cs_new_protected_nopar:Npn \__tikzspath_join_components_aux:nn #1#2 { \group_begin: \tl_set:Nn \l__tikzspath_tmpa_tl {#1} \spath_numberofcomponents:NV \l__tikzspath_tmpa_int \l__tikzspath_tmpa_tl \__tikzspath_seq_from_foreach:NVn \l__tikzspath_tmpa_seq \l__tikzspath_tmpa_int {#2} \seq_reverse:N \l__tikzspath_tmpa_seq \seq_map_inline:Nn \l__tikzspath_tmpa_seq { \spath_join_component:Nn \l__tikzspath_tmpa_tl {##1} } \tl_gset_eq:NN \g__tikzspath_output_tl \l__tikzspath_tmpa_tl \group_end: } \cs_new_protected_nopar:Npn \__tikzspath_join_components:Nnn #1#2#3 { \__tikzspath_join_components_aux:nn {#2}{#3} \tl_set_eq:NN #1 \g__tikzspath_output_tl \tl_gclear:N \g__tikzspath_output_tl } \cs_generate_variant:Nn \__tikzspath_join_components:Nnn {NVn} \cs_new_protected_nopar:Npn \__tikzspath_join_components:Nn #1#2 { \__tikzspath_join_components:NVn #1#1{#2} } \cs_generate_variant:Nn \__tikzspath_join_components:Nn {cn} \cs_new_protected_nopar:Npn \__tikzspath_gjoin_components:Nnn #1#2#3 { \__tikzspath_join_components_aux:nn {#2}{#3} \tl_gset_eq:NN #1 \g__tikzspath_output_tl \tl_gclear:N \g__tikzspath_output_tl } \cs_generate_variant:Nn \__tikzspath_gjoin_components:Nnn {NVn} \cs_new_protected_nopar:Npn \__tikzspath_gjoin_components:Nn #1#2 { \__tikzspath_gjoin_components:NVn #1#1{#2} } \cs_generate_variant:Nn \__tikzspath_gjoin_components:Nn {cn} \cs_new_protected_nopar:Npn \__tikzspath_join_components_with_bezier_aux:nn #1#2 { \group_begin: \tl_set:Nn \l__tikzspath_tmpc_tl {#1} \tl_if_empty:nT {#2} { \spath_spot_weld_components:N \l__tikzspath_tmpc_tl } \spath_numberofcomponents:NV \l__tikzspath_tmpa_int \l__tikzspath_tmpc_tl \__tikzspath_seq_from_foreach:NVn \l__tikzspath_tmpb_seq \l__tikzspath_tmpa_int {#2} \spath_components_to_seq:NV \l__tikzspath_tmpa_seq \l__tikzspath_tmpc_tl \seq_pop_left:NN \l__tikzspath_tmpa_seq \l__tikzspath_tmpa_tl \seq_pop_left:NN \l__tikzspath_tmpb_seq \l__tikzspath_tmpb_tl \seq_map_indexed_inline:Nn \l__tikzspath_tmpa_seq { \int_compare:nTF { ##1 == \l__tikzspath_tmpb_tl } { \seq_pop_left:NNF \l__tikzspath_tmpb_seq \l__tikzspath_tmpb_tl { \tl_set:Nn \l__tikzspath_tmpb_tl {-1} } \spath_curve_between:Nn \l__tikzspath_tmpa_tl {##2} } { \tl_put_right:Nn \l__tikzspath_tmpa_tl {##2} } } \tl_gset_eq:NN \g__tikzspath_output_tl \l__tikzspath_tmpa_tl \group_end: } \cs_new_protected_nopar:Npn \__tikzspath_join_components_with_bezier:Nnn #1#2#3 { \__tikzspath_join_components_with_bezier_aux:nn {#2}{#3} \tl_set_eq:NN #1 \g__tikzspath_output_tl \tl_gclear:N \g__tikzspath_output_tl } \cs_generate_variant:Nn \__tikzspath_join_components_with_bezier:Nnn {NVn} \cs_new_protected_nopar:Npn \__tikzspath_join_components_with_bezier:Nn #1#2 { \__tikzspath_join_components_with_bezier:NVn #1#1{#2} } \cs_generate_variant:Nn \__tikzspath_join_components_with_bezier:Nn {cV} \cs_new_protected_nopar:Npn \__tikzspath_gjoin_components_with_bezier:Nnn #1#2#3 { \__tikzspath_join_components_with_bezier_aux:nn {#2}{#3} \tl_gset_eq:NN #1 \g__tikzspath_output_tl \tl_gclear:N \g__tikzspath_output_tl } \cs_generate_variant:Nn \__tikzspath_gjoin_components_with_bezier:Nnn {NVn} \cs_new_protected_nopar:Npn \__tikzspath_gjoin_components_with_bezier:Nn #1#2 { \__tikzspath_gjoin_components_with_bezier:NVn #1#1{#2} } \cs_generate_variant:Nn \__tikzspath_gjoin_components_with_bezier:Nn {cV} \cs_new_protected_nopar:Npn \__tikzspath_remove_components_aux:nn #1#2 { \group_begin: \spath_numberofcomponents:Nn \l__tikzspath_tmpa_int {#1} \__tikzspath_seq_from_foreach:NVn \l__tikzspath_tmpa_seq \l__tikzspath_tmpa_int {#2} \spath_components_to_seq:Nn \l__tikzspath_tmpb_seq {#1} \seq_pop_left:NNF \l__tikzspath_tmpa_seq \l__tikzspath_tmpa_tl { \tl_clear:N \l__tikzspath_tmpa_tl } \seq_clear:N \l__tikzspath_tmpc_seq \seq_map_indexed_inline:Nn \l__tikzspath_tmpb_seq { \tl_set:Nn \l__tikzspath_tmpb_tl {##1} \tl_if_eq:NNTF \l__tikzspath_tmpb_tl \l__tikzspath_tmpa_tl { \seq_pop_left:NNF \l__tikzspath_tmpa_seq \l__tikzspath_tmpa_tl { \tl_clear:N \l__tikzspath_tmpa_tl } } { \seq_put_right:Nn \l__tikzspath_tmpc_seq {##2} } } \tl_gset:Nx \g__tikzspath_output_tl {\seq_use:Nn \l__tikzspath_tmpc_seq {} } \group_end: } \cs_new_protected_nopar:Npn \__tikzspath_remove_components:Nnn #1#2#3 { \__tikzspath_remove_components_aux:nn {#2}{#3} \tl_set_eq:NN #1 \g__tikzspath_output_tl \tl_gclear:N \g__tikzspath_output_tl } \cs_generate_variant:Nn \__tikzspath_remove_components:Nnn {NVn} \cs_new_protected_nopar:Npn \__tikzspath_remove_components:Nn #1#2 { \__tikzspath_remove_components:NVn #1#1{#2} } \cs_generate_variant:Nn \__tikzspath_remove_components:Nn {cn} \cs_new_protected_nopar:Npn \__tikzspath_gremove_components:Nnn #1#2#3 { \__tikzspath_remove_components_aux:nn {#2}{#3} \tl_gset_eq:NN #1 \g__tikzspath_output_tl \tl_gclear:N \g__tikzspath_output_tl } \cs_generate_variant:Nn \__tikzspath_gremove_components:Nnn {NVn} \cs_new_protected_nopar:Npn \__tikzspath_gremove_components:Nn #1#2 { \__tikzspath_gremove_components:NVn #1#1{#2} } \cs_generate_variant:Nn \__tikzspath_gremove_components:Nn {cn} \cs_new_protected_nopar:Npn \__tikzspath_transform_to_aux:nn #1#2 { \group_begin: \spath_reallength:Nn \l__tikzspath_tmpa_int {#2} \tl_set:Nx \l__tikzspath_tmpb_tl {\fp_to_decimal:n {(#1) * (\l__tikzspath_tmpa_int)}} \spath_transformation_at:NnV \l__tikzspath_tmpc_tl {#2} \l__tikzspath_tmpb_tl \tl_gset_eq:NN \g__tikzspath_output_tl \l__tikzspath_tmpc_tl \group_end: } \cs_new_protected_nopar:Npn \__tikzspath_transform_to:nn #1#2 { \__tikzspath_transform_to_aux:nn {#1}{#2} \exp_last_unbraced:NV \pgfsettransformentries \g__tikzspath_output_tl \tl_gclear:N \g__tikzspath_output_tl } \cs_generate_variant:Nn \__tikzspath_transform_to:nn {nv} \cs_new_protected_nopar:Npn \__tikzspath_transform_upright_to:nn #1#2 { \__tikzspath_transform_to_aux:nn {#1}{#2} \fp_compare:nT { \tl_item:Nn \g__tikzspath_output_tl {4} < 0} { \tl_gset:Nx \g__tikzspath_output_tl { { \fp_eval:n { - (\tl_item:Nn \g__tikzspath_output_tl {1})} } { \fp_eval:n { - (\tl_item:Nn \g__tikzspath_output_tl {2})} } { \fp_eval:n { - (\tl_item:Nn \g__tikzspath_output_tl {3})} } { \fp_eval:n { - (\tl_item:Nn \g__tikzspath_output_tl {4})} } { \tl_item:Nn \g__tikzspath_output_tl {5} } { \tl_item:Nn \g__tikzspath_output_tl {6} } } } \exp_last_unbraced:NV \pgfsettransformentries \g__tikzspath_output_tl \tl_gclear:N \g__tikzspath_output_tl } \cs_generate_variant:Nn \__tikzspath_transform_upright_to:nn {nv} \tikzset{ spath/.is~family, spath/.cd, set~ prefix/.store~ in=\l__tikzspath_prefix_tl, prefix/.is~choice, prefix/default/.style={ /tikz/spath/set~ prefix=tikz@intersect@path@name@ }, set~ suffix/.store~ in=\l__tikzspath_suffix_tl, suffix/.is~choice, suffix/default/.style={ /tikz/spath/set~ suffix={} }, set~ name/.style={ /tikz/spath/prefix=#1, /tikz/spath/suffix=#1 }, at~ end~ path~ construction/.code={ \tl_put_right:Nn \l__tikzspath_tikzpath_finish_tl {#1} }, save/.code={ \tikz@addmode{ \spath_get_current_path:N \l__tikzspath_tmpa_tl \spath_bake_round:NV \l__tikzspath_tmpa_tl \l__tikzspath_tmpa_tl \spath_bake_shorten:NV \l__tikzspath_tmpa_tl \l__tikzspath_tmpa_tl \spath_save_path:cV {\__tikzspath_path_name:n {#1}} \l__tikzspath_tmpa_tl } }, save~ global/.code={ \tikz@addmode{ \spath_get_current_path:N \l__tikzspath_tmpa_tl \spath_bake_round:NV \l__tikzspath_tmpa_tl \l__tikzspath_tmpa_tl \spath_bake_shorten:NV \l__tikzspath_tmpa_tl \l__tikzspath_tmpa_tl \spath_gsave_path:cV {\__tikzspath_path_name:n {#1}} \l__tikzspath_tmpa_tl } }, clone/.code~ 2~ args={ \__tikzspath_maybe_current_path:nn { \__tikzspath_check_path:nnn { \tl_clear_new:c {\__tikzspath_path_name:n {#1}} \tl_set_eq:cc {\__tikzspath_path_name:n {#1}} } } {#2}{} }, clone~ global/.code~ 2~ args={ \__tikzspath_maybe_current_path:nn { \__tikzspath_check_path:nnn { \tl_gclear_new:c {\__tikzspath_path_name:n {#1}} \tl_gset_eq:cc {\__tikzspath_path_name:n {#1}} } } {#2}{} }, save~ to~ aux/.code={ \__tikzspath_maybe_current_path:nn { \__tikzspath_check_path:nnn { \spath_save_to_aux:c } } {#1} {} }, export~ to~ svg/.code={ \__tikzspath_maybe_current_path:nn { \__tikzspath_check_path:nnn { \spath_export_to_svg:nv {#1} } } {#1} {} }, use/.code={ \bool_set_false:N \l__tikzspath_reverse_bool \bool_set_false:N \l__tikzspath_weld_bool \bool_set_false:N \l__tikzspath_move_bool \bool_set_false:N \l__tikzspath_current_transformation_bool \bool_set_true:N \l_spath_movetorelevant_bool \tl_clear:N \l__tikzspath_joinpath_tl \tl_clear:N \l__tikzspath_transformation_tl \tikzset{ spath/join/.cd, #1 } \__tikzspath_check_path:nVn { \__tikzspath_use_path:v } \l__tikzspath_joinpath_tl {} }, restore/.style={/tikz/spath/use={#1}}, restore~ reverse/.style={/tikz/spath/use={reverse, #1}}, append/.style={/tikz/spath/use={move, weld, #1}}, append~ no~ move/.style={/tikz/spath/use={weld, #1}}, append~ reverse/.style={/tikz/spath/use={move, weld, reverse, #1}}, append~ reverse~ no~ move/.style={/tikz/spath/use={weld, reverse, #1}}, insert/.style={/tikz/spath/use={#1}}, insert~ reverse/.style={/tikz/spath/use={reverse, #1}}, show~current~path/.code={ \tikz@addmode{ \pgfsyssoftpath@getcurrentpath\l__tikzspath_tmpa_tl \iow_term:n {---~ current~ soft~ path~ ---} \spath_show:V \l__tikzspath_tmpa_tl } }, show/.code={ \__tikzspath_check_path:nnn { \iow_term:n {---~ soft~ path~ #1~ ---} \spath_show:v } {#1} {} }, join~ with/.code~ 2~ args={ \bool_set_false:N \l__tikzspath_reverse_bool \bool_set_false:N \l__tikzspath_weld_bool \bool_set_false:N \l__tikzspath_move_bool \bool_set_false:N \l__tikzspath_global_bool \bool_set_false:N \l__tikzspath_current_transformation_bool \tl_clear:N \l__tikzspath_joinpath_tl \tl_clear:N \l__tikzspath_transformation_tl \tikzset{ spath/join/.cd, #2 } \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_two_paths:nnVn { \__tikzspath_join_with:cv } } {#1} { \l__tikzspath_joinpath_tl {} } }, spot~ weld/.code={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_spot_weld_components:c } } {#1} { {} } }, spot~ weld~ globally/.code={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_spot_gweld_components:c } } {#1} { {} } }, reverse/.code={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_reverse:c } } {#1} { {} } }, reverse~ globally/.code={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_greverse:c } } {#1} { {} } }, span/.code ~n~ args={3}{ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \__tikzspath_process_tikz_point:Nn \l__tikzspath_tmpa_tl {#2} \__tikzspath_process_tikz_point:Nn \l__tikzspath_tmpb_tl {#3} \spath_span:cVV } } {#1} { {} \l__tikzspath_tmpa_tl \l__tikzspath_tmpb_tl } }, span~ global/.code ~n~ args={3}{ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \__tikzspath_process_tikz_point:Nn \l__tikzspath_tmpa_tl {#2} \__tikzspath_process_tikz_point:Nn \l__tikzspath_tmpb_tl {#3} \spath_span:cVV } } {#1} { {} \l__tikzspath_tmpa_tl \l__tikzspath_tmpb_tl } }, to/.style={ to~path={ [ spath/span={#1}{(\tikztostart)}{(\tikztotarget)}, spath/use={#1,weld}, ] \tikztonodes } }, splice/.code ~n~ args={3}{ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_three_paths:nnnnn { \spath_splice_between:cvv } } {#1} { {#2} {#3} {} } }, splice~ global/.code ~n~ args={3}{ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_three_paths:nnnnn { \spath_gsplice_between:cvv } } {#1} { {#2} {#3} {} } }, join~ components~ with/.code~2~args={ \tl_if_head_is_group:nTF {#2} { \tl_set:Nx \l__tikzspath_tmpc_tl { \tl_item:nn {#2} {1} } \tl_set:Nx \l__tikzspath_tmpd_tl { \tl_item:nn {#2} {2} } } { \tl_set:Nn \l__tikzspath_tmpc_tl {#2} \tl_clear:N \l__tikzspath_tmpd_tl } \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_two_paths:nnVn { \__tikzspath_join_components_with:cvV } } {#1} { \l__tikzspath_tmpc_tl {} \l__tikzspath_tmpd_tl } }, join~ components~ globally~ with/.code~2~args={ \tl_if_head_is_group:nTF {#2} { \tl_set:Nx \l__tikzspath_tmpc_tl { \tl_item:nn {#2} {1} } \tl_set:Nx \l__tikzspath_tmpd_tl { \tl_item:nn {#2} {2} } } { \tl_set:Nn \l__tikzspath_tmpc_tl {#2} \tl_clear:N \l__tikzspath_tmpd_tl } \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_two_paths:nnVn { \__tikzspath_gjoin_components_with:cvV } } {#1} { \l__tikzspath_tmpc_tl {} \l__tikzspath_tmpd_tl } }, join~ components~ upright~ with/.code~2~args={ \tl_if_head_is_group:nTF {#2} { \tl_set:Nx \l__tikzspath_tmpc_tl { \tl_item:nn {#2} {1} } \tl_set:Nx \l__tikzspath_tmpd_tl { \tl_item:nn {#2} {2} } } { \tl_set:Nn \l__tikzspath_tmpc_tl {#2} \tl_clear:N \l__tikzspath_tmpd_tl } \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_two_paths:nnVn { \__tikzspath_join_components_upright_with:cvV } } {#1} { \l__tikzspath_tmpc_tl {} \l__tikzspath_tmpd_tl } }, join~ components~ globally~ upright~ with/.code~2~args={ \tl_if_head_is_group:nTF {#2} { \tl_set:Nx \l__tikzspath_tmpc_tl { \tl_item:nn {#2} {1} } \tl_set:Nx \l__tikzspath_tmpd_tl { \tl_item:nn {#2} {2} } } { \tl_set:Nn \l__tikzspath_tmpc_tl {#2} \tl_clear:N \l__tikzspath_tmpd_tl } \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_two_paths:nnVn { \__tikzspath_gjoin_components_upright_with:cvV } } {#1} { \l__tikzspath_tmpc_tl {} \l__tikzspath_tmpd_tl } }, join~ components~ with~ bezier/.code={ \tl_if_head_is_group:nTF {#1} { \tl_set:Nx \l__tikzspath_tmpc_tl { \tl_item:nn {#1} {1} } \tl_set:Nx \l__tikzspath_tmpd_tl { \tl_item:nn {#1} {2} } } { \tl_set:Nn \l__tikzspath_tmpc_tl {#1} \tl_clear:N \l__tikzspath_tmpd_tl } \__tikzspath_maybe_current_path_reuse:nVn { \__tikzspath_check_path:nnn { \__tikzspath_join_components_with_bezier:cV } } \l__tikzspath_tmpc_tl { {} \l__tikzspath_tmpd_tl } }, join~ components~ globally~ with~ bezier/.code~2~args={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \__tikzspath_gjoin_components_with_bezier:cn } } {#1} { {} {#2} } }, close/.code={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_close:c } } {#1} { {} } }, close~ globally/.code={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_gclose:c } } {#1} { {} } }, open/.code={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_open:c } } {#1} { {} } }, open~ globally/.code={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_gopen:c } } {#1} { {} } }, adjust~ and~ close/.code={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_adjust_close:c } } {#1} { {} } }, adjust~ and~ close~ globally/.code={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_adjust_gclose:c } } {#1} { {} } }, close~ with/.code~ 2~ args={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_two_paths:nnnn { \spath_close_with:cv } } {#1} { {#2} {} } }, close~ globally~ with/.code~ 2~ args={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_two_paths:nnnn { \spath_gclose_with:cv } } {#1} { {#2} {} } }, close~ with~ curve/.code={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_close_with_curve:c } } {#1} { {} } }, close~ globally~ with~ curve/.code={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_gclose_with_curve:c } } {#1} { {} } }, shorten~ at~ end/.code~ 2~ args={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_shorten_at_end:cn } } {#1} { {} {#2} } }, shorten~ at~ start/.code~ 2~ args ={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_shorten_at_start:cn } } {#1} { {} {#2} } }, shorten~ at~ both~ ends/.code~ 2~ args={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_shorten_at_both_ends:cn } } {#1} { {} {#2} } }, shorten~ globally~ at~ end/.code~ 2~ args={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_gshorten_at_end:cn } } {#1} { {} {#2} } }, shorten~ globally~ at~ start/.code~ 2~ args ={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_gshorten_at_start:cn } } {#1} { {} {#2} } }, shorten~ globally~ at~ both~ ends/.code~ 2~ args={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_gshorten_at_both_ends:cn } } {#1} { {} {#2} } }, split~ at/.code~ 2~ args={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_split_at_normalised:cn } } {#1} { {} {#2} } }, split~ globally~ at/.code~ 2~ args={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_gsplit_at_normalised:cn } } {#1} { {} {#2} } }, split~ at~ into/.code~ n~ args={4}{ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_split_at_normalised:ccvn {\__tikzspath_path_name:n {#1}} {\__tikzspath_path_name:n {#2}} } } {#3} { {} {#4} } }, split~ globally~ at~ into/.code~ n~ args={4}{ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_gsplit_at_normalised:ccvn {\__tikzspath_path_name:n {#1}} {\__tikzspath_path_name:n {#2}} } } {#3} { {} {#4} } }, split~ at~ keep~ start/.code~ 2~ args={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_split_at_normalised_keep_start:cn } } {#1} { {} {#2} } }, split~ globally~ at~ keep~ start/.code~ 2~ args={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_gsplit_at_normalised_keep_start:cn } } {#1} { {} {#2} } }, split~ at~ keep~ end/.code~ 2~ args={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_split_at_normalised_keep_end:cn } } {#1} { {} {#2} } }, split~ globally~ at~ keep~ end/.code~ 2~ args={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_gsplit_at_normalised_keep_end:cn } } {#1} { {} {#2} } }, split~ at~ keep~ middle/.style~ n~ args={3}{ /tikz/spath/split~ at~ keep~ start={#1}{#3}, /tikz/spath/split~ at~ keep~ end={#1}{(#2)/(#3)}, }, split~ globally~ at~ keep~ middle/.style~ n~ args={3}{ /tikz/spath/split~ globally~ at~ keep~ start={#1}{#3}, /tikz/spath/split~ globally~ at~ keep~ end={#1}{(#2)/(#3)}, }, translate/.code~ n~ args={3}{ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_translate:cnn } } {#1} { {} {#2}{#3} } }, translate~ globally/.code~ n~ args={3}{ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_gtranslate:cnn } } {#1} { {} {#2}{#3} } }, normalise/.code={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_normalise:c } } {#1} { {} } }, normalise~ globally/.code={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_gnormalise:c } } {#1} { {} } }, transform/.code~ 2~ args={ \group_begin: \pgftransformreset \tikzset{#2} \pgfgettransform \l__tikzspath_tmpa_tl \tl_gset_eq:NN \g__tikzspath_smuggle_tl \l__tikzspath_tmpa_tl \group_end: \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_transform:cV } } {#1} { {} \g__tikzspath_smuggle_tl } }, transform~globally/.code~ 2~ args={ \group_begin: \pgftransformreset \tikzset{#2} \pgfgettransform \l__tikzspath_tmpa_tl \tl_gset_eq:NN \g__tikzspath_smuggle_tl \l__tikzspath_tmpa_tl \group_end: \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_gtransform:cV } } {#1} { {} \g__tikzspath_smuggle_tl } }, split~ at~ intersections~ with/.code~ 2~ args={ \tl_if_exist:cTF { tikz@library@intersections@loaded } { \__tikzspath_maybe_current_two_paths_reuse_first:nnnn { \__tikzspath_check_two_paths:nnnn { \spath_split_path_at_intersections:cv } } {#1} {#2} { {} } } { \msg_warning:nn { spath3 } { load intersections } } }, split~ globally~ at~ intersections~ with/.code~ n~ args={2}{ \tl_if_exist:cTF { tikz@library@intersections@loaded } { \__tikzspath_maybe_current_two_paths_reuse_first:nnnn { \__tikzspath_check_two_paths:nnnn { \spath_gsplit_path_at_intersections:cv } } {#1} {#2} { {} } } { \msg_warning:nn { spath3 } { load intersections } } }, split~ at~ intersections/.code~ n~ args={2}{ \tl_if_exist:cTF { tikz@library@intersections@loaded } { \__tikzspath_maybe_current_two_paths_reuse_both:nnnn { \__tikzspath_check_two_paths:nnnn { \spath_split_at_intersections:cc } } {#1} {#2} { {} } } { \msg_warning:nn { spath3 } { load intersections } } }, split~ globally~ at~ intersections/.code~ n~ args={2}{ \tl_if_exist:cTF { tikz@library@intersections@loaded } { \__tikzspath_maybe_current_two_paths_reuse_both:nnnn { \__tikzspath_check_two_paths:nnnn { \spath_gsplit_at_intersections:cc } } {#1} {#2} { {} } } { \msg_warning:nn { spath3 } { load intersections } } }, split~ at~ self~ intersections/.code={ \tl_if_exist:cTF { tikz@library@intersections@loaded } { \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_split_at_self_intersections:c } } {#1} { {} } } { \msg_warning:nn { spath3 } { load intersections } } }, split~ globally~ at~ self~ intersections/.code={ \tl_if_exist:cTF { tikz@library@intersections@loaded } { \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_gsplit_at_self_intersections:c } } {#1} { {} } } { \msg_warning:nn { spath3 } { load intersections } } }, get~ components~ of/.code~ 2~ args={ \__tikzspath_maybe_current_path:nn { \__tikzspath_check_path:nnn { \__tikzspath_get_components:Nv #2 } } {#1} {} }, get~ components~ of~ globally/.code~ 2~ args={ \__tikzspath_maybe_current_path:nn { \__tikzspath_check_path:nnn { \__tikzspath_gget_components:Nv #2 } } {#1} {} }, render~ components/.code={ \__tikzspath_maybe_current_path:nn { \__tikzspath_check_path:nnn { \__tikzspath_render_components:nv {#1} } } {#1} {} }, insert~ gaps~ after~ components/.code~ 2~ args={ \tl_if_head_is_group:nTF {#2} { \tl_set:Nx \l__tikzspath_tmpc_tl { \tl_item:nn {#2} {1} } \tl_set:Nx \l__tikzspath_tmpd_tl { \tl_item:nn {#2} {2} } } { \tl_set:Nn \l__tikzspath_tmpc_tl {#2} \tl_clear:N \l__tikzspath_tmpd_tl } \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \__tikzspath_insert_gaps_after_components:cVV } } {#1} { {} \l__tikzspath_tmpc_tl \l__tikzspath_tmpd_tl } }, insert~ gaps~ globally~ after~ components/.code~ 2~ args={ \tl_if_head_is_group:nTF {#2} { \tl_set:Nx \l__tikzspath_tmpc_tl { \tl_item:nn {#2} {1} } \tl_set:Nx \l__tikzspath_tmpd_tl { \tl_item:nn {#2} {2} } } { \tl_set:Nn \l__tikzspath_tmpc_tl {#2} \tl_clear:N \l__tikzspath_tmpd_tl } \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \__tikzspath_ginsert_gaps_after_components:cVV } } {#1} { {} \l__tikzspath_tmpc_tl \l__tikzspath_tmpd_tl } }, insert~ gaps~ after~ segments/.code~ 2~ args={ \tl_if_head_is_group:nTF {#2} { \tl_set:Nx \l__tikzspath_tmpc_tl { \tl_item:nn {#2} {1} } \tl_set:Nx \l__tikzspath_tmpd_tl { \tl_item:nn {#2} {2} } } { \tl_set:Nn \l__tikzspath_tmpc_tl {#2} \tl_clear:N \l__tikzspath_tmpd_tl } \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \__tikzspath_insert_gaps_after_segments:cVV } } {#1} { {} \l__tikzspath_tmpc_tl \l__tikzspath_tmpd_tl } }, insert~ gaps~ globally~ after~ segments/.code~ 2~ args={ \tl_if_head_is_group:nTF {#2} { \tl_set:Nx \l__tikzspath_tmpc_tl { \tl_item:nn {#2} {1} } \tl_set:Nx \l__tikzspath_tmpd_tl { \tl_item:nn {#2} {2} } } { \tl_set:Nn \l__tikzspath_tmpc_tl {#2} \tl_clear:N \l__tikzspath_tmpd_tl } \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \__tikzspath_ginsert_gaps_after_segments:cVV } } {#1} { {} \l__tikzspath_tmpc_tl \l__tikzspath_tmpd_tl } }, join~ components/.code~ 2~ args={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \__tikzspath_join_components:cn } } {#1} { {} {#2} } }, join~ components~ globally/.code~ 2~ args={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \__tikzspath_gjoin_components:cn } } {#1} { {} {#2} } }, remove~ empty~ components/.code={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_remove_empty_components:c } } {#1} { {} } }, remove~ empty~ components~ globally/.code={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_gremove_empty_components:c } } {#1} { {} } }, replace~ lines/.code={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_replace_lines:c } } {#1} { {} } }, replace~ lines~ globally/.code={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_greplace_lines:c } } {#1} { {} } }, remove~ components/.code~ 2~ args={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \__tikzspath_remove_components:cn } } {#1} { {} {#2} } }, remove~ components~ globally/.code~ 2~ args={ \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \__tikzspath_gremove_components:cn } } {#1} { {} {#2} } }, draft~ mode/.code={ \__tikzspath_set_bool:Nn \l__tikzspath_draft_bool {#1} }, maybe~ spot~ weld/.code={ \bool_if:NF \l__tikzspath_draft_bool { \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_spot_weld_components:c } } {#1} { {} } } }, maybe~ spot~ weld~ globally/.code={ \bool_if:NF \l__tikzspath_draft_bool { \__tikzspath_maybe_current_path_reuse:nnn { \__tikzspath_check_path:nnn { \spath_spot_gweld_components:c } } {#1} { {} } } }, transform~ to/.code~ 2~ args={ \__tikzspath_maybe_current_path:nn { \__tikzspath_check_path:nnn { \__tikzspath_transform_to:nv {#2} } } {#1} { \pgfsettransformentries {1}{0}{0}{1}{0pt}{0pt} } }, upright~ transform~ to/.code~ 2~ args={ \__tikzspath_maybe_current_path:nn { \__tikzspath_check_path:nnn { \__tikzspath_transform_upright_to:nv {#2} } } {#1} { \pgfsettransformentries {1}{0}{0}{1}{0pt}{0pt} } }, knot/.style~ n~ args={3}{ /tikz/spath/split~ at~ self~ intersections=#1, /tikz/spath/remove~ empty~ components=#1, /tikz/spath/insert~ gaps~ after~ components={#1}{#2}{#3}, /tikz/spath/maybe~ spot~ weld=#1, /tikz/spath/render~ components=#1 }, global~ knot/.style~ n~ args={3}{ /tikz/spath/split~ globally~ at~ self~ intersections=#1, /tikz/spath/remove~ empty~ components~ globally=#1, /tikz/spath/insert~ gaps~ globally ~after~ components={#1}{#2}{#3}, /tikz/spath/maybe~ spot~ weld~ globally=#1, /tikz/spath/render~ components=#1 }, arrow~ shortening/.code={ \__tikzspath_set_bool:Nn \l_spath_arrow_shortening_bool {#1} }, show/.default=current, spot~ weld/.default=current, spot~ weld~ globally/.default=current, reverse/.default=current, reverse~ globally/.default=current, close/.default=current, close~ globally/.default=current, open/.default=current, open~ globally/.default=current, adjust~ and~ close/.default=current, adjust~ and~ close~ globally/.default=current, close~ with~ curve/.default=current, close~ globally~ with~ curve/.default=current, remove~ empty~ components/.default=current, remove~ empty~ components~ globally/.default=current, replace~ lines/.default=current, replace~ lines~ globally/.default=current, maybe~ spot~ weld/.default=current, maybe~ spot~ weld~ globally/.default=current, } \cs_new_protected_nopar:Npn \__tikzspath_get_point_at:nn #1#2 { \group_begin: \spath_reallength:Nn \l__tikzspath_tmpa_int {#2} \tl_set:Nx \l__tikzspath_tmpb_tl {\fp_to_decimal:n {(#1) * (\l__tikzspath_tmpa_int)}} \spath_point_at:NnV \l__tikzspath_tmpc_tl {#2} \l__tikzspath_tmpb_tl \tl_clear:N \l__tikzspath_tmpd_tl \tl_put_right:Nn \l__tikzspath_tmpd_tl {\pgf@x=} \tl_put_right:Nx \l__tikzspath_tmpd_tl {\tl_item:Nn \l__tikzspath_tmpc_tl {1}} \tl_put_right:Nn \l__tikzspath_tmpd_tl {\relax} \tl_put_right:Nn \l__tikzspath_tmpd_tl {\pgf@y=} \tl_put_right:Nx \l__tikzspath_tmpd_tl {\tl_item:Nn \l__tikzspath_tmpc_tl {2}} \tl_put_right:Nn \l__tikzspath_tmpd_tl {\relax} \tl_gset_eq:NN \g__tikzspath_output_tl \l__tikzspath_tmpd_tl \group_end: } \cs_generate_variant:Nn \__tikzspath_get_point_at:nn {VV, Vn, Vv} \tikzdeclarecoordinatesystem{spath}{% \group_begin: \tl_set:Nn \l__tikzspath_tmpa_tl {#1} \tl_trim_spaces:N \l__tikzspath_tmpa_tl \seq_set_split:NnV \l__tikzspath_tmpa_seq {~} \l__tikzspath_tmpa_tl \seq_pop_right:NN \l__tikzspath_tmpa_seq \l__tikzspath_tmpb_tl \tl_set:Nx \l__tikzspath_tmpa_tl { \seq_use:Nn \l__tikzspath_tmpa_seq {~} } \__tikzspath_maybe_current_path:nV { \__tikzspath_check_path:nnn { \__tikzspath_get_point_at:Vv \l__tikzspath_tmpb_tl } } \l__tikzspath_tmpa_tl { \tl_gset_eq:NN \g__tikzspath_output_tl \pgfpointorigin } \group_end: \use:c {pgf@process}{% \tl_use:N \g__tikzspath_output_tl \pgftransforminvert \use:c {pgf@pos@transform@glob} } \tl_gclear:N \g__tikzspath_output_tl } \ExplSyntaxOff %% %% Copyright (C) 2011-2024 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.txt %% %% %% End of file `tikzlibraryspath3.code.tex'.