diff options
author | Karl Berry <karl@freefriends.org> | 2023-08-22 22:45:59 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2023-08-22 22:45:59 +0000 |
commit | ea39527914dd7740302a337d64e3669b99e03ba8 (patch) | |
tree | 5e22518de8339e41b185657480571c5979857504 /Master/texmf-dist/tex | |
parent | 32e21ecdd4f51f1c29e7456564180085379aa16d (diff) |
numerica-plus (23aug23)
git-svn-id: svn://tug.org/texlive/trunk@68019 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex')
-rw-r--r-- | Master/texmf-dist/tex/latex/numerica-plus/numerica-plus.sty | 485 |
1 files changed, 236 insertions, 249 deletions
diff --git a/Master/texmf-dist/tex/latex/numerica-plus/numerica-plus.sty b/Master/texmf-dist/tex/latex/numerica-plus/numerica-plus.sty index 445c2b9ec6a..c082675197f 100644 --- a/Master/texmf-dist/tex/latex/numerica-plus/numerica-plus.sty +++ b/Master/texmf-dist/tex/latex/numerica-plus/numerica-plus.sty @@ -7,19 +7,26 @@ % % Andrew Parsloe (ajparsloe@gmail.com) % -\RequirePackage{numerica}[2021/12/07] -\@ifpackagelater{numerica}{2021/12/07} - {} - {% - \PackageError{numerica-plus}{Package numerica too old.} - {Please update the package.} - \endinput - } \ProvidesExplFile {numerica-plus.sty} - {2021/12/10} - {2.0.0} - {Iterate functions, find zeros/extrema of functions, evaluate recurrences } + {2023/08/13} + {3.0.0} + {Iterate functions, find zeros/extrema of functions, evaluate recurrences} + +\msg_new:nnn {numerica-plus} {version} + { + Package~too~old!~This~version~of~numerica-plus~requires~ + numerica~version~3. + } +\msg_new:nnn {numerica-plus} {load-order} + { Please~load~version~3~of~numerica~*before*~numerica~plus. } + +\cs_if_exist:NTF \c_nmc_version_tl + { + \int_compare:nNnT { \c_nmc_version_tl } < { 30 } + { \msg_fatal:nn {numerica-plus} {version} } + } + { \msg_fatal:nn {numerica-plus} {load-order} } %---------------------------------------------------------- \cs_generate_variant:Nn \tl_if_novalue:nTF { o } @@ -30,6 +37,8 @@ } \clist_gput_right:Nn \g__nmc_info_proc_clist { iter, solve } +\int_if_zero:nT { \g__nmc_consts_vv_int } + { \int_incr:N \g__nmc_consts_vv_int } \cs_new_protected:Npn \__nmc_plus_get_var:NNn #1#2#3 { \tl_if_empty:NT #1 @@ -38,7 +47,7 @@ { \seq_item:Nn \l__nmc_vv_all_seq { \g__nmc_consts_vv_int } } \quark_if_no_value:NTF \l_tmpa_tl { - \__nmc_error_where:n { \__nmc_verb:n { #2 } } + \__nmc_error_where:n { #2 } \__nmc_error_what:n { No~#3~variable~specified~in } } { \__nmc_vv_split_item:V \l_tmpa_tl @@ -46,38 +55,25 @@ } } } -%#1 vv-list reversed #2 var_tl #3 \nmc<cmd> #4 {adjective} +% #1 vv-seq reversed #2 var_tl #3 \nmc<cmd> #4 {adjective} \cs_new_protected:Npn \__nmc_plus_vv_digest:NNNn #1#2#3#4 - { - \clist_push:NV \l_nmc_formula_tl #2 + { + \clist_push:NV \l__nmc_formula_tl #2 \__nmc_vv_digest:N #1 \tl_if_empty:NTF #2 { \__nmc_plus_get_var:NNn #2 #3 { #4 } } - { \clist_pop:NN \l_nmc_formula_tl #2 } + { \clist_pop:NN \l__nmc_formula_tl #2 } } -\cs_new_protected:Npn \__nmc_plus_reuse:nNN #1#2#3 +\cs_new_protected:Npn \__nmc_plus_reuse:N #1 { - \int_case:nnF { #1 } - { - { 1 } - { - \seq_pop:NN #2 \l_tmpa_tl - \seq_pop:NN #3 \l_tmpb_tl - \tl_gset:Nx \g__nmc_reuse_tl - { { \l_tmpa_tl , \l_tmpb_tl } } - \seq_mapthread_function:NNN #2 #3 \__nmc_plus_reuse_display:nn - } - { 2 } - { - \tl_gset:Nx \g__nmc_reuse_tl - { \seq_use:Nn #3 { , } } - } - } - { \tl_gset_eq:NN \g__nmc_reuse_tl \l_nmc_result_tl } - } -\cs_new_protected:Npn \__nmc_plus_reuse_display:nn #1#2 - { \clist_gput_right:Nx \g__nmc_reuse_tl { { #1 , #2 } } } - + \tl_gclear:N \g__nmc_reuse_tl + \seq_map_inline:Nn #1 + { \tl_gput_right:Nn \g__nmc_reuse_tl { ,{##1} } } + \tl_gset:Nx \g__nmc_reuse_tl + { \exp_last_unbraced:NV \use_none:n \g__nmc_reuse_tl } + } +\NewDocumentCommand \clitem { m m } + { \clist_item:Nn #1 { #2 } } % \nmcIterate %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \int_new:N \l__nmc_iter_total_int \int_new:N \l__nmc_iter_view_int @@ -95,12 +91,13 @@ \nmc_define:NnN \nmcIterate { iter } \iter -\cs_gset_protected:Npn \__nmc_iter_initialize: +\cs_set_protected:Npn \__nmc_iter_initialize: { - \tl_set:Nn \l__nmc_dbg_idiii_tl { function } + \tl_set:Nn \l__nmc_dbg_idii_tl { function } \tl_set:Nn \l__nmc_dbg_idv_tl { stored } + \__nmc_env_initialize: } -\cs_gset_protected:Npn \__nmc_iter_settings_digest: +\cs_set_protected:Npn \__nmc_iter_settings: { \bool_set_false:N \l__nmc_allow_TF_out_bool \int_set:Nn \l__nmc_iter_total_int @@ -108,6 +105,12 @@ \int_set:Nn \l__nmc_iter_view_int { \int_min:nn { \int_max:nn { \l__nmc_iter_view_int } { 1 } } { \l__nmc_iter_total_int } } + \__nmc_env_settings: + } +\cs_gset_protected:Npn \__nmc_iter_formula: + { + \__nmc_env_formula: + \tl_set_eq:NN \l__nmc_formula_dup_tl \l__nmc_formula_tl } \cs_gset_protected:Npn \__nmc_iter_vv_digest:N #1 { @@ -121,7 +124,7 @@ % first iterate \__nmc_error_where:n { formula } \tl_clear:N \l__nmc_fp_expr_tl - \__nmc_fpify:VN \l_nmc_formula_tl \l__nmc_fp_expr_tl + \__nmc_fpify:VN \l__nmc_formula_tl \l__nmc_fp_expr_tl \fp_set:Nn \l__nmc_result_fp { \l__nmc_fp_expr_tl } \__nmc_error_fpflag: \bool_if:NF \g__nmc_error_bool @@ -137,7 +140,17 @@ \__nmc_iter_write: } \int_if_zero:nF \l__nmc_dbg_int - { \__nmc_dbg_get_data: } + { + \__nmc_dbg_get_data: + \__nmc_if_mod_zero:nnT \l__nmc_dbg_int { 11 } + { \__nmc_iter_display: } + } + } +\cs_gset_protected:Npn \__nmc_iter_display: + { + \tl_gset_eq:NN \l__nmc_show_tl \l__nmc_result_tl + \__nmc_if_mod_zero:nnF { \l__nmc_dbg_int } { 11 } + { \l__nmc_show_tl } } %-------------------------------------- \cs_new_protected:Npn \__nmc_iter_do: @@ -148,19 +161,20 @@ \bool_if:NF \g__nmc_error_bool { \__nmc_num_format:nNnN { \l__nmc_iter_fixedpti_fp } - \l_nmc_result_tl { \l__nmc_round_int } + \l__nmc_result_tl { \l__nmc_round_int } \l__nmc_sci_num_out_bool - \int_decr:N \l__nmc_iter_total_int + \tl_gset_eq:NN \g__nmc_reuse_tl \l__nmc_result_tl + \int_decr:N \l__nmc_iter_total_int % for checking iter. \tl_gset:Nx \g__nmc_info_iter_tl { \int_use:N \l__nmc_iter_total_int } } } - { % don't print initial iterations + { % don't print initial iters \int_step_function:nnnN { 1 } { 1 } { \l__nmc_iter_total_int - \l__nmc_iter_view_int - 1 } \__nmc_iter_current:n \bool_if:NF \g__nmc_error_bool - { % store then print these ones + { % store & print these ones \seq_clear:N \l__nmc_iter_result_seq \int_step_function:nnnN { 1 } { 1 } { \int_min:nn { \l__nmc_iter_view_int } @@ -172,19 +186,19 @@ { % stepping function \bool_if:NF \g__nmc_error_bool { - \__nmc_calc_fn_val:VNnN \l__nmc_iter_var_tl \l_nmc_formula_tl + \__nmc_calc_fn_val:VNnN \l__nmc_iter_var_tl \l__nmc_formula_tl { \l__nmc_result_fp } \l__nmc_result_fp } } \cs_new_protected:Npn \__nmc_iter_current_store:n #1 { % stepping function - \__nmc_calc_fn_val:VNnN \l__nmc_iter_var_tl \l_nmc_formula_tl + \__nmc_calc_fn_val:VNnN \l__nmc_iter_var_tl \l__nmc_formula_tl { \l__nmc_result_fp } \l__nmc_result_fp \bool_if:NF \g__nmc_error_bool { - \__nmc_num_format:nNnN { \l__nmc_result_fp } \l_nmc_result_tl + \__nmc_num_format:nNnN { \l__nmc_result_fp } \l__nmc_result_tl { \l__nmc_round_int } \l__nmc_sci_num_out_bool - \seq_put_right:NV \l__nmc_iter_result_seq \l_nmc_result_tl + \seq_put_right:NV \l__nmc_iter_result_seq \l__nmc_result_tl \int_set:Nn \l_tmpa_int { \l__nmc_iter_total_int - \l__nmc_iter_view_int + #1 } \seq_put_right:Nx \l__nmc_iter_index_seq { \int_use:N \l_tmpa_int } @@ -195,6 +209,7 @@ \int_set:Nn \l__nmc_iter_total_int { 1 } \fp_set_eq:NN \l__nmc_iter_fixedpti_fp \l__nmc_iter_first_fp \fp_set:Nn \l__nmc_iter_fixedptii_fp { \l__nmc_iter_fixedpti_fp + 1 } + \int_incr:N \l__nmc_iter_max_int % for fx pt checking iter \bool_until_do:nn { \fp_compare_p:nNn { 0 } = @@ -205,28 +220,28 @@ { \int_incr:N \l__nmc_iter_total_int \fp_set_eq:NN \l__nmc_iter_fixedptii_fp \l__nmc_iter_fixedpti_fp - \__nmc_calc_fn_val:VNnN \l__nmc_iter_var_tl \l_nmc_formula_tl + \__nmc_calc_fn_val:VNnN \l__nmc_iter_var_tl \l__nmc_formula_tl { \l__nmc_result_fp } \l__nmc_result_fp \fp_set_eq:NN \l__nmc_iter_fixedpti_fp \l__nmc_result_fp - \int_compare:nNnF { \l__nmc_iter_total_int } < - { \l__nmc_iter_max_int } + \int_compare:nNnT {\l__nmc_iter_total_int} > {\l__nmc_iter_max_int} { \bool_gset_true:N \g__nmc_error_bool + \int_decr:N \l__nmc_iter_max_int \__nmc_error_what:n { - No~fixed~point~attained~after~$\int_use:N - \l__nmc_iter_total_int$~iterations~of + No~fixed~point~attained~after~$ \int_use:N + \l__nmc_iter_max_int $~iterations~of } } } } \cs_new_protected:Npn \__nmc_iter_environ: - { + { \tl_set:Nx \l__nmc_iter_begin_tl { \mode_if_math:F { \exp_not:o \l__nmc_math_delimi_tl } \exp_not:N \begin{array}{r@{}l} - \bool_if:NTF \l__nmc_wraps_math_bool + \bool_if:NTF \l__nmc_see_formula_bool { \exp_not:o \l__nmc_formula_dup_tl &{}= } { &{} } } @@ -241,40 +256,28 @@ \__nmc_num_format:nNnN { \l__nmc_iter_first_fp } \l_tmpa_tl { \l__nmc_round_int } \l__nmc_sci_num_out_bool \tl_gset:Nx \g__nmc_info_iter_tl { \int_use:N \l__nmc_iter_total_int } - \__nmc_if_mod_zero:nnTF { \l__nmc_dbg_int } { 7 } - { \seq_get_right:NN \l__nmc_iter_result_seq \l_nmc_result_tl } + \tl_set:Nx \l__nmc_result_tl { - \tl_set:Nx \l_nmc_result_tl + \exp_not:o \l__nmc_iter_begin_tl + \l_tmpa_tl + \exp_not:o \l__nmc_vv_tl + \int_compare:nNnT + { \l__nmc_iter_total_int } > { \l__nmc_iter_view_int + 1 } { - \exp_not:o \l__nmc_iter_begin_tl - \l_tmpa_tl - \exp_not:o \l__nmc_vv_display_tl - \int_compare:nNnT - { \l__nmc_iter_total_int } > { \l__nmc_iter_view_int + 1 } - { - \\ & \exp_not:N \ldots - \ \exp_not:N\mbox{final\ - \int_use:N \l__nmc_iter_view_int\ of\ \g__nmc_info_iter_tl :} - } - \int_compare:nNnT { \l__nmc_iter_total_int } > { 1 } - { \\ & \exp_not:N \hookrightarrow } - \seq_use:Nn \l__nmc_iter_result_seq { \\ & \hookrightarrow } - \exp_not:o \l__nmc_iter_end_tl + \\ & \exp_not:N \ldots + \ \exp_not:N\mbox{final\ + \int_use:N \l__nmc_iter_view_int\ of\ \g__nmc_info_iter_tl :} } - } - } -\cs_gset_protected:Npn \__nmc_iter_display: - { - \bool_if:NTF \l__nmc_num_only_bool - { \tl_gset_eq:NN \g__nmc_reuse_tl \l_nmc_result_tl } - { - \__nmc_plus_reuse:nNN { \l__nmc_iter_reuse_int } - \l__nmc_iter_index_seq \l__nmc_iter_result_seq + \int_compare:nNnT { \l__nmc_iter_total_int } > { 1 } + { \\ & \exp_not:N \hookrightarrow } + \seq_use:Nn \l__nmc_iter_result_seq { \\ & \hookrightarrow } + \exp_not:o \l__nmc_iter_end_tl } - \l_nmc_result_tl + \__nmc_plus_reuse:N \l__nmc_iter_result_seq } %-------------------------------------- %\nmcSolve +\tl_new:N \l__nmc_solve_to_tl \int_new:N \l__nmc_solve_round_int \int_new:N \l__nmc_solve_steps_int \int_new:N \l__nmc_solve_slope_int @@ -294,19 +297,24 @@ \cs_gset_protected:Npn \__nmc_solve_initialize: { - \tl_set:Nn \l__nmc_dbg_idiii_tl { function } + \tl_set:Nn \l__nmc_dbg_idii_tl { function } \tl_set:Nn \l__nmc_dbg_idv_tl { stored } + \tl_clear:N \l__nmc_show_tl + \__nmc_env_initialize: } -\cs_gset_protected:Npn \__nmc_solve_settings_digest: +\cs_gset_protected:Npn \__nmc_solve_settings: { \bool_set_false:N \l__nmc_allow_TF_out_bool \tl_if_empty:NF \l__nmc_solve_step_tl { - \__nmc_fpify_set:NV \l__nmc_solve_step_fp \l__nmc_solve_step_tl + \__nmc_fpify_set:NV \l__nmc_solve_step_fp \l__nmc_solve_step_tl \fp_compare:nNnT \l__nmc_solve_step_fp = { 0 } { \__nmc_error_what:n { Non-zero~initial~step~required~in } } } + \__nmc_env_settings: } +\cs_gset_protected:Npn \__nmc_solve_formula: + { \__nmc_env_formula: } \cs_gset_protected:Npn \__nmc_solve_vv_digest:N #1 { \__nmc_plus_vv_digest:NNNn #1 @@ -325,15 +333,49 @@ } \bool_if:NF \g__nmc_error_bool { - \__nmc_num_format:nNnN { \l__nmc_solvea_fp } \l_nmc_result_tl + \__nmc_num_format:nNnN { \l__nmc_solvea_fp } \l__nmc_result_tl { \l__nmc_round_int } \l__nmc_sci_num_out_bool \tl_gset:Nx \g__nmc_info_solve_tl { \clist_use:Nn \g__nmc_info_solve_tl { + } } \tl_set_eq:NN \l__nmc_fp_expr_tl \l__nmc_fp_exprn_tl } \int_if_zero:nF \l__nmc_dbg_int - { \__nmc_dbg_get_data: } + { + \__nmc_dbg_get_data: + \__nmc_if_mod_zero:nnT \l__nmc_dbg_int { 11 } + { \__nmc_solve_display: } + } + } +\cs_gset_protected:Npn \__nmc_solve_display: + { + \tl_gset_eq:NN \g__nmc_reuse_tl \l__nmc_result_tl + \bool_if:NTF \l__nmc_num_only_bool + { \tl_set_eq:NN \l__nmc_show_tl \l__nmc_result_tl } + { + \__nmc_num_format:nNnN { \l__nmc_solvefa_fp } \l_tmpa_tl + { \l__nmc_round_int } \l__nmc_sci_num_out_bool + \tl_clear:N \l__nmc_display_tl + \tl_put_right:Nx \l__nmc_display_tl + { + \bool_if:NTF \l__nmc_see_formula_bool + { + \exp_not:o \l__nmc_formula_tl = \l_tmpa_tl + \bool_if:nT { \l__nmc_see_vv_bool + && !\l__nmc_env_rbrace_bool } + { \exp_not:o \l__nmc_vv_tl } + \l__nmc_solve_to_tl \l__nmc_solve_var_tl = \l__nmc_result_tl + } + { \exp_not:o \l__nmc_solve_var_tl = \l__nmc_result_tl } + } + \__nmc_eval_rdisplay:ooo \l__nmc_display_tl + \l__nmc_punc_tl \l__nmc_math_delimii_tl + \__nmc_eval_ldisplay:noo {} + \l__nmc_math_delimi_tl \l__nmc_env_arg_tl + } + \__nmc_if_mod_zero:nnF { \l__nmc_dbg_int } { 11 } + { \l__nmc_show_tl } } +%%%%%%%%% \cs_new_protected:Npn \__nmc_solve_get_trial_vals: { \prop_get:NVN \l__nmc_subst_var_prop @@ -382,7 +424,7 @@ } \bool_if:nF { \g__nmc_error_bool || \l__nmc_solve_stop_bool } { - \__nmc_error_where:n { $\l_nmc_formula_tl$ } + \__nmc_error_where:n { $\l__nmc_formula_tl$ } \__nmc_error_what:n { No~zero/extremum~found~after~$\int_use:N @@ -408,7 +450,7 @@ \tl_gset:Nx \g__nmc_info_solve_tl { \int_use:N \l__nmc_solve_steps_int } \int_zero:N \l__nmc_solve_steps_int \fp_set:Nn \l__nmc_solvec_fp { ( \l__nmc_solvea_fp + \l__nmc_solveb_fp ) / 2 } - \__nmc_calc_fn_val:VNnN \l__nmc_solve_var_tl \l_nmc_formula_tl + \__nmc_calc_fn_val:VNnN \l__nmc_solve_var_tl \l__nmc_formula_tl { \l__nmc_solvec_fp } \l__nmc_solvefc_fp \fp_set:Nn \l__nmc_solved_fp { \l__nmc_solvec_fp + 1 } \bool_until_do:nn @@ -440,7 +482,7 @@ \fp_set:Nn \l__nmc_solvec_fp { ( \l__nmc_solvea_fp + \l__nmc_solveb_fp ) / 2 } \__nmc_calc_fn_val:VNnN \l__nmc_solve_var_tl - \l_nmc_formula_tl { \l__nmc_solvec_fp } \l__nmc_solvefc_fp + \l__nmc_formula_tl { \l__nmc_solvec_fp } \l__nmc_solvefc_fp } } \bool_set_true:N \l__nmc_solve_stop_bool @@ -500,11 +542,12 @@ } \cs_new_protected:Npn \__nmc_solve_calc_values: { - \__nmc_calc_fn_val:VNnN \l__nmc_solve_var_tl \l_nmc_formula_tl + \__nmc_calc_fn_val:VNnN \l__nmc_solve_var_tl \l__nmc_formula_tl { \l__nmc_solvea_fp } \l__nmc_solvefa_fp + \bool_if:NF \g__nmc_error_bool { - \__nmc_calc_fn_val:VNnN \l__nmc_solve_var_tl \l_nmc_formula_tl + \__nmc_calc_fn_val:VNnN \l__nmc_solve_var_tl \l__nmc_formula_tl { \l__nmc_solveb_fp } \l__nmc_solvefb_fp } \bool_if:NF \g__nmc_error_bool @@ -515,41 +558,6 @@ { \fp_eval:n { sign(\l__nmc_solvefa_fp) sign(\l__nmc_solvefb_fp) } } } } -\cs_gset_protected:Npn \__nmc_solve_display: - { - \tl_gset_eq:NN \g__nmc_reuse_tl \l_nmc_result_tl - \bool_if:NF \l__nmc_num_only_bool - { - \__nmc_num_format:nNnN { \l__nmc_solvefa_fp } \l_tmpa_tl - { \l__nmc_round_int } \l__nmc_sci_num_out_bool - \tl_set:Nx \l_nmc_result_tl - { - \exp_not:o \l__nmc_math_delimi_tl - \bool_if:NTF \l__nmc_wraps_math_bool - { - \exp_not:o \l_nmc_formula_tl = \l_tmpa_tl - \bool_if:NTF \l__nmc_vv_multline_bool - { \exp_not:o \l__nmc_vv_display_tl } - { - \mathchoice{ \exp_not:o \l__nmc_vv_display_tl } - { \exp_not:o \l__nmc_vv_inline_tl }{}{} - } - \rightarrow \exp_not:N \quad - \l__nmc_solve_var_tl = \l_nmc_result_tl - } - { - \l__nmc_solve_var_tl = \l_nmc_result_tl - \mathchoice{ \exp_not:o \l__nmc_vv_display_tl } - { \exp_not:o \l__nmc_vv_inline_tl }{}{} - } - \l__nmc_punc_tl - \exp_not:o \l__nmc_math_delimii_tl - } - \int_if_zero:nT { \l__nmc_solve_reuse_int } - { \tl_gset_eq:NN \g__nmc_reuse_tl \l_nmc_result_tl } - } - \l_nmc_result_tl - } %-------------------------------------- % \nmcRecur \bool_new:N \l__nmc_recur_ellipsis_bool @@ -570,12 +578,13 @@ \nmc_define:NnN \nmcRecur { recur } \recur -\cs_gset_protected:Npn \__nmc_recur_initialize: +\cs_set_protected:Npn \__nmc_recur_initialize: { - \tl_set:Nn \l__nmc_dbg_idiii_tl { relation } + \tl_set:Nn \l__nmc_dbg_idii_tl { relation } \tl_set:Nn \l__nmc_dbg_idv_tl { stored } + \__nmc_env_initialize: } -\cs_gset_protected:Npn \__nmc_recur_settings_digest: +\cs_set_protected:Npn \__nmc_recur_settings: { \bool_set_false:N \l__nmc_allow_TF_out_bool \int_set:Nn \l__nmc_recur_total_int @@ -588,25 +597,71 @@ { \l__nmc_recur_total_int - \l__nmc_recur_last_int } } } \int_if_zero:nT { \l__nmc_recur_first_int } { \int_decr:N \l__nmc_recur_first_int } + \__nmc_env_settings: + } +\cs_set_protected:Npn \__nmc_recur_formula: + { + \__nmc_env_formula: + \tl_set_eq:NN \l__nmc_formula_dup_tl \l__nmc_formula_tl } -\cs_gset_protected:Npn \__nmc_recur_vv_digest:N #1 - { % #1 = reversed vv clist +\cs_set_protected:Npn \__nmc_recur_vv_digest:N #1 + { % #1 = reversed vv seq \bool_set_true:N \l__nmc_multitok_bool \__nmc_recur_elements: \__nmc_recur_vars_change:N #1 - \__nmc_vv_digest:N #1 + \__nmc_vv_digest:N #1 \__nmc_recur_vv_post: - \tl_set_eq:NN \l_nmc_formula_tl \l__nmc_recurrence_tl + \tl_set_eq:NN \l__nmc_formula_tl \l__nmc_recurrence_tl \int_if_zero:nF \l__nmc_dbg_int { \__nmc_dbg_get_data: } } +\cs_set_protected:Npn \__nmc_recur_process: + { % store initial vals; generate later vals + \__nmc_recur_store_ini: + \__nmc_error_where:n { recurrence~formula } + \__nmc_recur_generate: + \seq_get_right:NN \l__nmc_recur_result_seq \l__nmc_result_tl + \tl_set_eq:NN \l__nmc_fp_expr_tl \l__nmc_fp_exprn_tl + } +\cs_set_protected:Npn \__nmc_recur_display: + { + \tl_clear:N \l__nmc_show_tl + \bool_if:NTF \l__nmc_num_only_bool + { + \tl_gset_eq:NN \g__nmc_reuse_tl \l__nmc_result_tl + \l__nmc_result_tl + } + { + \seq_clear:N \l_tmpa_seq + \seq_clear:N \l_tmpb_seq + \seq_clear:N \l_tmpc_seq + \__nmc_recur_result:NN \l_tmpa_seq \l_tmpb_seq + \tl_clear:N \l__nmc_display_tl + \tl_set:Nx \l__nmc_display_tl + { + \bool_if:NT \l__nmc_see_formula_bool + { + \exp_not:o \l__nmc_formula_dup_tl + \exp_not:o \l__nmc_vv_tl + \l__nmc_recur_to_tl + } + \seq_use:Nn \l_tmpa_seq { \c__nmc_vv_delim_tl\ } + } + \__nmc_plus_reuse:N \l_tmpb_seq + \__nmc_eval_rdisplay:ooo \l__nmc_display_tl + \l__nmc_punc_tl \l__nmc_math_delimii_tl + \__nmc_eval_ldisplay:noo {} + \l__nmc_math_delimi_tl \l__nmc_env_arg_tl + \l__nmc_show_tl + } + } % \l__nmc_recurrence_tl, \l__nmc_recur_base_var_tl, % \l__nmc_recur_subscr_var_tl, \l__nmc_recur_subscr_val_int \cs_new_protected:Npn \__nmc_recur_elements: { \tl_clear:N \l_tmpa_tl \bool_set_false:N \l_tmpa_bool - \tl_map_inline:Nn \l_nmc_formula_tl + \tl_map_inline:Nn \l__nmc_formula_tl { \bool_if:NTF \l_tmpa_bool { @@ -623,7 +678,7 @@ } } \__nmc_recur_parse_subscr:N \l_tmpa_tl - \exp_last_unbraced:NV\__nmc_split_eq:w \l_nmc_formula_tl \q_stop + \exp_last_unbraced:NV\__nmc_split_eq:w \l__nmc_formula_tl \q_stop \tl_set:NV \l__nmc_recurrence_tl \l__nmc_eq_val_tl \tl_set_rescan:Nno \l__nmc_recurrence_tl { \ExplSyntaxOn } \l__nmc_recurrence_tl } @@ -648,15 +703,19 @@ } \int_set:Nn \l__nmc_recur_subscr_val_int { \l_tmpb_tl } } +\clist_new:N \l__nmca_clist \cs_new_protected:Npn \__nmc_recur_vars_change:N #1 { % f_{1} etc ==> f_{n-1} etc in #1 (reverse order vv-list) - \clist_reverse:N #1 + \seq_reverse:N #1 + \clist_set:Nx \l__nmca_clist { \seq_use:Nn #1 {,} } \int_zero:N \l__nmc_recur_order_int \clist_clear:N \l_tmpa_clist % --> \l__nmc_recur_vars_seq \clist_clear:N \l_tmpb_clist % --> #1 \int_set:Nn \l_tmpb_int { \l__nmc_recur_subscr_val_int - 1 } - \tl_set_rescan:Nno #1 { \ExplSyntaxOn } #1 - \clist_map_inline:Nn #1 + % \tl_set_rescan:Nno #1 { \ExplSyntaxOn } #1 + % \clist_map_inline:Nn #1 + \tl_set_rescan:Nno \l__nmca_clist { \ExplSyntaxOn } \l__nmca_clist + \clist_map_inline:Nn \l__nmca_clist { \seq_set_split:Nnn \l_tmpa_seq {_} { ##1 } \seq_pop:NN \l_tmpa_seq \l_tmpa_tl @@ -701,30 +760,23 @@ \int_set:Nn \l__nmc_recur_var_int { \l__nmc_recur_subscr_ini_int + \l__nmc_recur_order_int - \l__nmc_recur_subscr_val_int } - \clist_set_eq:NN #1 \l_tmpb_clist + \clist_set_eq:NN \l__nmca_clist \l_tmpb_clist + \seq_set_from_clist:NN #1 \l__nmca_clist \clist_put_left:NV \l_tmpa_clist \l__nmc_recur_subscr_var_tl - \clist_concat:NNN \l_nmc_formula_tl \l__nmc_recurrence_tl \l_tmpa_clist + \clist_concat:NNN \l__nmc_formula_tl \l__nmc_recurrence_tl \l_tmpa_clist } \cs_new_protected:Npn \__nmc_recur_vv_post: - { - \clist_pop:NN \l_nmc_formula_tl \l__nmc_recurrence_tl - \clist_pop:NN \l_nmc_formula_tl \l__nmc_recur_subscr_var_tl + { + \clist_pop:NN \l__nmc_formula_tl \l__nmc_recurrence_tl + \clist_pop:NN \l__nmc_formula_tl \l__nmc_recur_subscr_var_tl \tl_set:Nx \l_tmpa_tl { \int_use:N \l__nmc_recur_var_int } \__nmc_vv_record:NVN \l__nmc_recur_subscr_var_tl \l_tmpa_tl \c_empty_prop \tl_set_eq:NN \l_tmpa_tl \l__nmc_recur_subscr_var_tl \tl_put_right:Nn \l_tmpa_tl { =0 } % formal value \seq_put_left:NV \l__nmc_calc_fn_seq \l_tmpa_tl - \seq_set_from_clist:NN \l__nmc_recur_vars_seq \l_nmc_formula_tl + \seq_set_from_clist:NN \l__nmc_recur_vars_seq \l__nmc_formula_tl } %%%%%%%%%%%%%%%%%%% -\cs_gset_protected:Npn \__nmc_recur_process: - { % store initial vals; generate later vals - \__nmc_recur_store_ini: - \__nmc_error_where:n { recurrence~formula } - \__nmc_recur_generate: - \seq_get_right:NN \l__nmc_recur_result_seq \l_nmc_result_tl - \tl_set_eq:NN \l__nmc_fp_expr_tl \l__nmc_fp_exprn_tl - } \cs_new_protected:Npn \__nmc_recur_store_ini: { \seq_set_eq:NN \l_tmpa_seq \l__nmc_recur_vars_seq @@ -740,7 +792,7 @@ } } \cs_new_protected:Npn \__nmc_recur_generate: - { + { \prop_get:NVN \l__nmc_subst_var_prop \l__nmc_recur_subscr_var_tl \l__nmc_subst_tl \int_set:Nn \l__nmc_recur_var_int { \l__nmc_subst_tl } @@ -755,13 +807,13 @@ \cs_new_protected:Npn \__nmc_recur_generate_loop:n #1 { \bool_if:NF \g__nmc_error_bool - { % calc. the next term + { % calc. next \fp_set:Nn \l_tmpa_fp { #1 } \__nmc_calc_fn_val:VNnN \l__nmc_recur_subscr_var_tl \l__nmc_recurrence_tl { \l_tmpa_fp } \l__nmc_recur_result_fp } \bool_if:NF \g__nmc_error_bool - { % store the result + { % store result \__nmc_num_format:nNnN { \l__nmc_recur_result_fp } \l_tmpa_tl { \l__nmc_round_int } \l__nmc_sci_num_out_bool \seq_put_right:NV \l__nmc_recur_result_seq \l_tmpa_tl @@ -783,37 +835,6 @@ { \fp_use:N \l__nmc_recur_result_fp } } } -\cs_gset_protected:Npn \__nmc_recur_display: - { - \bool_if:NTF \l__nmc_num_only_bool - { \tl_gset_eq:NN \g__nmc_reuse_tl \l_nmc_result_tl } - { - \seq_clear:N \l_tmpa_seq - \seq_clear:N \l_tmpb_seq - \seq_clear:N \l_tmpc_seq - \__nmc_recur_result:NN \l_tmpa_seq \l_tmpb_seq - \tl_set:Nx \l_nmc_result_tl - { - \exp_not:o \l__nmc_math_delimi_tl - \bool_if:NT \l__nmc_wraps_math_bool - { - \exp_not:o \l__nmc_formula_dup_tl - \bool_if:NTF \l__nmc_vv_multline_bool - { \exp_not:o \l__nmc_vv_display_tl } - { - \mathchoice{ \exp_not:o \l__nmc_vv_display_tl } - { \exp_not:o \l__nmc_vv_inline_tl }{}{} - } - \rightarrow \exp_not:N \quad - } - \seq_use:Nn \l_tmpa_seq { ,\ } - \l__nmc_punc_tl - \exp_not:o \l__nmc_math_delimii_tl - } - \__nmc_plus_reuse:nNN { \l__nmc_recur_reuse_int } \l_tmpc_seq \l_tmpb_seq - } - \l_nmc_result_tl - } \cs_new_protected:Npn \__nmc_recur_result:NN #1#2 { \int_zero:N \l_tmpa_int @@ -838,79 +859,45 @@ \int_incr:N \l_tmpa_int } \bool_if:NT \l__nmc_recur_ellipsis_bool - { \seq_put_right:Nn #1{ \ldots } } + { \seq_put_right:Nn #1 { \ldots } } } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\keys_define:nn { numerica-plus } - { - iter-do .int_set:N = \l__nmc_iter_total_int, - iter-see-last .int_set:N = \l__nmc_iter_view_int, - iter-max-iterations .int_set:N = \l__nmc_iter_max_int, - iter-extra-rounding .int_set:N = \l__nmc_iter_extra_int, - iter-reuse .int_set:N = \l__nmc_iter_reuse_int, - - iter-do .default:n = 5, - iter-see-last .default:n = 4, - iter-max-iterations .default:n = 100, - iter-extra-rounding .default:n = 0, - iter-reuse .default:n = 0, -% - solve-max-steps .int_set:N = \l__nmc_solve_max_int, - solve-extra-rounding .int_set:N = \l__nmc_solve_extra_int, - solve-first-step .tl_set:N = \l__nmc_solve_step_tl, - solve-reuse .int_set:N = \l__nmc_solve_reuse_int, - - solve-max-steps .default:n = 100, - solve-extra-rounding .default:n = 0, - solve-first-step .default:n = 1, - solve-reuse .default:n = 0, -% - recur-do .int_set:N = \l__nmc_recur_total_int, - recur-see-first .int_set:N = \l__nmc_recur_first_int, - recur-see-last .int_set:N = \l__nmc_recur_last_int, - recur-reuse .int_set:N = \l__nmc_recur_reuse_int, - - recur-do .default:n = 7, - recur-see-first .default:n = 3, - recur-see-last .default:n = 2, - recur-reuse .default:n = 0 - } -\keys_set_known:nn { numerica-plus } - { - iter-do,iter-see-last,iter-max-iterations, - iter-extra-rounding,iter-reuse, - solve-variable,solve-first-step,solve-max-steps, - solve-extra-rounding,solve-reuse, - recur-do,recur-see-first,recur-see-last,recur-reuse - } \keys_define:nn { numerica/iter } { + view .code:n = \__nmc_dbg_int:nn { 1 } { 2*3*5*7*11 }, var .tl_set:N = \l__nmc_iter_var_tl, + .int_set:N = \l__nmc_iter_extra_int, + + .initial:n = 0, max .int_set:N = \l__nmc_iter_max_int, + max .initial:n = 100, do .int_set:N = \l__nmc_iter_total_int, + do .initial:n = 5, see .int_set:N = \l__nmc_iter_view_int, - reuse .int_set:N = \l__nmc_iter_reuse_int + see .initial:n = 4 } \keys_define:nn { numerica/solve } { - var .tl_set:N = \l__nmc_solve_var_tl, - + .int_set:N = \l__nmc_solve_extra_int, - max .int_set:N = \l__nmc_solve_max_int, - dvar .tl_set:N = \l__nmc_solve_step_tl, - reuse .int_set:N = \l__nmc_solve_reuse_int + view .code:n = \__nmc_dbg_int:nn { 1 } { 2*3*5*7*11 }, + var .tl_set:N = \l__nmc_solve_var_tl, + + .int_set:N = \l__nmc_solve_extra_int, + + .initial:n = 0, + max .int_set:N = \l__nmc_solve_max_int, + max .initial:n = 100, + dvar .tl_set:N = \l__nmc_solve_step_tl, + dvar .initial:n = 1, + to .tl_set:N = \l__nmc_solve_to_tl, + to .initial:n = {\,\to\,} , } \keys_define:nn { numerica/recur } { - do .int_set:N = \l__nmc_recur_total_int, - see1 .int_set:N = \l__nmc_recur_first_int, - see2 .int_set:N = \l__nmc_recur_last_int, - ... .code:n = \bool_set_true:N \l__nmc_recur_ellipsis_bool, - reuse .int_set:N = \l__nmc_recur_reuse_int - } -\file_if_exist:nT { numerica-plus.cfg } - { - \file_get:nnN { numerica-plus.cfg } {} \l_tmpa_tl - \exp_args:NnV \keys_set_known:nn { numerica-plus } \l_tmpa_tl + do .int_set:N = \l__nmc_recur_total_int, + do .initial:n = 7, + see1 .int_set:N = \l__nmc_recur_first_int, + see1 .initial:n = 3, + see2 .int_set:N = \l__nmc_recur_last_int, + see2 .initial:n = 2, + ... .code:n = \bool_set_true:N \l__nmc_recur_ellipsis_bool, + to .tl_set:N = \l__nmc_recur_to_tl, + to .initial:n = {\,\to\,} } % end of `numerica-plus.sty'. |