From 658facdfe16a2d2b43c7312b9b15bebbf3c89d8e Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sat, 13 Apr 2013 22:56:07 +0000 Subject: hobby (13apr13) git-svn-id: svn://tug.org/texlive/trunk@29895 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/tex/latex/hobby/hobby.code.tex | 419 ++++++++++++--- .../tex/latex/hobby/pgflibraryhobby.code.tex | 179 ++++++- Master/texmf-dist/tex/latex/hobby/pml3array.sty | 161 +++++- .../tex/latex/hobby/tikzlibraryhobby.code.tex | 594 +++++++++++++++------ 4 files changed, 1078 insertions(+), 275 deletions(-) (limited to 'Master/texmf-dist/tex/latex') diff --git a/Master/texmf-dist/tex/latex/hobby/hobby.code.tex b/Master/texmf-dist/tex/latex/hobby/hobby.code.tex index 70555c1973c..18c3409d5a3 100644 --- a/Master/texmf-dist/tex/latex/hobby/hobby.code.tex +++ b/Master/texmf-dist/tex/latex/hobby/hobby.code.tex @@ -18,6 +18,8 @@ \RequirePackage{pml3array} \ExplSyntaxOn \cs_generate_variant:Nn \fp_set:Nn {Nx} +\cs_generate_variant:Nn \tl_if_eq:nnTF {VnTF} +\cs_generate_variant:Nn \tl_if_eq:nnTF {xnTF} \fp_new:N \g_hobby_parama_fp \fp_new:N \g_hobby_paramb_fp \fp_new:N \g_hobby_paramc_fp @@ -32,6 +34,7 @@ \array_new:N \l_hobby_points_array \array_new:N \l_hobby_points_x_array \array_new:N \l_hobby_points_y_array +\array_new:N \l_hobby_actions_array \array_new:N \l_hobby_angles_array \array_new:N \l_hobby_distances_array \array_new:N \l_hobby_tension_out_array @@ -64,34 +67,79 @@ \fp_new:N \l_hobby_out_angle_fp \fp_set_eq:NN \l_hobby_out_angle_fp \c_undefined_fp \int_new:N \l_hobby_npoints_int +\int_new:N \l_hobby_draw_int \keys_define:nn {hobby / read in all} { x .fp_set:N = \l_hobby_tempa_fp, y .fp_set:N = \l_hobby_tempb_fp, tension~out .fp_set:N = \l_hobby_tempc_fp, tension~in .fp_set:N = \l_hobby_tempd_fp, excess~angle .fp_set:N = \l_hobby_temps_fp, + break .tl_set:N = \l_tmpb_tl, + blank .tl_set:N = \l_tmpa_tl, tension .meta:n = { tension~out=#1, tension~in=#1 }, + break .default:n = false, + blank .default:n = false, + invert~soft~blanks .choice:, + invert~soft~blanks / true .code:n = { + \int_gset:Nn \l_hobby_draw_int {0} + }, + invert~soft~blanks / false .code:n = { + \int_gset:Nn \l_hobby_draw_int {1} + }, + invert~soft~blanks .default:n = true, tension~out .default:n = 1, tension~in .default:n = 1, excess~angle .default:n = 0, - in~angle .fp_set:N = \l_hobby_in_angle_fp, - out~angle .fp_set:N = \l_hobby_out_angle_fp, - in~curl .fp_set:N = \l_hobby_in_curl_fp, - out~curl .fp_set:N = \l_hobby_out_curl_fp, - closed .bool_set:N = \l_hobby_closed_bool, + in~angle .fp_gset:N = \l_hobby_in_angle_fp, + out~angle .fp_gset:N = \l_hobby_out_angle_fp, + in~curl .fp_gset:N = \l_hobby_in_curl_fp, + out~curl .fp_gset:N = \l_hobby_out_curl_fp, + closed .bool_gset:N = \l_hobby_closed_bool, closed .default:n = true, - disjoint .bool_set:N = \l_hobby_disjoint_bool, + disjoint .bool_gset:N = \l_hobby_disjoint_bool, disjoint .default:n = true, + break~default .code:n = { + \keys_define:nn { hobby / read in all } + { + break .default:n = #1 + } + }, + blank~default .code:n = { + \keys_define:nn { hobby / read in all } + { + blank .default:n = #1 + } + }, } \keys_define:nn { hobby / read in params} { - in~angle .fp_set:N = \l_hobby_in_angle_fp, - out~angle .fp_set:N = \l_hobby_out_angle_fp, - in~curl .fp_set:N = \l_hobby_in_curl_fp, - out~curl .fp_set:N = \l_hobby_out_curl_fp, - closed .bool_set:N = \l_hobby_closed_bool, + in~angle .fp_gset:N = \l_hobby_in_angle_fp, + out~angle .fp_gset:N = \l_hobby_out_angle_fp, + in~curl .fp_gset:N = \l_hobby_in_curl_fp, + out~curl .fp_gset:N = \l_hobby_out_curl_fp, + closed .bool_gset:N = \l_hobby_closed_bool, closed .default:n = true, - disjoint .bool_set:N = \l_hobby_disjoint_bool, + disjoint .bool_gset:N = \l_hobby_disjoint_bool, disjoint .default:n = true, + break~default .code:n = { + \keys_define:nn { hobby / read in all } + { + break .default:n = #1 + } + }, + blank~default .code:n = { + \keys_define:nn { hobby / read in all } + { + blank .default:n = #1 + } + }, + invert~soft~blanks .choice:, + invert~soft~blanks / true .code:n = { + \int_gset:Nn \l_hobby_draw_int {0} + }, + invert~soft~blanks / false .code:n = { + \int_gset:Nn \l_hobby_draw_int {1} + }, + invert~soft~blanks .default:n = true, } \cs_set:Nn \hobby_distangle:n { \fp_set:Nn \l_hobby_tempa_fp { @@ -132,10 +180,11 @@ \hobby_append_point_copy_aux:Nn \l_hobby_tension_in_array {#1} \hobby_append_point_copy_aux:Nn \l_hobby_tension_out_array {#1} \hobby_append_point_copy_aux:Nn \l_hobby_excess_angle_array {#1} + \hobby_append_point_copy_aux:Nn \l_hobby_actions_array {#1} } \cs_new_protected:Npn \hobby_append_point_copy_aux:Nn #1#2 - { \array_push:Nx #1 { \array_get:Nn #1 {#2} } } -\cs_new:Nn \hobby_genpath: + { \array_gpush:Nx #1 { \array_get:Nn #1 {#2} } } +\cs_new:Nn \hobby_gen_path: { \bool_if:NT \l_hobby_closed_bool { \fp_compare:nTF {(\array_get:Nn \l_hobby_points_x_array {0}) @@ -156,10 +205,69 @@ } \hobby_append_point_copy:n {1} } -\int_set:Nn \l_hobby_npoints_int {\array_length:N \l_hobby_points_y_array} +\int_gset:Nn \l_hobby_npoints_int {\array_length:N \l_hobby_points_y_array} +\int_compare:nNnTF {\l_hobby_npoints_int} = {0} { +} +{ + \int_compare:nNnTF {\l_hobby_npoints_int} = {1} { +\hobby_distangle:n {0} +\fp_if_undefined:NF \l_hobby_out_angle_fp +{ + \fp_set:Nn \l_hobby_tempa_fp { \l_hobby_out_angle_fp + - \array_get:Nn \l_hobby_angles_array {0} } + \fp_compare:nT {\l_hobby_tempa_fp > \c_pi_fp } + { + \fp_sub:Nn \l_hobby_tempa_fp {2 * \c_pi_fp} + } + \fp_compare:nT {\l_hobby_tempa_fp < -\c_pi_fp } + { + \fp_add:Nn \l_hobby_tempa_fp {2 * \c_pi_fp} + } + \array_put:Nnx \l_hobby_theta_array {0} {\fp_to_tl:N \l_hobby_tempa_fp} + \fp_if_undefined:NT \l_hobby_in_angle_fp + { + \array_put:Nnx \l_hobby_phi_array {1}{ \fp_to_tl:N \l_hobby_tempa_fp} + } + } +\fp_if_undefined:NTF \l_hobby_in_angle_fp +{ + \fp_if_undefined:NT \l_hobby_out_angle_fp + { + \array_put:Nnx \l_hobby_phi_array {1} {0} + \array_put:Nnx \l_hobby_theta_array {0} {0} + } +} +{ + \fp_set:Nn \l_hobby_tempa_fp { - \l_hobby_in_angle_fp + \c_pi_fp ++ (\array_get:Nn \l_hobby_angles_array {0})} + \fp_compare:nT {\l_hobby_tempa_fp > \c_pi_fp } + { + \fp_sub:Nn \l_hobby_tempa_fp {2 * \c_pi_fp} + } + \fp_compare:nT {\l_hobby_tempa_fp < -\c_pi_fp } + { + \fp_add:Nn \l_hobby_tempa_fp {2 * \c_pi_fp} + } -\prg_stepwise_function:nnnN {0} {1} {\l_hobby_npoints_int - 1} \hobby_distangle:n - \prg_stepwise_inline:nnnn {1} {1} {\l_hobby_npoints_int - 1} { + \array_put:Nnx \l_hobby_phi_array {1} + {\fp_to_tl:N \l_hobby_tempa_fp} + \fp_if_undefined:NT \l_hobby_out_angle_fp + { + \array_put:Nnx \l_hobby_theta_array {0}{ \fp_to_tl:N \l_hobby_tempa_fp} + } +} + + } + { + \hobby_compute_path: + } + \hobby_build_path: +} +} +\cs_new:Nn \hobby_compute_path: +{ +\int_step_function:nnnN {0} {1} {\l_hobby_npoints_int - 1} \hobby_distangle:n + \int_step_inline:nnnn {1} {1} {\l_hobby_npoints_int - 1} { \fp_set:Nx \l_hobby_tempa_fp { \array_get:Nn \l_hobby_angles_array {##1} - \array_get:Nn \l_hobby_angles_array {##1 - 1}} @@ -178,14 +286,14 @@ }{} \array_put:Nnx \l_hobby_psi_array {##1}{\fp_to_tl:N \l_hobby_tempa_fp} } - \prg_stepwise_inline:nnnn {1} {1} {\l_hobby_npoints_int - 1} { + \int_step_inline:nnnn {1} {1} {\l_hobby_npoints_int - 1} { \array_put:Nnx \l_hobby_matrix_a_array {##1} {\fp_to_tl:n { \array_get:Nn \l_hobby_tension_in_array {##1}^2 * \array_get:Nn \l_hobby_distances_array {##1} * \array_get:Nn \l_hobby_tension_in_array {##1 + 1} }} } - \prg_stepwise_inline:nnnn {1} {1} {\l_hobby_npoints_int - 1} { + \int_step_inline:nnnn {1} {1} {\l_hobby_npoints_int - 1} { \array_put:Nnx \l_hobby_matrix_b_array {##1} {\fp_to_tl:n {(3 * (\array_get:Nn \l_hobby_tension_in_array {##1 + 1}) - 1) * @@ -199,7 +307,7 @@ * (\array_get:Nn \l_hobby_distances_array {##1})} } } - \prg_stepwise_inline:nnnn {1} {1} {\l_hobby_npoints_int - 2} { + \int_step_inline:nnnn {1} {1} {\l_hobby_npoints_int - 2} { \array_put:Nnx \l_hobby_matrix_c_array {##1} {\fp_to_tl:n {(\array_get:Nn \l_hobby_tension_in_array {##1})^2 @@ -208,7 +316,7 @@ }} } - \prg_stepwise_inline:nnnn {1} {1} {\l_hobby_npoints_int - 2} { + \int_step_inline:nnnn {1} {1} {\l_hobby_npoints_int - 2} { \array_put:Nnx \l_hobby_matrix_d_array {##1} {\fp_to_tl:n { @@ -253,7 +361,7 @@ } \array_put:Nnn \l_hobby_vector_u_array {0} {1} \array_put:Nnn \l_hobby_vector_u_array {\l_hobby_npoints_int - 1} {1} - \prg_stepwise_inline:nnnn {1} {1} {\l_hobby_npoints_int - 2} { + \int_step_inline:nnnn {1} {1} {\l_hobby_npoints_int - 2} { \array_put:Nnn \l_hobby_vector_u_array {##1} {0} } \fp_set:Nn \l_hobby_matrix_v_fp { @@ -365,7 +473,7 @@ * (\array_get:Nn \l_hobby_distances_array {\l_hobby_npoints_int - 1}) }} } } -\prg_stepwise_inline:nnnn {1} {1} {\l_hobby_npoints_int - 1} { +\int_step_inline:nnnn {1} {1} {\l_hobby_npoints_int - 1} { \array_put:Nnx \l_hobby_matrix_b_array {##1} {\fp_to_tl:n { (\array_get:Nn \l_hobby_matrix_b_array {##1 - 1}) @@ -409,7 +517,7 @@ / (\array_get:Nn \l_hobby_matrix_b_array {\l_hobby_npoints_int - 1}) }} } -\prg_stepwise_inline:nnnn {\l_hobby_npoints_int - 2} {-1} {0} { +\int_step_inline:nnnn {\l_hobby_npoints_int - 2} {-1} {0} { \array_put:Nnx \l_hobby_theta_array {##1} {\fp_to_tl:n { ( (\array_get:Nn \l_hobby_matrix_d_array {##1}) @@ -419,7 +527,7 @@ }} } \bool_if:NT \l_hobby_closed_bool { -\prg_stepwise_inline:nnnn {\l_hobby_npoints_int - 2} {-1} {0} { +\int_step_inline:nnnn {\l_hobby_npoints_int - 2} {-1} {0} { \array_put:Nnx \l_hobby_vector_u_array {##1} {\fp_to_tl:n { ((\array_get:Nn \l_hobby_vector_u_array {##1}) @@ -440,7 +548,7 @@ + 1 )} -\prg_stepwise_inline:nnnn {0} {1} {\l_hobby_npoints_int - 1} { +\int_step_inline:nnnn {0} {1} {\l_hobby_npoints_int - 1} { \array_put:Nnx \l_hobby_theta_array {##1} {\fp_to_tl:n { (\array_get:Nn \l_hobby_theta_array {##1}) @@ -449,7 +557,7 @@ }} } } -\prg_stepwise_inline:nnnn {1} {1} {\l_hobby_npoints_int - 1} { +\int_step_inline:nnnn {1} {1} {\l_hobby_npoints_int - 1} { \array_put:Nnx \l_hobby_phi_array {##1} {\fp_to_tl:n { - (\array_get:Nn \l_hobby_psi_array {##1}) @@ -457,7 +565,7 @@ }} } \bool_if:NTF \l_hobby_closed_bool { - \int_decr:N \l_hobby_npoints_int + \int_gdecr:N \l_hobby_npoints_int }{ \fp_if_undefined:NT \l_hobby_in_angle_fp { @@ -478,7 +586,10 @@ }} } } -\prg_stepwise_inline:nnnn {0} {1} {\l_hobby_npoints_int - 1} { +} +\cs_new:Nn \hobby_build_path: +{ +\int_step_inline:nnnn {0} {1} {\l_hobby_npoints_int - 1} { \fp_set:Nn \l_hobby_tempa_fp {\array_get:Nn \l_hobby_theta_array {##1}} @@ -493,9 +604,8 @@ \array_put:Nnx \l_hobby_rho_array {##1} {\fp_to_tl:N \l_hobby_temps_fp} } -\prg_stepwise_inline:nnnn {0} {1} {\l_hobby_npoints_int - 1} { - -\array_put:Nnx \l_hobby_controla_array {##1 + 1} {x = \fp_eval:n { +\int_step_inline:nnnn {0} {1} {\l_hobby_npoints_int - 1} { +\array_gput:Nnx \l_hobby_controla_array {##1 + 1} {x = \fp_eval:n { (\array_get:Nn \l_hobby_points_x_array {##1}) + (\array_get:Nn \l_hobby_distances_array {##1}) * @@ -515,9 +625,8 @@ sin ( (\array_get:Nn \l_hobby_angles_array {##1}) } } } - -\prg_stepwise_inline:nnnn {1} {1} {\l_hobby_npoints_int} { - \array_put:Nnx \l_hobby_controlb_array {##1} { +\int_step_inline:nnnn {1} {1} {\l_hobby_npoints_int} { + \array_gput:Nnx \l_hobby_controlb_array {##1} { x = \fp_eval:n {\array_get:Nn \l_hobby_points_x_array {##1} - (\array_get:Nn \l_hobby_distances_array {##1 - 1}) * (\array_get:Nn \l_hobby_sigma_array {##1}) @@ -533,35 +642,8 @@ sin ( (\array_get:Nn \l_hobby_angles_array {##1}) } } \NewDocumentCommand \hobbyinit {m m m} { -\hobby_set_cmds:nnn#1#2#3 -\array_clear:N \l_hobby_points_array -\array_clear:N \l_hobby_points_x_array -\array_clear:N \l_hobby_points_y_array -\array_clear:N \l_hobby_angles_array -\array_clear:N \l_hobby_distances_array -\array_clear:N \l_hobby_tension_out_array -\array_clear:N \l_hobby_tension_in_array -\array_clear:N \l_hobby_excess_angle_array -\array_clear:N \l_hobby_matrix_a_array -\array_clear:N \l_hobby_matrix_b_array -\array_clear:N \l_hobby_matrix_c_array -\array_clear:N \l_hobby_matrix_d_array -\array_clear:N \l_hobby_vector_u_array -\array_clear:N \l_hobby_psi_array -\array_clear:N \l_hobby_theta_array -\array_clear:N \l_hobby_phi_array -\array_clear:N \l_hobby_sigma_array -\array_clear:N \l_hobby_rho_array -\array_clear:N \l_hobby_controla_array -\array_clear:N \l_hobby_controlb_array -\bool_set_false:N \l_hobby_closed_bool -\bool_set_false:N \l_hobby_disjoint_bool - - \int_set:Nn \l_hobby_npoints_int {-1} - \fp_set_eq:NN \l_hobby_in_angle_fp \c_undefined_fp - \fp_set_eq:NN \l_hobby_out_angle_fp \c_undefined_fp - \fp_set_eq:NN \l_hobby_in_curl_fp \c_one_fp - \fp_set_eq:NN \l_hobby_out_curl_fp \c_one_fp + \hobby_set_cmds:nnn#1#2#3 + \hobby_clear_path: } \NewDocumentCommand \hobbyaddpoint { m } { \keys_set:nn { hobby/read in all } @@ -569,16 +651,29 @@ sin ( (\array_get:Nn \l_hobby_angles_array {##1}) tension~out, tension~in, excess~angle, + blank, + break, #1 } - \array_push:Nx \l_hobby_tension_out_array {\fp_to_tl:N \l_hobby_tempc_fp} - \array_push:Nx \l_hobby_tension_in_array {\fp_to_tl:N \l_hobby_tempd_fp} - \array_push:Nx \l_hobby_excess_angle_array {\fp_to_tl:N \l_hobby_temps_fp} - \array_push:Nx \l_hobby_points_array { + \tl_if_eq:VnTF {\l_tmpa_tl} {true} + {\tl_set:Nn \l_tmpa_tl {2}} + { + \tl_if_eq:VnTF {\l_tmpa_tl} {soft} + {\tl_set:Nn \l_tmpa_tl {0}} + {\tl_set:Nn \l_tmpa_tl {1}} + } + \tl_if_eq:VnTF {\l_tmpb_tl} {true} + {\tl_put_right:Nn \l_tmpa_tl {1}} + {\tl_put_right:Nn \l_tmpa_tl {0}} + \array_gpush:Nx \l_hobby_actions_array {\l_tmpa_tl} + \array_gpush:Nx \l_hobby_tension_out_array {\fp_to_tl:N \l_hobby_tempc_fp} + \array_gpush:Nx \l_hobby_tension_in_array {\fp_to_tl:N \l_hobby_tempd_fp} + \array_gpush:Nx \l_hobby_excess_angle_array {\fp_to_tl:N \l_hobby_temps_fp} + \array_gpush:Nx \l_hobby_points_array { x = \fp_use:N \l_hobby_tempa_fp, y = \fp_use:N \l_hobby_tempb_fp } - \array_push:Nx \l_hobby_points_x_array {\fp_to_tl:N \l_hobby_tempa_fp} - \array_push:Nx \l_hobby_points_y_array {\fp_to_tl:N \l_hobby_tempb_fp} + \array_gpush:Nx \l_hobby_points_x_array {\fp_to_tl:N \l_hobby_tempa_fp} + \array_gpush:Nx \l_hobby_points_y_array {\fp_to_tl:N \l_hobby_tempb_fp} } \NewDocumentCommand \hobbysetparams { m } { \keys_set:nn { hobby / read in params } @@ -587,28 +682,196 @@ sin ( (\array_get:Nn \l_hobby_angles_array {##1}) } } \cs_new:Nn \hobby_set_cmds:nnn { - \cs_set_eq:NN \hobby_moveto:n #1 - \cs_set_eq:NN \hobby_curveto:nnn #2 - \cs_set_eq:NN \hobby_close:n #3 + \cs_gset_eq:NN \hobby_moveto:n #1 + \cs_gset_eq:NN \hobby_curveto:nnn #2 + \cs_gset_eq:NN \hobby_close:n #3 } -\tl_new:N \l_tmpc_tl \NewDocumentCommand \hobbygenpath { } { - \hobby_genpath: + \array_if_empty:NF \l_hobby_points_array { + \hobby_gen_path: + } +} +\NewDocumentCommand \hobbygenifnecpath { m } { + \tl_if_exist:cTF {g_hobby_#1_path} + { + \tl_use:c {g_hobby_#1_path} + } + { + \hobby_gen_path: + } + \hobby_save_path:n {#1} + \hobby_save_path_to_aux:x {#1} +} +\NewDocumentCommand \hobbygenuseifnecpath { m } { + \tl_if_exist:cTF {g_hobby_#1_path} + { + \tl_use:c {g_hobby_#1_path} + } + { + \hobby_gen_path: + } + \hobby_save_path:n {#1} + \hobby_save_path_to_aux:x {#1} + \hobby_use_path: +} +\NewDocumentCommand \hobbyusepath { m } { + \hobbysetparams{#1} + \hobby_use_path: +} +\NewDocumentCommand \hobbysavepath { m } { + \hobby_save_path:n {#1} +} +\NewDocumentCommand \hobbyrestorepath { m } { + \tl_if_exist:cT {g_hobby_#1_path} { + \tl_use:c {g_hobby_#1_path} + } +} +\NewDocumentCommand \hobbyshowpath { m } { + \tl_if_exist:cT {g_hobby_#1_path} { + \tl_show:c {g_hobby_#1_path} + } +} +\NewDocumentCommand \hobbygenusepath { } { + \array_if_empty:NF \l_hobby_points_array { + \hobby_gen_path: + \hobby_use_path: + } +} +\NewDocumentCommand \hobbyclearpath { } { + \hobby_clear_path: +} +\tl_new:N \l_tmpc_tl +\cs_new:Nn \hobby_use_path: { \bool_if:NT \l_hobby_disjoint_bool { \array_get:NnN \l_hobby_points_array {0} \l_tmpa_tl \exp_args:No \hobby_moveto:n {\l_tmpa_tl} } - \prg_stepwise_inline:nnnn {1} {1} {\l_hobby_npoints_int} { + \int_step_inline:nnnn {1} {1} {\l_hobby_npoints_int} { \array_get:NnN \l_hobby_controla_array {##1} \l_tmpa_tl \array_get:NnN \l_hobby_controlb_array {##1} \l_tmpb_tl \array_get:NnN \l_hobby_points_array {##1} \l_tmpc_tl - \exp_args:Nooo \hobby_curveto:nnn {\l_tmpa_tl} {\l_tmpb_tl} {\l_tmpc_tl} -} + \array_get:NnN \l_hobby_actions_array {##1} \l_tmpd_tl + \int_compare:nNnTF {\tl_item:Nn \l_tmpd_tl {1}} = {\l_hobby_draw_int} { + \exp_args:Nooo \hobby_curveto:nnn {\l_tmpa_tl} {\l_tmpb_tl} {\l_tmpc_tl} + }{ + \bool_gset_false:N \l_hobby_closed_bool + \exp_args:No \hobby_moveto:n {\l_tmpc_tl} + } + \tl_if_eq:xnTF {\tl_item:Nn \l_tmpd_tl {2}} {1} { + \bool_gset_false:N \l_hobby_closed_bool + \exp_args:No \hobby_moveto:n {\l_tmpc_tl} + }{} + } \bool_if:NT \l_hobby_closed_bool { \array_get:NnN \l_hobby_points_array {0} \l_tmpa_tl \exp_args:No \hobby_close:n {\l_tmpa_tl} } } +\cs_new:Nn \hobby_save_path:n { + \tl_clear:N \l_tmpa_tl + \tl_put_right:Nn \l_tmpa_tl {\int_gset:Nn \l_hobby_npoints_int} + \tl_put_right:Nx \l_tmpa_tl {{\int_use:N \l_hobby_npoints_int}} + \bool_if:NTF \l_hobby_disjoint_bool { + \tl_put_right:Nn \l_tmpa_tl {\bool_gset_true:N} + }{ + \tl_put_right:Nn \l_tmpa_tl {\bool_gset_false:N} + } + \tl_put_right:Nn \l_tmpa_tl {\l_hobby_disjoint_bool} + \bool_if:NTF \l_hobby_closed_bool { + \tl_put_right:Nn \l_tmpa_tl {\bool_gset_true:N} + }{ + \tl_put_right:Nn \l_tmpa_tl {\bool_gset_false:N} + } + \tl_put_right:Nn \l_tmpa_tl {\l_hobby_closed_bool} + \tl_put_right:Nn \l_tmpa_tl {\array_gclear:N \l_hobby_points_array} + \array_map_inline:Nn \l_hobby_points_array { + \tl_put_right:Nn \l_tmpa_tl { + \array_gput:Nnn \l_hobby_points_array {##1} {##2} + } + } + \tl_put_right:Nn \l_tmpa_tl {\array_gclear:N \l_hobby_actions_array} + \array_map_inline:Nn \l_hobby_actions_array { + \tl_put_right:Nn \l_tmpa_tl { + \array_gput:Nnn \l_hobby_actions_array {##1} {##2} + } + } + \tl_put_right:Nn \l_tmpa_tl {\array_gclear:N \l_hobby_controla_array} + \array_map_inline:Nn \l_hobby_controla_array { + \tl_put_right:Nn \l_tmpa_tl { + \array_gput:Nnn \l_hobby_controla_array {##1} {##2} + } + } + \tl_put_right:Nn \l_tmpa_tl {\array_gclear:N \l_hobby_controlb_array} + \array_map_inline:Nn \l_hobby_controlb_array { + \tl_put_right:Nn \l_tmpa_tl { + \array_gput:Nnn \l_hobby_controlb_array {##1} {##2} + } + } + \tl_gclear_new:c {g_hobby_#1_path} + \tl_gset_eq:cN {g_hobby_#1_path} \l_tmpa_tl +} +\int_set:Nn \l_tmpa_int {\char_value_catcode:n {`@}} +\char_set_catcode_letter:N @ +\cs_new:Npn \hobby_save_path_to_aux:n #1 { + \bool_if:nT { + \tl_if_exist_p:c {g_hobby_#1_path} + && + ! \tl_if_exist_p:c {g_hobby_#1_path_saved} + } + { + \tl_clear:N \l_tmpa_tl + \tl_put_right:Nn \l_tmpa_tl { + \ExplSyntaxOn + \tl_gclear_new:c {g_hobby_#1_path} + \tl_gput_right:cn {g_hobby_#1_path} + } + \tl_put_right:Nx \l_tmpa_tl { + {\tl_to_str:c {g_hobby_#1_path}} + } + \tl_put_right:Nn \l_tmpa_tl { + \ExplSyntaxOff + } + \protected@write\@auxout{}{ + \tl_to_str:N \l_tmpa_tl + } + \tl_new:c {g_hobby_#1_path_saved} + } +} +\char_set_catcode:nn {`@} {\l_tmpa_int} +\cs_generate_variant:Nn \hobby_save_path_to_aux:n {x} +\cs_new:Nn \hobby_clear_path: +{ +\array_gclear:N \l_hobby_points_array +\array_gclear:N \l_hobby_points_x_array +\array_gclear:N \l_hobby_points_y_array +\array_gclear:N \l_hobby_angles_array +\array_gclear:N \l_hobby_actions_array +\array_gclear:N \l_hobby_distances_array +\array_gclear:N \l_hobby_tension_out_array +\array_gclear:N \l_hobby_tension_in_array +\array_gclear:N \l_hobby_excess_angle_array +\array_gclear:N \l_hobby_matrix_a_array +\array_gclear:N \l_hobby_matrix_b_array +\array_gclear:N \l_hobby_matrix_c_array +\array_gclear:N \l_hobby_matrix_d_array +\array_gclear:N \l_hobby_vector_u_array +\array_gclear:N \l_hobby_psi_array +\array_gclear:N \l_hobby_theta_array +\array_gclear:N \l_hobby_phi_array +\array_gclear:N \l_hobby_sigma_array +\array_gclear:N \l_hobby_rho_array +\array_gclear:N \l_hobby_controla_array +\array_gclear:N \l_hobby_controlb_array +\bool_gset_false:N \l_hobby_closed_bool +\bool_gset_false:N \l_hobby_disjoint_bool + + \int_gset:Nn \l_hobby_npoints_int {-1} + \int_gset:Nn \l_hobby_draw_int {1} + \fp_gset_eq:NN \l_hobby_in_angle_fp \c_undefined_fp + \fp_gset_eq:NN \l_hobby_out_angle_fp \c_undefined_fp + \fp_gset_eq:NN \l_hobby_in_curl_fp \c_one_fp + \fp_gset_eq:NN \l_hobby_out_curl_fp \c_one_fp +} \ExplSyntaxOff %% %% Copyright (C) 2012 by Andrew Stacey diff --git a/Master/texmf-dist/tex/latex/hobby/pgflibraryhobby.code.tex b/Master/texmf-dist/tex/latex/hobby/pgflibraryhobby.code.tex index 3e4e609dae9..5d0f4a91996 100644 --- a/Master/texmf-dist/tex/latex/hobby/pgflibraryhobby.code.tex +++ b/Master/texmf-dist/tex/latex/hobby/pgflibraryhobby.code.tex @@ -18,7 +18,7 @@ /pgf/hobby/.is family, /pgf/hobby/.cd, x/.code={\pgf@x=#1cm}, - y/.code={\pgf@y=#1cm}, + y/.code={\pgf@y=#1cm} } \def\hobby@curveto#1#2#3{% \pgfpathcurveto{\hobby@topgf{#1}}{\hobby@topgf{#2}}{\hobby@topgf{#3}}% @@ -32,6 +32,183 @@ \def\hobby@close#1{% \pgfpathclose } +\def\pgfplothandlerhobby{% + \def\pgf@plotstreamstart{% + \hobbyinit\hobby@moveto\hobby@curveto\hobby@close + \global\let\pgf@plotstreampoint=\pgf@plot@hobby@firstpt + \global\let\pgf@plotstreamspecial=\pgfutil@gobble + \gdef\pgf@plotstreamend{% + \ifhobby@externalise + \ifx\hobby@path@name\pgfutil@empty + \hobbygenusepath + \else + \hobbygenuseifnecpath{\hobby@path@name}% + \fi + \else + \hobbygenusepath + \fi + \ifx\hobby@path@name\pgfutil@empty + \else + \hobbysavepath{\hobby@path@name}% + \fi + \global\let\hobby@path@name=\pgfutil@empty + }% + \let\tikz@scan@point@options=\pgfutil@empty + } +} +\def\pgfplothandlerclosedhobby{% + \def\pgf@plotstreamstart{% + \hobbyinit\hobby@moveto\hobby@curveto\hobby@close + \hobbysetparams{closed=true,disjoint=true}% + \global\let\pgf@plotstreampoint=\pgf@plot@hobby@firstpt + \global\let\pgf@plotstreamspecial=\pgfutil@gobble + \gdef\pgf@plotstreamend{% + \ifhobby@externalise + \ifx\hobby@path@name\pgfutil@empty + \hobbygenusepath + \else + \hobbygenuseifnecpath{\hobby@path@name}% + \fi + \else + \hobbygenusepath + \fi + \ifx\hobby@path@name\pgfutil@empty + \else + \hobbysavepath{\hobby@path@name}% + \fi + \global\let\hobby@path@name=\pgfutil@empty + }% + } +} +\def\pgf@plot@hobby@firstpt#1{% + \pgf@plot@first@action{#1}% + \pgf@plot@hobby@handler{#1}% + \global\let\pgf@plotstreampoint=\pgf@plot@hobby@handler +} +\def\pgf@plot@hobby@handler#1{% + #1% + \pgfmathsetmacro\hobby@x{\the\pgf@x/1cm}% + \pgfmathsetmacro\hobby@y{\the\pgf@y/1cm}% + \hobbyaddpoint{x = \hobby@x, y = \hobby@y}% + } +\def\pgfplothandlerquickhobby{% + \def\pgf@plotstreamstart{% + \global\let\hobby@quick@curveto=\pgfpathcurveto + \global\let\pgf@plotstreampoint=\pgf@plot@qhobby@firstpt + \global\let\pgf@plotstreamspecial=\pgfutil@gobble + \global\let\pgf@plotstreamend=\pgf@plot@qhobby@end + } +} +\def\pgf@plot@qhobby@firstpt#1{% + #1% + \edef\hobby@temp{\noexpand\pgf@plot@first@action{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}}\hobby@temp% + \xdef\hobby@qpoints{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}% + \gdef\hobby@qpointa{}% + \gdef\hobby@angle{}% + \global\let\pgf@plotstreampoint=\pgf@plot@qhobby@secondpt +} +\def\pgf@plot@qhobby@secondpt#1{% + #1% + \xdef\hobby@qpointa{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}% + \global\let\pgf@plotstreampoint=\pgf@plot@qhobby@handler +} +\def\pgf@plot@qhobby@handler#1{% + #1 + \edef\hobby@temp{\noexpand\hobby@quick@compute{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}}\hobby@temp + \global\let\hobby@qpointa=\hobby@qpointa + \global\let\hobby@qpoints=\hobby@qpoints + \global\let\hobby@angle=\hobby@angle + \global\let\hobby@thetaone=\hobby@thetaone + \global\let\hobby@phitwo=\hobby@phitwo + \global\let\hobby@done=\hobby@done + \global\let\hobby@omegaone=\hobby@omegaone +} +\def\pgf@plot@qhobby@end{% + \hobby@quick@computeend +} +\pgfmathsetmacro\hobby@sf{10cm} +\def\hobby@quick@compute#1{% + #1% + \pgf@xb=\pgf@x + \pgf@yb=\pgf@y + \hobby@qpointa + \pgf@xa=\pgf@x + \pgf@ya=\pgf@y + \advance\pgf@xb by -\pgf@xa + \advance\pgf@yb by -\pgf@ya + \pgfmathsetmacro\hobby@done{sqrt((\pgf@xb/\hobby@sf)^2 + (\pgf@yb/\hobby@sf)^2)}% + \pgfmathsetmacro\hobby@omegaone{rad(atan2(\pgf@xb,\pgf@yb))}% + \hobby@qpoints + \advance\pgf@xa by -\pgf@x + \advance\pgf@ya by -\pgf@y + \pgfmathsetmacro\hobby@dzero{sqrt((\pgf@xa/\hobby@sf)^2 + (\pgf@ya/\hobby@sf)^2)}% + \pgfmathsetmacro\hobby@omegazero{rad(atan2(\pgf@xa,\pgf@ya))}% + \pgfmathsetmacro\hobby@psi{\hobby@omegaone - \hobby@omegazero}% + \pgfmathsetmacro\hobby@psi{\hobby@psi > pi ? \hobby@psi - 2*pi : \hobby@psi}% + \pgfmathsetmacro\hobby@psi{\hobby@psi < -pi ? \hobby@psi + 2*pi : \hobby@psi}% + \ifx\hobby@angle\pgfutil@empty + \pgfmathsetmacro\hobby@thetaone{-\hobby@psi * \hobby@done% +/(\hobby@done + \hobby@dzero)}% + \pgfmathsetmacro\hobby@thetazero{-\hobby@psi - \hobby@thetaone}% + \let\hobby@phione=\hobby@thetazero + \let\hobby@phitwo=\hobby@thetaone + \else + \let\hobby@thetazero=\hobby@angle + \pgfmathsetmacro\hobby@thetaone{% + -(2 * \hobby@psi + \hobby@thetazero) * \hobby@done% + / (2 * \hobby@done + \hobby@dzero)}% + \pgfmathsetmacro\hobby@phione{-\hobby@psi - \hobby@thetaone}% + \let\hobby@phitwo=\hobby@thetaone + \fi + \let\hobby@angle=\hobby@thetaone + \hobby@quick@ctrlpts{\hobby@thetazero}{\hobby@phione}{\hobby@qpoints}{\hobby@qpointa}{\hobby@dzero}{\hobby@omegazero}% + \edef\hobby@temp{\noexpand\hobby@quick@curveto{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}{\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}}% +\hobby@temp + \global\let\hobby@qpoints=\hobby@qpointa + #1 + \xdef\hobby@qpointa{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}% + \global\let\hobby@angle=\hobby@angle + \global\let\hobby@phitwo=\hobby@phitwo + \global\let\hobby@thetaone=\hobby@thetaone +\global\let\hobby@done=\hobby@done +\global\let\hobby@omegaone=\hobby@omegaone +} +\def\hobby@quick@computeend{% + \hobby@quick@ctrlpts{\hobby@thetaone}{\hobby@phitwo}{\hobby@qpoints}{\hobby@qpointa}{\hobby@done}{\hobby@omegaone}% + \edef\hobby@temp{\noexpand\hobby@quick@curveto{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}{\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}}% +\hobby@temp +}% +\def\hobby@quick@ctrlpts#1#2#3#4#5#6{% + \pgfmathsetmacro\hobby@alpha{% + sqrt(2) * (sin(#1 r) - 1/16 * sin(#2 r))% +* (sin(#2 r) - 1/16 * sin(#1 r))% + * (cos(#1 r) - cos(#2 r))}% + \pgfmathsetmacro\hobby@rho{% + (2 + \hobby@alpha)/(1 + (1 - (3 - sqrt(5))/2)% + * cos(#1 r) + (3 - sqrt(5))/2 * cos(#2 r))}% + \pgfmathsetmacro\hobby@sigma{% + (2 - \hobby@alpha)/(1 + (1 - (3 - sqrt(5))/2)% + * cos(#2 r) + (3 - sqrt(5))/2 * cos(#1 r))}% + #3% + \pgf@xa=\pgf@x + \pgf@ya=\pgf@y + \pgfmathsetlength\pgf@xa{% + \pgf@xa + #5 * \hobby@rho% + * cos((#1 + #6) r)/3*\hobby@sf}% + \pgfmathsetlength\pgf@ya{% + \pgf@ya + #5 * \hobby@rho% + * sin((#1 + #6) r)/3*\hobby@sf}% + #4% + \pgf@xb=\pgf@x + \pgf@yb=\pgf@y + \pgfmathsetlength\pgf@xb{% + \pgf@xb - #5 * \hobby@sigma% + * cos((-#2 + #6) r)/3*\hobby@sf}% + \pgfmathsetlength\pgf@yb{% + \pgf@yb - #5 * \hobby@sigma% + * sin((-#2 + #6) r)/3*\hobby@sf}% + #4% +} %% %% Copyright (C) 2012 by Andrew Stacey %% diff --git a/Master/texmf-dist/tex/latex/hobby/pml3array.sty b/Master/texmf-dist/tex/latex/hobby/pml3array.sty index e704e4c41ab..3aeb1e6849b 100644 --- a/Master/texmf-dist/tex/latex/hobby/pml3array.sty +++ b/Master/texmf-dist/tex/latex/hobby/pml3array.sty @@ -46,11 +46,40 @@ \prop_put:Nnx #1 {top} {\int_eval:n {#2}} } } +\cs_new:Npn \array_gadjust_ends:Nn #1#2 { + \prop_get:NnNTF #1 {base} \l_tmpa_tl + { + \int_compare:nNnTF {\l_tmpa_tl} > {#2} + { + \prop_gput:Nnx #1 {base} {\int_eval:n {#2}} + } + {} + } + { + \prop_gput:Nnx #1 {base} {\int_eval:n {#2}} + } + \prop_get:NnNTF #1 {top} \l_tmpa_tl + { + \int_compare:nNnTF {\l_tmpa_tl} < {#2} + { + \prop_gput:Nnx #1 {top} {\int_eval:n {#2}} + } + {} + } + { + \prop_gput:Nnx #1 {top} {\int_eval:n {#2}} + } +} \cs_new:Npn \array_put:Nnn #1#2#3 { \exp_args:NNx \prop_put:Nnn #1 {\int_eval:n {#2}} {#3} \array_adjust_ends:Nn #1{#2} } \cs_generate_variant:Nn \array_put:Nnn {Nnx} +\cs_new:Npn \array_gput:Nnn #1#2#3 { + \exp_args:NNx \prop_gput:Nnn #1 {\int_eval:n {#2}} {#3} + \array_gadjust_ends:Nn #1{#2} +} +\cs_generate_variant:Nn \array_gput:Nnn {Nnx} \cs_new:Npn \array_get:NnN #1#2#3 { \exp_args:NNx \prop_get:NnN #1 {\int_eval:n {#2}} #3 } @@ -60,9 +89,17 @@ \cs_new:Npn \array_get:NnNTF #1#2#3#4#5 { \exp_args:NNx \prop_get:NnNTF #1 {\int_eval:n {#2}} #3 {#4}{#5} } -\cs_new_eq:NN \array_if_empty:NTF \prop_if_empty:NTF +\prg_new_conditional:Npnn \array_if_empty:N #1 { p, T, F, TF } +{ + \if_meaning:w #1 \c_empty_prop + \prg_return_true: + \else: + \prg_return_false: + \fi: +} \cs_new_eq:NN \array_new:N \prop_new:N \cs_new_eq:NN \array_clear:N \prop_clear:N +\cs_new_eq:NN \array_gclear:N \prop_gclear:N \cs_new:Npn \array_map_function:NN #1#2 { \array_if_empty:NTF #1 {} { @@ -76,9 +113,9 @@ }{ \int_set:Nn \l_array_top_int {0} } - \prg_stepwise_inline:nnnn {\l_array_base_int} {1} {\l_array_top_int} { + \int_step_inline:nnnn {\l_array_base_int} {1} {\l_array_top_int} { \array_get:NnN #1 {##1} \l_array_tmp_tl - \exp_args:Nno #2 {##1} \l_array_tmp_tl + \exp_args:NnV #2 {##1} \l_array_tmp_tl } } {} } @@ -97,7 +134,7 @@ }{ \int_set:Nn \l_array_top_int {0} } - \prg_stepwise_inline:nnnn {\l_array_top_int} {-1} {\l_array_base_int} { + \int_step_inline:nnnn {\l_array_top_int} {-1} {\l_array_base_int} { \array_get:NnN #1 {##1} \l_array_tmp_tl \exp_args:Nno #2 {##1} \l_array_tmp_tl } @@ -107,25 +144,29 @@ \cs_generate_variant:Nn \array_reverse_map_function:NN { c , cc } \cs_new_protected:Npn \array_map_inline:Nn #1#2 { - \int_gincr:N \g_prg_map_int - \cs_gset:cpn { array_map_inline_ \int_use:N \g_prg_map_int :nn } + \int_gincr:N \g__prg_map_int + \cs_gset:cpn { array_map_inline_ \int_use:N \g__prg_map_int :nn } ##1##2 {#2} \exp_args:NNc \array_map_function:NN #1 - { array_map_inline_ \int_use:N \g_prg_map_int :nn } - \prg_break_point:n { \int_gdecr:N \g_prg_map_int } + { array_map_inline_ \int_use:N \g__prg_map_int :nn } + \__prg_break_point:Nn \array_map_break: { \int_gdecr:N \g__prg_map_int } } \cs_generate_variant:Nn \array_map_inline:Nn { c } \cs_new_protected:Npn \array_reverse_map_inline:Nn #1#2 { - \int_gincr:N \g_prg_map_int - \cs_gset:cpn { array_map_inline_ \int_use:N \g_prg_map_int :nn } + \int_gincr:N \g__prg_map_int + \cs_gset:cpn { array_map_inline_ \int_use:N \g__prg_map_int :nn } ##1##2 {#2} \exp_args:NNc \array_reverse_map_function:NN #1 - { array_map_inline_ \int_use:N \g_prg_map_int :nn } - \prg_break_point:n { \int_gdecr:N \g_prg_map_int } + { array_map_inline_ \int_use:N \g__prg_map_int :nn } + \__prg_break_point:Nn \array_map_break: { \int_gdecr:N \g__prg_map_int } } \cs_generate_variant:Nn \array_reverse_map_inline:Nn { c } -\msg_new:nnn { array } { show } +\cs_new_nopar:Npn \array_map_break: + { \__prg_map_break:Nn \array_map_break: { } } +\cs_new_nopar:Npn \array_map_break:n + { \__prg_map_break:Nn \array_map_break: } +\__msg_kernel_new:nnn { kernel } { show-array } { The~array~\token_to_str:N #1~ \array_if_empty:NTF #1 @@ -136,15 +177,16 @@ { \tl_clear:N \l_array_show_tl \array_map_function:NN #1 \array_show_aux:nn - \__msg_show_variable:Nnx + \__msg_show_variable:Nno #1 { array } - { \l_array_show_tl } + { \l_array_show_tl } } +\cs_generate_variant:Nn \__msg_show_variable:Nnn { Nno } \cs_new_protected:Npn \array_show_aux:nn #1#2 { - \tl_if_eq:NNTF {#2} {\q_no_value} {} + \tl_if_eq:nnTF {#2} {\q_no_value} {} { \tl_put_right:No \l_array_show_tl {\__msg_show_item:nn {#1}{#2}} } @@ -163,6 +205,19 @@ } } \cs_generate_variant:Nn \array_push:Nn {Nx} +\cs_new_protected:Npn \array_gpush:Nn #1#2 +{ + \prop_get:NnNTF #1 {top} \l_array_tmp_tl + { + \int_set:Nn \l_array_tmp_int {\l_array_tmp_tl} + \int_incr:N \l_array_tmp_int + \array_gput:Nnn #1 {\l_array_tmp_int} {#2} + } + { + \array_gput:Nnn #1 {\g_array_base_int} {#2} + } +} +\cs_generate_variant:Nn \array_gpush:Nn {Nx} \cs_new_protected:Npn \array_unshift:Nn #1#2 { \prop_get:NnNTF #1 {base} \l_array_tmp_tl @@ -176,18 +231,43 @@ } } \cs_generate_variant:Nn \array_unshift:Nn {Nx} +\cs_new_protected:Npn \array_gunshift:Nn #1#2 +{ + \prop_get:NnNTF #1 {base} \l_array_tmp_tl + { + \int_set:Nn \l_array_tmp_int {\l_array_tmp_tl} + \int_decr:N \l_array_tmp_int + \array_gput:Nnn #1 {\l_array_tmp_int} {#2} + } + { + \array_gput:Nnn #1 {\g_array_base_int} {#2} + } +} +\cs_generate_variant:Nn \array_gunshift:Nn {Nx} \cs_new_protected:Npn \array_pop:NN #1#2 { \prop_get:NnN #1 {top} \l_array_tmp_tl \array_get:NnN #1 {\l_array_tmp_tl} #2 \array_del:Nn #1 {\l_array_tmp_tl} } +\cs_new_protected:Npn \array_gpop:NN #1#2 +{ + \prop_get:NnN #1 {top} \l_array_tmp_tl + \array_get:NnN #1 {\l_array_tmp_tl} #2 + \array_gdel:Nn #1 {\l_array_tmp_tl} +} \cs_new_protected:Npn \array_shift:NN #1#2 { \prop_get:NnN #1 {base} \l_array_tmp_tl \array_get:NnN #1 {\l_array_tmp_tl} #2 \array_del:Nn #1 {\l_array_tmp_tl} } +\cs_new_protected:Npn \array_gshift:NN #1#2 +{ + \prop_get:NnN #1 {base} \l_array_tmp_tl + \array_get:NnN #1 {\l_array_tmp_tl} #2 + \array_gdel:Nn #1 {\l_array_tmp_tl} +} \cs_new_protected:Npn \array_top:NN #1#2 { \prop_get:NnN #1 {top} \l_array_tmp_tl @@ -208,7 +288,7 @@ } \cs_new_protected:Npn \array_del:Nn #1#2 { - \exp_args:NNx \prop_del:Nn #1 {\int_eval:n {#2}} + \exp_args:NNx \prop_pop:Nn #1 {\int_eval:n {#2}} \int_set:Nn \l_array_tmp_int {0} \array_map_inline:Nn #1 { \tl_if_eq:NNTF {##2} {\q_no_value} {} @@ -237,7 +317,7 @@ }{} \prop_get:NnN #1 {base} \l_array_tmp_tl \int_compare:nNnTF {#2} = {\l_array_tmp_tl} { -p \prop_get:NnN #1 {top} \l_array_tmp_tl + \prop_get:NnN #1 {top} \l_array_tmp_tl \int_set:Nn \l_array_tmp_int {\l_array_tmp_tl} \array_map_inline:Nn #1 { \tl_if_eq:NNTF {##2} {\q_no_value} {} @@ -251,6 +331,51 @@ p \prop_get:NnN #1 {top} \l_array_tmp_tl }{} } } +\cs_new_protected:Npn \array_gdel:Nn #1#2 +{ + \exp_args:NNx \prop_gpop:Nn #1 {\int_eval:n {#2}} + \int_set:Nn \l_array_tmp_int {0} + \array_map_inline:Nn #1 { + \tl_if_eq:NNTF {##2} {\q_no_value} {} + { + \int_incr:N \l_array_tmp_int + } + } + \int_compare:nNnTF {\l_array_tmp_int} = {0} + { + \prop_gclear:N #1 + } + { + \prop_get:NnN #1 {top} \l_array_tmp_tl + \int_compare:nNnTF {#2} = {\l_array_tmp_tl} { + \prop_get:NnN #1 {base} \l_array_tmp_tl + \int_set:Nn \l_array_tmp_int {\l_array_tmp_tl} + \array_map_inline:Nn #1 { + \tl_if_eq:NNTF {##2} {\q_no_value} {} + { + \int_compare:nNnTF {\l_array_tmp_int} < {##1} { + \int_set:Nn \l_array_tmp_int {##1} + }{} + } + } + \prop_gput:Nnx #1 {top} {\int_use:N \l_array_tmp_int} + }{} + \prop_get:NnN #1 {base} \l_array_tmp_tl + \int_compare:nNnTF {#2} = {\l_array_tmp_tl} { + \prop_get:NnN #1 {top} \l_array_tmp_tl + \int_set:Nn \l_array_tmp_int {\l_array_tmp_tl} + \array_map_inline:Nn #1 { + \tl_if_eq:NNTF {##2} {\q_no_value} {} + { + \int_compare:nNnTF {\l_array_tmp_int} > {##1} { + \int_set:Nn \l_array_tmp_int {##1} + }{} + } + } + \prop_gput:Nnx #1 {base} {\int_use:N \l_array_tmp_int} + }{} + } +} \cs_new_protected:Npn \array_length:N #1 { \int_eval:n {\prop_get:Nn #1 {top} - \prop_get:Nn #1 {base}} diff --git a/Master/texmf-dist/tex/latex/hobby/tikzlibraryhobby.code.tex b/Master/texmf-dist/tex/latex/hobby/tikzlibraryhobby.code.tex index 9214dfd6dd3..a3fa361d216 100644 --- a/Master/texmf-dist/tex/latex/hobby/tikzlibraryhobby.code.tex +++ b/Master/texmf-dist/tex/latex/hobby/tikzlibraryhobby.code.tex @@ -14,251 +14,489 @@ %% ---------------------------------------------------------------- %% \usepgflibrary{hobby} -\let\hobby@opts=\pgfutil@empty +\let\hobby@this@opts=\pgfutil@empty +\let\hobby@next@opts=\pgfutil@empty +\let\hobby@action=\pgfutil@empty +\let\hobby@path@name=\pgfutil@empty +\newif\ifhobby@externalise +\def\hobby@point@options{}% \tikzset{ curve through/.style={ to path={ \pgfextra{ - \expandafter\curvethrough\expandafter[\hobby@opts]{% + \expandafter\curvethrough\expandafter[\hobby@next@opts]{% (\tikztostart) .. #1 .. (\tikztotarget)% } } } }, - tension in/.code = {}, - tension out/.code = {}, - tension/.code = {}, - excess angle/.code = {}, - closed/.code = {% - \expandafter\def\expandafter\hobby@opts\expandafter{\hobby@opts% - closed=#1,disjoint=#1}% + tension in/.code = {% + \expandafter\gdef\expandafter\hobby@point@options\expandafter% + {\hobby@point@options,tension in=#1}% + }, + tension out/.code = {% + \expandafter\gdef\expandafter\hobby@point@options\expandafter% + {\hobby@point@options,tension out=#1}% + }, + tension/.code = {% + \expandafter\gdef\expandafter\hobby@point@options\expandafter% + {\hobby@point@options,tension=#1}% + }, + excess angle/.code = {% + \expandafter\gdef\expandafter\hobby@point@options\expandafter% + {\hobby@point@options,excess angle=#1}% + }, + break/.code = {% + \expandafter\gdef\expandafter\hobby@point@options\expandafter% + {\hobby@point@options,break=#1}% + }, + blank/.code = {% + \expandafter\gdef\expandafter\hobby@point@options\expandafter% + {\hobby@point@options,blank=#1}% + }, + designated Hobby path/.initial={next}, + clear next Hobby path options/.code={% + \gdef\hobby@next@opts{}% + }, + clear this Hobby path options/.code={% + \gdef\hobby@this@opts{}% + }, + clear Hobby path options/.style={% + clear \pgfkeysvalueof{/tikz/designated Hobby path} Hobby path options + }, + add option to this Hobby path/.code={% + \expandafter\gdef\expandafter\hobby@this@opts\expandafter{\hobby@this@opts#1,}% + }, + add option to next Hobby path/.code={% + \expandafter\gdef\expandafter\hobby@next@opts\expandafter{\hobby@next@opts#1,}% + }, + add option to Hobby path/.style={% + add option to \pgfkeysvalueof{/tikz/designated Hobby path} Hobby path={#1}% + }, + closed/.style = {% + add option to Hobby path={closed=#1,disjoint=#1}% + }, + invert blank/.style = {% + add option to Hobby path={invert blank=#1}% }, closed/.default = true, + blank/.default = true, + break/.default = true, + invert blank/.default = true, in angle/.code = {% \pgfmathparse{#1*pi/180}% - \edef\@temp{ in angle=\pgfmathresult,}% - \expandafter\expandafter\expandafter% - \def% - \expandafter\expandafter\expandafter% - \hobby@opts% - \expandafter\expandafter\expandafter% - {\expandafter\hobby@opts\@temp}% + \edef\@temp{in angle=\pgfmathresult,}% + \pgfkeysalso{add option to Hobby path/.expand once=\@temp}% }, out angle/.code = {% \pgfmathparse{#1*pi/180}% - \edef\@temp{ out angle=\pgfmathresult,}% - \expandafter\expandafter\expandafter% - \def% - \expandafter\expandafter\expandafter% - \hobby@opts% - \expandafter\expandafter\expandafter% - {\expandafter\hobby@opts\@temp}% + \edef\@temp{out angle=\pgfmathresult,}% + \pgfkeysalso{add option to Hobby path/.expand once=\@temp}% }, - in curl/.code = {% - \expandafter\def\expandafter\hobby@opts\expandafter{\hobby@opts in curl=#1,}% + in curl/.style = {% + add option to Hobby path={in curl=#1}% }, out curl/.code = {% - \expandafter\def\expandafter\hobby@opts\expandafter{\hobby@opts out curl=#1,}% + add option to Hobby path={out curl=#1}% }, use Hobby shortcut/.code={% - \let\tikz@curveto@auto=\hobby@curveto@auto - } + \let\tikz@curveto@auto=\hobby@curveto@override + \global\let\hobby@curveto@delegate=\hobby@curveto@auto + }, + use quick Hobby shortcut/.code={% + \let\tikz@curveto@auto=\hobby@curveto@override + \global\let\hobby@curveto@delegate=\hobby@qcurveto@auto + }, + use previous Hobby path/.code={% + \pgfextra{\hobbyusepath{#1}} + }, + use previous Hobby path/.default={},% + save Hobby path/.code={% + \xdef\hobby@path@name{#1}% + }, + restore Hobby path/.code={% + \pgfextra{% + \hobbyinit\hobby@moveto\hobby@curveto\hobby@close + \hobbyrestorepath{#1}} + }, + restore and use Hobby path/.code 2 args={% + \pgfextra{% + \hobbyinit\hobby@moveto\hobby@curveto\hobby@close + \hobbyrestorepath{#1}% + \hobbyusepath{#2}% + } + }, + show Hobby path/.code={% + \pgfextra{\hobbyshowpath{#1}} + }, + Hobby action/.code={% + \expandafter\gdef\expandafter\hobby@action\expandafter{\hobby@action#1}% + }, + Hobby finish/.style={% + Hobby action=\hobby@finish% + }, + Hobby externalise/.is if=hobby@externalise, + Hobby externalize/.is if=hobby@externalise } \newcommand\curvethrough[2][]{% \hobbyinit\hobby@moveto\hobby@curveto\hobby@close \hobbysetparams{#1}% - \hobby@processpts{#2}% -} -\newcommand\hobby@processpts[1]{% - \pgfutil@in@{..}{#1}% - \ifpgfutil@in@% - \hobby@getonepoint #1 \relax - \let\hobby@next=\hobby@processpts - \else - \def\hobby@pt{#1}% - \def\hobby@rest{}% - \let\hobby@next=\hobbygenpath - \fi + \tikzset{designated Hobby path=this}% + \global\let\hobby@this@opts=\pgfutil@empty + \global\let\hobby@next@opts=\pgfutil@empty \let\tikz@scan@point@options=\pgfutil@empty - \expandafter\tikz@scan@one@point\expandafter\pgfutil@firstofone\hobby@pt\relax + \def\hobby@point@options{}% + \tikz@scan@one@point\hobby@processpt #2 \relax% +} +\newcommand\hobby@processpt[1]{% + #1% \pgfmathsetmacro\hobby@x{\the\pgf@x/1cm}% \pgfmathsetmacro\hobby@y{\the\pgf@y/1cm}% - \expandafter\hobbyaddpoint\expandafter{\tikz@scan@point@options,% + \expandafter\hobbyaddpoint\expandafter{\hobby@point@options,% x = \hobby@x, y = \hobby@y}% - \expandafter\hobby@next\expandafter{\hobby@rest}% -} -\def\hobby@getonepoint#1..#2\relax{% - \def\hobby@pt{#1}% - \def\hobby@rest{#2}% -} + \def\hobby@point@options{}% + \let\tikz@scan@point@options=\pgfutil@empty + \pgfutil@ifnextchar\relax{% + \expandafter\hobbysetparams\expandafter{\hobby@this@opts}% + \ifhobby@externalise + \ifx\hobby@path@name\pgfutil@empty + \hobbygenusepath + \else + \hobbygenuseifnecpath{\hobby@path@name}% + \fi + \else + \hobbygenusepath + \fi + \ifx\hobby@path@name\pgfutil@empty + \else + \hobbysavepath{\hobby@path@name}% + \fi + \global\let\hobby@path@name=\pgfutil@empty + }{% + \pgfutil@ifnextchar.{% + \hobby@swallowdots}{% + \tikz@scan@one@point\hobby@processpt}}} +\def\hobby@swallowdots.{% + \pgfutil@ifnextchar.{% + \hobby@swallowdots}{% + \tikz@scan@one@point\hobby@processpt}} +\def\hobby@curveto@override{% + \hobby@curveto@delegate} \def\hobby@curveto@auto{% - \hobbyinit\pgfutil@gobble\hobby@curveto\hobby@close + \hobbyinit\hobby@moveto\hobby@curveto\hobby@close \pgfmathsetmacro\hobby@x{\the\tikz@lastx/1cm}% \pgfmathsetmacro\hobby@y{\the\tikz@lasty/1cm}% - \pgfutil@ifundefined{tikz@scan@point@options}{% - \hobbyaddpoint{x = \hobby@x, y = \hobby@y}% - }{% - \expandafter\hobbyaddpoint\expandafter{\tikz@scan@point@options,% + \expandafter\hobbysetparams\expandafter{\hobby@next@opts}% + \expandafter\hobbyaddpoint\expandafter{\hobby@point@options,% x = \hobby@x, y = \hobby@y}% - }% + \hobby@init@tikz@commands + \tikzset{designated Hobby path=this}% \let\tikz@scan@point@options=\pgfutil@empty + \global\let\hobby@action=\pgfutil@empty + \global\let\hobby@this@opts=\pgfutil@empty + \global\let\hobby@next@opts=\pgfutil@empty + \global\let\hobby@point@options=\pgfutil@empty \tikz@scan@one@point\hobby@addfromtikz} \def\hobby@addfromtikz#1{% #1% \tikz@make@last@position{#1}% \pgfmathsetmacro\hobby@x{\the\pgf@x/1cm}% \pgfmathsetmacro\hobby@y{\the\pgf@y/1cm}% - \expandafter\hobbyaddpoint\expandafter{\tikz@scan@point@options,% + \expandafter\hobbysetparams\expandafter{\hobby@this@opts}% + \expandafter\hobbyaddpoint\expandafter{\hobby@point@options,% x = \hobby@x, y = \hobby@y}% - \hobby@donext} -\def\hobby@donext{% - \pgfutil@ifnextchar.% - {\hobby@curveto@check}% - {\hobby@finish@auto}}% -\def\hobby@curveto@check..{% - \pgfutil@ifnextchar c% - {\hobby@maybefinish@auto}% - {\hobby@curveto@continue}}% -\def\hobby@maybefinish@auto c{% - \pgfutil@ifnextchar o% - {\hobby@finish@auto .. c}% - {\hobby@closeandfinish@auto}} -\def\hobby@closeandfinish@auto ycle{% - \hobbysetparams{closed=true,disjoint=true}% - \hobby@finish@auto% + \hobby@action + \global\let\hobby@this@opts=\pgfutil@empty + \global\let\hobby@action=\pgfutil@empty + \global\let\hobby@point@options=\pgfutil@empty + \tikz@scan@next@command% +} +\def\hobby@init@tikz@commands{% + \hobby@init@tikz@modcmd\tikz@movetoabs + \hobby@init@tikz@modcmd\tikz@movetorel + \hobby@init@tikz@modcmd\tikz@lineto + \hobby@init@tikz@modcmd\tikz@rect + \hobby@init@tikz@modcmd\tikz@cchar + \hobby@init@tikz@modcmd\tikz@finish + \hobby@init@tikz@modcmd\tikz@arcA + \hobby@init@tikz@modcmd\tikz@e@char + \hobby@init@tikz@modcmd\tikz@g@char + \hobby@init@tikz@modcmd\tikz@schar + \hobby@init@tikz@modcmd\tikz@vh@lineto + \hobby@init@tikz@modcmd\tikz@pchar + \hobby@init@tikz@modcmd\tikz@to + \hobby@init@tikz@modcmd\pgf@stop + \hobby@init@tikz@modcmd\tikz@decoration + \global\let\hobby@curveto@delegate=\hobby@midcurveto@auto +} +\def\hobby@restore@tikz@commands{% + \hobby@restore@tikz@modcmd\tikz@movetoabs + \hobby@restore@tikz@modcmd\tikz@movetorel + \hobby@restore@tikz@modcmd\tikz@lineto + \hobby@restore@tikz@modcmd\tikz@rect + \hobby@restore@tikz@modcmd\tikz@cchar + \hobby@restore@tikz@modcmd\tikz@finish + \hobby@restore@tikz@modcmd\tikz@arcA + \hobby@restore@tikz@modcmd\tikz@e@char + \hobby@restore@tikz@modcmd\tikz@g@char + \hobby@restore@tikz@modcmd\tikz@schar + \hobby@restore@tikz@modcmd\tikz@vh@lineto + \hobby@restore@tikz@modcmd\tikz@pchar + \hobby@restore@tikz@modcmd\tikz@to + \hobby@restore@tikz@modcmd\pgf@stop + \hobby@restore@tikz@modcmd\tikz@decoration + \global\let\hobby@curveto@delegate=\hobby@curveto@auto } -\def\hobby@curveto@continue{% +\def\hobby@init@tikz@modcmd#1{% + \expandafter\global\expandafter\let\csname hobby@orig@\string#1\endcsname=#1% + \gdef#1{\hobby@finish#1}% +} +\def\hobby@restore@tikz@modcmd#1{% + \expandafter\global\expandafter\let\expandafter#1\csname hobby@orig@\string#1\endcsname% +} +\def\hobby@midcurveto@auto{% \let\tikz@scan@point@options=\pgfutil@empty - \tikz@scan@one@point\hobby@addfromtikz} -\def\hobby@finish@auto{% - \hobbygenpath - \tikz@scan@next@command% + \global\let\hobby@action=\pgfutil@empty + \global\let\hobby@this@opts=\pgfutil@empty + \global\let\hobby@point@options=\pgfutil@empty + \tikz@scan@one@point\hobby@addfromtikz% +} +\def\hobby@finish{% + \ifhobby@externalise + \ifx\hobby@path@name\pgfutil@empty + \hobbygenusepath + \else + \hobbygenuseifnecpath{\hobby@path@name}% + \fi + \else + \hobbygenusepath + \fi + \ifx\hobby@path@name\pgfutil@empty + \else + \hobbysavepath{\hobby@path@name}% + \fi + \global\let\hobby@path@name=\pgfutil@empty + \hobby@restore@tikz@commands } \tikzset{ quick curve through/.style={% to path={% \pgfextra{% + \let\hobby@next@qbreak=\relax + \let\hobby@next@qblank=\relax \tikz@scan@one@point\pgfutil@firstofone(\tikztostart)% + \tikz@make@last@position{\pgfqpoint{\the\pgf@x}{\the\pgf@y}}% \edef\hobby@qpoints{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}% \def\hobby@qpointa{}% \def\hobby@quick@path{}% \def\hobby@angle{}% + \let\hobby@quick@curveto=\hobby@quick@makepath \tikz@scan@one@point\hobby@quickfirst #1 (\tikztotarget)\relax } \hobby@quick@path } - } + }, + quick hobby/blank curve/.is choice, + quick hobby/blank curve/true/.code={% + \gdef\hobby@next@qblank{% + \qhobby@blanktrue + \global\let\hobby@next@qblank=\relax + }% + }, + quick hobby/blank curve/false/.code={% + \gdef\hobby@next@qblank{% + \qhobby@blankfalse + \global\let\hobby@next@qblank=\relax + }% + }, + quick hobby/blank curve/once/.code={% + \gdef\hobby@next@qblank{% + \qhobby@blanktrue + \gdef\hobby@next@qblank{% + \qhobby@blankfalse + \global\let\hobby@next@qblank=\relax + }% + }% + }, + quick hobby/blank curve/.default=true, + quick hobby/break curve/.is choice, + quick hobby/break curve/true/.code={% + \gdef\hobby@next@qbreak{% + \qhobby@breaktrue + \global\let\hobby@next@qbreak=\relax + }% + }, + quick hobby/break curve/false/.code={% + \gdef\hobby@next@qbreak{% + \qhobby@breakfalse + \global\let\hobby@next@qbreak=\relax + }% + }, + quick hobby/break curve/once/.code={% + \gdef\hobby@next@qbreak{% + \qhobby@breaktrue + \gdef\hobby@next@qbreak{% + \qhobby@breakfalse + \global\let\hobby@next@qbreak=\relax + }% + }% + }, + quick hobby/break curve/.default=true, } -\pgfmathsetmacro\hobby@sf{10cm} +\newif\ifqhobby@break +\newif\ifqhobby@blank +\tikzoption{hobby}[]{\let\tikz@plot@handler=\pgfplothandlerhobby} +\tikzoption{quick hobby}[]{\let\tikz@plot@handler=\pgfplothandlerquickhobby} +\tikzoption{closed hobby}[]{\let\tikz@plot@handler=\pgfplothandlerclosedhobby} \def\hobby@quickfirst#1{% #1% - \edef\hobby@qpointa{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}% + \xdef\hobby@qpointa{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}% + \tikz@make@last@position{\hobby@qpointa}% \pgfutil@ifnextchar\relax{% - \edef\hobby@quick@path{ -- (\the\pgf@x,\the\pgf@y)}% + \xdef\hobby@quick@path{ -- (\the\pgf@x,\the\pgf@y)}% }{% + \pgfutil@ifnextchar.{% + \hobby@qswallowdots}{% + \tikz@scan@one@point\hobby@quick}}} +\def\hobby@qswallowdots.{% + \pgfutil@ifnextchar.{% + \hobby@qswallowdots}{% \tikz@scan@one@point\hobby@quick}} \def\hobby@quick#1{% + \hobby@quick@compute{#1}% + \tikz@make@last@position{\hobby@qpointa}% + \pgfutil@ifnextchar\relax{% + \hobby@quick@computeend% + }{% + \pgfutil@ifnextchar.{% + \hobby@qswallowdots}{% + \tikz@scan@one@point\hobby@quick}}} +\def\hobby@quick@makepath#1#2#3{% #1% - \pgf@xb=\pgf@x - \pgf@yb=\pgf@y - \hobby@qpointa - \pgf@xa=\pgf@x - \pgf@ya=\pgf@y - \advance\pgf@xb by -\pgf@xa - \advance\pgf@yb by -\pgf@ya - \pgfmathsetmacro\hobby@done{sqrt((\pgf@xb/\hobby@sf)^2 + (\pgf@yb/\hobby@sf)^2)}% - \pgfmathsetmacro\hobby@omegaone{rad(atan2(\pgf@xb,\pgf@yb))}% - \hobby@qpoints - \advance\pgf@xa by -\pgf@x - \advance\pgf@ya by -\pgf@y - \pgfmathsetmacro\hobby@dzero{sqrt((\pgf@xa/\hobby@sf)^2 + (\pgf@ya/\hobby@sf)^2)}% - \pgfmathsetmacro\hobby@omegazero{rad(atan2(\pgf@xa,\pgf@ya))}% - \pgfmathsetmacro\hobby@psi{\hobby@omegaone - \hobby@omegazero}% - \pgfmathsetmacro\hobby@psi{\hobby@psi > pi ? \hobby@psi - 2*pi : \hobby@psi}% - \pgfmathsetmacro\hobby@psi{\hobby@psi < -pi ? \hobby@psi + 2*pi : \hobby@psi}% - \ifx\hobby@angle\pgfutil@empty - \pgfmathsetmacro\hobby@thetaone{-\hobby@psi * \hobby@done% -/(\hobby@done + \hobby@dzero)}% - \pgfmathsetmacro\hobby@thetazero{-\hobby@psi - \hobby@thetaone}% - \let\hobby@phione=\hobby@thetazero - \let\hobby@phitwo=\hobby@thetaone + \pgf@xa=\pgf@x\relax + \pgf@ya=\pgf@y\relax + #2% + \pgf@xb=\pgf@x\relax + \pgf@yb=\pgf@y\relax + #3% + \ifqhobby@blank + \xdef\hobby@quick@path{\hobby@quick@path (\the\pgf@x,\the\pgf@y)}% \else - \let\hobby@thetazero=\hobby@angle - \pgfmathsetmacro\hobby@thetaone{% - -(2 * \hobby@psi + \hobby@thetazero) * \hobby@done% - / (2 * \hobby@done + \hobby@dzero)}% - \pgfmathsetmacro\hobby@phione{-\hobby@psi - \hobby@thetaone}% - \let\hobby@phitwo=\hobby@thetaone - \fi - \let\hobby@angle=\hobby@thetaone - \pgfmathsetmacro\hobby@alpha{% - sqrt(2) * (sin(\hobby@thetazero r) - 1/16 * sin(\hobby@phione r))% -* (sin(\hobby@phione r) - 1/16 * sin(\hobby@thetazero r))% - * (cos(\hobby@thetazero r) - cos(\hobby@phione r))}% - \pgfmathsetmacro\hobby@rho{% - (2 + \hobby@alpha)/(1 + (1 - (3 - sqrt(5))/2)% - * cos(\hobby@thetazero r) + (3 - sqrt(5))/2 * cos(\hobby@phione r))}% - \pgfmathsetmacro\hobby@sigma{% - (2 - \hobby@alpha)/(1 + (1 - (3 - sqrt(5))/2)% - * cos(\hobby@phione r) + (3 - sqrt(5))/2 * cos(\hobby@thetazero r))}% - \hobby@qpoints - \pgf@xa=\pgf@x - \pgf@ya=\pgf@y - \pgfmathsetlength\pgf@xa{% - \pgf@xa + \hobby@dzero * \hobby@rho% - * cos((\hobby@thetazero + \hobby@omegazero) r)/3*\hobby@sf}% - \pgfmathsetlength\pgf@ya{% - \pgf@ya + \hobby@dzero * \hobby@rho% - * sin((\hobby@thetazero + \hobby@omegazero) r)/3*\hobby@sf}% - \hobby@qpointa - \pgf@xb=\pgf@x - \pgf@yb=\pgf@y - \pgfmathsetlength\pgf@xb{% - \pgf@xb - \hobby@dzero * \hobby@sigma% - * cos((-\hobby@phione + \hobby@omegazero) r)/3*\hobby@sf}% - \pgfmathsetlength\pgf@yb{% - \pgf@yb - \hobby@dzero * \hobby@sigma% - * sin((-\hobby@phione + \hobby@omegazero) r)/3*\hobby@sf}% - \hobby@qpointa - \edef\hobby@quick@path{\hobby@quick@path .. controls% + \xdef\hobby@quick@path{\hobby@quick@path .. controls% (\the\pgf@xa,\the\pgf@ya) and (\the\pgf@xb,\the\pgf@yb) .. (\the\pgf@x,\the\pgf@y) }% - \let\hobby@qpoints=\hobby@qpointa - #1 - \edef\hobby@qpointa{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}% - \pgfutil@ifnextchar\relax{% - \pgfmathsetmacro\hobby@alpha{% - sqrt(2) * (sin(\hobby@thetaone r) - 1/16 * sin(\hobby@phitwo r))% - * (sin(\hobby@phitwo r) - 1/16 * sin(\hobby@thetaone r))% - * (cos(\hobby@thetaone r) - cos(\hobby@phitwo r))}% - \pgfmathsetmacro\hobby@rho{% - (2 + \hobby@alpha)/(1 + (1 - (3 - sqrt(5))/2)% - * cos(\hobby@thetaone r) + (3 - sqrt(5))/2 * cos(\hobby@phitwo r))}% - \pgfmathsetmacro\hobby@sigma{% - (2 - \hobby@alpha)/(1 + (1 - (3 - sqrt(5))/2)% - * cos(\hobby@phitwo r) + (3 - sqrt(5))/2 * cos(\hobby@thetaone r))}% - \hobby@qpoints - \pgf@xa=\pgf@x - \pgf@ya=\pgf@y - \pgfmathsetlength\pgf@xa{% - \pgf@xa + \hobby@done * \hobby@rho% - * cos((\hobby@thetaone + \hobby@omegaone) r)/3*\hobby@sf}% - \pgfmathsetlength\pgf@ya{% - \pgf@ya + \hobby@done * \hobby@rho% - * sin((\hobby@thetaone + \hobby@omegaone) r)/3*\hobby@sf}% - \hobby@qpointa - \pgf@xb=\pgf@x - \pgf@yb=\pgf@y - \pgfmathsetlength\pgf@xb{% - \pgf@xb - \hobby@done * \hobby@sigma% - * cos((-\hobby@phitwo + \hobby@omegaone) r)/3*\hobby@sf}% - \pgfmathsetlength\pgf@yb{% - \pgf@yb - \hobby@done * \hobby@sigma% - * sin((-\hobby@phitwo + \hobby@omegaone) r)/3*\hobby@sf}% - \hobby@qpointa - \edef\hobby@quick@path{\hobby@quick@path .. controls% - (\the\pgf@xa,\the\pgf@ya) and (\the\pgf@xb,\the\pgf@yb) .. (\the\pgf@x,\the\pgf@y) }% -}{% -\tikz@scan@one@point\hobby@quick}} + \fi + \ifqhobby@break + \xdef\hobby@quick@path{\hobby@quick@path +(0,0)}% + \fi + \hobby@next@qbreak + \hobby@next@qblank +} +\def\hobby@qcurveto@auto{% + \global\let\hobby@next@qbreak=\relax + \global\let\hobby@next@qblank=\relax + \xdef\hobby@qpoints{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}% + \gdef\hobby@qpointa{}% + \gdef\hobby@quick@path{}% + \gdef\hobby@angle{}% + \global\let\hobby@quick@curveto=\hobby@quick@makepathauto + \hobby@qinit@tikz@commands + \let\tikz@scan@point@options=\pgfutil@empty + \global\let\hobby@action=\pgfutil@empty + \global\let\hobby@point@options=\pgfutil@empty + \tikz@scan@one@point\hobby@qfirst@auto} +\def\hobby@qmidcurveto@auto{% + \let\tikz@scan@point@options=\pgfutil@empty + \global\let\hobby@action=\pgfutil@empty + \global\let\hobby@point@options=\pgfutil@empty + \tikz@scan@one@point\hobby@qaddfromtikz} +\def\hobby@qfirst@auto#1{% + #1% + \xdef\hobby@qpointa{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}% + \tikz@make@last@position{\hobby@qpointa}% + \tikz@scan@next@command% +} +\def\hobby@quick@makepathauto#1#2#3{% + #1% + \pgf@xa=\pgf@x\relax + \pgf@ya=\pgf@y\relax + #2% + \pgf@xb=\pgf@x\relax + \pgf@yb=\pgf@y\relax + #3% + \ifqhobby@blank + \edef\hobby@temp{% + \noexpand\pgfpathmoveto{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}% + }% + \hobby@temp + \else + \edef\hobby@temp{% + \noexpand\pgfpathcurveto{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}% + {\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}% + {\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}% + }% + \hobby@temp + \fi + \ifqhobby@break + #3% + \edef\hobby@temp{% + \noexpand\pgfpathmoveto{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}% + }% + \hobby@temp + \fi + \hobby@next@qbreak + \hobby@next@qblank +} +\def\hobby@qaddfromtikz#1{% + \hobby@quick@compute{#1}% + \tikz@make@last@position{\hobby@qpointa}% + \tikz@scan@next@command% +} +\def\hobby@qinit@tikz@commands{% + \hobby@qinit@tikz@modcmd\tikz@movetoabs + \hobby@qinit@tikz@modcmd\tikz@movetorel + \hobby@qinit@tikz@modcmd\tikz@lineto + \hobby@qinit@tikz@modcmd\tikz@rect + \hobby@qinit@tikz@modcmd\tikz@cchar + \hobby@qinit@tikz@modcmd\tikz@finish + \hobby@qinit@tikz@modcmd\tikz@arcA + \hobby@qinit@tikz@modcmd\tikz@e@char + \hobby@qinit@tikz@modcmd\tikz@g@char + \hobby@qinit@tikz@modcmd\tikz@schar + \hobby@qinit@tikz@modcmd\tikz@vh@lineto + \hobby@qinit@tikz@modcmd\tikz@pchar + \hobby@qinit@tikz@modcmd\tikz@to + \hobby@qinit@tikz@modcmd\pgf@stop + \hobby@qinit@tikz@modcmd\tikz@decoration + \global\let\hobby@curveto@delegate=\hobby@qmidcurveto@auto +} +\def\hobby@qrestore@tikz@commands{% + \hobby@restore@tikz@modcmd\tikz@movetoabs + \hobby@restore@tikz@modcmd\tikz@movetorel + \hobby@restore@tikz@modcmd\tikz@lineto + \hobby@restore@tikz@modcmd\tikz@rect + \hobby@restore@tikz@modcmd\tikz@cchar + \hobby@restore@tikz@modcmd\tikz@finish + \hobby@restore@tikz@modcmd\tikz@arcA + \hobby@restore@tikz@modcmd\tikz@e@char + \hobby@restore@tikz@modcmd\tikz@g@char + \hobby@restore@tikz@modcmd\tikz@schar + \hobby@restore@tikz@modcmd\tikz@vh@lineto + \hobby@restore@tikz@modcmd\tikz@pchar + \hobby@restore@tikz@modcmd\tikz@to + \hobby@restore@tikz@modcmd\pgf@stop + \hobby@restore@tikz@modcmd\tikz@decoration + \hobby@restore@tikz@modcmd\tikz@@close + \global\let\hobby@curveto@delegate=\hobby@qcurveto@auto +} +\def\hobby@qinit@tikz@modcmd#1{% + \expandafter\global\expandafter\let\csname hobby@orig@\string#1\endcsname=#1% + \gdef#1{\hobby@qfinish#1}% +} +\def\hobby@qfinish{% + \hobby@quick@computeend + \hobby@qrestore@tikz@commands +} + %% %% Copyright (C) 2012 by Andrew Stacey %% -- cgit v1.2.3