summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2023-08-22 22:45:59 +0000
committerKarl Berry <karl@freefriends.org>2023-08-22 22:45:59 +0000
commitea39527914dd7740302a337d64e3669b99e03ba8 (patch)
tree5e22518de8339e41b185657480571c5979857504 /Master/texmf-dist/tex
parent32e21ecdd4f51f1c29e7456564180085379aa16d (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.sty485
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'.