summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2013-04-13 22:56:07 +0000
committerKarl Berry <karl@freefriends.org>2013-04-13 22:56:07 +0000
commit658facdfe16a2d2b43c7312b9b15bebbf3c89d8e (patch)
tree6b219a6bd62fa7eda6d3aa87fccf509cc3fc7191 /Master/texmf-dist/tex/latex
parent5ffaf0fed7a947071a4ad491d01164a10e97b7ed (diff)
hobby (13apr13)
git-svn-id: svn://tug.org/texlive/trunk@29895 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex')
-rw-r--r--Master/texmf-dist/tex/latex/hobby/hobby.code.tex419
-rw-r--r--Master/texmf-dist/tex/latex/hobby/pgflibraryhobby.code.tex179
-rw-r--r--Master/texmf-dist/tex/latex/hobby/pml3array.sty161
-rw-r--r--Master/texmf-dist/tex/latex/hobby/tikzlibraryhobby.code.tex594
4 files changed, 1078 insertions, 275 deletions
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 <stacey@math.ntnu.no>
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 <stacey@math.ntnu.no>
%%
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 <stacey@math.ntnu.no>
%%