%% %% This is file `pml3array.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% hobby_code.dtx (with options: `array') %% ---------------------------------------------------------------- %% hobby --- a TikZ/PGF library for drawing smooth(ish) curves using %% Hobby's algorithm (implemented in LaTeX3) %% E-mail: loopspace@mathforge.org %% Released under the LaTeX Project Public License v1.3c or later %% See http://www.latex-project.org/lppl.txt %% ---------------------------------------------------------------- %% \RequirePackage{expl3} \ExplSyntaxOn \tl_new:N \l_array_tmp_tl \tl_new:N \l_array_show_tl \int_new:N \l_array_base_int \int_new:N \l_array_top_int \int_new:N \l_array_tmp_int \int_new:N \g_array_map_int \int_new:N \g_array_base_int \int_gset:Nn \g_array_base_int {0} \cs_new:Npn \array_adjust_ends:Nn #1#2 { \prop_get:NnNTF #1 {base} \l_tmpa_tl { \int_compare:nNnTF {\l_tmpa_tl} > {#2} { \prop_put:Nnx #1 {base} {\int_eval:n {#2}} } {} } { \prop_put:Nnx #1 {base} {\int_eval:n {#2}} } \prop_get:NnNTF #1 {top} \l_tmpa_tl { \int_compare:nNnTF {\l_tmpa_tl} < {#2} { \prop_put:Nnx #1 {top} {\int_eval:n {#2}} } {} } { \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 } \cs_new:Npn \array_get:Nn #1#2 { \exp_args:NNf \prop_item:Nn #1 { \int_eval:n {#2} } } \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} } \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: } \prg_new_eq_conditional:NNn \array_if_exist:N \cs_if_exist:N { p, T, F, TF } \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 {} { \prop_get:NnNTF #1 {base} \l_array_tmp_tl { \int_set:Nn \l_array_base_int {\l_array_tmp_tl} }{ \int_set:Nn \l_array_base_int {0} } \prop_get:NnNTF #1 {top} \l_array_tmp_tl { \int_set:Nn \l_array_top_int {\l_array_tmp_tl} }{ \int_set:Nn \l_array_top_int {0} } \int_step_inline:nnnn {\l_array_base_int} {1} {\l_array_top_int} { \array_get:NnN #1 {##1} \l_array_tmp_tl \exp_args:NnV #2 {##1} \l_array_tmp_tl } } {} } \cs_generate_variant:Nn \array_map_function:NN { Nc } \cs_generate_variant:Nn \array_map_function:NN { c , cc } \cs_new:Npn \array_reverse_map_function:NN #1#2 { \array_if_empty:NTF #1 {} { \prop_get:NnNTF #1 {base} \l_array_tmp_tl { \int_set:Nn \l_array_base_int {\l_array_tmp_tl} }{ \int_set:Nn \l_array_base_int {0} } \prop_get:NnNTF #1 {top} \l_array_tmp_tl { \int_set:Nn \l_array_top_int {\l_array_tmp_tl} }{ \int_set:Nn \l_array_top_int {0} } \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 } } {} } \cs_generate_variant:Nn \array_reverse_map_function:NN { Nc } \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_array_map_int \cs_gset:cpn { array_map_inline_ \int_use:N \g_array_map_int :nn } ##1##2 {#2} \exp_args:NNc \array_map_function:NN #1 { array_map_inline_ \int_use:N \g_array_map_int :nn } \prg_break_point:Nn \array_map_break: { \int_gdecr:N \g_array_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_array_map_int \cs_gset:cpn { array_map_inline_ \int_use:N \g_array_map_int :nn } ##1##2 {#2} \exp_args:NNc \array_reverse_map_function:NN #1 { array_map_inline_ \int_use:N \g_array_map_int :nn } \prg_break_point:Nn \array_map_break: { \int_gdecr:N \g_array_map_int } } \cs_generate_variant:Nn \array_reverse_map_inline:Nn { c } \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_new:nnn { kernel } { show-array } { The~array~\token_to_str:N #1~ \array_if_empty:NTF #1 { is~empty } { contains~the~items~(without~outer~braces): } } \cs_new_protected:Npn \array_show:N #1 { \__msg_show_variable:NNNnn #1 \array_if_exist:NTF \array_if_empty:NTF { array } { \array_map_function:NN #1 \__msg_show_item:nn } } \cs_generate_variant:Nn \array_show:N { c } \cs_new_protected:Npn \array_push: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_put:Nnn #1 {\l_array_tmp_int} {#2} } { \array_put:Nnn #1 {\g_array_base_int} {#2} } } \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 { \int_set:Nn \l_array_tmp_int {\l_array_tmp_tl} \int_decr:N \l_array_tmp_int \array_put:Nnn #1 {\l_array_tmp_int} {#2} } { \array_put:Nnn #1 {\g_array_base_int} {#2} } } \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 \array_get:NnN #1 {\l_array_tmp_tl} #2 } \cs_new_protected:Npn \array_base:NN #1#2 { \prop_get:NnN #1 {base} \l_array_tmp_tl \array_get:NnN #1 {\l_array_tmp_tl} #2 } \cs_new:Npn \array_top:N #1 { \array_get:Nn #1 {\prop_item:Nn #1 {top}} } \cs_new:Npn \array_base:N #1 { \array_get:Nn #1 {\prop_item:Nn #1 {base}} } \cs_new_protected:Npn \array_del:Nn #1#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} {} { \int_incr:N \l_array_tmp_int } } \int_compare:nNnTF {\l_array_tmp_int} = {0} { \prop_clear: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_put: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_put:Nnx #1 {base} {\int_use:N \l_array_tmp_int} }{} } } \cs_new_protected:Npn \array_gdel:Nn #1#2 { \exp_args:NNx \prop_gremove: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_item:Nn #1 {top} - \prop_item:Nn #1 {base}} } \ExplSyntaxOff %% %% Copyright (C) 2012-2021 by Andrew Stacey %% %% This file may be distributed and/or modified under the conditions %% of the LaTeX Project Public License, either version 1.3 of this %% license or (at your option) any later version. %% The latest version of this license is in: %% %% http://www.latex-project.org/lppl.txt %% %% and version 1.3 or later is part of all distributions of LaTeX %% version 2005/12/01 or later. %% %% This work is "maintained" (as per LPPL maintenance status) by %% Andrew Stacey. %% %% This work consists of the files hobby_code.dtx %% hobby.tex %% and the derived files hobby.code.tex %% pgflibraryhobby.code.tex %% tikzlibraryhobby.code.tex %% pml3array.sty %% hobby-l3draw.sty %% hobby.ins %% hobby.pdf %% hobby_code.pdf %% README.txt %% %% %% End of file `pml3array.sty'.