From 693851fcb2698450b53dce0962991f803c52bc61 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sun, 12 Dec 2021 22:29:10 +0000 Subject: numerica (12dec21) git-svn-id: svn://tug.org/texlive/trunk@61283 c570f23f-e606-0410-a88d-b1316a301751 --- .../texmf-dist/tex/latex/numerica/numerica-lyx.def | 44 - .../tex/latex/numerica/numerica-plus.def | 876 --------- .../tex/latex/numerica/numerica-tables.def | 1138 ----------- Master/texmf-dist/tex/latex/numerica/numerica.sty | 2024 ++++++++++++-------- 4 files changed, 1204 insertions(+), 2878 deletions(-) delete mode 100644 Master/texmf-dist/tex/latex/numerica/numerica-lyx.def delete mode 100644 Master/texmf-dist/tex/latex/numerica/numerica-plus.def delete mode 100644 Master/texmf-dist/tex/latex/numerica/numerica-tables.def (limited to 'Master/texmf-dist/tex/latex/numerica') diff --git a/Master/texmf-dist/tex/latex/numerica/numerica-lyx.def b/Master/texmf-dist/tex/latex/numerica/numerica-lyx.def deleted file mode 100644 index 96b0f7b1933..00000000000 --- a/Master/texmf-dist/tex/latex/numerica/numerica-lyx.def +++ /dev/null @@ -1,44 +0,0 @@ -% This is file `numerica-lyx.def', -% part of the `numerica' package -% -% This work may be distributed and/or modified under the conditions -% of the LaTeX Project Public License, either version 1.3c of this -% license or any later version; see -% http://www.latex-project.org/lppl.txt -% -% Andrew Parsloe (ajparsloe@gmail.com) -% -\ProvidesExplFile - {numerica-lyx.def} - {2021/02/15} - {1.0.0} - { Enable reuse command to preview in LyX } -%---------------------------------------------------------- -% copy (only once) .nmc file from doc to temp -% directory; use nmcDummy.txt to mark success -\tl_set:NV \l_tmpb_tl \jobname -\tl_put_right:Nn \l_tmpb_tl {.nmc} -\file_if_exist:nTF { nmcDummy.txt } - { \tl_gset_eq:NN \g__nmc_reuse_filename_tl \l_tmpb_tl } - { - \iow_open:Nn \g__nmc_iow { nmcDummy.txt } - \iow_close:N \g__nmc_iow - \makeatletter - \tl_set:Nx \l_tmpa_tl \input@path - \makeatother - \exp_last_unbraced:NNV - \tl_gset:Nn \g__nmc_reuse_filename_tl \l_tmpa_tl - \tl_gput_right:NV \g__nmc_reuse_filename_tl \l_tmpb_tl - \file_get:VnNTF \g__nmc_reuse_filename_tl {} \l__nmc_reuse_retrieved_tl - { - \tl_gset_eq:NN \g__nmc_reuse_filename_tl \l_tmpb_tl - \iow_open:NV \g__nmc_iow \g__nmc_reuse_filename_tl - \bool_lazy_or:nnF - { \tl_if_blank_p:V \l__nmc_reuse_retrieved_tl } - { \tl_if_head_eq_meaning_p:VN \l__nmc_reuse_retrieved_tl \par } - { \iow_now:NV \g__nmc_iow \l__nmc_reuse_retrieved_tl } - \iow_close:N \g__nmc_iow - } - { \tl_gset_eq:NN \g__nmc_reuse_filename_tl \l_tmpb_tl } - } -% end of `numerica-lyx.def' \ No newline at end of file diff --git a/Master/texmf-dist/tex/latex/numerica/numerica-plus.def b/Master/texmf-dist/tex/latex/numerica/numerica-plus.def deleted file mode 100644 index 6301dc96434..00000000000 --- a/Master/texmf-dist/tex/latex/numerica/numerica-plus.def +++ /dev/null @@ -1,876 +0,0 @@ -% This is file `numerica-plus.def', -% part of the `numerica' package. -% -% This work may be distributed and/or modified under the conditions -% of the LaTeX Project Public License, either version 1.3c of this -% license or any later version; see -% http://www.latex-project.org/lppl.txt -% -% Andrew Parsloe (ajparsloe@gmail.com) -% -\ProvidesExplFile - {numerica-plus.def} - {2021/02/15} - {1.0.0} - { Iterate functions, find fixed points, zeros, extrema and recurrence terms } -%---------------------------------------------------------- -\cs_new_protected:Npn \__nmc_plus_reuse:nNN #1#2#3 - { - \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 - { \tl_gput_right:Nx \g__nmc_reuse_tl { , { #1 , #2 } } } -%-------------------------------------- -% \nmcIterate -\int_new:N \l__nmc_iter_total_int -\int_new:N \l__nmc_iter_view_int -\int_new:N \l__nmc_iter_round_int -\tl_new:N \l__nmc_iter_var_tl -\fp_new:N \l__nmc_iter_first_fp -\seq_new:N \l__nmc_iter_result_seq -\seq_new:N \l__nmc_iter_index_seq - -\fp_new:N \l__nmc_iter_fixedpti_fp -\fp_new:N \l__nmc_iter_fixedptii_fp - -\tl_new:N \l__nmc_iter_begin_tl -\tl_new:N \l__nmc_iter_end_tl -\tl_new:N \g__nmc_iter_info_tl - -\nmc_define:nnN { \nmcIterate } { iter } \iter - -\cs_new_protected:Npn \__nmc_iter_settings_digest: - { - \bool_set_false:N \l__nmc_allow_TF_out_bool - \int_set:Nn \l__nmc_iter_total_int - { \int_max:nn { \l__nmc_iter_total_int } { 1 } } - \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 } } - } -\cs_new_protected:Npn \__nmc_iter_vv_digest:N #1 - { - \tl_if_empty:NTF \l__nmc_iter_var_tl - { \__nmc_vv_digest:N #1 } - { - \clist_push:NV \l__nmc_formula_tl \l__nmc_iter_var_tl - \__nmc_vv_digest:N #1 - \clist_pop:NN \l__nmc_formula_tl \l__nmc_iter_var_tl - } - } -\cs_new_protected:Npn \__nmc_iter_process: - { - \int_set:Nn \l__nmc_iter_round_int - { \l__nmc_round_int + \l__nmc_iter_extra_int } - % 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 - \fp_set:Nn \l__nmc_result_fp { \l__nmc_fp_expr_tl } - \__nmc_error_fpflag: - - \bool_if:NF \g__nmc_error_bool - { - \fp_set_eq:NN \l__nmc_iter_first_fp \l__nmc_result_fp - \tl_if_empty:NT \l__nmc_iter_var_tl - { % get iter. var if unspecified - \seq_get:NN \l__nmc_vv_all_seq \l_tmpa_tl - \__nmc_vv_split_item:V \l_tmpa_tl - \tl_set_eq:NN \l__nmc_iter_var_tl \l__nmc_eq_var_tl - } - \__nmc_iter_do: - \tl_set_eq:NN \l__nmc_fp_expr_tl \l__nmc_fp_exprn_tl - } - \bool_if:nF { \g__nmc_error_bool || \l__nmc_num_only_bool } - { - \__nmc_iter_environ: - \__nmc_iter_write: - } - } -%-------------------------------------- -\cs_new_protected:Npn \__nmc_iter_do: - { - \bool_if:NTF \l__nmc_num_only_bool - { - \__nmc_iter_fixed_pt: - \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_sci_num_out_bool - \int_decr:N \l__nmc_iter_total_int - \tl_gset:Nx \g__nmc_iter_info_tl - { \int_use:N \l__nmc_iter_total_int } - } - } - { % don't print initial iterations - \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 - \seq_clear:N \l__nmc_iter_result_seq - \int_step_function:nnnN { 1 } { 1 } - { \int_min:nn { \l__nmc_iter_view_int } - { \l__nmc_iter_total_int - 1 } } \__nmc_iter_current_store:n - } - } - } -\cs_new_protected:Npn \__nmc_iter_current:n #1 - { % stepping function - \bool_if:NF \g__nmc_error_bool - { - \__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 - { \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 - { \l__nmc_round_int } \l__nmc_sci_num_out_bool - \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 } - } - } -\cs_new_protected:Npn \__nmc_iter_fixed_pt: - { % already 1 iteration - \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 } - \bool_until_do:nn - { - \fp_compare_p:nNn { 0 } = - { round( \l__nmc_iter_fixedpti_fp - \l__nmc_iter_fixedptii_fp, - \l__nmc_iter_round_int ) } - || \g__nmc_error_bool - } - { - \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 - { \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 } - { - \bool_gset_true:N \g__nmc_error_bool - \__nmc_error_what:n - { - No~fixed~point~attained~after~$\int_use:N - \l__nmc_iter_total_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 - { \exp_not:o \l__nmc_formula_dup_tl &{}= } - { &{} } - } - \tl_set:Nx \l__nmc_iter_end_tl - { - \exp_not:N \end{array} - \mode_if_math:F { \exp_not:o \l__nmc_math_delimii_tl } - } - } -\cs_new_protected:Npn \__nmc_iter_write: - { - \__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_iter_info_tl { \int_use:N \l__nmc_iter_total_int } - \__nmc_if_mod_zero:nnTF { \l__nmc_debug_int } { 7 } - { \seq_get_right:NN \l__nmc_iter_result_seq \l_nmc_result_tl } - { - \tl_set:Nx \l_nmc_result_tl - { - \exp_not:o \l__nmc_iter_begin_tl - \l_tmpa_tl \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_iter_info_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 - } - } - } -\cs_new_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 - } - \l_nmc_result_tl - } -%-------------------------------------- -%\nmcSolve -\int_new:N \l__nmc_solve_round_int -\int_new:N \l__nmc_solve_steps_int -\int_new:N \l__nmc_solve_slope_int -\int_new:N \l__nmc_solve_slopei_int -\int_new:N \l__nmc_solve_signs_int -\fp_new:N \l__nmc_solvea_fp -\fp_new:N \l__nmc_solveb_fp -\fp_new:N \l__nmc_solvec_fp -\fp_new:N \l__nmc_solved_fp - -\fp_new:N \l__nmc_solvefa_fp -\fp_new:N \l__nmc_solvefb_fp -\fp_new:N \l__nmc_solvefc_fp -\bool_new:N \l__nmc_solve_stop_bool -\tl_new:N \g__nmc_sove_info_tl - -\nmc_define:nnN { \nmcSolve } { solve } \solve - -\cs_new_protected:Npn \__nmc_solve_settings_digest: - { - \bool_set_false:N \l__nmc_allow_TF_out_bool - \tl_if_empty:NF \l__nmc_solve_step_tl - { - \__nmc_fpify_set:NN \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 } } - } - } -\cs_new_protected:Npn \__nmc_solve_vv_digest:N #1 - { - \tl_if_empty:NTF \l__nmc_solve_var_tl - { \__nmc_vv_digest:N #1 } - { - \clist_push:NV \l__nmc_formula_tl \l__nmc_solve_var_tl - \__nmc_vv_digest:N #1 - \clist_pop:NN \l__nmc_formula_tl \l__nmc_solve_var_tl - } - } -\cs_new_protected:Npn \__nmc_solve_process: - { - \int_set:Nn \l__nmc_solve_round_int - { \l__nmc_round_int + \l__nmc_solve_extra_int } - % get equation var if unspecified - \tl_if_empty:NT \l__nmc_solve_var_tl - { - \seq_get:NN \l__nmc_vv_all_seq \l_tmpa_tl - \__nmc_vv_split_item:V \l_tmpa_tl - \tl_set_eq:NN \l__nmc_solve_var_tl \l__nmc_eq_var_tl - } - \bool_if:NF \g__nmc_error_bool - { \__nmc_solve_get_trial_vals: } - \bool_if:NF \g__nmc_error_bool - { - \__nmc_error_where:n { function } - \__nmc_solve_do: - } - \bool_if:NF \g__nmc_error_bool - { - \__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_solve_info_tl - { \clist_use:Nn \g__nmc_solve_info_tl { + } } - \tl_set_eq:NN \l__nmc_fp_expr_tl \l__nmc_fp_exprn_tl - } - } -\cs_new_protected:Npn \__nmc_solve_get_trial_vals: - { - \prop_get:NVN \g__nmc_subst_var_prop - \l__nmc_solve_var_tl \l__nmc_subst_tl - % ensure a < b - \int_case:nn { \fp_sign:n { \l__nmc_solve_step_fp } } - { - { 1 } - { - \fp_set:Nn \l__nmc_solvea_fp { \l__nmc_subst_tl } - \fp_set:Nn \l__nmc_solveb_fp - { \l__nmc_solvea_fp + \l__nmc_solve_step_fp } - } - { -1 } - { - \fp_set:Nn \l__nmc_solveb_fp { \l__nmc_subst_tl } - \fp_set:Nn \l__nmc_solvea_fp - { \l__nmc_solveb_fp + \l__nmc_solve_step_fp } - } - } - } -% find opp. signs, zero, or fn min. -% a b = var vals; fa fb = fn vals -\cs_new_protected:Npn \__nmc_solve_do: - { - \__nmc_solve_calc_values: - \int_zero:N \l__nmc_solve_steps_int - \tl_gclear:N \g__nmc_solve_info_tl - \bool_do_until:nn - { - \g__nmc_error_bool || \l__nmc_solve_stop_bool - || \int_compare_p:nNn - { \l__nmc_solve_steps_int } > { \l__nmc_solve_max_int } - || \fp_compare_p:nNn { 0 } = - { round(\l__nmc_solveb_fp - \l__nmc_solvea_fp, - \l__nmc_solve_round_int) } - } - { - \int_incr:N \l__nmc_solve_steps_int - \int_case:nn { \l__nmc_solve_signs_int } - { - { 0 } { \__nmc_solve_do_bingo: } - { -1 } { \__nmc_solve_do_bisect: } - { 1 } { \__nmc_solve_do_slope: } - } - } - \bool_if:nF { \g__nmc_error_bool || \l__nmc_solve_stop_bool } - { - \__nmc_error_where:n { $\l__nmc_formula_tl$ } - \__nmc_error_what:n - { - No~zero/extremum~found~after~$\int_use:N - \l__nmc_solve_max_int$~steps~for~function - } - } - } -\cs_new_protected:Npn \__nmc_solve_do_bingo: - { % fn = 0 to 16 figures - \fp_compare:nNnTF { \l__nmc_solvefb_fp } = { 0 } - { - \fp_set_eq:NN \l__nmc_solvea_fp \l__nmc_solveb_fp - \fp_set_eq:NN \l__nmc_solvefa_fp \l__nmc_solvefb_fp - } - { - \fp_set_eq:NN \l__nmc_solveb_fp \l__nmc_solvea_fp - \fp_set_eq:NN \l__nmc_solvefb_fp \l__nmc_solvefa_fp - } - \bool_set_true:N \l__nmc_solve_stop_bool - } -\cs_new_protected:Npn \__nmc_solve_do_bisect: - { - \tl_gset:Nx \g__nmc_solve_info_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 - { \l__nmc_solvec_fp } \l__nmc_solvefc_fp - \fp_set:Nn \l__nmc_solved_fp { \l__nmc_solvec_fp + 1 } - \bool_until_do:nn - { - \g__nmc_error_bool || - \fp_compare_p:nNn { 0 } = - { round( \l__nmc_solvec_fp - \l__nmc_solved_fp , - \l__nmc_solve_round_int ) } - } - { - \int_incr:N \l__nmc_solve_steps_int - \fp_set_eq:NN \l__nmc_solved_fp \l__nmc_solvec_fp - \fp_compare:nNnTF { 0 } = { \l__nmc_solvefc_fp } - { - \fp_set_eq:NN \l__nmc_solvea_fp \l__nmc_solvec_fp - \fp_set_eq:NN \l__nmc_solvefa_fp \l__nmc_solvefc_fp - } - { - \fp_compare:nNnTF - { sign(\l__nmc_solvefa_fp)sign(\l__nmc_solvefc_fp) } = { 1 } - { - \fp_set_eq:NN \l__nmc_solvea_fp \l__nmc_solvec_fp - \fp_set_eq:NN \l__nmc_solvefa_fp \l__nmc_solvefc_fp - } - { - \fp_set_eq:NN \l__nmc_solveb_fp \l__nmc_solvec_fp - \fp_set_eq:NN \l__nmc_solvefb_fp \l__nmc_solvefc_fp - } - \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 - } - } - \bool_set_true:N \l__nmc_solve_stop_bool - \clist_gput_right:Nx \g__nmc_solve_info_tl { \int_use:N \l__nmc_solve_steps_int } - } -\cs_new_protected:Npn \__nmc_solve_do_slope: - { - \bool_if:NF \g__nmc_error_bool - { - \int_if_zero:nTF { \l__nmc_solve_slope_int } - { % contract - \fp_add:Nn \l__nmc_solvea_fp - { ( \l__nmc_solveb_fp - \l__nmc_solvea_fp ) / 4 } - \fp_sub:Nn \l__nmc_solveb_fp - { ( \l__nmc_solveb_fp - \l__nmc_solvea_fp ) / 4 } - } - { % always towards x-axis - \fp_compare:nNnTF { 0 } < - { \l__nmc_solvefa_fp * \l__nmc_solve_slope_int } - { \__nmc_solve_do_slope_left: } - { \__nmc_solve_do_slope_right: } - } - \fp_set_eq:NN \l__nmc_solved_fp \l__nmc_solvea_fp - \int_set_eq:NN \l__nmc_solve_slopei_int \l__nmc_solve_slope_int - \__nmc_solve_calc_values: - } - \bool_if:NF \g__nmc_error_bool - { - \int_compare:nNnF { \l__nmc_solve_slope_int } = - { \l__nmc_solve_slopei_int } - { - \fp_set:Nn \l__nmc_solvec_fp { ( \l__nmc_solvea_fp + \l__nmc_solveb_fp ) / 2 } - \int_case:nn { \l__nmc_solve_slopei_int } - { - { 1 } { \fp_set_eq:NN \l__nmc_solvea_fp \l__nmc_solvec_fp } - { -1 } { \fp_set_eq:NN \l__nmc_solveb_fp \l__nmc_solvec_fp } - } - \__nmc_solve_calc_values: - } - } - \fp_compare:nNnT { 0 } = - { round(\l__nmc_solveb_fp - \l__nmc_solvea_fp, - \l__nmc_solve_round_int) } - { \bool_set_true:N \l__nmc_solve_stop_bool } - } -\cs_new_protected:Npn \__nmc_solve_do_slope_left: - { - \fp_set:Nn \l__nmc_solvec_fp { 2 \l__nmc_solvea_fp - \l__nmc_solveb_fp } - \fp_set_eq:NN \l__nmc_solveb_fp \l__nmc_solvea_fp - \fp_set_eq:NN \l__nmc_solvea_fp \l__nmc_solvec_fp - } -\cs_new_protected:Npn \__nmc_solve_do_slope_right: - { - \fp_set:Nn \l__nmc_solvec_fp { 2 \l__nmc_solveb_fp - \l__nmc_solvea_fp } - \fp_set_eq:NN \l__nmc_solvea_fp \l__nmc_solveb_fp - \fp_set_eq:NN \l__nmc_solveb_fp \l__nmc_solvec_fp - } -\cs_new_protected:Npn \__nmc_solve_calc_values: - { - \__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 - { \l__nmc_solveb_fp } \l__nmc_solvefb_fp - } - \bool_if:NF \g__nmc_error_bool - { - \int_set:Nn \l__nmc_solve_slope_int - { \fp_eval:n { sign(\l__nmc_solvefb_fp - \l__nmc_solvefa_fp) } } - \int_set:Nn \l__nmc_solve_signs_int - { \fp_eval:n { sign(\l__nmc_solvefa_fp) sign(\l__nmc_solvefb_fp) } } - } - } -\cs_new_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 -\int_new:N \l__nmc_recur_last_int -\fp_new:N \l__nmc_recur_result_fp - -\int_new:N \l__nmc_recur_subscr_ini_int -\int_new:N \l__nmc_recur_subscr_val_int -\int_new:N \l__nmc_recur_order_int -\int_new:N \l__nmc_recur_var_int - -\tl_new:N \l__nmc_recurrence_tl -\tl_new:N \l__nmc_recur_base_var_tl -\tl_new:N \l__nmc_recur_subscr_var_tl - -\seq_new:N \l__nmc_recur_result_seq -\seq_new:N \l__nmc_recur_index_seq -\seq_new:N \l__nmc_recur_vars_seq - -\nmc_define:nnN { \nmcRecur } { recur } \recur - -\cs_new_protected:Npn \__nmc_recur_settings_digest: - { - \bool_set_false:N \l__nmc_allow_TF_out_bool - \int_set:Nn \l__nmc_recur_total_int - { \int_max:nn { \l__nmc_recur_total_int } { 1 } } - \int_set:Nn \l__nmc_recur_last_int - { \int_max:nn { 0 } { \int_min:nn - { \l__nmc_recur_last_int } { \l__nmc_recur_total_int } } } - \int_set:Nn \l__nmc_recur_first_int - { \int_max:nn { 0 } { \int_min:nn { \l__nmc_recur_first_int } - { \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 } - } -\cs_new_protected:Npn \__nmc_recur_vv_digest:N #1 - { % #1 = reversed vv clist - \bool_set_true:N \l__nmc_multitok_bool - \__nmc_recur_elements: - \__nmc_recur_vars_change:N #1 - \__nmc_vv_digest:N #1 - \__nmc_recur_vv_post: - \tl_set_eq:NN \l__nmc_formula_tl \l__nmc_recurrence_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 - { - \bool_if:NTF \l_tmpa_bool - { - \tl_set:Nn \l_tmpa_tl { ##1 } - \tl_map_break: - } - { - \token_if_math_subscript:NTF ##1 - { - \tl_set:NV \l__nmc_recur_base_var_tl \l_tmpa_tl - \bool_set_true:N \l_tmpa_bool - } - { \tl_put_right:Nn \l_tmpa_tl { ##1 } } - } - } - \__nmc_recur_parse_subscr:N \l_tmpa_tl - \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 - } -\cs_new_protected:Npn \__nmc_recur_parse_subscr:N #1 - { - \tl_clear:N \l__nmc_recur_subscr_var_tl - \tl_set:Nn \l_tmpb_tl { 0 } - \int_zero:N \l__nmc_recur_subscr_val_int - \bool_set_false:N \l_tmpa_bool - \tl_map_inline:Nn #1 - { - \bool_if:NTF \l_tmpa_bool - { \tl_put_right:Nn \l_tmpb_tl { ##1 } } - { - \tl_if_in:nnTF { +- } { ##1 } - { - \tl_put_right:Nn \l_tmpb_tl { ##1 } - \bool_set_true:N \l_tmpa_bool - } - { \tl_put_right:Nn \l__nmc_recur_subscr_var_tl { ##1 } } - } - } - \int_set:Nn \l__nmc_recur_subscr_val_int { \l_tmpb_tl } - } -\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 - \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 - { - \seq_set_split:Nnn \l_tmpa_seq {_} { ##1 } - \seq_pop:NN \l_tmpa_seq \l_tmpa_tl - \seq_if_empty:NTF \l_tmpa_seq - { \clist_put_left:NV \l_tmpb_clist \l_tmpa_tl } - { - \tl_if_eq:NNTF \l_tmpa_tl \l__nmc_recur_base_var_tl - { % change e.g. f_{1}(x) to f_{n-1}(x) - \int_incr:N \l__nmc_recur_order_int - \tl_put_right:Nn \l_tmpa_tl { _ } - \tl_set_eq:NN \l_tmpb_tl \l__nmc_recur_subscr_var_tl - \int_case:nn { \int_sign:n { \l_tmpb_int } } - { - { -1 } - { - \tl_put_right:Nx \l_tmpb_tl - { \int_use:N \l_tmpb_int } - } - { 0 } { \prg_do_nothing: } - { 1 } - { - \tl_put_right:Nn \l_tmpb_tl { + } - \tl_put_right:Nx \l_tmpb_tl - { \int_use:N \l_tmpb_int } - } - } - \tl_put_right:Nx \l_tmpa_tl { { \l_tmpb_tl } } - \int_decr:N \l_tmpb_int - \seq_pop:NN \l_tmpa_seq \l_tmpb_tl - \int_set:Nn \l__nmc_recur_subscr_ini_int - { \tl_head:N \l_tmpb_tl } - \tl_put_right:Nx \l_tmpa_tl - { \tl_range:Nnn \l_tmpb_tl { 2 } { -1 } } - \clist_put_left:NV \l_tmpb_clist \l_tmpa_tl - \seq_set_split:NnV \l_tmpb_seq { = } \l_tmpa_tl - \seq_pop:NN \l_tmpb_seq \l_tmpa_tl - \clist_put_left:NV \l_tmpa_clist \l_tmpa_tl - } - { \clist_put_left:Nn \l_tmpb_clist { ##1 } } - } - } - \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_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 - } -\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 - \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 - } -%%%%%%%%%%%%%%%%%%% -\cs_new_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 - \int_step_inline:nnnn { 1 } { 1 } { \l__nmc_recur_order_int } - { - \seq_pop:NN \l_tmpa_seq \l_tmpa_tl - \prop_get:NVN \g__nmc_subst_var_prop \l_tmpa_tl \l__nmc_subst_tl - \__nmc_num_format:nNnN { \l__nmc_subst_tl } \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 - \tl_set:Nx \l_tmpb_tl { \int_eval:n - { \l__nmc_recur_subscr_ini_int + ##1 -1 } } - \seq_put_right:NV \l__nmc_recur_index_seq \l_tmpb_tl - } - } -\cs_new_protected:Npn \__nmc_recur_generate: - { - \prop_get:NVN \g__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 } - \int_set:Nn \l_tmpa_int { \l__nmc_recur_var_int + - \l__nmc_recur_total_int - \l__nmc_recur_order_int - 1 } - \__nmc_error_where:n { recurrence~relation } - \__nmc_if_mod_zero:nnT { \l__nmc_debug_int } { 7 } - { \__nmc_fpify:VN \l__nmc_recurrence_tl \l__nmc_fp_expr_tl } - \int_step_function:nnnN { \l__nmc_recur_var_int } { 1 } - {\l_tmpa_int } \__nmc_recur_generate_loop:n - } -\cs_new_protected:Npn \__nmc_recur_generate_loop:n #1 - { - \bool_if:NF \g__nmc_error_bool - { % calc. the next term - \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 - \__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 - \seq_put_right:Nn \l__nmc_recur_index_seq { #1 } - % shift vals "down variable"; tmpa above, tmpb below - \seq_set_eq:NN \l_tmpa_seq \l__nmc_recur_vars_seq - \seq_pop:NN \l_tmpa_seq \l_tmpb_tl % low var - \int_step_inline:nnnn {2} { 1 } { \l__nmc_recur_order_int } - { - \seq_pop:NN \l_tmpa_seq \l_tmpa_tl % hi var - \prop_get:NVN \g__nmc_subst_var_prop \l_tmpa_tl \l__nmc_subst_tl - \prop_put:NVV \g__nmc_subst_var_prop \l_tmpb_tl \l__nmc_subst_tl - \prop_put:NVV \l__nmc_vv_change_prop \l_tmpb_tl \l__nmc_subst_tl - \tl_set_eq:NN \l_tmpb_tl \l_tmpa_tl - } - % use tmpb, not tmpa, in case order = 1 - \prop_put:NVx \g__nmc_subst_var_prop \l_tmpb_tl - { \fp_use:N \l__nmc_recur_result_fp } - \prop_put:NVx \l__nmc_vv_change_prop \l_tmpb_tl - { \fp_use:N \l__nmc_recur_result_fp } - } - } -\cs_new_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 - \seq_map_inline:Nn \l__nmc_recur_result_seq - { - \seq_pop:NN \l__nmc_recur_index_seq \l__nmc_toss_tl - \int_compare:nNnTF { \l_tmpa_int } < { \l__nmc_recur_first_int } - { \seq_put_right:Nn #1 { ##1 } } - { - \int_compare:nTF { \l_tmpa_int = \l__nmc_recur_first_int - < \l__nmc_recur_total_int - \l__nmc_recur_last_int } - { \seq_put_right:Nn #1 { \ldots } } - { - \int_compare:nNnT { 1 + \l_tmpa_int } > - { \l__nmc_recur_total_int - \l__nmc_recur_last_int } - { - \seq_put_right:Nn #1 { ##1 } - \seq_put_right:Nn #2 { ##1 } - \seq_put_right:Nx \l_tmpc_seq { \int_eval:n { \l_tmpa_int + \l__nmc_recur_subscr_val_int } } - } - } - } - \int_incr:N \l_tmpa_int - } - \bool_if:NT \l__nmc_recur_ellipsis_bool - { \seq_put_right:Nn #1{ \ldots } } - } -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\keys_define:nn { numerica } - { - 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 } - { - 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 } - { - var .tl_set:N = \l__nmc_iter_var_tl, - + .int_set:N = \l__nmc_iter_extra_int, - max .int_set:N = \l__nmc_iter_max_int, - do .int_set:N = \l__nmc_iter_total_int, - see .int_set:N = \l__nmc_iter_view_int, - reuse .int_set:N = \l__nmc_iter_reuse_int - } -\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 - } -\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 - } -% end of `numerica-plus.def' \ No newline at end of file diff --git a/Master/texmf-dist/tex/latex/numerica/numerica-tables.def b/Master/texmf-dist/tex/latex/numerica/numerica-tables.def deleted file mode 100644 index 5fb2efd5b48..00000000000 --- a/Master/texmf-dist/tex/latex/numerica/numerica-tables.def +++ /dev/null @@ -1,1138 +0,0 @@ -% This is file `numerica-tables.def', -% part of the `numerica' package. -% -% This work may be distributed and/or modified under the conditions -% of the LaTeX Project Public License, either version 1.3c of this -% license or any later version; see -% http://www.latex-project.org/lppl.txt -% -% Andrew Parsloe (ajparsloe@gmail.com) -% -\RequirePackage{booktabs} -% -\ProvidesExplFile - {numerica-tables.def} - {2021/02/15} - {1.0.0} - {Create tables of function values} -%---------------------------------------------------------- -\cs_new_protected:Npn \__nmc_table_prepad:Nnn #1#2#3 - { - \tl_put_left:Nx #1 { \prg_replicate:nn - { \int_max:nn { #2 - \tl_count:N #1 } { 0 } } { #3 } } - } -\cs_new:Npn \__nmc_sci_num_table_plus:nn #1#2 - { % #1 significand, #2 exponent - \fp_compare:nTF { #1 >= 0 } - { ( #2 )\,{ \__nmc_sci_num_table:n { #1 } } } - { ( #2 )\,{ #1 } } - } -\cs_new:Npn \__nmc_sci_num_table:n #1 - { - \int_compare:nNnF { \l__nmc_num_sgn_int } < { 0 } - { - \int_case:nn { \l__nmc_table_signs_int } - { - {-2 } { \exp_not:N \hphantom{-} } - {-1 } { \bool_if:NTF \l__nmc_table_signs_bool - { + }{ \exp_not:N \hphantom{-} } } - { 1 } { \bool_if:NT \l__nmc_table_signs_bool { + } } - { 2 } { + } - } - } - #1 - } -%-------------------------------------- -\tl_new:N \l__nmc_x_tl -\seq_new:N \l_tmpd_seq -\tl_const:Nn \c__nmc_r_tl { r } -\tl_const:Nn \c__nmc_l_tl { l } -\bool_new:N \l__nmc_table_clist_bool -\clist_new:N \l__nmc_formula_clist -\tl_new:N \l__nmc_table_valign_tl -\seq_new:N \l_nmc_table_reuse_seq - -\tl_new:N \l__nmc_table_rvar_tl -\tl_new:N \l__nmc_table_rvari_tl -\tl_new:N \l__nmc_table_rstart_tl -\tl_new:N \l__nmc_table_rstop_tl -\tl_new:N \l__nmc_table_rstep_tl -\fp_new:N \l__nmc_table_rstart_fp -\fp_new:N \l__nmc_table_rstop_fp -\fp_new:N \l__nmc_table_rstep_fp -\fp_new:N \l__nmc_table_r_fp -\fp_new:N \l__nmc_table_c_fp -\int_new:N \l__nmc_table_rnum_int -\clist_new:N \l__nmc_table_rspec_clist -\bool_new:N \l__nmc_table_rspec_bool - -\tl_new:N \l__nmc_table_cvar_tl -\tl_new:N \l__nmc_table_cstart_tl -\tl_new:N \l__nmc_table_cstop_tl -\tl_new:N \l__nmc_table_cstep_tl -\fp_new:N \l__nmc_table_cstart_fp -\fp_new:N \l__nmc_table_cstop_fp -\fp_new:N \l__nmc_table_cstep_fp -\int_new:N \l__nmc_table_cnum_int -\clist_new:N \l__nmc_table_cspec_clist -\bool_new:N \l__nmc_table_cspec_bool - -\seq_new:N \l__nmc_table_rvraw_seq -\seq_new:N \l__nmc_table_rvcol_seq -\seq_new:N \l__nmc_table_rvcoli_seq -\seq_new:N \l__nmc_table_this_col_seq -\seq_new:N \l__nmc_table_body_cols_seq -\seq_new:N \l__nmc_table_body_rows_seq - -\seq_new:N \l__nmc_table_header_seq -\tl_new:N \l__nmc_table_header_tl -\tl_new:N \l__nmc_table_rfont_tl -\tl_new:N \l__nmc_table_rhead_tl -\tl_new:N \l__nmc_table_rheadi_tl -\tl_new:N \l__nmc_table_rhnudge_tl -\tl_new:N \l__nmc_table_rhnudgei_tl -\int_new:N \l__nmc_table_chround_int -\int_new:N \l__nmc_table_chstyle_int -\tl_new:N \l__nmc_table_chnudge_tl - -\tl_new:N \l__nmc_table_ctitle_tl -\bool_new:N \l__nmc_table_ctitle_bool -\bool_new:N \l__nmc_table_ctitle_vv_bool -\int_new:N \l__nmc_table_rules_int -\tl_new:N \l__nmc_table_footer_tl -\bool_new:N \l__nmc_table_foot_bool -\bool_new:N \l__nmc_table_footops_bool -\tl_new:N \l__nmc_table_csum_tl -\tl_new:N \l__nmc_table_cave_tl -\tl_new:N \l__nmc_table_cmax_tl -\tl_new:N \l__nmc_table_cmin_tl -\tl_new:N \l__nmc_table_cdel_tl -\tl_new:N \l__nmc_table_rbloc_tl -\tl_new:N \l__nmc_table_rblock_tl -\int_new:N \l__nmc_table_rbloc_int -\clist_new:N \l__nmc_table_rbloc_clist - -\int_new:N \l__nmc_table_signs_int -\int_new:N \l__nmc_table_tsigns_int -\int_new:N \l__nmc_table_c_int -\int_new:N \l__nmc_table_b_int -\int_new:N \l__nmc_table_a_int -\bool_new:N \l__nmc_table_signs_bool -\bool_new:N \l__nmc_table_diffs_bool -\tl_new:N \l__nmc_table_diff_tl -\tl_new:N \l__nmc_table_diff_null_tl - -\tl_new:N \l__nmc_table_Q_tl -\tl_new:N \l__nmc_table_A_tl -\fp_new:N \l__nmc_table_max_fp -\fp_new:N \l__nmc_table_min_fp -\bool_new:N \l__nmc_table_QA_max_bool -\bool_new:N \l__nmc_table_QA_min_bool -\bool_new:N \l__nmc_table_QA_bool -\bool_new:N \l__nmc_table_num_only_bool -\tl_new:N \l__nmc_table_num_only_tl -\tl_new:N \l__nmc_table_query_tl -%------------------------------------------------ -\nmc_define:nnN { \nmcTabulate } { table } \tabulate - -\cs_new_protected:Npn \__nmc_table_settings_digest: - { - \bool_set_false:N \l__nmc_allow_TF_out_bool - \int_compare:nTF { 0 <= \l__nmc_table_rpos_int <= 4 } - { - \int_compare:nNnT { \l__nmc_table_rpos_int } = { 4 } - { \int_incr:N \l__nmc_table_rpos_int } - } - { \int_set:Nn \l__nmc_table_rpos_int { 1 } } - \clist_if_empty:NF \l__nmc_table_rspec_clist - { \__nmc_table_settings_spec:N r } - \clist_if_empty:NF \l__nmc_table_cspec_clist - { \__nmc_table_settings_spec:N c } - \tl_if_empty:NT \l__nmc_table_rhead_tl - { \tl_set_eq:NN \l__nmc_table_rhead_tl \l__nmc_table_rvar_tl } - \tl_if_empty:NT \l__nmc_table_rheadi_tl - { - \tl_if_empty:NTF \l__nmc_table_rvari_tl - { \tl_set_eq:NN \l__nmc_table_rheadi_tl \l__nmc_table_rhead_tl } - { \tl_set_eq:NN \l__nmc_table_rheadi_tl \l__nmc_table_rvari_tl } - } - \tl_if_empty:NT \l__nmc_table_rhnudgei_tl - { \tl_set_eq:NN \l__nmc_table_rhnudgei_tl \l__nmc_table_rhnudge_tl } - - \tl_if_empty:NF \l__nmc_table_ctitle_tl - { \l__nmc_table_settings_ctitle: } - \tl_if_empty:NTF \l__nmc_table_Q_tl - { \tl_set:Nn \l__nmc_table_query_tl { *~option~ } } - { - \tl_set:Nn \l__nmc_table_query_tl { table~value~satisfies~ } - \__nmc_table_settings_QA: - } - \clist_if_empty:NTF \l__nmc_table_rbloc_clist - { \tl_set:Nn \l__nmc_table_rbloc_tl { 10000 } } - { \clist_pop:NN \l__nmc_table_rbloc_clist \l__nmc_table_rbloc_tl } - \tl_set_eq:NN \l__nmc_table_rblock_tl \l__nmc_table_rbloc_tl - \int_set:Nn \l__nmc_table_rbloc_int { \l__nmc_table_rbloc_tl } - - \__nmc_table_settings_rules: - \int_if_zero:nTF \l__nmc_table_diffs_int - { \bool_set_false:N \l__nmc_table_diffs_bool } - { \bool_set_true:N \l__nmc_table_diffs_bool } - \tl_if_empty:NF \l__nmc_table_chead_tl - { \int_set:Nn \l__nmc_table_chstyle_int { 4 } } - \tl_if_empty:NF \l__nmc_table_footer_tl - { - \tl_if_eq:VnTF \l__nmc_table_footer_tl { * } - { \bool_set_true:N \l__nmc_table_foot_bool } - { \__nmc_table_footer:N \l__nmc_table_footer_tl } - } - } -\cs_new_protected:Npn \l__nmc_table_settings_ctitle: - { - \bool_set_true:N \l__nmc_table_ctitle_bool - \tl_if_head_eq_charcode:VNT \l__nmc_table_ctitle_tl * - { - \tl_if_eq:VnT \l__nmc_table_ctitle_tl { ** } - { \bool_set_true:N \l__nmc_table_ctitle_vv_bool } - \tl_if_head_eq_charcode:VNT \l__nmc_table_ctitle_tl * - { - \tl_set:Nn \l__nmc_table_ctitle_tl - { \exp_not:o \l__nmc_formula_dup_tl } - } - } - } -\cs_new_protected:Npn \__nmc_table_settings_rules: - { - \tl_replace_once:Nnn \l__nmc_table_rules_tl { T } { *2 } - \tl_replace_once:Nnn \l__nmc_table_rules_tl { t } { *3 } - \tl_replace_once:Nnn \l__nmc_table_rules_tl { h } { *5 } - \tl_replace_once:Nnn \l__nmc_table_rules_tl { f } { *7 } - \tl_replace_once:Nnn \l__nmc_table_rules_tl { B } { *11 } - \int_set:Nn \l__nmc_table_rules_int { 1 \l__nmc_table_rules_tl } - } -\cs_new_protected:Npn \__nmc_table_settings_QA: - { - \bool_set_true:N \l__nmc_table_QA_bool - \regex_replace_all:nnN { (\@) } { \c{l_tmpb_fp} } \l__nmc_table_Q_tl - \tl_set_rescan:Nno \l__nmc_table_Q_tl { \ExplSyntaxOn } \l__nmc_table_Q_tl - \regex_replace_all:nnN { (\cC.) } { \c{exp_not:N}\1 } \l__nmc_table_A_tl - \regex_replace_all:nnN { (\@) } { \c{l_tmpb_tl} } \l__nmc_table_A_tl - \tl_if_in:NnT \l__nmc_table_Q_tl { MAX } - { - \bool_set_true:N \l__nmc_table_QA_max_bool - \regex_replace_all:nnN { MAX } { \c{l__nmc_table_max_fp} } - \l__nmc_table_Q_tl - \fp_set:Nn \l__nmc_table_max_fp { -inf } - } - \tl_if_in:NnT \l__nmc_table_Q_tl { MIN } - { - \bool_set_true:N \l__nmc_table_QA_min_bool - \regex_replace_all:nnN { MIN } { \c{l__nmc_table_min_fp} } - \l__nmc_table_Q_tl - \fp_set:Nn \l__nmc_table_min_fp { inf } - } - } -\cs_new_protected:Npn \__nmc_table_footer:N #1 - { - \tl_set_eq:NN \l_tmpa_tl #1 - \regex_replace_all:nnN { SUM } { \c{l__nmc_table_csum_tl} } #1 - \regex_replace_all:nnN { AVE } { \c{l__nmc_table_cave_tl} } #1 - \regex_replace_all:nnN { MAX } { \c{l__nmc_table_cmax_tl} } #1 - \regex_replace_all:nnN { MIN } { \c{l__nmc_table_cmin_tl} } #1 - \regex_replace_all:nnN { DEL } { \c{l__nmc_table_cdel_tl} } #1 - \tl_if_eq:NNF \l_tmpa_tl #1 - { \bool_set_true:N \l__nmc_table_footops_bool } - } -\cs_new_protected:Npn \__nmc_table_settings_spec:N #1 - { - \bool_set_true:c { l__nmc_table_ #1 spec_bool } - \clist_pop:cc { l__nmc_table_#1spec_clist } { l__nmc_table_ #1 var_tl } - \clist_pop:cc { l__nmc_table_ #1 spec_clist } { l__nmc_table_ #1 step_tl } - \clist_pop:cN { l__nmc_table_ #1 spec_clist } \l_tmpa_tl - \tl_if_head_eq_charcode:VNTF \l_tmpa_tl ( - { - \int_set:cn { l__nmc_table_ #1 num_int } - { \exp_last_unbraced:NV \__nmc_paren_arg:w \l_tmpa_tl } - } - { \tl_set_eq:cN { l__nmc_table_ #1 stop_tl } \l_tmpa_tl } - } -\cs_new:Npn \__nmc_paren_arg:w (#1) { #1 } - -\cs_new_protected:Npn \__nmc_table_vv_digest:N #1 - { - \bool_if:NTF \l__nmc_multitok_bool - { - \clist_push:NV \l__nmc_formula_tl \l__nmc_table_cvar_tl - \clist_push:NV \l__nmc_formula_tl \l__nmc_table_rvar_tl - \__nmc_vv_digest:N #1 - \clist_pop:NN \l__nmc_formula_tl \l__nmc_table_rvar_tl - \tl_if_empty:NF \l__nmc_table_cvar_tl - { \clist_pop:NN \l__nmc_formula_tl \l__nmc_table_cvar_tl } - } - { \__nmc_vv_digest:N #1 } - \seq_gpop:NN \g__nmc_error_where_seq \l__nmc_toss_tl - \__nmc_table_get_ini_vals: - \bool_if:nT - { - \int_if_zero_p:n { \l__nmc_table_rpos_int } && - \int_if_zero_p:n { \l__nmc_table_cnum_int } - } - { \__nmc_error_what:n { Null~table~specified~in } } - \bool_if:NF \g__nmc_error_bool - { - \bool_if:NT \l__nmc_table_ctitle_vv_bool - { - \exp_args:NNnx\tl_replace_once:Nnn \l__nmc_vv_inline_tl { vv } - { \seq_use:Nn \l__nmc_vv_visible_seq { , } } - \tl_put_right:Nn \l__nmc_table_ctitle_tl - { \exp_not:o \l__nmc_vv_inline_tl } - } - } - } -\cs_new_protected:Npn \__nmc_table_get_ini_vals: - { - \__nmc_error_where:n { settings } - \__nmc_table_get_ini_vals_aux:N r - \tl_if_empty:NTF \l__nmc_table_cvar_tl - { - \int_set:Nn \l__nmc_table_cnum_int - { - \int_compare:nNnTF { \l__nmc_table_cnum_int } = { -1 } - { 1 } { \int_min:nn { 1 } - { \int_abs:n { \l__nmc_table_cnum_int } } } - } - } - { \__nmc_table_get_ini_vals_aux:N c } - \seq_gpop:NN \g__nmc_error_where_seq \l__nmc_toss_tl - } -\cs_new_protected:Npn \__nmc_table_get_ini_vals_aux:N #1 - { - \prop_get:NvNTF \g__nmc_subst_var_prop { l__nmc_table_ #1 var_tl } \l_tmpa_tl - { - \fp_set:cn { l__nmc_table_ #1 start_fp } { \l_tmpa_tl } - \bool_if:cTF { l__nmc_table_ #1 spec_bool } - { - \__nmc_fpify_set:cc { l__nmc_table_ #1 step_fp } - { l__nmc_table_ #1 step_tl } - \int_compare:vNnT { l__nmc_table_ #1 num_int } = { -1 } - { - \__nmc_fpify_set:cc { l__nmc_table_ #1 stop_fp } - { l__nmc_table_ #1 stop_tl } - \l__nmc_table_calc_num:cnnn { l__nmc_table_ #1 num_int } - { l__nmc_table_ #1 stop_fp } { l__nmc_table_ #1 start_fp } - { l__nmc_table_ #1 step_fp } - } - } - { \__nmc_table_get_individual_ini_vals:N #1 } - } - { \__nmc_error_what:n { No~ \__nmc_table_rc:N #1 ~variable~specified~in } } - } -\cs_new:Npn \__nmc_table_rc:N #1 - { \tl_if_eq:NNTF #1 \c__nmc_r_tl { row } { column } } - -\cs_new_protected:Npn \l__nmc_table_calc_num:Nnnn #1#2#3#4 - { - \int_set:Nn #1 { \fp_to_int:n { ( \exp_not:v { #2 } - \exp_not:v { #3 } ) - / \exp_not:v { #4 } } + 1 } - } -\cs_generate_variant:Nn \l__nmc_table_calc_num:Nnnn { c } - -\cs_new_protected:Npn \__nmc_table_get_individual_ini_vals:N #1 - { - \int_case:vnTF { l__nmc_table_ #1 num_int } - { - { -1 } - { - \__nmc_fpify_set:cc { l__nmc_table_ #1 step_fp } - { l__nmc_table_ #1 step_tl } - \bool_if:NF \g__nmc_error_bool - { \__nmc_fpify_set:cc { l__nmc_table_ #1 stop_fp } - { l__nmc_table_ #1 stop_tl } } - \bool_if:NF \g__nmc_error_bool - { - \l__nmc_table_calc_num:cnnn { l__nmc_table_ #1 num_int } - { l__nmc_table_ #1 stop_fp } { l__nmc_table_ #1 start_fp } - { l__nmc_table_ #1 step_fp } - } - } - { 0 } - { - \fp_set:cn { l__nmc_table_ #1 stop_fp } - { \exp_not:v { l__nmc_table_ #1 start_fp } - 1 } - \fp_set:cn { l__nmc_table_ #1 step_fp } { 1 } - } - { 1 } - { - \fp_set_eq:cc { l__nmc_table_ #1 stop_fp } - { l__nmc_table_ #1 start_fp } - \fp_set:cn { l__nmc_table_ #1 step_fp } { 1 } - } - } - { - \bool_if:NT \g__nmc_error_bool - { \__nmc_error_what:n { Missing~ - \__nmc_table_rc:N #1-related~variable~in } } - } - { - \int_compare:vNnTF { l__nmc_table_ #1 num_int } > { 1 } - { \__nmc_fpify_set:cc { l__nmc_table_ #1 step_fp } - { l__nmc_table_ #1 step_tl } } - { \__nmc_error_what:n { Check~number~of~ - \__nmc_table_rc:N #1s~specified~in } } - } - } -%---------------------------------------------------------- -\cs_new_protected:Npn \__nmc_table_process: - { - \__nmc_error_where:n { formula } - \__nmc_table_calc_rvar_col: - \seq_clear:N \l__nmc_table_header_seq - \tl_if_head_eq_charcode:VNT \l__nmc_formula_tl , - { \__nmc_table_multifn: } - \__nmc_table_calc_cvar_cols: - \tl_clear:N \l_nmc_result_tl - \__nmc_table_form_body:N \l_nmc_result_tl - \tl_set_eq:NN \l__nmc_fp_expr_tl \l__nmc_fp_exprn_tl - \bool_if:NT \l__nmc_num_only_bool - { - \bool_if:NTF \l__nmc_table_num_only_bool - { - \tl_set_eq:NN \l_nmc_result_tl \l__nmc_table_num_only_tl - \tl_gset_eq:NN \g__nmc_reuse_tl \l__nmc_table_num_only_tl - } - { - \__nmc_error_where:n { settings } - \__nmc_error_what:n - { No~ \l__nmc_table_query_tl query~\__nmc_verb:n {Q?}~in } - \tl_clear:N \l_nmc_result_tl - } - } - } -\cs_new_protected:Npn \__nmc_table_multifn: - { - \bool_set_true:N \l__nmc_table_clist_bool - \clist_set:NV \l__nmc_formula_clist \l__nmc_formula_tl - \seq_set_from_clist:NN \l__nmc_table_header_seq \l__nmc_formula_clist - \int_set:Nn \l__nmc_table_cnum_int - { \clist_count:N \l__nmc_formula_clist } - \fp_set:Nn \l__nmc_table_cstep_fp { 0 } - \fp_set:Nn \l__nmc_table_cstart_fp { 0 } - \tl_set:Nn \l__nmc_table_cvar_tl { \l__nmc_x_tl } - \prop_put:Nnn \g__nmc_subst_var_prop { \l__nmc_x_tl } { 1 } - \int_set:Nn \l__nmc_table_chstyle_int { 4 } - } -\cs_new_protected:Npn \__nmc_table_calc_rvar_col: - { - \fp_set_eq:NN \l__nmc_table_r_fp \l__nmc_table_rstart_fp - \int_step_inline:nnnn { 1 } { 1 } { \l__nmc_table_rnum_int } - { - \seq_put_right:NV \l__nmc_table_rvraw_seq \l__nmc_table_r_fp - \fp_add:Nn \l__nmc_table_r_fp { \l__nmc_table_rstep_fp } - } - } -\cs_new:Npn \__nmc_table_calc_cvar_cols: - { - \fp_set_eq:NN \l__nmc_table_c_fp \l__nmc_table_cstart_fp - \int_step_inline:nn { \l__nmc_table_cnum_int } - { - \bool_if:NTF \l__nmc_table_clist_bool - { \clist_pop:NN \l__nmc_formula_clist \l__nmc_formula_tl } - { \seq_put_right:NV \l__nmc_table_header_seq { \l__nmc_table_c_fp } } - \bool_if:NF \g__nmc_error_bool - { - \seq_clear:N \l__nmc_table_this_col_seq - \fp_set_eq:NN \l__nmc_table_r_fp \l__nmc_table_rstart_fp - \int_step_function:nN { \l__nmc_table_rnum_int } - \__nmc_table_rvar_step_fn:n - } - \bool_if:NF \g__nmc_error_bool - { - \seq_put_right:NV \l__nmc_table_body_cols_seq - \l__nmc_table_this_col_seq - \fp_add:Nn \l__nmc_table_c_fp \l__nmc_table_cstep_fp - \__nmc_table_prop_mode:n {\l__nmc_mode_int} - \l__nmc_table_rvar_tl \l__nmc_table_rstart_fp - \__nmc_calc_fn_val:VNnN \l__nmc_table_cvar_tl \l__nmc_formula_tl - { \l__nmc_table_c_fp } \l__nmc_table_fn_val_fp - } - } - } -\cs_new:Npn \__nmc_table_prop_mode:n #1 - { - \int_if_zero:nTF { #1 } - { \prop_put:NVV \g__nmc_subst_var_prop } - { \prop_put:NVV \l__nmc_vv_change_prop } - } -\cs_new_protected:Npn \__nmc_table_rvar_step_fn:n #1 - { - \bool_if:NF \g__nmc_error_bool - { - \__nmc_calc_fn_val:VNnN \l__nmc_table_rvar_tl - \l__nmc_formula_tl { \l__nmc_table_r_fp } \l_tmpa_fp - \seq_put_right:NV \l__nmc_table_this_col_seq \l_tmpa_fp - \bool_if:NT \l__nmc_table_QA_bool - { \__nmc_table_maxmin_do:n { \l_tmpa_fp } } - \fp_add:Nn \l__nmc_table_r_fp { \l__nmc_table_rstep_fp } - } - } -\cs_new_protected:Npn \__nmc_table_maxmin_do:n #1 - { - \bool_if:NT \l__nmc_table_QA_max_bool - { \fp_set:Nn \l__nmc_table_max_fp - { \fp_max:nn { \l__nmc_table_max_fp } { #1} } } - \bool_if:NT \l__nmc_table_QA_min_bool - { \fp_set:Nn \l__nmc_table_min_fp - { \fp_min:nn { \l__nmc_table_min_fp } { #1 } } } - } -%---------------------------------------------------------- -\cs_new_protected:Npn \__nmc_table_display: - { - \bool_if:NF \l__nmc_num_only_bool - { - \__nmc_table_headercnum: - \tl_set:Nx \l__nmc_table_header_tl { \__nmc_table_header: } - \bool_if:NT \l__nmc_table_foot_bool - { - \seq_set_split:NnV \l_tmpa_seq { & }\l__nmc_table_header_tl - \seq_reverse:N \l_tmpa_seq - \tl_set:Nx \l__nmc_table_footer_tl { \seq_use:Nn \l_tmpa_seq { & } } - } - \tl_put_left:Nx \l_nmc_result_tl - { - \__nmc_table_upper: - \exp_not:o \l__nmc_table_header_tl - \tabularnewline - \__nmc_if_mod_zero:nnT { \l__nmc_table_rules_int } { 5 } - { \exp_not:N \midrule } - } - \tl_put_right:Nx \l_nmc_result_tl { \__nmc_table_form_lower: } - \__nmc_table_reuse: - } - \l_nmc_result_tl - } -\cs_new:Npn \__nmc_table_upper: - { - \exp_not:n { \begin{tabular} } - \exp_not:o \l__nmc_table_valign_tl - { - \int_if_odd:nT { \l__nmc_table_rpos_int } - { \l__nmc_table_rcalign_tl } - \prg_replicate:nn - { \l__nmc_table_cnum_int } \l__nmc_table_ccalign_tl - \int_compare:nNnT { \l__nmc_table_rpos_int } > { 1 } - { \l__nmc_table_rcalign_tl } - } - \__nmc_if_mod_zero:nnT { \l__nmc_table_rules_int } { 2 } - { \exp_not:N \toprule } - \bool_if:NT \l__nmc_table_ctitle_bool - { \__nmc_table_form_ctitle: } - } -\cs_new:Npn \__nmc_table_form_ctitle: - { - \int_compare:nNnTF { \l__nmc_table_rpos_int } = { 0 } - { - \int_compare:nNnF { \l__nmc_table_cnum_int } = { 1 } - { - \__nmc_table_form_ctitle:nnnn {} {} { 1 } - { \l__nmc_table_cnum_int } - } - } - { - \int_compare:nNnT { \l__nmc_table_cnum_int } > { 1 } - { - \int_case:nnF { \l__nmc_table_rpos_int } - { - { 1 } { \__nmc_table_form_ctitle:nnnn { & } {} { 2 } - { \l__nmc_table_cnum_int + 1 } } - { 2 } { \__nmc_table_form_ctitle:nnnn {} { & } { 1 } - { \l__nmc_table_cnum_int } } - } - { % 3,4/5 - \__nmc_table_form_ctitle:nnnn { & } { & } { 2 } - { \l__nmc_table_cnum_int + 1 } - } - } - } - } -\cs_new:Npn \__nmc_table_form_ctitle:nnnn #1#2#3#4 - { - #1 \exp_not:N \multicolumn - { \int_eval:n { \l__nmc_table_cnum_int } } { c } - { $ \l__nmc_table_ctitle_tl $ } - #2 \tabularnewline - \__nmc_if_mod_zero:nnT { \l__nmc_table_rules_int } { 3 } - { - \exp_not:N \cmidrule(lr) - { #3-\int_eval:n { #4 } } - } - } -%%%%%%%%%%%%%%%%%%%% -\cs_new:Npn \__nmc_table_header: - { - \int_if_zero:nTF { \l__nmc_table_cnum_int } - { - \__nmc_table_header_rvar:nn { \exp_not:o \l__nmc_table_rhead_tl } - \l__nmc_table_rhnudge_tl - } - { - \int_case:nnF { \l__nmc_table_rpos_int } - { - { 0 } { \exp_not:o \l__nmc_table_chead_tl } - { 1 } - { - \__nmc_table_header_rvar:nn - { \exp_not:o \l__nmc_table_rhead_tl } - \l__nmc_table_rhnudge_tl - & \exp_not:o \l__nmc_table_chead_tl - } - { 2 } - { - \exp_not:o \l__nmc_table_chead_tl & - \__nmc_table_header_rvar:nn - { \exp_not:o \l__nmc_table_rhead_tl } - \l__nmc_table_rhnudge_tl - } - } - { % 3,4/5 - \__nmc_table_header_rvar:nn - { \exp_not:o \l__nmc_table_rhead_tl } - \l__nmc_table_rhnudge_tl - & \exp_not:o \l__nmc_table_chead_tl & - \__nmc_table_header_rvar:nn - { \exp_not:o \l__nmc_table_rheadi_tl } - \l__nmc_table_rhnudgei_tl - } - } - } -\cs_new:Npn \__nmc_table_headercnum: - { - \int_compare:nNnTF { \l__nmc_table_cnum_int } = { 1 } - { \__nmc_table_headeri: } - { \__nmc_table_headern: } - } -\cs_new:Npn \__nmc_table_header_rvar:nn #1#2 - { \__nmc_table_header_nudge:Nnn r { #1 } { #2 } } - -\cs_new:Npn \__nmc_table_headeri: - { - \tl_if_empty:NT \l__nmc_table_chead_tl - { - \tl_set:Nx \l__nmc_table_chead_tl - { - \__nmc_table_header_nudge:Nnn c - { - \bool_if:NTF \l__nmc_table_ctitle_bool - { \exp_not:o \l__nmc_table_ctitle_tl } - { \exp_not:o \l__nmc_formula_dup_tl } - } - \l__nmc_table_chnudge_tl - } - } - } -\cs_new:Npn \__nmc_table_headern: - { - \tl_if_empty:NT \l__nmc_table_chead_tl - { - \seq_clear:N \l_tmpa_seq - \bool_set_true:N \l__nmc_table_coli_only_bool - \bool_if:NTF \l__nmc_table_clist_bool - { - \seq_map_inline:Nn \l__nmc_table_header_seq - { \__nmc_table_header_auxi:Nn \l_tmpa_seq { ##1 } } - } - { - \seq_map_inline:Nn \l__nmc_table_header_seq - { - \__nmc_num_format:nNnN { ##1 } \l_tmpb_tl - { \l__nmc_table_chround_int } \l__nmc_sci_num_out_bool - \__nmc_table_chstyler:NN \l_tmpa_seq \l_tmpb_tl - } - } - \tl_set:Nx \l__nmc_table_chead_tl { \seq_use:Nn \l_tmpa_seq { & } } - } - } -\cs_new_protected:Npn \__nmc_table_chstyler:NN #1 #2 - { - \int_case:nnF { \l__nmc_table_chstyle_int } - { - { 0 } { \__nmc_table_header_auxi:NV #1 #2 } - { 1 } - { - \bool_if:NTF \l__nmc_table_coli_only_bool - { - \__nmc_table_header_auxi:Nx #1 { \l__nmc_table_cvar_tl = #2 } - \bool_set_false:N \l__nmc_table_coli_only_bool - } - { \seq_put_right:NV #1 #2 } - } - { 2 } { \__nmc_table_header_auxi:Nx #1 { \l__nmc_table_cvar_tl = #2 } } - { 3 } { \__nmc_table_header_auxiii:NV #1 #2 } - { 4 } { \seq_set_split:NnV #1 { & } \l__nmc_table_chead_tl } - } - { \__nmc_table_header_auxi:NV #1 #2 } - } -\cs_new_protected:Npn \__nmc_table_header_auxi:Nn #1#2 - { - \seq_put_right:Nx #1 { \__nmc_table_header_nudge:Nnn c - { \exp_not:n { #2 } } \l__nmc_table_chnudge_tl } - } -\cs_generate_variant:Nn \__nmc_table_header_auxi:Nn { NV,Nx } - -\cs_new_protected:Npn \__nmc_table_header_auxiii:Nn #1#2 - { - \tl_set_eq:NN \l_tmpa_tl \l__nmc_formula_dup_tl - \regex_replace_all:nnNT { \u{l__nmc_table_cvar_tl} } { #2 } \l_tmpa_tl - { \__nmc_table_header_auxi:NV #1 \l_tmpa_tl } - } -\cs_generate_variant:Nn \__nmc_table_header_auxiii:Nn { NV } - -\cs_new:Npn \__nmc_table_header_nudge:Nnn #1#2#3 - { % #1=r(ow)/c(ol), #2=var, #3=nudge - \tl_if_eq:cNTF { l__nmc_table_ #1 calign_tl } \c__nmc_r_tl - { $ #2 #3 $ } - { - \tl_if_eq:cNTF { l__nmc_table_ #1 calign_tl } \c__nmc_l_tl - { $ #3 #2 $ } { $ #2 $ } - } - } -%%%%%%%%%% -\cs_new_protected:Npn \__nmc_table_form_body:N #1 - { % #1 \l_nmc_result_tl - \int_if_zero:nF { \l__nmc_table_rpos_int } - { - \__nmc_table_form_rvcol:NN - \l__nmc_table_rvraw_seq \l__nmc_table_rvcol_seq - } - \int_zero:N \l__nmc_table_rbloc_int - \int_if_zero:nTF { \l__nmc_table_cnum_int } - { \__nmc_table_form_body_rvcol_only:N #1 } - { \__nmc_table_form_body_cvcols:N #1 } - } -\cs_new_protected:Npn \__nmc_table_form_rvcol:NN #1#2 - { - \seq_clear:N \l_tmpb_seq - \seq_map_variable:NNn #1 \l_tmpa_tl - { - \__nmc_num_format:nNnN \l_tmpa_tl \l_tmpb_tl - { \l__nmc_table_rround_int } \c_false_bool - \seq_put_right:Nx \l_tmpb_seq - { \exp_not:o \l__nmc_table_rfont_tl { \l_tmpb_tl } } - } - \seq_set_eq:NN #2 \l_tmpb_seq - \int_compare:nNnTF { \l__nmc_table_rpos_int } > { 3 } - { \__nmc_table_form_rvcoli:NN #1 #2 } % reverse/pivot - { \seq_set_eq:NN \l__nmc_table_rvcoli_seq #2 } - } -\cs_new_protected:Npn \__nmc_table_form_rvcoli:NN #1 #2 - { - \seq_clear:N \l__nmc_table_rvcoli_seq - \seq_map_variable:NNn #1 \l_tmpa_tl - { - \__nmc_calc_fn_val:VNnN \l__nmc_table_rvar_tl - \l__nmc_table_rvari_tl \l_tmpa_tl \l_tmpa_fp - \__nmc_num_format:nNnN { \l_tmpa_fp } \l_tmpb_tl - { \l__nmc_table_rround_int } \c_false_bool - \seq_put_right:Nx \l__nmc_table_rvcoli_seq - { \exp_not:o \l__nmc_table_rfont_tl { \l_tmpb_tl } } - } - } -\cs_new_protected:Npn \__nmc_table_form_body_rvcol_only:N #1 - { % #1 = \l_nmc_result_tl - \seq_clear:N \l_tmpb_seq - \seq_map_variable:NNn \l__nmc_table_rvcol_seq \l_tmpa_tl - { - \tl_put_right:Nx #1 - { \exp_not:o \l_tmpa_tl \tabularnewline } - \__nmc_table_rbloc_spc:NN \l__nmc_table_rbloc_int \l_tmpa_bool - \bool_if:NT \l_tmpa_bool - { - \tl_put_right:Nx #1 - { \exp_not:o \addlinespace[\l__nmc_table_blocsep_tl] } - } - } - } -\cs_new_protected:Npn \__nmc_table_form_body_cvcols:N #1 - { % #1 \l_nmc_result_tl - \seq_clear:N \l_tmpd_seq - \seq_map_variable:NNn \l__nmc_table_body_cols_seq \l_tmpa_seq - { - \seq_clear:N \l_tmpb_seq - \__nmc_table_form_cols:NN \l_tmpa_seq \l_tmpb_seq - \seq_put_right:NV \l_tmpd_seq \l_tmpb_seq - } - \bool_if:NT \l__nmc_table_footops_bool - { \__nmc_table_footops:N \l_tmpd_seq } - \__nmc_table_transpose:NN \l_tmpd_seq \l__nmc_table_body_rows_seq - - \seq_map_variable:NNn \l__nmc_table_body_rows_seq \l_tmpa_seq - { - \__nmc_table_rbloc_spc:NN \l__nmc_table_rbloc_int \l_tmpa_bool - \tl_put_right:Nx #1 - { - \seq_use:Nn \l_tmpa_seq { & } - \tabularnewline - \bool_if:NT \l_tmpa_bool - { \exp_not:o \addlinespace[\l__nmc_table_blocsep_tl] } - } - } - } -\cs_new_protected:Npn \__nmc_table_footops:N #1 - { - \group_begin: - \seq_clear:N \l_tmpb_seq - \seq_set_split:NnV \l_tmpa_seq { & } \l__nmc_table_footer_tl - \int_if_odd:nT { \l__nmc_table_rpos_int } - { - \seq_pop:NN \l_tmpa_seq \l_tmpa_tl - \seq_put_left:NV \l_tmpb_seq \l_tmpa_tl - } - \seq_mapthread_function:NNN #1 \l_tmpa_seq \__nmc_table_footops:nn - \int_compare:nNnT { \l__nmc_table_rpos_int } > { 1 } - { - \seq_pop:NN \l_tmpa_seq \l_tmpa_tl - \seq_put_right:NV \l_tmpb_seq \l_tmpa_tl - } - \tl_set:Nx \l__nmc_table_footer_tl { \seq_use:Nn \l_tmpb_seq { & } } - \exp_args:NNNV - \group_end: - \tl_set:Nn \l__nmc_table_footer_tl \l__nmc_table_footer_tl - } -\cs_new_protected:Npn \__nmc_table_footops:nn #1#2 - { - \tl_set:Nn \l_tmpc_seq { #1 } - \tl_set:Nx \l_tmpa_tl { \seq_use:Nn \l_tmpc_seq { + } } - \fp_set:Nn \l_tmpa_fp { \l_tmpa_tl } - \fp_set:Nn \l_tmpb_fp { \l_tmpa_fp / \l__nmc_table_rnum_int } - \__nmc_num_format:nNnN \l_tmpa_fp \l__nmc_table_csum_tl - { \l__nmc_round_int } \l__nmc_sci_num_out_bool - \__nmc_num_format:nNnN \l_tmpb_fp \l__nmc_table_cave_tl - { \l__nmc_round_int } \l__nmc_sci_num_out_bool - \tl_set:Nx \l_tmpa_tl { max(\seq_use:Nn \l_tmpc_seq { , }) } - \fp_set:Nn \l_tmpa_fp { \l_tmpa_tl } - \__nmc_num_format:nNnN \l_tmpa_fp \l__nmc_table_cmax_tl - { \l__nmc_round_int } \l__nmc_sci_num_out_bool - \tl_set:Nx \l_tmpa_tl { min(\seq_use:Nn \l_tmpc_seq { , }) } - \fp_set:Nn \l_tmpb_fp { \l_tmpa_tl } - \__nmc_num_format:nNnN \l_tmpb_fp \l__nmc_table_cmin_tl - { \l__nmc_round_int } \l__nmc_sci_num_out_bool - \__nmc_num_format:nNnN { \l_tmpa_fp - \l_tmpb_fp } \l__nmc_table_cdel_tl - { \l__nmc_round_int } \l__nmc_sci_num_out_bool - \seq_put_right:Nx \l_tmpb_seq { $ #2 $ } - } -\cs_new_protected:Npn \__nmc_table_transpose:NN #1#2 - { % #1 seq of seq in #2 seq of seq out - \int_if_zero:nF { \l__nmc_table_rpos_int } - { - \int_compare:nNnF { \l__nmc_table_rpos_int } = { 2 } - { \seq_put_left:NV #1 \l__nmc_table_rvcol_seq } - \int_compare:nNnT { \l__nmc_table_rpos_int } > { 1 } - { \seq_put_right:NV #1 \l__nmc_table_rvcoli_seq } - } - \int_step_inline:nn { \l__nmc_table_rnum_int } - { - \seq_clear:N \l_tmpb_seq - \seq_clear:N \l_tmpc_seq - \seq_map_variable:NNn #1 \l_tmpa_seq - { - \seq_pop:NN \l_tmpa_seq \l_tmpa_tl - \seq_put_right:Nx \l_tmpb_seq { $\exp_not:o\l_tmpa_tl $ } - \seq_put_right:NV \l_tmpc_seq \l_tmpa_seq - } - \seq_put_right:NV \l__nmc_table_body_rows_seq \l_tmpb_seq - \seq_set_eq:NN #1 \l_tmpc_seq - } - } -\cs_new:Npn \__nmc_table_rbloc_spc:NN #1#2 - { % - \int_incr:N #1 - \bool_set_false:N #2 - \int_compare:nNnT { #1 } = { \l__nmc_table_rblock_tl } - { - \int_compare:nNnF { #1 } = { \l__nmc_table_rnum_int } - { \bool_set_true:N #2 } - \clist_if_empty:NF \l__nmc_table_rbloc_clist - { \clist_pop:NN \l__nmc_table_rbloc_clist \l__nmc_table_rbloc_tl } - \tl_set:Nx \l__nmc_table_rblock_tl - { \int_eval:n { \l__nmc_table_rblock_tl + \l__nmc_table_rbloc_tl } } - } - } -\cs_new_protected:Npn \__nmc_table_form_cols:NN #1#2 - { % #1 raw cseq, #2 <--formatted cseq - \int_case:nnF { \l__nmc_table_rnum_int } - { - { 0 } { \prg_do_nothing: } - { 1 } { \__nmc_table_form_cols_ri:NN #1#2 } - { 2 } { \__nmc_table_form_cols_rii:NN #1#2 } - } - { \__nmc_table_form_cols_riii:NN #1#2 } - } -\cs_new_protected:Npn \__nmc_table_form_cols_ri:NN #1#2 - { - \seq_pop:NN #1 \l_tmpb_fp - \__nmc_num_format:nNnN \l_tmpb_fp \l_tmpb_tl - { \l__nmc_round_int } \l__nmc_sci_num_table_bool - \bool_if:NT \l__nmc_table_QA_bool - { \__nmc_table_QA:N \l_tmpb_tl } - \seq_put_right:Nx #2 { \exp_not:o \l_tmpb_tl } - } -\cs_new_protected:Npn \__nmc_table_form_cols_rii:NN #1#2 - { - \__nmc_table_form_cols_rii_aux:NN #1#2 - \__nmc_table_signs: - \__nmc_num_format:nNnN \l_tmpb_fp \l_tmpb_tl - { \l__nmc_round_int } \l__nmc_sci_num_out_bool - \__nmc_table_num_format:N \l_tmpb_tl - \seq_put_right:Nx #2 - { \exp_not:o \l_tmpb_tl \exp_not:o \l__nmc_table_diff_tl } - } -\cs_new_protected:Npn \__nmc_table_form_cols_rii_aux:NN #1#2 - { - \seq_pop:NN #1 \l_tmpb_fp - \int_if_zero:nF \l__nmc_table_diffs_int - { \__nmc_table_form_diffs_null:n { \l__nmc_table_diffs_int } } - \seq_pop:NN #1 \l_tmpa_fp - \int_set:Nn \l__nmc_table_c_int { 1 } - \int_set:Nn \l__nmc_table_b_int { \fp_sign:n { \l_tmpb_fp } } - \int_set:Nn \l__nmc_table_a_int { \fp_sign:n { \l_tmpa_fp } } - \__nmc_table_signs: - \__nmc_num_format:nNnN \l_tmpb_fp \l_tmpb_tl - { \l__nmc_round_int } \l__nmc_sci_num_out_bool - \__nmc_table_num_format:N \l_tmpb_tl - \seq_put_right:Nx #2 - { \exp_not:o \l_tmpb_tl \exp_not:o \l__nmc_table_diff_tl } - \int_if_zero:nF \l__nmc_table_diffs_int - { \__nmc_table_calc_diffs:nn - { \l_tmpb_fp } { \l_tmpa_fp } } - \fp_set_eq:NN \l_tmpb_fp \l_tmpa_fp - } -\cs_new_protected:Npn \__nmc_table_form_cols_riii:NN #1#2 - { - \__nmc_table_form_cols_rii_aux:NN #1#2 - \int_set_eq:NN \l__nmc_table_c_int \l__nmc_table_b_int - \int_set_eq:NN \l__nmc_table_b_int \l__nmc_table_a_int - \seq_map_variable:NNn #1 \l_tmpa_fp - { - \int_set:Nn \l__nmc_table_a_int { \fp_sign:n { \l_tmpa_fp } } - \__nmc_table_signs: - \__nmc_num_format:nNnN \l_tmpb_fp \l_tmpb_tl - { \l__nmc_round_int } \l__nmc_sci_num_out_bool - \__nmc_table_num_format:N \l_tmpb_tl - \seq_put_right:Nx #2 - { \exp_not:o \l_tmpb_tl \exp_not:o \l__nmc_table_diff_tl } - \int_if_zero:nF \l__nmc_table_diffs_int - { \__nmc_table_calc_diffs:nn { \l_tmpb_fp } { \l_tmpa_fp } } - \fp_set_eq:NN \l_tmpb_fp \l_tmpa_fp - \int_set_eq:NN \l__nmc_table_c_int \l__nmc_table_b_int - \int_set_eq:NN \l__nmc_table_b_int \l__nmc_table_a_int - } - \int_set:Nn \l__nmc_table_a_int { 1 } - \__nmc_table_signs: - \__nmc_num_format:nNnN \l_tmpb_fp \l_tmpb_tl - { \l__nmc_round_int } \l__nmc_sci_num_out_bool - \__nmc_table_num_format:N \l_tmpb_tl - \seq_put_right:Nx #2 - { \exp_not:o \l_tmpb_tl \exp_not:o \l__nmc_table_diff_tl } - } -\cs_new_protected:Npn \__nmc_table_num_format:N #1 - { - \bool_if:NTF \l__nmc_sci_num_table_bool - { - \tl_if_head_eq_charcode:VNTF #1 ( - { % for nums in [1,10) - \exp_last_unbraced:NV - \__nmc_table_t_format:wN #1\q_stop \l_tmpa_tl - \tl_set_eq:NN #1 \l_tmpa_tl - } - { \tl_set:Nx #1 { \__nmc_sci_num_table:n { #1 } } } - } - { \tl_set:Nx #1 { \__nmc_sci_num_table:n { #1 } } } - \bool_if:NT \l__nmc_table_QA_bool - { \__nmc_table_QA:N #1 } - } -\cs_new_protected:Npn \__nmc_table_QA:N #1 - { - \fp_compare:nNnT { \l__nmc_table_Q_tl } = { 1 } - { - \bool_lazy_and:nnT - { \l__nmc_num_only_bool } { !\l__nmc_table_num_only_bool } - { - \tl_set_eq:NN \l__nmc_table_num_only_tl \l_tmpb_tl - \bool_set_true:N \l__nmc_table_num_only_bool - } - \tl_set:Nx #1 { \l__nmc_table_A_tl } - } - } -\cs_new_protected:Npn \__nmc_table_t_format:wN (#1)#2#3\q_stop #4 - { - \tl_set:Nn \l__nmc_toss_tl { #1 } - \__nmc_table_prepad:Nnn \l__nmc_toss_tl - { \l__nmc_table_tsigns_int } { \exp_not:o \hphantom{-} } - \tl_set:Nx #4 { \__nmc_sci_num_table_plus:nn - { #3 } { \exp_not:o\l__nmc_toss_tl } } - } -\cs_new_protected:Npn \__nmc_table_signs: - { % A prev, B current, C next - \int_compare:nNnTF \l__nmc_table_b_int > { -1 } - { - \bool_lazy_or:nnTF - { \int_compare_p:nNn \l__nmc_table_a_int = { -1 } } - { \int_compare_p:nNn \l__nmc_table_c_int = { -1 } } - { \bool_set_true:N \l__nmc_table_signs_bool } - { \bool_set_false:N \l__nmc_table_signs_bool } - } - { \bool_set_false:N \l__nmc_table_signs_bool } - } -%%%%%%%%%% -\cs_new_protected:Npn \__nmc_table_calc_diffs:nn #1#2 - { - \__nmc_num_format:nNnN - { \fp_abs:n {round( #1,\l__nmc_round_int ) - - round( #2, \l__nmc_round_int) } } \l_tmpb_tl - { \l__nmc_round_int } \c_false_bool - \tl_set:Nx \l_tmpb_tl { \fp_eval:n { round( 10^{ \l__nmc_round_int } - * \l_tmpb_tl, \l__nmc_round_int + 1) } } - \__nmc_table_prepad:Nnn \l_tmpb_tl { \l__nmc_table_diffs_int } { 0 } - \tl_set:Nx \l__nmc_table_diff_tl { ^{\,^{ \l_tmpb_tl } } } - } -\cs_new_protected:Npn \__nmc_table_form_diffs_null:n #1 - { - \tl_set:Nn \l_tmpb_tl { 0 } - \__nmc_table_prepad:Nnn \l_tmpb_tl { #1 } { 0 } - \tl_set:Nx \l__nmc_table_diff_tl - { ^{\,^{ \exp_not:o \hphantom{ \l_tmpb_tl } } } } - } -%%%%%%%%%%%%%%%%%%% -\cs_new:Npn \__nmc_table_form_lower: - { - \tl_if_empty:NF \l__nmc_table_footer_tl - { - \__nmc_if_mod_zero:nnT { \l__nmc_table_rules_int } { 7 } - { \exp_not:N \midrule[\cmidrulewidth] } - \exp_not:o \l__nmc_table_footer_tl \tabularnewline - } - \__nmc_if_mod_zero:nnT { \l__nmc_table_rules_int } { 11 } - { \exp_not:N \bottomrule } - \exp_not:n { \end{tabular} } - } -%%%%%%%%%%%%%%%%%%% -\cs_new_protected:Npn \__nmc_table_reuse: - { - \bool_if:NF \l__nmc_num_only_bool - { - \int_case:nnF { \int_sign:n { \l__nmc_table_reuse_int } } - { - { -1 } { \__nmc_table_reuse_row:n { \l__nmc_table_reuse_int } } - - { 1 } { \__nmc_table_reuse_col:n { \l__nmc_table_reuse_int } } - } - { \tl_gset_eq:NN \g__nmc_reuse_tl \l_nmc_result_tl } - } - } -\cs_new_protected:Npn \__nmc_table_reuse_row:n #1 - { - \tl_set:Nx \l_tmpa_seq - { \seq_item:Nn \l__nmc_table_body_rows_seq { -#1 } } - \tl_gset:Nx \g__nmc_reuse_tl { \seq_use:Nn \l_tmpa_seq { , } } - } -\cs_new_protected:Npn \__nmc_table_reuse_col:n #1 - { - \int_zero:N \l_tmpa_int - \seq_map_variable:NNn \l__nmc_table_body_cols_seq \l_tmpa_seq - { - \int_incr:N \l_tmpa_int - \int_compare:nNnT { \l_tmpa_int } = { #1 } - { - \seq_mapthread_function:NNN \l__nmc_table_rvraw_seq - \l_tmpa_seq \__nmc_table_reuse:nn - \seq_map_break: - } - } - } -\cs_new_protected:Npn \__nmc_table_reuse:nn #1#2 - { - \__nmc_num_format:nNnN { #1 } \l_tmpa_tl - { \l__nmc_table_rround_int } \c_false_bool - \__nmc_num_format:nNnN { #2 } \l_tmpb_tl - { \l__nmc_round_int } \l__nmc_sci_num_out_bool - \int_if_zero:nTF \l__nmc_table_rpos_int - { \seq_put_right:NV \l_nmc_table_reuse_seq \l_tmpb_tl } - { - \seq_put_right:Nx \l_nmc_table_reuse_seq - { { \l_tmpa_tl , \l_tmpb_tl } } - } - \tl_gset:Nx \g__nmc_reuse_tl { \seq_use:Nn \l_nmc_table_reuse_seq {,} } - } -%------------------------------------------------ -\keys_define:nn { numerica } - { - table-rvar-rounding .int_set:N = \l__nmc_table_rround_int, - table-rvar-col-pos .int_set:N = \l__nmc_table_rpos_int, - table-rvar-align .tl_set:N = \l__nmc_table_rcalign_tl, - table-cvar-align .tl_set:N = \l__nmc_table_ccalign_tl, - table-block-sep .tl_set:N = \l__nmc_table_blocsep_tl, - table-rules .tl_set:N = \l__nmc_table_rules_tl, - table-form-diffs .int_set:N = \l__nmc_table_diffs_int, - table-reuse .int_set:N = \l__nmc_table_reuse_int, - table-rvar-rounding .default:n = 1, - table-rvar-align .default:n = r, - table-rvar-col-pos .default:n = 1, - table-cvar-align .default:n = r, - table-block-sep .default:n = 1ex, - table-rules .default:n = ThB, - table-form-diffs .default:n = 0, - table-reuse .default:n = 0 - } -\keys_set_known:nn { numerica } - { - table-rvar-rounding,table-rvar-align,table-rvar-col-pos, - table-cvar-align,table-block-sep,table-rules,table-fontsize, - table-form-diffs,table-reuse - } -\keys_define:nn { numerica/table } - { - rvar .tl_set:N = \l__nmc_table_rvar_tl, - rstop .tl_set:N = \l__nmc_table_rstop_tl, - rstep .tl_set:N = \l__nmc_table_rstep_tl, - rows .int_set:N = \l__nmc_table_rnum_int, - rows .initial:n = -1, - rspec .clist_set:N = \l__nmc_table_rspec_clist, - rround .int_set:N = \l__nmc_table_rround_int, - rfont .code:n = \tl_set:Nn \l__nmc_table_rfont_tl - { \use:c { math#1 } }, - ralign .tl_set:N = \l__nmc_table_rcalign_tl, - rhead .tl_set:N = \l__nmc_table_rhead_tl, - rhnudge .code:n = \tl_set:Nn \l__nmc_table_rhnudge_tl - { \mkern #1 mu }, - rpos .int_set:N = \l__nmc_table_rpos_int, - rvar' .tl_set:N = \l__nmc_table_rvari_tl, - rhead' .tl_set:N = \l__nmc_table_rheadi_tl, - rhnudge' .code:n = \tl_set:Nn \l__nmc_table_rhnudgei_tl - { \mkern #1 mu }, -% - cvar .tl_set:N = \l__nmc_table_cvar_tl, - cstop .tl_set:N = \l__nmc_table_cstop_tl, - cstep .tl_set:N = \l__nmc_table_cstep_tl, - cols .int_set:N = \l__nmc_table_cnum_int, - cols .initial:n = -1, - cspec .clist_set:N = \l__nmc_table_cspec_clist, - calign .tl_set:N = \l__nmc_table_ccalign_tl, - chstyle .int_set:N = \l__nmc_table_chstyle_int, - chnudge .code:n = \tl_set:Nn \l__nmc_table_chnudge_tl - { \mkern #1 mu }, - chead .tl_set:N = \l__nmc_table_chead_tl, - chround .int_set:N = \l__nmc_table_chround_int, -% - ctitle .tl_set:N = \l__nmc_table_ctitle_tl, - rules .tl_set:N = \l__nmc_table_rules_tl, - foot .tl_set:N = \l__nmc_table_footer_tl, - rbloc .clist_set:N = \l__nmc_table_rbloc_clist, - rblocsep .tl_set:N = \l__nmc_table_blocsep_tl, - signs .int_set:N = \l__nmc_table_signs_int, - (pad) .int_set:N = \l__nmc_table_tsigns_int, - diffs .int_set:N = \l__nmc_table_diffs_int, -% - Q? .tl_set:N = \l__nmc_table_Q_tl, - A! .tl_set:N = \l__nmc_table_A_tl, - reuse .int_set:N = \l__nmc_table_reuse_int, - valign .code:n = \tl_set:Nn \l__nmc_table_valign_tl { [#1] }, - } -% end of `numerica-tables.def' \ No newline at end of file diff --git a/Master/texmf-dist/tex/latex/numerica/numerica.sty b/Master/texmf-dist/tex/latex/numerica/numerica.sty index 1f1be433427..6f85a17f756 100644 --- a/Master/texmf-dist/tex/latex/numerica/numerica.sty +++ b/Master/texmf-dist/tex/latex/numerica/numerica.sty @@ -1,5 +1,4 @@ -% This is file `numerica.sty', -% the base of the `numerica' package. +% This is file `numerica.sty'. % % This work may be distributed and/or modified under the conditions % of the LaTeX Project Public License, either version 1.3c of this @@ -8,16 +7,14 @@ % % Andrew Parsloe (ajparsloe@gmail.com) % -\RequirePackage{expl3}[2017/07/15] -\RequirePackage{xparse,l3keys2e} -\RequirePackage{amsmath,mathtools} - +\RequirePackage{l3keys2e} +\RequirePackage{amsmath,mathtools,etoolbox} \ProvidesExplPackage {numerica} - {2021/02/15} - {1.0.0} - {Evaluate math expressions in the LaTeX form they are typeset} -%------------------------------------------------ + {2021/12/07} + {2.0.0} + {Numerically evaluate mathematical expressions in their LaTeX form} +% needs amsmath \cs_if_free:NT \arccsc { \DeclareMathOperator{\arccsc}{arccsc} } \cs_if_free:NT \arcsec { \DeclareMathOperator{\arcsec}{arcsec} } \cs_if_free:NT \arccot { \DeclareMathOperator{\arccot}{arccot} } @@ -31,15 +28,28 @@ \cs_if_free:NT \acoth { \DeclareMathOperator{\acoth}{acoth} } \cs_if_free:NT \sgn { \DeclareMathOperator{\sgn}{sgn} } \cs_if_free:NT \lb { \DeclareMathOperator{\lb}{lb} } -% mathtools +% needs mathtools \cs_if_free:NT \abs {\DeclarePairedDelimiter{\abs}{\lvert}{\rvert} } \cs_if_free:NT \ceil { \DeclarePairedDelimiter{\ceil}{\lceil}{\rceil} } \cs_if_free:NT \floor { \DeclarePairedDelimiter{\floor}{\lfloor}{\rfloor} } +% \RenewDocumentCommand \land {} { \,\wedge\, } \RenewDocumentCommand \lor {} { \,\vee\, } -% Qleave apart; qleave to -\NewDocumentCommand \Q {} { \prg_do_nothing: } -\NewDocumentCommand \q {} { \prg_do_nothing: } +\NewDocumentCommand \Q {} { \prg_do_nothing: } % Qleave apart +\NewDocumentCommand \q {} { \prg_do_nothing: } % qleave to +% +\int_const:Nn \c__nmc_and_int { 0 } +\int_const:Nn \c__nmc_cmp_int { 1 } +\int_const:Nn \c__nmc_sum_int { 2 } +\int_const:Nn \c__nmc_trg_int { 3 } +\int_const:Nn \c__nmc_uny_int { 4 } +\int_const:Nn \c__nmc_prn_int { 5 } +\int_const:Nn \c__nmc_srd_int { 6 } +\int_new:N \l__nmc_trg_int +\int_new:N \l__nmc_num_sgn_int % tables +\tl_new:N \l__nmc_toss_tl +\seq_new:N \l_tmpc_seq +% \prg_new_conditional:Npnn \int_if_zero:n #1 { p,T,F,TF } { \int_compare:nNnTF { #1 } = { 0 } @@ -56,80 +66,59 @@ { \prg_return_true: } { \prg_return_false: } } -% constants -\tl_const:Nn \c__nmc_digits_tl { 123456789 } -\tl_const:Nn \c__nmc_decimals_tl { 1234567890. } -\tl_const:Nn \c__nmc_sdigits_tl { -1234567890 } -\tl_const:Nn \c__nmc_comparisons_tl { <=> } -\tl_const:Nn \c__nmc_modds_tl { |./ } -\int_const:Nn \c__nmc_and_int { 0 } -\int_const:Nn \c__nmc_cmp_int { 1 } -\int_const:Nn \c__nmc_sum_int { 2 } -\int_const:Nn \c__nmc_trg_int { 3 } -\int_const:Nn \c__nmc_uny_int { 4 } -\int_const:Nn \c__nmc_prn_int { 5 } -\int_const:Nn \c__nmc_srd_int { 6 } -\seq_const_from_clist:Nn \c__nmc_T_out_seq { 1,T,\texttt{T} } -\seq_const_from_clist:Nn \c__nmc_F_out_seq { 0,F,\texttt{F} } -\int_new:N \l__nmc_trg_int -\int_new:N \l__nmc_num_sgn_int -\tl_new:N \l__nmc_toss_tl -\seq_new:N \l_tmpc_seq -%----------------------------------------------------------- -% processing and substitution property lists -% #1 clist of keys; #2 tl of values +% fpify & delim property lists +\prop_new:N \g__nmc_class_prop % latex tokens + +% #1(clist) tokens; #2(tl) { fpify: delim: } routines \cs_new_protected:Npn \__nmc_fill_class:nn #1#2 { \clist_map_inline:nn { #1 } { \prop_gput:Nnn \g__nmc_class_prop { ##1 } { #2 } } } -% math token classes -\prop_new:N \g__nmc_class_prop -% decimals +% \__nmc_fill_class:nn { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, . } { \__nmc_fpify_dec: \__nmc_delim_dec: } -% constants \__nmc_fill_class:nn { e, \pi, \gamma, \phi, \deg, \infty } - { \__nmc_fpify_const: \__nmc_delim_const: } -% plus minus + { \__nmc_fpify_const: \__nmc_delim_const: } +% arith \__nmc_fill_class:nn { +, - } - { \__nmc_fpify_arith: \__nmc_delim_pm: } -% arith. + { \__nmc_fpify_arith: \__nmc_delim_pm: } \prop_put:Nnn \g__nmc_class_prop { * } - { \__nmc_fpify_arith: \__nmc_delim_arith: } -% slash + { \__nmc_fpify_arith: \__nmc_delim_arith: } \prop_put:Nnn \g__nmc_class_prop { / } - { \__nmc_fpify_slash: \__nmc_delim_arith: } -% arith. alternatives + { \__nmc_fpify_slash: \__nmc_delim_arith: } \__nmc_fill_class:nn { \times, \cdot, \div } { \__nmc_fpify_arith_alt: \__nmc_delim_arith: } +\prop_put:Nnn \g__nmc_class_prop { ^ } + { \__nmc_fpify_power: \__nmc_delim_power: } +\__nmc_fill_class:nn { \frac, \dfrac } + { \__nmc_fpify_frac: \__nmc_delim_frac: } +\prop_put:Nnn \g__nmc_class_prop { \tfrac } + { \__nmc_fpify_frac: \__nmc_delim_tfrac: } % comparisons \__nmc_fill_class:nn - { - =, <, >, - \ne, \neq, \nless, \ngtr, - \ge, \geq, \geqq, \geqslant, - \le, \leq, \leqq, \leqslant, - \ngeq, \ngeqq, \ngeqslant, - \nleq, \nleqq, \nleqslant, - } + { + =, <, >, \ne, \neq, \nless, \ngtr, + \ge, \geq, \geqq, \geqslant, \le, \leq, \leqq, \leqslant, + \ngeq, \ngeqq, \ngeqslant, nleq, \nleqq, \nleqslant, + } { \__nmc_fpify_comparison: \__nmc_delim_comparison: } -% and or +% logic, surd \__nmc_fill_class:nn { \wedge, \land, \vee, \lor } { \__nmc_fpify_andor: \__nmc_delim_andor: } -% lparen +\__nmc_fill_class:nn { \surd, \neg, \lnot } + { \__nmc_fpify_surd: \__nmc_delim_surd: } +% left \__nmc_fill_class:nn { (, [, \{, \lparen, \lbrack, \lbrace } { \__nmc_fpify_lparen: \__nmc_delim_lparen: } -% lvert etc. \__nmc_fill_class:nn { |, \lvert, \lfloor, \lceil } { \__nmc_fpify_lvert: \__nmc_delim_lvert: } -% lmodifiers \__nmc_fill_class:nn { \left, \bigl, \Bigl, \biggl, \Biggl } { \__nmc_fpify_lmod: \__nmc_delim_lmod: } -% rmodifiers +% right \__nmc_fill_class:nn { \right, \bigr, \Bigr, \biggr, \Biggr } { \prg_do_nothing: \__nmc_delim_rparen: } -% trig, hyper, other unary fns +% unary fns: f \__nmc_fill_class:nn { \sin, \cos, \tan, \csc, \sec, \cot } { { \__nmc_fpify_unary:n { \l__nmc_trg_int } } @@ -146,87 +135,75 @@ { \__nmc_fpify_unary:n { \c__nmc_uny_int } } { \__nmc_delim_unary:n { \c__nmc_uny_int } } } -% power -\prop_put:Nnn \g__nmc_class_prop { ^ } - { \__nmc_fpify_power: \__nmc_delim_power: } -% (d)frac -\__nmc_fill_class:nn { \frac, \dfrac } - { \__nmc_fpify_frac: \__nmc_delim_frac: } -% tfrac -\prop_put:Nnn \g__nmc_class_prop { \tfrac } - { \__nmc_fpify_frac: \__nmc_delim_tfrac: } -% binom -\__nmc_fill_class:nn { \tbinom, \binom, \dbinom } - { \__nmc_fpify_binom: \__nmc_delim_frac: } -% unary with braced arg +% f! +\prop_put:Nnn \g__nmc_class_prop { ! } + { \__nmc_fpify_fact: \__nmc_delim_fact: } +% f{} \__nmc_fill_class:nn { \sqrt, \abs, \floor, \ceil } - { \__nmc_fpify_unarybrace: \__nmc_delim_unarybrace: } -% unary subscripted + { \__nmc_fpify_unarybrace: \__nmc_delim_unarybrace: } +% binary ( f_{arg1}{arg2}, f{arg1}{arg2} ) \prop_put:Nnn \g__nmc_class_prop { \log } - { \__nmc_fpify_unarysub: \__nmc_delim_log: } -% surd, not -\__nmc_fill_class:nn { \surd, \neg, \lnot } - { \__nmc_fpify_surd: \__nmc_delim_surd: } -% factorial -\prop_put:Nnn \g__nmc_class_prop { ! } - { \__nmc_fpify_fact: \__nmc_delim_fact: } -% cleave -\__nmc_fill_class:nn { \q, \Q } - { \prg_do_nothing: \__nmc_delim_qleave: } -% n-ary + { \__nmc_fpify_unarysub: \__nmc_delim_log: } +\__nmc_fill_class:nn { \tbinom, \binom, \dbinom } + { \__nmc_fpify_binom: \__nmc_delim_frac: } +% nary f(arg1,...) \__nmc_fill_class:nn { \min, \max, \gcd } { \__nmc_fpify_nary: \__nmc_delim_nary: } -% comma (n-ary fns) \prop_put:Nnn \g__nmc_class_prop { , } - { \__nmc_fpify_comma: \__nmc_delim_comma: } + { \__nmc_fpify_comma: \__nmc_delim_comma: } +% fontlike (ignore cmd; heed {arg} ) +\__nmc_fill_class:nn + { + \mathrm, \mathit, \mathcal, \mathtt, \mathbf, \mathbb, + \mathsf, \mathfrak, \mathscr, \mathnormal, \boldsymbol, + \ensuremath, \smash, \textrm, \textsf, \texttt + } + { \__nmc_fpify_font: \__nmc_delim_font: } +% ignore cmd, [arg1], {arg2}; heed {arg3} +\prop_put:Nnn \g__nmc_class_prop { \textcolor } + { \__nmc_fpify_color: \__nmc_delim_color: } +% splitfrac ( ignore cmd, heed {arg1}{arg2} ) +\__nmc_fill_class:nn { \splitfrac, \splitdfrac } + { \__nmc_fpify_splitfrac: \__nmc_delim_append_twobraced: } % absorb \__nmc_fill_class:nn { - {{}}, \\, &, \to, \q_nil, - \dots, \ldots, \cdots, - \ , \,, \;, \:, \!, \>, - \thinspace, \quad, \qquad , \hfill, \hfil, - \mathstrut, \displaystyle, \textstyle, - \scriptstyle, \scriptscriptstyle + {{}}, \\, &, \to, \q_nil, \dots, \ldots, \cdots, + \quad, \qquad, \hfill, \hfil, \mathstrut, $, \(, \), \[, \], + \ , \,, \;, \:, \!, \>, \thinspace, \medspace, \thickspace, \negthinspace, \negmedspace, \negthickspace, + \displaystyle, \textstyle, \scriptstyle, \scriptscriptstyle, } { \prg_do_nothing: \__nmc_delim_absorb: } -% absorbm -\__nmc_fill_class:nn { \vphantom, \hphantom, \phantom, \label } - { \__nmc_fpify_absorbm: \__nmc_delim_absorbm: } -% absorbom -\__nmc_fill_class:nn { \xmathstrut } - { \__nmc_fpify_absorbom: \__nmc_delim_absorbom: } +\__nmc_fill_class:nn + { \vphantom, \hphantom, \phantom, \label, \mspace, \mbox, \text } + { \__nmc_fpify_absorb_m: \__nmc_delim_absorb_i: } +\__nmc_fill_class:nn { \hspace } + { \__nmc_fpify_absorb_sm: \__nmc_delim_absorb_ii: } +\__nmc_fill_class:nn { \xmathstrut, \color } + { \__nmc_fpify_absorb_om: \__nmc_delim_absorb_ii: } +% ams environs f{arg1} (& f{arg1}{arg2} for aligned, aligned*) +\__nmc_fill_class:nn { \begin, \end } + { \__nmc_fpify_BE: \__nmc_delim_BE: } +% cleave +\__nmc_fill_class:nn { \q, \Q } + { \prg_do_nothing: \__nmc_delim_cleave: } % sum, prod \__nmc_fill_class:nn { \sum, \prod } - { \__nmc_fpify_sum: \__nmc_delim_sum: } -% begin end -\__nmc_fill_class:nn { \begin, \end } - { \__nmc_fpify_BE: \__nmc_delim_BE: } -% font -\__nmc_fill_class:nn - { - \mathrm, \mathit, \mathcal, \mathtt, \mathbf, \mathbb, - \mathsf, \mathfrak, \mathscr, \mathnormal, \boldsymbol - } - { \__nmc_fpify_font: \__nmc_delim_font: } -% meta -\__nmc_fill_class:nn { \ensuremath, \text, \mbox } - { \__nmc_fpify_meta: \__nmc_delim_stop: } -% meta2 -\__nmc_fill_class:nn { \splitfrac, \splitdfrac } - { \__nmc_fpify_metamm: \__nmc_delim_metamm: } + { \__nmc_fpify_sum: \__nmc_delim_sum: } % nmcFn \__nmc_fill_class:nn { - \eval, \iter, \solve, \recur, \tabulate, - \nmcEvaluate, \nmcIterate, \nmcSolve, - \nmcRecur, \nmcTabulate + \eval, \nmcEvaluate, \iter, \nmcIterate, \solve, \nmcSolve, + \recur, \nmcRecur, \tabulate, \nmcTabulate, \info, \nmcInfo, + \constants, \nmcConstants, \reuse, \nmcReuse } { \__nmc_fpify_cmd: \__nmc_delim_cmd: } - -\__nmc_fill_class:nn { \nmcInfo } { \__nmc_fpify_info: \__nmc_delim_info: } -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% math token replacements for l3fp evaluation +% substitution classes %%%%%%%%%%%%%%%%%%%%%%%%%% +\prop_new:N \l__nmc_subst_var_prop % variables +\prop_new:N \g__nmc_subst_var_prop % macros (user & reuse) +\prop_new:N \g__nmc_subst_fpfn_prop % math toks for l3fp eval +\prop_new:N \g__nmc_subst_misc_prop % misc subst + % #1 prop; #2 seq (keys); #3 seq (values) \cs_new_protected:Npn \__nmc_subst:NNN #1#2#3 { @@ -234,7 +211,6 @@ { \prop_gput:Nnn #1 { ##1 } { ##2 } } \seq_mapthread_function:NNN #2 #3 \__nmc_substitutions:nn } -\prop_new:N \g__nmc_subst_fpfn_prop \seq_set_from_clist:Nn \l_tmpa_seq { e, \pi, \gamma, \phi, \deg, \infty, @@ -243,10 +219,8 @@ \sinh, \cosh, \tanh, \csch, \sech, \coth, \asinh, \acosh, \atanh, \acsch, \asech, \acoth, \exp, \ln, \lg, \lb, \sgn, - \max, \min, \surd, \sqrt, - \abs, \floor, \ceil, - \lvert, \lfloor, \lceil, - \times, \cdot, \div, + \max, \min, \surd, \sqrt, \times, \cdot, \div, + \abs, \floor, \ceil, \lvert, \lfloor, \lceil, \neg, \lnot, \wedge, \land, \vee, \lor, \le, \leq, \leqq, \leqslant, \ge, \geq, \geqq, \geqslant, @@ -264,27 +238,24 @@ sinh, cosh, tanh, csch, sech, coth, asinh, acosh, atanh, acsch, asech, acoth, exp, ln, (0.4342944819032518)ln, (1.442695040888963)ln, sign, - max, min, sqrt, sqrt, - abs, floor, ceil, - abs, floor, ceil, - *, *, /, + max, min, sqrt, sqrt, *, *, /, + abs, floor, ceil, abs, floor, ceil, !, !, &&, &&, ||, ||, - <=, <=, <=, <=, - >=, >=, >=, >=, - !=, !=, !<, !>, - !<=, !<=, !<=, !>=, !>=, !>= + <=, <=, <=, <=, >=, >=, >=, >=, + !=, !=, !<, !>, !<=, !<=, !<=, !>=, !>=, !>= } \__nmc_subst:NNN \g__nmc_subst_fpfn_prop \l_tmpa_seq \l_tmpb_seq -% property list for some miscellaneous substitutions -\prop_new:N \g__nmc_subst_misc_prop \seq_set_from_clist:Nn \l_tmpa_seq { \cosh, \sinh, \tanh, \csch, \sech, \coth, (, [, \{, \lparen, \lbrack, \lbrace, \left, \bigl, \Bigl, \biggl, \Biggl, \lvert, \lceil, \lfloor, - sum, prod, iter, solve + sum, prod, deriv, integ, iter, solve, + \eval, \nmcEvaluate, \iter, \nmcIterate, \solve, \nmcSolve, + \recur, \nmcRecur, \tabulate, \nmcTabulate, \info, \nmcInfo, + \constants, \nmcConstants, \reuse, \nmcReuse } \seq_set_from_clist:Nn \l_tmpb_seq { @@ -292,14 +263,14 @@ ), ], \}, \rparen, \rbrack, \rbrace, \right, \bigr, \Bigr, \biggr, \Biggr, \rvert, \rceil, \rfloor, - term, factor, iteration, step + term, factor, bisection, subdivision, iteration, step, + eval, eval, iter, iter, solve, solve, + recur, recur, table, table, info, info, + consts, consts, reuse, reuse } \__nmc_subst:NNN \g__nmc_subst_misc_prop \l_tmpa_seq \l_tmpb_seq -% for variables & \reuse \cs -\prop_new:N \g__nmc_subst_var_prop -%--------------------------------------------------------------------------- -% base function variants +% base function variants %%%%%%%%%%%%%%%%%%%%%%%% \cs_generate_variant:Nn \tl_if_head_eq_meaning:nNTF { V } \cs_generate_variant:Nn \tl_if_head_eq_meaning:nNF { V } \cs_generate_variant:Nn \tl_if_head_eq_meaning_p:nN { V } @@ -326,14 +297,10 @@ \cs_generate_variant:Nn \file_get:nnN { V } \cs_generate_variant:Nn \file_get:nnNT { V } \cs_generate_variant:Nn \file_get:nnNTF { V } -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% general purpose routines -\tl_new:N \l__nmc_A_tl -\tl_new:N \l__nmc_B_tl -\tl_new:N \l__nmc_C_tl -\tl_new:N \l__nmc_L_tl -\tl_new:N \l__nmc_R_tl -% prune head from A, place in B; record new head of A in C +% general purpose routines %%%%%%%%%%%%%%%%%%%%%% +% \tl_new:N \l__nmc_A_tl etc. +\clist_map_inline:nn { A,B,C,L,R } { \tl_new:c { l__nmc_#1_tl } } +% prune head from A, put in B; record new head of A in C \cs_new_protected:Npn \__nmc_next: { \exp_last_unbraced:NV\__nmc_next:w \l__nmc_A_tl\q_stop } \cs_new_protected:Npn \__nmc_next:w #1#2#3\q_stop @@ -355,9 +322,9 @@ { \tl_set:Nx #1 { ( \exp_not:o #1 ) } } \cs_new_protected:Npn \__nmc_accum_fn_parenth:NNn #1#2#3 { \tl_put_right:Nx #1 { #3( \exp_not:o #2 ) } } - +% (fpify) #2, append to #1 \cs_new_protected:Npn \__nmc_accum_fpify_parenth:NN #1#2 - { % fpify #2, wrap in ( ), append to #1 + { \group_begin: \tl_clear:N \l_tmpa_tl \__nmc_fpify:VN #2 \l_tmpa_tl @@ -365,15 +332,15 @@ \group_end: \__nmc_accum_fn_parenth:NNn #1\l_tmpa_tl{} } + % (fp-ify) next braced arg, append to #1 \cs_new_protected:Npn \__nmc_fpify_next_braced:N #1 - { % fp-ify next braced argument, parenthesize, append to #1 + { \__nmc_next: \__nmc_accum_fpify_parenth:NN #1 \l__nmc_B_tl } % wrap #3 in #2 & #4, & append to #1 \cs_new_protected:Npn \__nmc_put_right_wrap:NnNn #1#2#3#4 { \tl_put_right:Nx #1 { #2 \exp_not:o #3 #4 } } - \cs_new_protected:Npn \__nmc_get_arg_L:nN #1#2 { \tl_set:Nn \l__nmc_L_tl { #1 } @@ -386,8 +353,8 @@ { \__nmc_get_arg_LR:NNN #1#2#3 } \cs_generate_variant:Nn \__nmc_get_arg_L_aux:NNn { NNV } -% #1 left delim; #2 <-- arg (delims *not* included) -% #3 right delim (*must* differ from #1) +% #1 ldelim; #2 <-- arg (delims *not* included) +% #3 rdelim (*must* differ from #1) \cs_new_protected:Npn \__nmc_get_arg_LR:NNN #1#2#3 { \int_set:Nn \l_tmpa_int { 1 } @@ -404,6 +371,7 @@ { \tl_put_right:Nn #2 { ##1 } } { \tl_put_right:Nn #2 { {##1} } } } + } \cs_new_protected:Npn \__nmc_get_arg_LR_rdelim: { @@ -417,11 +385,11 @@ \tl_map_break: } % #1 <== multi-char num poss. in sci notation -% #2 delim only bool +% #2 delim: vs fpify: bool \cs_new_protected:Npn \__nmc_get_dec:NN #1#2 - { + { \tl_set:NV #1 \l__nmc_B_tl - \__nmc_get_dec_digits:NN #1 \c__nmc_decimals_tl + \__nmc_get_dec_digits:Nn #1 { 1234567890. } \bool_lazy_and:nnT { \l__nmc_sci_num_in_bool } { \tl_if_eq_p:NN \l__nmc_C_tl \l__nmc_sci_num_in_tl } { \__nmc_get_dec_aux:NN #1#2 } @@ -438,12 +406,12 @@ } \cs_new_protected:Npn \__nmc_get_dec_aux:NNn #1#2#3 { - \tl_if_in:NVTF \c__nmc_digits_tl \l__nmc_C_tl + \tl_if_in:nVTF { 123456789 } \l__nmc_C_tl { \bool_if:NTF #2 { \tl_put_right:NV #1 \l__nmc_sci_num_in_tl } { \tl_put_right:Nn #1 { #3 } } - \__nmc_get_dec_digits:NN #1 \c__nmc_sdigits_tl + \__nmc_get_dec_digits:Nn #1 { -1234567890 } } { \tl_set_eq:NN \l__nmc_C_tl \l__nmc_sci_num_in_tl @@ -452,23 +420,24 @@ \tl_put_left:NV \l__nmc_A_tl \l__nmc_sci_num_in_tl } } -\cs_new_protected:Npn \__nmc_get_dec_digits:NN #1#2 +\cs_new_protected:Npn \__nmc_get_dec_digits:Nn #1#2 { \tl_map_inline:Nn \l__nmc_A_tl - { - \tl_if_in:NnTF #2 { ##1 } - { + { + \tl_if_in:nnTF { #2 } { ##1 } + { \tl_put_right:Nn #1 { ##1 } \__nmc_next: } { \tl_map_break: } } } -% for factorial, binom, n-th root, sum/prod +% intify fp (for !, binom, n-th root, sum/prod) +% #2(e.g. = 0,1,-1) <= #1(tl) <-- int \cs_new_protected:Npn \__nmc_intify:Nn #1#2 - { % #1 value; #2 lower bound (e.g. 0,1,-1) - \int_set:Nn \l_tmpa_int { \l__nmc_intify_round_tl } - \fp_compare:nTF { { #2 } <= round(#1+0,\l_tmpa_int) = round(#1+0) } + { + \fp_compare:nTF + { { #2 } <= round(#1+0,\l__nmc_intify_round_tl) = round(#1+0) } { \tl_set:Nx #1 { \fp_eval:n { round(#1+0) } } } { \fp_compare:nNnTF { #2 } = { -inf } @@ -476,67 +445,77 @@ { \__nmc_error_what:n { Integer~$\ge#2$~required~in } } } } -%------------------------------------------------ -% explicit/implicit calc. of fn vals (sum/prod, tables, etc.) -% #1 var; #2 fn; #3 var val (fp); #4 <= fn val at #3 +% calc fn vals; explicit/implicit eval. of vv-list +% #1(tl) var; #2(tl) fn; #3(fp) var val; #4(fp) <-- fn val +% mode 0 (no vals in vv-list change) \cs_new_protected:Npn \__nmc_calc_fn_val:nNnN #1#2#3#4 - { - \prop_put:Nnx \g__nmc_subst_var_prop { #1 } { \fp_eval:n { #3 } } - \__nmc_fpify_set:NN #4 #2 + { + \prop_put:Nnx \l__nmc_subst_var_prop { #1 } { \fp_to_tl:n { #3 } } + \__nmc_fpify_set:NV #4 #2 } +\cs_generate_variant:Nn \__nmc_calc_fn_val:nNnN { V } \cs_new_protected:Npn \__nmc_calc_mode:n #1 { - \int_set:Nn \l__nmc_mode_int { #1 } - \int_case:nn { #1 } - { + \tl_set:Nx \l__nmc_mode_tl { \int_eval:n { #1 } } + \str_case:Vn \l__nmc_mode_tl + { { 1 } { \cs_set_eq:NN \__nmc_calc_fn_val:nNnN \__nmc_calc_fn_vali:nNnN } { 2 } { \cs_set_eq:NN \__nmc_calc_fn_val:nNnN \__nmc_calc_fn_valii:nNnN } } } -\cs_generate_variant:Nn \__nmc_calc_fn_val:nNnN { V } - +\cs_generate_variant:Nn \__nmc_calc_mode:n { V } +% mode 1 (all vals in vv-list may change) \cs_new_protected:Npn \__nmc_calc_fn_vali:nNnN #1#2#3#4 - { % mode 1 (all vals in vv-list may change) - \prop_put:Nnx \l__nmc_vv_change_prop { #1 } { \fp_eval:n { #3 } } + { + \prop_put:Nnx \l__nmc_vv_change_prop { #1 } { \fp_to_tl:n { #3 } } \__nmc_vv_get_vars_vals:NN \l__nmc_calc_fn_seq \l__nmc_vv_change_prop - \__nmc_fpify_set:NN #4 #2 + \__nmc_fpify_set:NV #4 #2 } +% mode 2 (some vals in vv-list held const.) \cs_new_protected:Npn \__nmc_calc_fn_valii:nNnN #1#2#3#4 - { % mode 2 (some vals in vv-list held const.) - \prop_put:Nnx \l__nmc_vv_change_prop { #1 } { \fp_eval:n { #3 } } + { + \prop_put:Nnx \l__nmc_vv_change_prop { #1 } { \fp_to_tl:n { #3 } } \clist_map_inline:Nn \g__nmc_unchanged_clist { - \prop_get:NnN \g__nmc_subst_var_prop { ##1 } \l__nmc_subst_tl + \prop_get:NnN \l__nmc_subst_var_prop { ##1 } \l__nmc_subst_tl \prop_put:NnV \l__nmc_vv_change_prop { ##1 } \l__nmc_subst_tl } \__nmc_vv_get_vars_vals:NN \l__nmc_calc_fn_seq \l__nmc_vv_change_prop - \__nmc_fpify_set:NN #4 #2 + \__nmc_fpify_set:NV #4 #2 } -\cs_new_protected:Npn \__nmc_fpify_set:NN #1#2 - { % fp-set #1 to fpified #2 +% fp-set #1 to fpified #2 +\cs_new_protected:Npn \__nmc_fpify_set:Nn #1#2 + { \group_begin: \tl_clear:N \l_tmpa_tl - \__nmc_fpify:VN #2 \l_tmpa_tl + \__nmc_fpify:nN { #2 } \l_tmpa_tl \exp_args:NNNV \group_end: - \tl_set:Nn \l__nmc_fp_exprn_tl { \l_tmpa_tl } + \tl_set:Nn \l__nmc_fp_exprn_tl \l_tmpa_tl \fp_set:Nn #1 { \l__nmc_fp_exprn_tl } \__nmc_error_fpflag: } -\cs_generate_variant:Nn \__nmc_fpify_set:NN { cc } -\cs_new_protected:Npn \__nmc_verb:n #1 - { \texttt{ \tl_trim_spaces:n { \tl_to_str:n { #1 } } } } +\cs_generate_variant:Nn \__nmc_fpify_set:Nn { NV, cv } + +\cs_new:Npn \__nmc_verb:n #1 + { \texttt{\string #1} } \cs_generate_variant:Nn \__nmc_verb:n { V } -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Error handling +\cs_new:Npn \__nmc_verb:N #1 + { \texttt{\string #1} } +\cs_generate_variant:Nn \__nmc_verb:N { c } +% Error handling %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \seq_new:N \g__nmc_error_where_seq \bool_new:N \g__nmc_error_bool -%-------------------------------------- \cs_new_protected:Npn \__nmc_error_where:n #1 - { \seq_gpush:Nn \g__nmc_error_where_seq { #1 } } - + { + \seq_gpush:Nn \g__nmc_error_where_seq + { #1 + \int_compare:nNnT { \l__nmc_depth_int } > { 1 } + { ~(\int_eval:n { (\l__nmc_depth_int-1)/2 } ) } + } + } \cs_new_protected:Npn \__nmc_error_what:n #1 { \bool_gset_true:N \g__nmc_error_bool @@ -545,16 +524,18 @@ } \cs_new_protected:Npn \__nmc_error_msg:n #1 { + \tl_set:Nn \l_tmpa_tl { ??? } \seq_if_empty:NF \g__nmc_error_where_seq { \seq_gpop:NN \g__nmc_error_where_seq \l_tmpa_tl \hbox:n { !!!~ #1 :~\l_tmpa_tl.~!!! } } } -% l3fp exceptions; invalid op triggers a LaTeX *error*, hence: +% l3fp exceptions; ln(1),cos(90),sin(360) underflow ignored! +% Invalid op --> LaTeX *error*, hence \fp_trap:nn { invalid_operation } { flag } \cs_new_protected:Npn \__nmc_error_fpflag: - { % ln(1),cos(90),sin(360) => underflow. Ignored! + { \flag_if_raised:nTF { fp_overflow } { \__nmc_flag:n { 1 } } { \flag_if_raised:nTF { fp_division_by_zero } { \__nmc_flag:n { 2 } } { \flag_if_raised:nT { fp_invalid_operation } @@ -566,24 +547,17 @@ { \__nmc_error_what:n { - \__nmc_verb:n{l3fp}~error~ - \int_case:nnT { #1 } - { - { 1 } { `Overflow' } - { 2 } { `Division~by~zero' } - { 3 } { `Invalid~operation' } - } - { ~in } - } - } -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% multi-tok vars (primed, subscripted, ...) to single tok -% assumes math delims absent + \__nmc_verb:n{l3fp}~error~` \clist_item:nn + { Overflow, Division~by~zero, Invalid~operation }{ #1 }'~in + } + } +%%%%%%%% multi-tok --> single token vars %%%%%%%% +% no math delims; #1(seq) vv-list; #2(tl) formula \int_new:N \g__nmc_prep_multitok_int \tl_new:N \l_nmc_multitoka_tl \tl_new:N \l_nmc_multitokb_tl \cs_new_protected:Npn \__nmc_prep_multitok:NN #1#2 - { % #1 vv-list (seq); #2 formula (tl) + { \seq_clear:N \l_tmpa_seq \seq_map_inline:Nn #1 { @@ -599,12 +573,12 @@ { \sort_return_same: } } \seq_map_inline:Nn \l_tmpa_seq - { % multitoks => \_nmca, \_nmcb, etc + { % multitoks => \nmc_a, \nmc_b, etc \int_gincr:N \g__nmc_prep_multitok_int \tl_set:Nn \l_nmc_multitoka_tl { ##1 } - \tl_set:Nx \l_nmc_multitokb_tl { \cs:w _nmc\int_to_alph:n + \tl_set:Nx \l_nmc_multitokb_tl { \cs:w nmc_\int_to_alph:n { \g__nmc_prep_multitok_int } \cs_end: } - \tl_set:cn { _nmc\int_to_alph:n { \g__nmc_prep_multitok_int } } + \tl_set:cn { nmc_\int_to_alph:n { \g__nmc_prep_multitok_int } } { ##1 } \regex_replace_all:nnN { \u{l_nmc_multitoka_tl} } { \u{l_nmc_multitokb_tl} } #1 @@ -612,203 +586,231 @@ { \u{l_nmc_multitoka_tl} } { \u{l_nmc_multitokb_tl} } #2 } } -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% \nmcInfo (no. of terms/loops/steps in "infinite" processes) -\tl_new:N \g__nmc_sum_info_tl -\tl_new:N \g__nmc_prod_info_tl -\NewDocumentCommand \nmcInfo { s m } - { - \prop_if_in:NnTF \g__nmc_subst_misc_prop { #2 } - { - \tl_if_empty:cT { g__nmc_#2_info_tl } - { \tl_set:cn { g__nmc_#2_info_tl } { 0 } } - \tl_use:c { g__nmc_#2_info_tl } - \IfBooleanF { #1 } - { - \prop_get:NnN \g__nmc_subst_misc_prop { #2 } \l_tmpb_tl - \ \l_tmpb_tl % pluralise? - \int_if_zero:nF { \tl_use:c { g__nmc_#2_info_tl } - 1 } { s } - } - } - { - \__nmc_error_where:n { info~command } - \__nmc_error_what:n { Unknown~argument~\__nmc_verb:n { #2 }~in } - } - } -\ProvideDocumentCommand \info {} { \nmcInfo } -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\int_new:N \l__nmc_mode_int -\tl_new:N \l__nmc_formula_tl +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\int_new:N \l__nmc_depth_int +\tl_new:N \l__nmc_mode_tl +\tl_new:N \l_nmc_formula_tl +\fp_new:N \l__nmc_result_fp +\tl_new:N \l_nmc_result_tl \tl_new:N \l__nmc_formula_dup_tl \tl_new:N \l__nmc_fp_expr_tl \tl_new:N \l__nmc_fp_exprn_tl -\tl_new:N \l_nmc_result_tl -\bool_new:N \l__nmc_vv_val_only_bool -\clist_new:N \l__nmc_vv_clist -\seq_new:N \l__nmc_vv_visible_seq -\seq_new:N \l__nmc_vv_all_seq -\seq_new:N \l__nmc_calc_fn_seq -\prop_new:N \l__nmc_vv_change_prop -\tl_new:N \l__nmc_eq_var_tl -\tl_new:N \l__nmc_eq_val_tl -\tl_new:N \l__nmc_vv_fp_expr_tl +\bool_new:N \l__nmc_dbg_count_bool +\tl_new:N \l__nmc_dbg_vv_tl +\tl_new:N \l__nmc_dbg_idii_tl +\tl_new:N \l__nmc_dbg_idiii_tl +\tl_new:N \l__nmc_dbg_idv_tl +\seq_new:N \l__nmc_dbg_stored_seq \int_new:N \l__nmc_round_int -\int_new:N \l__nmc_sci_num_int -\int_new:N \l__nmc_prime_int +\int_new:N \l__nmc_sci_expon_int +\int_new:N \l__nmc_num_alt_int \tl_new:N \l__nmc_bool_F_tl \tl_new:N \l__nmc_bool_T_tl \bool_new:N \l__nmc_TF_out_bool \bool_new:N \l__nmc_allow_TF_out_bool \bool_new:N \l__nmc_sci_num_x_bool -\bool_new:N \l__nmc_sci_num_table_bool -\tl_new:N \l__nmc_punc_tl -\tl_new:N \l__nmc_math_delimi_tl -\tl_new:N \l__nmc_math_delimii_tl +\bool_new:N \l__nmc_sci_num_table_bool +\bool_new:N \l__nmc_vv_val_only_bool +\bool_new:N \l__nmc_vv_invisible_bool +\clist_new:N \l__nmc_vv_clist +\seq_new:N \l__nmc_vv_visible_seq +\seq_new:N \l__nmc_vv_no_consts_seq +\seq_new:N \l__nmc_vv_all_seq +\seq_new:N \l__nmc_calc_fn_seq +\prop_new:N \l__nmc_vv_change_prop +\tl_new:N \l__nmc_eq_var_tl +\tl_new:N \l__nmc_eq_val_tl +\tl_new:N \l__nmc_vv_fp_expr_tl +\tl_new:N \l__nmc_punc_tl +\tl_new:N \l__nmc_math_delimi_tl +\tl_new:N \l__nmc_math_delimii_tl \bool_new:N \l__nmc_wraps_math_bool % ##1 = number-only switch, ##2 = keyval settings, -% ##3 = formula, ##4 = vv-list, ##5 = number format, -% #1 = \nmcCommand, #2 = id, #3 =short-name cmd -\cs_new_protected:Npn \nmc_define:nnN #1#2#3 - { - \NewDocumentCommand { #1 } { s O{} m O{} O{} } - { - \bool_gset_false:N \g__nmc_error_bool +% ##3 = formula, ##4 = vv-list, ##5 = number-format spec., +% #1 = \nmcCommand, #2 = cmd id, #3 = short-name cmd +\cs_new_protected:Npn \nmc_define:NnN #1#2#3 + { + \NewDocumentCommand #1 { s O{} m O{} O{} } + { \group_begin: - \bool_set_eq:NN \l__nmc_num_only_bool ##1 - \__nmc_get_inputs:nnnnn { #2 } { ##2 } { ##3 } {##4 } {##5 } - \bool_if:NF \g__nmc_error_bool - { \use:c { __nmc_#2_process: } } - \int_if_zero:nTF { \l__nmc_debug_int } - { - \bool_if:NF \g__nmc_error_bool - { \use:c { __nmc_#2_display: } } - } - { \__nmc_debug_display:nn { \l__nmc_debug_int } { #2 } } + \__nmc_initialize:Nn ##1 { #2 } + \__nmc_inputs_get:nnnnn { #2 } { ##2 } { ##3 } {##4 } {##5 } + \bool_if:NF \g__nmc_error_bool + { \use:c { __nmc_#2_process: } } + \int_if_zero:nTF { \l__nmc_dbg_int } + { + \bool_if:NF \g__nmc_error_bool + { \use:c { __nmc_#2_display: } } + } + { \__nmc_dbg_display:nn { \l__nmc_dbg_int } { #2 } } \group_end: } - \ProvideDocumentCommand { #3 } { } { #1 } + \ProvideDocumentCommand #3 {} { #1 } + \cs_new_protected:cpn { __nmc_#2_vv_digest:N } ##1 + { } + \clist_map_inline:nn { initialize, settings_digest, process, display } + { \cs_new_protected:cpn { __nmc_#2_##1: } { \prg_do_nothing: } } } -\nmc_define:nnN { \nmcEvaluate } { eval } \eval +\nmc_define:NnN \nmcEvaluate { eval } \eval %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\cs_new_protected:Npn \__nmc_get_inputs:nnnnn #1#2#3#4#5 - { - \__nmc_settings_get:nn { #1 }{ #2 } +\cs_new_protected:Npn \__nmc_initialize:Nn #1#2 + { + \bool_gset_false:N \g__nmc_error_bool + \bool_set_eq:NN \l__nmc_num_only_bool #1 + \bool_set_false:N \l__nmc_sci_num_out_bool + \bool_set_false:N \l__nmc_sci_num_x_bool + \bool_set_false:N \l__nmc_sci_num_table_bool + \int_incr:N \l__nmc_depth_int + \int_compare:nNnT \l__nmc_depth_int > { 1 } % for nesting + { \bool_set_true:N \l__nmc_num_only_bool } + \prop_concat:NNN \l__nmc_subst_var_prop + \g__nmc_subst_var_prop \l__nmc_subst_var_prop + \tl_set:Nn \l__nmc_dbg_idii_tl { vv-list } + \use:c { __nmc_#2_initialize: } + } +\cs_new_protected:Npn \__nmc_inputs_get:nnnnn #1#2#3#4#5 + { + \__nmc_error_where:n { settings } + \tl_if_empty:nF { #2 } + { + \keys_set_known:nn { numerica/generic } { #2 } + \keys_set_known:xn { numerica/#1 }{ #2 } + } \use:c { __nmc_#1_settings_digest: } + \seq_gpop:NN \g__nmc_error_where_seq \l__nmc_toss_tl \bool_if:NF \g__nmc_error_bool { \mode_if_math:TF - { \tl_set:Nn \l__nmc_formula_tl { #3 } } + { \tl_set:Nn \l_nmc_formula_tl { #3 } } { \__nmc_math_delims:n { #3 } } - \tl_set_eq:NN \l__nmc_formula_dup_tl \l__nmc_formula_tl + \tl_set_eq:NN \l__nmc_formula_dup_tl \l_nmc_formula_tl } \bool_if:NF \g__nmc_error_bool - { - \tl_if_in:nnTF { #4 } { = } - { % vv-list + { + \tl_if_in:nnTF { #4 } { = }% vv-list + { + \__nmc_get_num_format:n { #5 } + \__nmc_error_where:n { variable\,=\,value~list } \__nmc_vv_extract_visible:nN { #4 } \l__nmc_vv_clist \use:c { __nmc_#1_vv_digest:N } \l__nmc_vv_clist - \bool_if:NF \g__nmc_error_bool - { % number format - \tl_if_empty:nF { #5 } - { \__nmc_get_num_format:nn { #5 } { #1 } } - } } - { % if empty vv-list + { % empty vv-list + \__nmc_get_num_format:n { #4#5 } + \use:c { __nmc_#1_vv_digest:N } \c_empty_clist \tl_clear:N \l__nmc_vv_inline_tl \tl_clear:N \l__nmc_vv_display_tl - \__nmc_get_num_format:nn { #4#5 } { #1 } + \bool_set_true:N \l__nmc_vv_invisible_bool } + \seq_gpop:NN \g__nmc_error_where_seq \l__nmc_toss_tl } } -\cs_new_protected:Npn \__nmc_settings_get:nn #1#2 - { % #1 = iter,solve,recur,table; #2 = settings - \__nmc_error_where:n { settings } - \tl_if_empty:nF { #2 } - { - \keys_set_known:nn { numerica/generic } { #2 } - \keys_set_known:xn { numerica/#1 }{ #2 } - } - } -\cs_new_protected:Npn \__nmc_debug_display:nn #1#2 - { \__nmc_debug_display:xnn { \mode_if_math:TF { ed }{ * } } { #1 } { #2 } } -\cs_new_protected:Npn \__nmc_debug_display:nnn #1#2#3 - { % #2 dbg int #3 fn id - \__nmc_if_mod_zero:nnT { #2 } { 5 } - { \__nmc_debug_stored:N \l_tmpb_tl } - \raggedright +%%%%%%%%%%%%%%%%% debug routines %%%%%%%%%%%%%%%% +\cs_new_protected:Npn \__nmc_dbg_display:nn #1#2 + { \__nmc_dbg_display:xnn { \mode_if_math:TF { ed }{ * } } { #1 } { #2 } } +\cs_new_protected:Npn \__nmc_dbg_display:nnn #1#2#3 + { % #2 dbg int, #3 fn id + \seq_reverse:N \l__nmc_vv_all_seq + \raggedright \begin{ align#1 } - \__nmc_debug_display:xnnn { \seq_use:Nn \l__nmc_vv_all_seq { ,~ } } - { #2 } { 2 } { vv-list } - \__nmc_debug_display:Vnnn \l__nmc_formula_tl { #2 } { 3 } { formula } - \__nmc_debug_display:Vnnn \l_tmpb_tl { #2 } { 5 } { stored } - \__nmc_debug_display:Vnnn \l__nmc_fp_expr_tl { #2 } { 7 } { fp-form } - \bool_if:nT - { - !\g__nmc_error_bool && - \__nmc_if_mod_zero_p:nn { #2 } { 7 } && - !\str_if_eq_p:nn { #3 } { table } - } - { \text{result:} & \quad \l_nmc_result_tl } - \__nmc_debug_display:Vnnn \l__nmc_reuse_retrieved_tl - { #2 } { 99991 } { Saved } + \__nmc_if_mod_zero:nnT { #2 } { 2 } + { \__nmc_dbg:Nnn \l__nmc_dbg_vv_tl { #2 } \l__nmc_dbg_idii_tl } + \__nmc_if_mod_zero:nnT { #2 } { 3 } + { \__nmc_dbg:Nnn \l_nmc_formula_tl { #2 } \l__nmc_dbg_idiii_tl } + \__nmc_if_mod_zero:nnT { #2 } { 5 } + { + \__nmc_dbg_stored: + \__nmc_dbg:Nnn \l_tmpa_tl { #2 } \l__nmc_dbg_idv_tl + } + \__nmc_if_mod_zero:nnT { #2 } { 7 } + { + \__nmc_dbg:Nnn \l__nmc_fp_expr_tl { #2 } { fp-form } + \bool_if:nT { !\g__nmc_error_bool + && !\str_if_eq_p:nn { #3 } { table } } + { \\ \text{result:} & \quad \text{\l_nmc_result_tl } } + } \end{ align#1 } + \bool_set_false:N \l__nmc_dbg_count_bool } -\cs_generate_variant:Nn \__nmc_debug_display:nnn { x } - -\cs_new_protected:Npn \__nmc_debug_stored:N #1 - { - \tl_clear:N \l_tmpa_tl - \tl_if_empty:NF \l__nmc_reuse_retrieved_tl +\cs_generate_variant:Nn \__nmc_dbg_display:nnn { x } + +\cs_new_protected:Npn \__nmc_dbg_vv_view:n #1 + { + \seq_set_eq:NN \l__nmc_vv_no_consts_seq \l__nmc_vv_all_seq + \int_step_inline:nn { \seq_count:N \g__nmc_consts_vv_seq } + { \seq_pop:NN \l__nmc_vv_no_consts_seq \l__nmc_toss_tl } + \seq_reverse:N \l__nmc_vv_no_consts_seq + \int_step_inline:nn { #1 } + { \seq_pop:NN \l__nmc_vv_no_consts_seq \l__nmc_toss_tl } + \tl_gset:Nx \l__nmc_dbg_vv_tl + { \seq_use:Nn \l__nmc_vv_no_consts_seq {,~} } + } +\cs_new_protected:Npn \__nmc_dbg_get_data: + { + \seq_clear:N \l__nmc_dbg_stored_seq + \__nmc_dbg_vv_view:n { 0 } + \seq_map_inline:Nn \l__nmc_vv_no_consts_seq { - \clist_map_inline:Nn \l__nmc_reuse_retrieved_tl - { \tl_put_left:Nx \l_tmpa_tl { \exp_not:o { \use_i:nn ##1 }; } } - \tl_replace_all:Nnn \l_tmpa_tl { ~; } { ; } + \__nmc_split_eq:w ##1\q_stop + \prop_get:NVN \l__nmc_subst_var_prop \l__nmc_eq_var_tl \l_tmpa_tl + \tl_put_left:Nn \l_tmpa_tl { = } + \tl_put_left:NV \l_tmpa_tl \l__nmc_eq_var_tl + \seq_put_right:NV \l__nmc_dbg_stored_seq \l_tmpa_tl } - \tl_clear:N #1 - \prop_map_inline:Nn \g__nmc_subst_var_prop + } +\cs_new_protected:Npn \__nmc_dbg_stored: + { + \seq_clear:N \l_tmpa_seq + \seq_map_inline:Nn \l__nmc_dbg_stored_seq { - \str_if_in:NnF \l_tmpa_tl { ##1; } - { \tl_put_right:Nn #1 { ##1=##2,~ } } + \prop_get:NnNTF \l__nmc_subst_var_prop { ##1 } \l_tmpa_tl + { + \tl_put_left:Nn \l_tmpa_tl { ##1= } + \seq_put_right:NV \l_tmpa_seq \l_tmpa_tl + } + { \seq_put_right:Nn \l_tmpa_seq { ##1 } } } - \tl_set:Nx #1 { \tl_range:Nnn #1 { 1 } { -2 } } + \tl_gset:Nx \l_tmpa_tl { \seq_use:Nn \l_tmpa_seq {,~} } } -\cs_new:Npn \__nmc_debug_display:nnnn #1#2#3#4 +\cs_new:Npn \__nmc_dbg:Nnn #1#2#3 { - \__nmc_if_mod_zero:nnT { #2 } { #3 } - { \hbox:n { #4:} & \quad - \int_compare:nNnTF { #2 } > { 0 } - { \vbox_top:n } { \hbox:n } { \tl_to_str:n { #1 } } \\ } - } -\cs_generate_variant:Nn \__nmc_debug_display:nnnn { V, x } -%%%%%%%%% formula, delimiters %%%%%%%%%%% -% delimiters -% #1(tl) = formula + \bool_if:NT \l__nmc_dbg_count_bool { \\ } + \hbox:n { #3:} & \quad + \int_compare:nNnTF { #2 } > { 0 } + { \vbox_top:n } { \hbox:n } { \tl_to_str:N #1 } + \bool_set_true:N \l__nmc_dbg_count_bool + } +\cs_generate_variant:Nn \__nmc_dbg_display:nnnn { V, x } +%%%%%%%%%%%%%% formula, delimiters %%%%%%%%%%%%%% \cs_new_protected:Npn \__nmc_math_delims:n #1 - { - \tl_set:Nn \l__nmc_formula_tl { #1 } - \tl_trim_spaces:N \l__nmc_formula_tl + { % #1 formula + \tl_set:Nn \l_nmc_formula_tl { #1 } + \tl_trim_spaces:N \l_nmc_formula_tl \bool_set_true:N \l__nmc_wraps_math_bool % $ ? - \tl_if_head_eq_meaning:VNTF \l__nmc_formula_tl $ + \tl_if_head_eq_meaning:VNTF \l_nmc_formula_tl $ { \__nmc_math_delims_aux:n { 1 } } - { % \[ ? - \tl_if_head_eq_meaning:VNTF \l__nmc_formula_tl \[ + { + \tl_if_head_eq_meaning:VNTF \l_nmc_formula_tl \( { \__nmc_math_delims_aux:n { 1 } } - { %\begin{environ} ? - \tl_if_head_eq_meaning:VNTF \l__nmc_formula_tl \begin - { \__nmc_math_delims_aux:n { 2 } } - { - \__nmc_math_delims_aux:nn { \[ } { \] } - \bool_set_false:N \l__nmc_wraps_math_bool - } - } + { % \[ ? + \tl_if_head_eq_meaning:VNTF \l_nmc_formula_tl \[ + { \__nmc_math_delims_aux:n { 1 } } + { %\begin{environ} ? + \tl_if_head_eq_meaning:VNTF \l_nmc_formula_tl \begin + { \__nmc_math_delims_aux:n { 2 } } + { + \__nmc_math_delims_aux:nn { \[ } { \] } + \bool_set_false:N \l__nmc_wraps_math_bool + } + } + } } - \tl_trim_spaces:N \l__nmc_formula_tl + \tl_trim_spaces:N \l_nmc_formula_tl \bool_if:NTF \l__nmc_num_only_bool { \__nmc_math_delims_aux:nn {}{} } { \bool_if:NT \l__nmc_vv_multline_bool - { \__nmc_math_delims_mliner:V \l__nmc_eq_num_tl } + { \__nmc_math_delims_mliner:V \l__nmc_eqn_num_tl } } } \cs_new:Npn \__nmc_math_delims_mliner:n #1 @@ -823,12 +825,11 @@ \cs_new_protected:Npn \__nmc_math_delims_aux:n #1 { \__nmc_math_delims_aux:xx - { \tl_range:Nnn \l__nmc_formula_tl { 1 } { #1 } } - { \tl_range:Nnn \l__nmc_formula_tl { -#1 } { -1 } } + { \tl_range:Nnn \l_nmc_formula_tl { 1 } { #1 } } + { \tl_range:Nnn \l_nmc_formula_tl { -#1 } { -1 } } \int_set:Nn \l_tmpa_int { #1 + 1 } - \tl_set:Nx \l__nmc_formula_tl - { \tl_range:Nnn \l__nmc_formula_tl { \l_tmpa_int } - { -\l_tmpa_int } } + \tl_set:Nx \l_nmc_formula_tl + { \tl_range:Nnn \l_nmc_formula_tl { \l_tmpa_int } { -\l_tmpa_int } } } \cs_new_protected:Npn \__nmc_math_delims_aux:nn #1#2 { @@ -836,50 +837,213 @@ \tl_set:Nn \l__nmc_math_delimii_tl { #2 } } \cs_generate_variant:Nn \__nmc_math_delims_aux:nn { xx } -%%%%%%%%%% vv-list routines %%%%%%%%%%% + +%%%%%%%%%% number-formatting routines %%%%%%%%%%% +\cs_new_protected:Npn \__nmc_get_num_format:n #1 + { + \__nmc_error_where:n { result~format~spec. } + \str_set:Nn \l_tmpa_str { #1 } + \tl_clear:N \l_tmpa_tl + \int_zero:N \l__nmc_num_alt_int + \str_if_in:NnTF \l_tmpa_str { ? } + { \__nmc_num_bool_spec: } + { + \str_if_in:NnT \l_tmpa_str { * } + { + \bool_set_true:N \l__nmc_pad_zeros_bool + \str_remove_all:Nn \l_tmpa_str { * } + } + } + \str_map_inline:Nn \l_tmpa_str + { + \str_if_in:nnTF { 1234567890- } { ##1 } + { \tl_put_right:Nn \l_tmpa_tl { ##1 } } + { \__nmc_num_sci_spec:n { ##1 } } + } + \tl_if_empty:NF \l_tmpa_tl + { \int_set:Nn \l__nmc_round_int \l_tmpa_tl } + \int_compare:nNnT { \l__nmc_depth_int } > { 2 } + { \__nmc_num_deep_output:N \l_tmpa_tl } + \bool_if:NF \g__nmc_error_bool + { \seq_gpop:NN \g__nmc_error_where_seq \l__nmc_toss_tl } + } +\cs_new_protected:Npn \__nmc_num_bool_spec: + { + \bool_set_eq:NN \l__nmc_TF_out_bool \l__nmc_allow_TF_out_bool + \int_incr:N \l__nmc_num_alt_int + \str_remove_once:Nn \l_tmpa_str { ? } + \str_if_in:NnT \l_tmpa_str { ? } + { + \int_incr:N \l__nmc_num_alt_int + \str_remove_once:Nn \l_tmpa_str { ? } + \str_if_in:NnT \l_tmpa_str { ? } + { + \int_incr:N \l__nmc_num_alt_int + \str_remove_all:Nn \l_tmpa_str { ? } + } + } + \bool_if:NT \l__nmc_num_only_bool + { \int_set:Nn \l__nmc_num_alt_int { 1 } } + } +\cs_new_protected:Npn \__nmc_num_sci_spec:n #1 + { + \str_case:nn { #1 } + { + { x } { \bool_set_true:N \l__nmc_sci_num_x_bool } + { t } { \bool_set_true:N \l__nmc_sci_num_table_bool } + } + \tl_set:Nn \l__nmc_sci_num_out_tl { #1 } + \bool_set_true:N \l__nmc_sci_num_out_bool + \int_incr:N \l__nmc_num_alt_int + } +\cs_new_protected:Npn \__nmc_num_deep_output:N #1 + { + \bool_set_true:N \l__nmc_sci_num_out_bool + \bool_set_false:N \l__nmc_sci_num_x_bool + \bool_set_false:N \l__nmc_sci_num_table_bool + \tl_set:Nn \l__nmc_sci_num_out_tl { e } + \bool_set_false:N \l__nmc_pad_zeros_bool + \int_zero:N \l__nmc_num_alt_int + } +%%%%%%%%%% +% #1=fpify-ed in; #2=tl fmt'ed out; #3=int rnd; #4 sci bool +\cs_new_protected:Npn \__nmc_num_format:nNnN #1#2#3#4 + { + \bool_if:NTF \l__nmc_TF_out_bool + { \__nmc_num_bool_out:nNn { #1 } #2 { \l__nmc_num_alt_int } } + { + \bool_if:NTF #4 + { + \exp_last_unbraced:Nx \__nmc_sci_output_aux:wNn + { \fp_to_scientific:n { #1 } } \q_stop #2 { #3 } + } + { \__nmc_num_format_decimal:nNn { #1 } #2 { #3 } } + } + } +\cs_new_protected:Npn \__nmc_num_bool_out:nNn #1#2#3 + { + \fp_compare:nNnTF { 0 } = { #1 } + { \tl_set:Nx #2 { \clist_item:nn {0,F,\texttt{F}} { #3 } } } + { \tl_set:Nx #2 { \clist_item:nn {1,T,\texttt{T}} { #3 } } } + } +\cs_new_protected:Npn \__nmc_num_format_decimal:nNn #1#2#3 + { + \tl_set:Nx #2 { \fp_eval:n { 0 + round( #1, #3 ) } } + \__nmc_error_fpflag: + \bool_if:NF \g__nmc_error_bool + { + \int_set:Nn \l__nmc_num_sgn_int { \fp_sign:n { #2 } } + \bool_lazy_and:nnT { \l__nmc_pad_zeros_bool } + { \int_compare_p:nNn { #3 } > { 0 } } + { \__nmc_num_pad:Nn #2 { #3 } } + } + } +\cs_new_protected:Npn \__nmc_num_pad:Nn #1#2 + { + \tl_if_in:NnTF #1 { . } + { \tl_set:Nx #1 { \__nmc_num_pad_aux:Vn #1 { #2 } } } + { \tl_set:Nx #1 { \__nmc_num_pad_aux:Vn { #1.} { #2 } } } + } +\cs_new:Npn \__nmc_num_pad_aux:nn #1#2 + { \__nmc_num_pad:wN #1\q_stop { #2 } } +\cs_generate_variant:Nn \__nmc_num_pad_aux:nn { V } +\cs_new:Npn \__nmc_num_pad:wN #1.#2\q_stop#3 + { + \int_if_zero:nTF { #3 } { #1 } + { #1.#2\prg_replicate:nn { #3 - \tl_count:n { #2 } } { 0 } } + } +\cs_new_protected:Npn \__nmc_sci_output_aux:wNn #1e#2\q_stop#3#4 + { % #1e#2=fp input; #3=formatted tl out; #4 = rounding + \tl_set:Nx #3 { \fp_eval:n { 0 + round( #1, #4 ) } } + \__nmc_error_fpflag: + \bool_if:NF \g__nmc_error_bool + { + \int_set:Nn \l__nmc_sci_expon_int { #2 } + \tl_if_eq:VnT #3 { 10 } + { + \int_incr:N \l__nmc_sci_expon_int + \tl_set:Nn #3 { 1 } + } + \bool_if:NT \l__nmc_pad_zeros_bool + { \__nmc_num_pad:Nn #3 { #4 } } + \bool_lazy_or:nnT { !\int_if_zero_p:n { \l__nmc_sci_expon_int } } + { \int_compare_p:nNn { \l__nmc_num_alt_int } > { 1 } } + { + \bool_if:NTF \l__nmc_sci_num_table_bool + { \tl_put_left:Nx #3 { \__nmc_sci_num_table:n { #2 } } } + { + \tl_put_right:Nx #3 { \__nmc_sci_write:n + { \int_use:N \l__nmc_sci_expon_int } } + } + } + } + \int_set:Nn \l__nmc_num_sgn_int { \fp_sign:n { #1 } } % tables + } +\cs_new:Npn \__nmc_sci_write:n #1 + { % #1 exponent + \int_compare:nNnTF { \l__nmc_depth_int } > { 2 } + { e#1 } + { + \bool_if:NTF \l__nmc_sci_num_x_bool + { \exp_not:N \times 10^{#1} } + { \hbox:n { \l__nmc_sci_num_out_tl {#1} } } + } + } +\cs_new:Npn \__nmc_sci_num_table:n #1 + { (#1)\exp_not:n {\,} } +% vv-list routines %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \cs_new_protected:Npn \__nmc_vv_extract_visible:nN #1#2 { % #2 reverses #1 - \clist_clear:N #2 \seq_clear:N \l__nmc_vv_visible_seq \clist_set:Nn \l_tmpa_clist { #1 } \mode_if_math:F { - \tl_remove_all:Nn \l_tmpa_clist { $ } - \tl_if_head_eq_charcode:VNT \l_tmpa_clist \[ - { - \tl_remove_once:Nn \l_tmpa_clist { \[ } - \tl_remove_once:Nn \l_tmpa_clist { \] } - } + \__nmc_vv_remove_delims:N \l_tmpa_clist \tl_trim_spaces:N \l_tmpa_clist - } - \clist_map_inline:Nn \l_tmpa_clist - { + } + \clist_clear:N #2 + \clist_map_inline:Nn \l_tmpa_clist % to remove { } + { \tl_if_head_is_group:nTF { ##1 } - { % to remove { } - \clist_put_left:Nx #2 - { \tl_head:n { ##1 } \tl_tail:n { ##1 } } - } + { \clist_put_left:Nx #2 { \tl_head:n { ##1 } \tl_tail:n { ##1 } } } { \seq_put_right:Nn \l__nmc_vv_visible_seq { ##1 } - \tl_if_head_eq_meaning:nNF { ##1 } \\ - { \clist_put_left:Nn #2 { ##1 } } + \clist_put_left:Nn #2 { ##1 } } } - \tl_replace_once:Nnx \l__nmc_vv_inline_tl { vv } - { \seq_use:Nn \l__nmc_vv_visible_seq { , } } - \tl_replace_once:Nnx \l__nmc_vv_display_tl { vv } - { \seq_use:Nn \l__nmc_vv_visible_seq { , } } + \__nmc_vv_subst_style: } -\cs_new_protected:Npn \__nmc_vv_digest:N #1 +\cs_new_protected:Npn \__nmc_vv_remove_delims:N #1 + { + \exp_args:Nx\str_case:nn { \tl_head:N #1 } + { + { $ } { \tl_remove_all:Nn #1 { $ } } + { \( } { \tl_map_inline:nn {\(\)} { \tl_remove_once:Nn #1 { ##1 } } } + { \[ } { \tl_map_inline:nn {\[\]} { \tl_remove_once:Nn #1 { ##1 } } } + } + } +\cs_new_protected:Npn \__nmc_vv_subst_style: { + \seq_if_empty:NTF \l__nmc_vv_visible_seq + { \bool_set_true:N \l__nmc_vv_invisible_bool } + { + \tl_map_inline:nn { \l__nmc_vv_inline_tl \l__nmc_vv_display_tl } + { \tl_replace_once:Nnx ##1 { vv } + { \seq_use:Nn \l__nmc_vv_visible_seq { , } } } + } + } +\cs_new_protected:Npn \__nmc_vv_digest:N #1 + { \seq_set_from_clist:NN \l__nmc_vv_all_seq #1 - \__nmc_error_where:n { variable\,=\,value~list } + \seq_concat:NNN \l__nmc_vv_all_seq + \g__nmc_consts_vv_seq \l__nmc_vv_all_seq \bool_if:NT \l__nmc_multitok_bool - { \__nmc_prep_multitok:NN \l__nmc_vv_all_seq \l__nmc_formula_tl } + { \__nmc_prep_multitok:NN \l__nmc_vv_all_seq \l_nmc_formula_tl } \__nmc_vv_get_vars_vals:NN \l__nmc_vv_all_seq \c_empty_prop } +% #1(seq) vv-list;#2(prop) changed vars (implicit-mode) \cs_new_protected:Npn \__nmc_vv_get_vars_vals:NN #1#2 - { % #1(seq) vv-list;#2(prop) changed vars (implicit-mode) + { \seq_set_eq:NN \l_tmpa_seq #1 \seq_clear:N \l__nmc_calc_fn_seq \seq_map_inline:Nn \l_tmpa_seq @@ -897,15 +1061,11 @@ \bool_if:NF \g__nmc_error_bool { \__nmc_vv_record:NVN \l__nmc_eq_var_tl \l__nmc_eq_val_tl #2 } } +% changed `var=vals in prop #3 \cs_new_protected:Npn \__nmc_vv_record:NnN #1#2#3 { - \bool_if:NF \l__nmc_vv_val_only_bool - { % record the var - \prop_put_if_new:Non \g__nmc_class_prop #1 - { \__nmc_fpify_var: \__nmc_delim_var: } - } \prop_get:NVNF #3 #1 \l__nmc_vv_fp_expr_tl - { % fp-ify & calc. (changed `var=val's in prop #3) + { \tl_clear:N \l__nmc_vv_fp_expr_tl \__nmc_fpify:nN { #2 } \l__nmc_vv_fp_expr_tl } @@ -917,22 +1077,18 @@ { \__nmc_vv_write:VN #1 \l__nmc_vv_fp_expr_tl } } \cs_generate_variant:Nn \__nmc_vv_record:NnN { NV } - +% #1 = var; #2 = val as fp expr. \cs_new_protected:Npn \__nmc_vv_write:nN #1#2 - { % #1 = var; #2 = val as fp expr. + { \tl_if_empty:NF #2 { \tl_if_eq:VnTF #2 { inf } - { \prop_put:Nnn \g__nmc_subst_var_prop { #1 } { inf } } - { - \prop_put:Nnx \g__nmc_subst_var_prop - { #1 } { \fp_eval:n { #2 } } - \__nmc_error_fpflag: - } + { \prop_put:Nnn \l__nmc_subst_var_prop { #1 } { inf } } + { \prop_put:Nnx \l__nmc_subst_var_prop { #1 } { \fp_to_tl:n {#2} } } + \__nmc_error_fpflag: } } \cs_generate_variant:Nn \__nmc_vv_write:nN { V } -% split var=val \cs_new_protected:Npn \__nmc_vv_split_item:n #1 { \bool_set_false:N \l__nmc_vv_val_only_bool @@ -949,163 +1105,48 @@ } \cs_generate_variant:Nn \__nmc_vv_split_item:n { V } \cs_new_protected:Npn \__nmc_split_eq:w #1=#2\q_stop - { + { \tl_set:Nn \l__nmc_eq_var_tl { #1 } \tl_trim_spaces:N \l__nmc_eq_var_tl \tl_set:Nn \l__nmc_eq_val_tl { #2 } } -%%%%%%%%%% number-formatting routines %%%%%%%%%% -\cs_new_protected:Npn \__nmc_get_num_format:nn #1#2 - { - \__nmc_error_where:n { result~format~spec. } - \tl_clear:N \l_tmpa_tl - \str_map_inline:nn { #1 } - { - \str_if_in:NnTF \c__nmc_sdigits_tl { ##1 } - { \tl_put_right:Nn \l_tmpa_tl { ##1 } } - { - \str_if_eq:nnTF { ##1 } { * } - { \bool_set_true:N \l__nmc_pad_zeros_bool } - { - \bool_set_true:N \l__nmc_sci_num_out_bool - \str_case:nnF { ##1 } - { - { x } { \bool_set_true:N \l__nmc_sci_num_x_bool - \tl_set:Nn \l__nmc_sci_num_out_tl { ##1 } } - { t } { \bool_set_true:N \l__nmc_sci_num_table_bool } - { ' } { \int_incr:N \l__nmc_prime_int } - } - { \tl_set:Nn \l__nmc_sci_num_out_tl { ##1 } } - } - } - } - \str_if_in:nnT { #1 } { ? } - { - \bool_set_eq:NN \l__nmc_TF_out_bool \l__nmc_allow_TF_out_bool - \bool_set_false:N \l__nmc_sci_num_out_bool - } - \tl_if_empty:NF \l_tmpa_tl - { \int_set:Nn \l__nmc_round_int \l_tmpa_tl } - \bool_if:NT \l__nmc_TF_out_bool - { - \bool_if:NTF \l__nmc_num_only_bool - { \__nmc_num_TF_format:n { 1 } } - { \__nmc_num_TF_format:n { 1 + \l__nmc_prime_int } } - } - \bool_if:NF \g__nmc_error_bool - { \seq_gpop:NN \g__nmc_error_where_seq \l__nmc_toss_tl } - } -%%%%%%%%%% -\cs_new_protected:Npn \__nmc_num_TF_format:n #1 - { - \tl_set:Nx \l__nmc_bool_F_tl { \seq_item:Nn \c__nmc_F_out_seq { #1 } } - \tl_set:Nx \l__nmc_bool_T_tl { \seq_item:Nn \c__nmc_T_out_seq { #1 } } - } -\cs_new_protected:Npn \__nmc_num_format:nNnN #1#2#3#4 - { % #1=fpf'ied in; #2=tl fmt'ed out; #3=int rnd; #4 sci bool - \bool_if:NTF \l__nmc_TF_out_bool - { - \tl_set:Nx #2 { \fp_compare:nNnTF { 0 } = { #1 } - { \exp_not:o \l__nmc_bool_F_tl } - { \exp_not:o \l__nmc_bool_T_tl } } - } - { - \bool_if:NTF #4 - { - \exp_last_unbraced:Nx \__nmc_sci_output_aux:wNn - { \fp_to_scientific:n { #1 } } \q_stop #2 { #3 } - } - { \__nmc_num_format_decimal:nNn { #1 } #2 { #3 } } - } - } -\cs_new_protected:Npn \__nmc_num_format_decimal:nNn #1#2#3 +% eval-specific routines %%%%%%%%%%%%%%%%%%%%%%%% +\cs_gset_protected:Npn \__nmc_eval_initialize: { - \tl_set:Nx #2 { \fp_eval:n { 0 + round( #1, #3 ) } } - \__nmc_error_fpflag: - \bool_if:NF \g__nmc_error_bool - { - \int_set:Nn \l__nmc_num_sgn_int { \fp_sign:n { #2 } } - \bool_lazy_and:nnT { \l__nmc_pad_zeros_bool } - { \int_compare_p:nNn { #3 } > { 0 } } - { - \tl_if_in:NnTF #2 { . } - { \__nmc_num_pad:Nnn #2 {} { #3 } } - { \__nmc_num_pad:Nnn { #2 } {.} { #3 } } - } - } - } -\cs_new_protected:Npn \__nmc_num_pad:Nnn #1#2#3 - { % pad with 0s: #1 number; #2 point #3 rounding - \tl_set:Nx #1 { \exp_last_unbraced:NV - \__nmc_num_pad:wnN #1#2\q_stop{ #3 } } + \tl_set:Nn \l__nmc_dbg_idiii_tl { formula } + \tl_set:Nn \l__nmc_dbg_idv_tl { stored } } -\cs_new:Npn \__nmc_num_pad:wnN #1.#2\q_stop#3 - { - \int_if_zero:nTF { #3 } { #1 } - { #1.#2\prg_replicate:nn { #3 - \tl_count:n { #2 } } { 0 } } - } -\cs_new_protected:Npn \__nmc_sci_output_aux:wNn #1e#2\q_stop#3#4 - { % #1e#2=fp input; #3=formatted tl out; #4 = rounding - \tl_set:Nx #3 - { \fp_eval:n { 0 + round( #1, #4 ) } } - \__nmc_error_fpflag: - \bool_if:NF \g__nmc_error_bool - { - \int_set:Nn \l__nmc_sci_num_int { #2 } - \tl_if_eq:VnT #3 { 10 } - { - \int_incr:N \l__nmc_sci_num_int - \tl_set:Nn #3 { 1 } - } - \bool_if:NT \l__nmc_pad_zeros_bool - { - \tl_if_in:NnTF #3 {.} - { \__nmc_num_pad:Nnn #3 {} { #4 } } - { \__nmc_num_pad:Nnn #3 {.} { #4 } } - } - \bool_lazy_or:nnT { !\int_if_zero_p:n { \l__nmc_sci_num_int } } - { \int_compare_p:nNn { \l__nmc_prime_int } > { 0 } } - { \__nmc_sci_write:Nx #3 { \int_use:N \l__nmc_sci_num_int } } - } - \int_set:Nn \l__nmc_num_sgn_int { \fp_sign:n { #1 } } - } -\cs_new_protected:Npn \__nmc_sci_write:Nn #1#2 - { % #1 significand #2 exponent - \bool_if:NTF \l__nmc_sci_num_x_bool - { \tl_put_right:Nn #1 { \times 10^{#2} } } - { - \bool_if:NTF \l__nmc_sci_num_table_bool - { \tl_set:Nx #1 { \__nmc_sci_num_table:nn { #1 } { #2 } } } - { \tl_put_right:Nx #1 { \hbox:n { \l__nmc_sci_num_out_tl {#2} } } } - } - } -\cs_generate_variant:Nn \__nmc_sci_write:Nn { Nx } -\cs_new:Npn \__nmc_sci_num_table:nn #1#2 - { (#2)\exp_not:n {\,}{#1} } -%%%%%%%%%%%%%% eval-specific routines %%%%%%%%%%%%%%% -\cs_new:Npn \__nmc_eval_settings_digest: +\cs_gset_protected:Npn \__nmc_eval_settings_digest: { \bool_set_true:N \l__nmc_allow_TF_out_bool } -\cs_set_eq:NN \__nmc_eval_vv_digest:N \__nmc_vv_digest:N -\cs_new_protected:Npn \__nmc_eval_process: - { + +\cs_gset_eq:NN \__nmc_eval_vv_digest:N \__nmc_vv_digest:N + +\cs_gset_protected:Npn \__nmc_eval_process: + { \__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 \bool_if:NF \g__nmc_error_bool - { \__nmc_num_format:nNnN { \l__nmc_fp_expr_tl } \l_nmc_result_tl - { \l__nmc_round_int } \l__nmc_sci_num_out_bool } + { + \tl_set:Nx \l_nmc_result_tl { \fp_to_tl:n { \l__nmc_fp_expr_tl } } + \__nmc_error_fpflag: + } + \int_if_zero:nF \l__nmc_dbg_int + { \__nmc_dbg_get_data: } } -\cs_new_protected:Npn \__nmc_eval_display: +\cs_gset_protected:Npn \__nmc_eval_display: { + \__nmc_num_format:nNnN { \l_nmc_result_tl } \l_nmc_result_tl + { \l__nmc_round_int } \l__nmc_sci_num_out_bool \tl_gset_eq:NN \g__nmc_reuse_tl \l_nmc_result_tl - \bool_if:NF \l__nmc_num_only_bool - { + \bool_if:NF \l__nmc_num_only_bool + { \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 + \exp_not:o \l__nmc_formula_dup_tl \bool_if:NTF \l__nmc_TF_out_bool { \rightarrow } { = } } @@ -1113,8 +1154,11 @@ \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 }{}{} + \bool_if:NF \l__nmc_vv_invisible_bool + { + \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 @@ -1124,8 +1168,7 @@ } \l_nmc_result_tl } -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% \__nmc_fpify:nN +% fpify LaTeX math expr %%%%%%%%%%%%%%%%%%%%%%%%% \bool_new:N \l__nmc_insert_aster_bool \tl_new:N \l__nmc_subst_tl \tl_new:N \l__nmc_accum_tl @@ -1162,9 +1205,10 @@ \fp_new:N \l__nmc_sum_total_fp \fp_new:N \l__nmc_sum_prev_fp \fp_new:N \l__nmc_sum_rounded_fp + % #1 = latex expr #2 = fp-ified result \cs_new_protected:Npn \__nmc_fpify:nN #1#2 - { + { \group_begin: \bool_set_false:N \l__nmc_superscript_bool \bool_set_false:N \l__nmc_insert_aster_bool @@ -1183,28 +1227,28 @@ \__nmc_next: \prop_get:NVNTF \g__nmc_class_prop \l__nmc_B_tl \l_tmpb_tl { \exp_last_unbraced:NV \use_i:nn \l_tmpb_tl } - { \__nmc_fpify_unknown: } - } + { \__nmc_fpify_var: } + } \exp_args:NNNV \group_end: - \tl_put_right:Nn #2 \l__nmc_accum_tl - } + \tl_put_right:Nn #2 \l__nmc_accum_tl + } \cs_generate_variant:Nn \__nmc_fpify:nN { V } -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \cs_new_protected:Npn \__nmc_fpify_unknown: { \tl_if_in:nVTF { )]\}\rbrace } \l__nmc_B_tl { \__nmc_error_what:n { Unmatched~\__nmc_verb:V \l__nmc_B_tl{}~in } } { \__nmc_error_what:n { Unknown~token~\__nmc_verb:V \l__nmc_B_tl{}~in } } } +% to avoid e.g. 34 instead of 3*4 \cs_new_protected:Npn \__nmc_insert_aster: { \bool_if:NT \l__nmc_insert_aster_bool { \tl_put_right:Nn \l__nmc_accum_tl { * } } } \cs_new_protected:Npn \__nmc_fpify_dec: - { + { \__nmc_get_dec:NN \l__nmc_fact_arg_tl \c_false_bool \tl_if_eq:VnF \l__nmc_C_tl { ! } { @@ -1215,14 +1259,10 @@ } \cs_new_protected:Npn \__nmc_fpify_var: { % ( ) in case var < 0 raised to power - \prop_get:NVNTF \g__nmc_subst_var_prop \l__nmc_B_tl \l__nmc_subst_tl + \prop_get:NVNTF \l__nmc_subst_var_prop \l__nmc_B_tl \l__nmc_subst_tl { \tl_set_eq:NN \l__nmc_fact_arg_tl \l__nmc_subst_tl - \tl_if_in:noTF { !' } \l__nmc_C_tl - { - % \tl_if_eq:VnT \l__nmc_C_tl { ' } - % { \__nmc_deriv_dot_from_prime: } - } + \tl_if_in:noF { ! } \l__nmc_C_tl { \__nmc_accum_fn_parenth:NNn \l__nmc_accum_tl \l__nmc_subst_tl {} \bool_set_true:N \l__nmc_insert_aster_bool @@ -1232,7 +1272,7 @@ } \cs_new_protected:Npn \__nmc_fpify_const: { % if const used as var - \prop_get:NVNTF \g__nmc_subst_var_prop \l__nmc_B_tl \l__nmc_subst_tl + \prop_get:NVNTF \l__nmc_subst_var_prop \l__nmc_B_tl \l__nmc_subst_tl { \__nmc_fpify_var: } { \prop_get:NVN \g__nmc_subst_fpfn_prop \l__nmc_B_tl \l__nmc_subst_tl @@ -1262,7 +1302,7 @@ } \cs_new_protected:Npn \__nmc_fpify_comparison: { - \tl_if_in:NVTF \c__nmc_comparisons_tl \l__nmc_C_tl + \tl_if_in:noTF { <=> } \l__nmc_C_tl { \__nmc_error_what:n { Multi-token~comparison~in } } { \prop_get:NVNF \g__nmc_subst_fpfn_prop \l__nmc_B_tl \l_tmpa_tl @@ -1284,14 +1324,11 @@ { \prop_get:NVN \g__nmc_subst_fpfn_prop \l__nmc_B_tl \l_tmpa_tl \tl_put_right:NV \l__nmc_accum_tl \l_tmpa_tl -% \tl_show:N \l__nmc_A_tl \__nmc_delim_arg:Nnn \l__nmc_arg_tl { 1 } { \c__nmc_and_int } -% \tl_show:N \l__nmc_arg_tl \tl_clear:N \l_tmpa_tl \__nmc_fpify:VN \l__nmc_arg_tl \l_tmpa_tl \tl_put_right:NV \l__nmc_accum_tl \l_tmpa_tl \bool_set_false:N \l__nmc_insert_aster_bool - } \cs_new_protected:Npn \__nmc_fpify_lparen: { @@ -1299,7 +1336,7 @@ \tl_set_eq:NN \l__nmc_fact_arg_tl \l__nmc_arg_tl \tl_if_eq:VnTF \l__nmc_C_tl { ! } { \bool_set_false:N \l__nmc_insert_aster_bool } - { + { \__nmc_accum_fpify_parenth:NN \l__nmc_accum_tl \l__nmc_arg_tl \bool_set_true:N \l__nmc_insert_aster_bool } @@ -1569,13 +1606,12 @@ \fp_compare:nF { 0 < \l__nmc_arg_tl != 1 } { \__nmc_error_what:n - { Valid~base~required~for~\__nmc_verb:n { \log } in } + { Valid~base~required~for~\__nmc_verb:n { \log }~in } } } \bool_if:NF \g__nmc_error_bool { - \tl_set:Nx \l_tmpa_tl - { \fp_eval:n { 1 / ( ln ( \l__nmc_arg_tl ) ) } } + \tl_set:Nx \l_tmpa_tl { \fp_eval:n { 1/(ln(\l__nmc_arg_tl)) } } \__nmc_error_fpflag: } \bool_if:NF \g__nmc_error_bool @@ -1735,17 +1771,23 @@ \__nmc_fpify_fact_do:nNn { #1 } #2 { 1 } \tl_put_right:Nx \l__nmc_accum_tl { \fp_use:N \l__nmc_fact_fp } } -\cs_new_protected:Npn \__nmc_fpify_BE: +\cs_new_protected:Npn \__nmc_fpify_font: { - \__nmc_next: - \tl_if_in:VnT \l__nmc_B_tl { alignat } - { \__nmc_next: } + \__nmc_next: + \__nmc_accum_fpify_parenth:NN \l__nmc_accum_tl \l__nmc_B_tl + } +\cs_new_protected:Npn \__nmc_fpify_splitfrac: + { + \__nmc_next: + \tl_set_eq:NN \l_tmpb_tl \l__nmc_B_tl + \__nmc_next: + \tl_put_right:NV \l_tmpb_tl \l__nmc_B_tl + \__nmc_accum_fpify_parenth:NN \l__nmc_accum_tl \l_tmpb_tl } -% \cs { m } -\cs_new_protected:Npn \__nmc_fpify_absorbm: +% \cs { m }, \cs { o m }, \cs { * m } +\cs_new_protected:Npn \__nmc_fpify_absorb_m: { \__nmc_next: } -% \cs { o m } -\cs_new_protected:Npn \__nmc_fpify_absorbom: +\cs_new_protected:Npn \__nmc_fpify_absorb_om: { \str_if_eq:VnT \l__nmc_C_tl { [ } { @@ -1754,18 +1796,70 @@ } \__nmc_next: } -\cs_new_protected:Npn \__nmc_fpify_font: - { \__nmc_fpify_meta: } - -\cs_new_protected:Npn \__nmc_fpify_meta: +\cs_new_protected:Npn \__nmc_fpify_absorb_sm: + { + \str_if_eq:VnT \l__nmc_C_tl { * } + { \__nmc_next: } + \__nmc_next: + } +\cs_new_protected:Npn \__nmc_fpify_color: + { + \__nmc_fpify_absorb_om: + \__nmc_fpify_next_braced:N \l__nmc_accum_tl + \bool_set_true:N \l__nmc_insert_aster_bool + } +\cs_new_protected:Npn \__nmc_fpify_BE: + { + \__nmc_next: + \tl_if_in:VnT \l__nmc_B_tl { alignat } + { \__nmc_next: } + } +\cs_new_protected:Npn \__nmc_fpify_cmd: + { + \__nmc_insert_aster: + \prop_get:NoNT \g__nmc_subst_misc_prop \l__nmc_B_tl \l_tmpa_tl + { + \exp_args:NV \__nmc_cmd:n \l_tmpa_tl + \bool_set_false:N \l__nmc_insert_aster_bool + \bool_set_false:N \l__nmc_wraps_math_bool + } + } +\cs_new_protected:Npn \__nmc_cmd:n #1 + { % \cm { s O m O O } + \tl_set:Nn \l__nmc_delim_arg_tl { { #1 } } % cmd + \tl_if_eq:VnT \l__nmc_C_tl { * } + { \__nmc_next: } + \bool_set_true:N \l__nmc_num_only_bool + \__nmc_append_sqbrarg: % settings + \__nmc_next: + \tl_put_right:Nx \l__nmc_delim_arg_tl { { \exp_not:o \l__nmc_B_tl } } + \__nmc_append_sqbrarg: % vv-list + \__nmc_append_sqbrarg: % num format + \tl_put_right:Nn \l__nmc_accum_tl { ( } + \group_begin: + \int_add:Nn \l__nmc_depth_int { 2 } + \exp_last_unbraced:No \__nmc_inputs_get:nnnnn \l__nmc_delim_arg_tl + \bool_if:NF \g__nmc_error_bool + { \use:c { __nmc_#1_process: } } + \exp_args:NNNV + \group_end: + \tl_put_right:Nn \l__nmc_accum_tl \l_nmc_result_tl + \tl_put_right:Nn \l__nmc_accum_tl { ) } + } +\cs_new_protected:Npn \__nmc_append_sqbrarg: + { + \tl_if_eq:VnTF \l__nmc_C_tl { [ } + { \__nmc_append_sqbrarg_aux: } + { \tl_put_right:Nx \l__nmc_delim_arg_tl { {} } } + } +\cs_new_protected:Npn \__nmc_append_sqbrarg_aux: { \__nmc_next: - \__nmc_fpify:VN \l__nmc_B_tl \l__nmc_accum_tl + \tl_clear:N \l_tmpa_tl + \__nmc_get_arg_LR:NNN [ \l_tmpa_tl ] + \tl_put_right:Nx \l__nmc_delim_arg_tl { { \exp_not:o \l_tmpa_tl } } } -\cs_new_protected:Npn \__nmc_fpify_metamm: - { \prg_replicate:nn { 2 } { \__nmc_fpify_meta: } } -%%%%%%%%%%%%%%%%%%% -% sum/prod +% sum/prod %%%%%%%%%%%%%%%%%% \cs_new_protected:Npn \__nmc_fpify_sum: { \__nmc_insert_aster: @@ -1782,7 +1876,7 @@ \tl_set:Nn \l__nmc_sum_op_tl { * } \fp_set:Nn \l__nmc_sum_total_fp { 1 } \fp_set:Nn \l__nmc_sum_prev_fp { 2 } - \tl_set:Nn \l__nmc_sum_type_tl { product } + \tl_set:Nn \l__nmc_sum_type_tl { prod } \bool_set_false:N \l__nmc_sum_bool } \__nmc_error_where:n { \l__nmc_sum_type_tl } @@ -1792,6 +1886,7 @@ \__nmc_error_where:n { \l__nmc_sum_type_tl~\ limits } \__nmc_sum_get_limits:NNN \l__nmc_sum_var_tl \l__nmc_sum_index_int \l__nmc_sum_end_int + \seq_gpop:NN \g__nmc_error_where_seq \l__nmc_toss_tl } \bool_if:NTF \g__nmc_error_bool { \group_end: } @@ -1800,18 +1895,19 @@ \tl_if_eq:VnF \l__nmc_C_tl { ( } { \__nmc_parenth:N \l__nmc_arg_tl } \tl_set_eq:NN \l__nmc_summand_tl \l__nmc_arg_tl - % do the sum/prod; result in \l__nmc_sum_total_fp + % do the sum/prod \__nmc_error_where:n { \l__nmc_sum_type_tl } - \__nmc_sum_do:nnN { \l__nmc_sum_index_int } - { \l__nmc_sum_end_int } \l__nmc_sum_total_fp - \fp_gset_eq:NN \g_tmpa_fp \l__nmc_sum_total_fp + \__nmc_sum_do:nn { \l__nmc_sum_index_int } { \l__nmc_sum_end_int } \tl_gset_eq:NN \g_tmpa_tl \l__nmc_A_tl + \tl_gset_eq:NN \g_tmpb_tl \l__nmc_C_tl \exp_args:NNNV \group_end: - \tl_set:Nn \l__nmc_C_tl \l__nmc_C_tl - \tl_put_right:Nx \l__nmc_accum_tl { \fp_use:N \g_tmpa_fp } + \fp_set:Nn \l__nmc_sum_total_fp { \l__nmc_sum_total_fp } \tl_set_eq:NN \l__nmc_A_tl \g_tmpa_tl - \bool_set_false:N \l__nmc_insert_aster_bool + \tl_set_eq:NN \l__nmc_C_tl \g_tmpb_tl + \tl_put_right:Nx \l__nmc_accum_tl { \fp_use:N \l__nmc_sum_total_fp } + \bool_set_true:N \l__nmc_insert_aster_bool + \seq_gpop:NN \g__nmc_error_where_seq \l__nmc_toss_tl } } \cs_new_protected:Npn \__nmc_sum_get_limits:NNN #1#2#3 @@ -1822,7 +1918,7 @@ \bool_if:NF \g__nmc_error_bool { \__nmc_sum_limit_upper:N #3 } } - { + { \__nmc_sum_limit_upper:N #3 \__nmc_sum_limit_lower:NN #1#2 } @@ -1853,8 +1949,10 @@ \cs_new_protected:Npn \__nmc_sum_limit_upper:N #1 { \__nmc_next: \__nmc_next: + \__nmc_vv_get_vars_vals_lims:NN \l__nmc_B_tl \c_empty_prop - \__nmc_sum_limit_assign:NN #1 \l__nmc_vv_fp_expr_tl + \bool_if:NF \g__nmc_error_bool + { \__nmc_sum_limit_assign:NN #1 \l__nmc_vv_fp_expr_tl } } \cs_new_protected:Npn \__nmc_sum_limit_assign:NN #1#2 { @@ -1870,24 +1968,25 @@ } } } -\cs_new_protected:Npn \__nmc_sum_do:nnN #1#2#3 - { % #1,#2 lower, upper limits (int), #3 <-- total (fp) +% #1#2 lower/upper limits (int); result in \l__nmc_sum_total_fp +\cs_new_protected:Npn \__nmc_sum_do:nn #1#2 + { \int_compare:nNnTF { \c_max_int } = { \int_max:nn { \int_abs:n { #1 } } { \int_abs:n { #2 } } } { \bool_if:NTF \l__nmc_sum_bool - { \__nmc_sum_do_infinite:Nn #1 { sum } } + { \__nmc_sum_do_infinite:Nn #1 { sum } } { \__nmc_sum_do_infinite:Nn #1 { prod } } + } { \int_step_function:nnnN { #1 } { 1 } { #2 } \__nmc_sum_eval:n } \bool_if:NF \g__nmc_error_bool { - \int_compare:nTF { #1 <= #2 } - { \fp_set:Nn #3 { \l__nmc_sum_total_fp } } + \int_compare:nNnT { #2 } < { #1 } { \tl_if_eq:VnTF \l__nmc_sum_op_tl { * } - { \fp_set:Nn #3 { 1 } } - { \fp_set:Nn #3 { 0 } } + { \fp_set:Nn \l__nmc_sum_total_fp { 1 } } + { \fp_set:Nn \l__nmc_sum_total_fp { 0 } } } } } @@ -1918,14 +2017,14 @@ \__nmc_sum_query:n { \l__nmc_suma_int } } } - \tl_gset:cx { g__nmc_ \tl_range:Nnn \l__nmc_sum_type_tl{1}{4} _info_tl } + \tl_gset:cx { g__nmc_info_\tl_range:Nnn \l__nmc_sum_type_tl{1}{4} _tl } { \int_eval:n { \l__nmc_suma_int - #1 - \use:c { l__nmc_#2_query_int } } } } \cs_new_protected:Npn \__nmc_sum_eval:n #1 { \__nmc_calc_fn_val:VNnN \l__nmc_sum_var_tl \l__nmc_summand_tl - { #1 } \l_tmpb_fp + { #1 } \l_tmpb_fp \fp_set:Nn \l__nmc_sum_total_fp { \l__nmc_sum_total_fp \l__nmc_sum_op_tl \l_tmpb_fp } } @@ -1940,71 +2039,13 @@ \int_set_eq:NN \l__nmc_sumb_int \l__nmc_suma_int } } -\cs_new_protected:Npn \__nmc_fpify_cmd: - { - \__nmc_insert_aster: - \str_case:onT \l__nmc_B_tl - { - { \eval } { \__nmc_cmd:n { eval } } - { \iter } { \__nmc_cmd:n { iter } } - { \solve } { \__nmc_cmd:n { solve } } - { \recur } { \__nmc_cmd:n { recur } } - { \tabulate } { \__nmc_cmd:n { table } } - { \nmcInfo } { \nmcInfo } - { \nmcEvaluate } { \__nmc_cmd:n { eval } } - { \nmcIterate } { \__nmc_cmd:n { iter } } - { \nmcSolve } { \__nmc_cmd:n { solve } } - { \nmcRecur } { \__nmc_cmd:n { recur } } - { \nmcTabulate } { \__nmc_cmd:n { table } } - } - { - \bool_set_false:N \l__nmc_insert_aster_bool - \bool_set_false:N \l__nmc_wraps_math_bool - } - } -\cs_new_protected:Npn \__nmc_cmd:n #1 - { % \cm { s O m O O } - \tl_set:Nn \l__nmc_delim_arg_tl { { #1 } } % cmd - \tl_if_eq:VnT \l__nmc_C_tl { * } - { \__nmc_next: } - \__nmc_append_sqbrarg: % settings - \__nmc_next: - \tl_put_right:Nx \l__nmc_delim_arg_tl { { \exp_not:o \l__nmc_B_tl } } - \__nmc_append_sqbrarg: % vv-list - \__nmc_append_sqbrarg: % num format - \tl_put_right:Nn \l__nmc_accum_tl { ( } - \group_begin: - \bool_set_true:N \l__nmc_num_only_bool - \exp_last_unbraced:No \__nmc_get_inputs:nnnnn \l__nmc_delim_arg_tl - \bool_set_false:N \l__nmc_sci_num_out_bool - \bool_if:NF \g__nmc_error_bool - { \use:c { __nmc_#1_process: } } - \exp_args:NNNV - \group_end: - \tl_put_right:Nn \l__nmc_accum_tl { \l_nmc_result_tl ) } - } -\cs_new_protected:Npn \__nmc_append_sqbrarg: - { - \tl_if_eq:VnTF \l__nmc_C_tl { [ } - { \__nmc_append_sqbrarg_aux: } - { \tl_put_right:Nx \l__nmc_delim_arg_tl { {} } } - } -\cs_new_protected:Npn \__nmc_append_sqbrarg_aux: - { - \__nmc_next: - \tl_clear:N \l_tmpa_tl - \__nmc_get_arg_LR:NNN [ \l_tmpa_tl ] - \tl_put_right:Nx \l__nmc_delim_arg_tl { { \exp_not:o \l_tmpa_tl } } - } -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% \nmc_delim_arg:Nnn +% delimit math args %%%%%%%%%%%%%%%%%%% \tl_new:N \l__nmc_delim_arg_tl \tl_new:N \l__nmc_delim_argi_tl \int_new:N \l__nmc_delim_pas_int \int_new:N \l__nmc_delim_pos_int \bool_new:N \l__nmc_delim_stop_bool \bool_new:N \l__nmc_delim_lmod_bool - \prg_new_conditional:Npnn \__nmc_if_pospas_gtr:nn #1#2 { p, TF } { \bool_if:nTF @@ -2016,12 +2057,10 @@ { \prg_return_true: } { \prg_return_false: } } -%-------------------------------------------------------------------- -% #1(tlvar) receives arg (\l__nmc_delim_arg_tl) -% #2 (int) initial pos +% #1 <-- \l__nmc_delim_arg_tl; % #2 (int) initial pos % #3 (int) parsing state \cs_new_protected:Npn \__nmc_delim_arg:Nnn #1#2#3 - { + { \group_begin: \bool_set_false:N \__nmc_delim_stop_bool \bool_set_false:N \l__nmc_delim_lmod_bool @@ -2036,7 +2075,7 @@ { \prop_get:NVNTF \g__nmc_class_prop \l__nmc_C_tl \l__nmc_class_tl { \exp_last_unbraced:NV \use_ii:nn \l__nmc_class_tl } - { \__nmc_delim_var: } % unknown; treat as var + { \__nmc_delim_var: } \int_incr:N \l__nmc_delim_pos_int } \tl_gset_eq:NN \g_tmpa_tl \l__nmc_A_tl @@ -2047,7 +2086,7 @@ \tl_set_eq:NN \l__nmc_A_tl \g_tmpa_tl \tl_set_eq:NN #1 \g_tmpb_tl } -%%%%%%%%% delimit arg routines %%%%%%%% +% delimit arg routines %%%%%%%%%%%%%%%% \cs_new_protected:Npn \__nmc_delim_stop: { \tl_if_eq:VnTF \l__nmc_C_tl { \q } @@ -2230,7 +2269,7 @@ { \__nmc_delim_stop: } { \__nmc_next: - \tl_if_in:NVTF \c__nmc_modds_tl \l__nmc_C_tl + \tl_if_in:nVTF { |./ } \l__nmc_C_tl { \prop_get:NVN \g__nmc_subst_misc_prop \l__nmc_B_tl \l_tmpb_tl \__nmc_delim_lparen:VV \l__nmc_B_tl \l_tmpb_tl @@ -2283,11 +2322,15 @@ } \cs_new_protected:Npn \__nmc_delim_frac: % also \(d)binom { - \__nmc_if_pospas_gtr:nnTF { 1 } { \c__nmc_sum_int } - { \__nmc_delim_stop: } - { - \__nmc_delim_append_twobraced: - \__nmc_delim_stop_if_gtr:n { \c__nmc_sum_int } + \int_compare:nNnTF { \l__nmc_posi_int } = { 3 } + { \__nmc_delim_tfrac: } + { + \__nmc_if_pospas_gtr:nnTF { 1 } { \c__nmc_sum_int } + { \__nmc_delim_stop: } + { + \__nmc_delim_append_twobraced: + \__nmc_delim_stop_if_gtr:n { \c__nmc_sum_int } + } } } \cs_new_protected:Npn \__nmc_delim_unarybrace: @@ -2349,14 +2392,12 @@ \__nmc_delim_stop_if_gtr:n { \c__nmc_sum_int } } } -\cs_new_protected:Npn \__nmc_delim_qleave: +\cs_new_protected:Npn \__nmc_delim_cleave: { \__nmc_next: \tl_if_eq:VnTF \l__nmc_B_tl { \q } { \int_zero:N \l__nmc_delim_pos_int } % adhere { \bool_set_true:N \l__nmc_delim_stop_bool } % sever - \tl_if_eq:VnT \l__nmc_C_tl { ' } - { \__nmc_next: } } \cs_new_protected:Npn \__nmc_delim_nary: { @@ -2392,24 +2433,40 @@ } } \cs_new_protected:Npn \__nmc_delim_absorb: - { % \cs + { \__nmc_next: \int_decr:N \l__nmc_delim_pos_int } -\cs_new_protected:Npn \__nmc_delim_absorbm: - { % \cs { m } - \__nmc_next: \__nmc_next: - \int_decr:N \l__nmc_delim_pos_int +\cs_new_protected:Npn \__nmc_delim_absorb_i: + { + \__nmc_delim_absorb: + \__nmc_next: } -\cs_new_protected:Npn \__nmc_delim_absorbom: - { % \cs { o m } - \__nmc_next: +\cs_new_protected:Npn \__nmc_delim_absorb_ii: + { + \__nmc_delim_absorb_i: + \str_case:VnT \l__nmc_B_tl + { + { * } { } + { [ } { \__nmc_get_arg_LR:NNN [ \l__nmc_toss_tl ] } + } + { \__nmc_next: } + } +\cs_new_protected:Npn \__nmc_delim_color: + { + \__nmc_next: \str_if_eq:VnT \l__nmc_C_tl { [ } { - \__nmc_next: + \__nmc_next: \__nmc_get_arg_LR:NNN [ \l__nmc_toss_tl ] } - \__nmc_next: + \__nmc_delim_font: + } +\cs_new_protected:Npn \__nmc_delim_font: + { + \__nmc_next: \__nmc_next: + \tl_put_left:NV \l__nmc_A_tl \l__nmc_B_tl + \tl_set:Nx \l__nmc_C_tl { \tl_head:N \l__nmc_B_tl } \int_decr:N \l__nmc_delim_pos_int } \cs_new_protected:Npn \__nmc_delim_BE: @@ -2426,19 +2483,6 @@ \__nmc_next: } } -\cs_new_protected:Npn \__nmc_delim_font: - { - \__nmc_next: - \tl_put_left:NV \l__nmc_A_tl \l__nmc_B_tl - \int_decr:N \l__nmc_delim_pos_int - } -\cs_new_protected:Npn \__nmc_delim_metamm: - { - \__nmc_next: - \__nmc_delim_append_braced: - \__nmc_delim_append_braced: - \int_decr:N \l__nmc_delim_pos_int - } \cs_new_protected:Npn \__nmc_delim_cmd: { % \cmd { s O m O O } \__nmc_if_pospas_gtr:nnTF { 1 } { \c__nmc_sum_int } @@ -2468,138 +2512,461 @@ { #1 } \l_tmpa_tl { #2 } } } -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% save & retrieve -\tl_new:N \g__nmc_reuse_tl -\tl_new:N \g__nmc_reuse_filename_tl -\tl_new:N \l__nmc_reuse_retrieved_tl -\bool_new:N \l__nmc_reuse_retrieved_bool -\bool_new:N \g__nmc_lyx_bool -\ior_new:N \g__nmc_ior -\iow_new:N \g__nmc_iow -\tl_gset:NV \g__nmc_reuse_filename_tl \jobname -\tl_gput_right:Nn \g__nmc_reuse_filename_tl { .nmc } -% -\NewDocumentCommand \nmcReuse { s >{ \TrimSpaces } O{} } - { % save \eval result to csname #2 - \tl_if_empty:nTF { #2 } - { \__nmc_reuse_retrieve: } +%%%%%%%%% info on "infinite" processes %%%%%%%%%% +\nmc_define:NnN \nmcInfo { info } \info + +\clist_map_inline:nn { sum,prod } + { + \tl_new:c { g__nmc_info_#1_tl } + \tl_gset:cn { g__nmc_info_#1_tl } { 0 } + } +\clist_new:N \g__nmc_info_proc_clist +\clist_gset:Nn \g__nmc_info_proc_clist { sum, prod } +\cs_gset_protected:Npn \__nmc_info_initialize: + { + \seq_clear:N \l_tmpa_seq + \tl_set:Nn \l__nmc_dbg_idii_tl { process } + \clist_map_inline:Nn \g__nmc_info_proc_clist { - \tl_if_empty:NTF \g__nmc_reuse_tl + \seq_put_right:Nx \l_tmpa_seq + { ##1~{ \use:c { g__nmc_info_##1_tl } } } + } + \tl_set:Nx \l__nmc_dbg_vv_tl { \seq_use:Nn \l_tmpa_seq {,~} } + } +\cs_gset_protected:Npn \__nmc_info_process: + { \tl_set_eq:Nc \l_nmc_result_tl { g__nmc_info_\l_nmc_formula_tl _tl } + } +\cs_gset_protected:Npn \__nmc_info_display: + { + \bool_if:NTF \l__nmc_num_only_bool + { \l_nmc_result_tl } + { + \prop_if_in:NVTF \g__nmc_subst_misc_prop \l_nmc_formula_tl + { + \tl_if_empty:cT { g__nmc_info_\l_nmc_formula_tl _tl } + { \tl_set:Nn \l_nmc_result_tl { 0 } } + \tl_use:N \l_nmc_result_tl + \prop_get:NVN \g__nmc_subst_misc_prop \l_nmc_formula_tl \l_tmpb_tl + \ \l_tmpb_tl % pluralise? + \int_if_zero:nF { \l_nmc_result_tl - 1 } { s } + \seq_gpop:NN \g__nmc_error_where_seq \l__nmc_toss_tl + } + { + \__nmc_error_where:n { \__nmc_verb:n {\nmcInfo}~command } + \__nmc_error_what:n + { Unknown~process~\__nmc_verb:V \l_nmc_formula_tl\ in } + } + } + } +%%%%%%%%%%%%% user-defined macros %%%%%%%%%%%%%%% +\clist_new:N \g__nmc_macros_clist +\bool_new:N \l__nmc_macros_free_bool + +\nmc_define:NnN \nmcMacros { macros } \macros + +\cs_gset_protected:Npn \__nmc_macros_initialize: + { + \tl_set:Nn \l__nmc_dbg_idiii_tl { macros } + \tl_set:Nn \l__nmc_dbg_idv_tl { stored } + } +\cs_gset_protected:Npn \__nmc_macros_vv_digest:N #1 + { + \__nmc_error_where:n { \__nmc_verb:n { \nmcMacros }\ command } + \clist_set:No \l_tmpa_clist \l_nmc_formula_tl + \clist_clear:N \l_tmpb_clist + \clist_map_inline:Nn \l_tmpa_clist + { + \cs_if_exist:NTF ##1 + { + \clist_put_right:Nx \l_tmpb_clist + {\exp_not:N ##1 {~\exp_not:f ##1} } + } + { + \__nmc_error_what:n { Undefined~macro~\__nmc_verb:n {##1}\ in } + \clist_map_break: + } + } + \bool_if:NF \g__nmc_error_bool + { + \tl_set:No \l_nmc_formula_tl \l_tmpb_clist + \__nmc_vv_digest:N #1 + \int_if_zero:nF \l__nmc_dbg_int + { \__nmc_dbg_vv_view:n { 0 } } + \clist_set:No \l_tmpb_clist \l_nmc_formula_tl + } + } +\cs_gset_protected:Npn \__nmc_macros_process: + { + \bool_if:NTF \l__nmc_macros_free_bool + { \__nmc_macros_deregister:N \l_tmpa_clist } + { \__nmc_macros_register:N \l_tmpb_clist } + \clist_gremove_duplicates:N \g__nmc_macros_clist + \bool_if:NT \l__nmc_num_only_bool + { + \tl_set:Nx \l_nmc_result_tl + { \int_eval:n { \clist_count:N \g__nmc_macros_clist } } + } + } +\cs_gset:Npn \__nmc_macros_display: + { \bool_if:NT \l__nmc_num_only_bool { \l_nmc_result_tl } } +%%%%%%%%%% +\cs_gset_protected:Npn \__nmc_macros_deregister:N #1 + { + \clist_if_empty:NT #1 + { + \clist_set_eq:NN #1 \g__nmc_macros_clist + \tl_set:No \l_nmc_formula_tl \g__nmc_macros_clist + } + \clist_map_inline:Nn #1 + { + \cs_if_exist:NT ##1 { - \__nmc_error_where:n { \__nmc_verb:n { \nmcReuse }~command } - \__nmc_error_what:n { No~value~to~save~with } + \clist_gremove_all:Nn \g__nmc_macros_clist { ##1 } + \prop_gremove:NV \g__nmc_subst_var_prop { ##1 } } - { \__nmc_reuse_result:c { #2 } } } - \IfBooleanT #1 { \__nmc_debug_display:nn { 99991 } { reuse } } + \__nmc_macros_reg_dbg_aux:Nn \c_true_bool { freed } + } +\cs_gset_protected:Npn \__nmc_macros_register:N #1 + { + \__nmc_error_where:n { \__nmc_verb:n { \nmcMacros } } + \clist_reverse:N #1 + \clist_map_inline:Nn #1 + { + \__nmc_macros_reg_split:w ##1\q_stop + \bool_if:NT \g__nmc_error_bool + { \clist_map_break: } + } + \bool_if:NF \g__nmc_error_bool + { \__nmc_macros_reg_props: } + } +\cs_new_protected:Npn \__nmc_macros_reg_split:w #1#2\q_stop + { + \tl_clear:N \l__nmc_vv_fp_expr_tl + \__nmc_fpify:nN { #2 } \l__nmc_vv_fp_expr_tl + \bool_if:NF \g__nmc_error_bool + { + \prop_put:Nnx \l__nmc_subst_var_prop { #1 } + { \fp_eval:n \l__nmc_vv_fp_expr_tl } + \__nmc_error_fpflag: + } } -\ProvideDocumentCommand\reuse {} { \nmcReuse } -\cs_new_protected:Npn \__nmc_reuse_retrieve: +\cs_new_protected:Npn \__nmc_macros_reg_props: { - \file_get:VnNT \g__nmc_reuse_filename_tl {} \l__nmc_reuse_retrieved_tl + \clist_gconcat:NNN \g__nmc_macros_clist \l_tmpa_clist \g__nmc_macros_clist + \clist_remove_duplicates:N \g__nmc_macros_clist + \clist_map_inline:Nn \l_tmpa_clist { - \bool_lazy_or:nnF - { \tl_if_blank_p:V \l__nmc_reuse_retrieved_tl } - { \tl_if_head_eq_meaning_p:VN \l__nmc_reuse_retrieved_tl \par } + \prop_get:NnN \l__nmc_subst_var_prop { ##1 } \l_tmpa_tl + \prop_gput:Nno \g__nmc_subst_var_prop { ##1 } \l_tmpa_tl + } + \seq_gpop:NN \g__nmc_error_where_seq \l__nmc_toss_tl + \int_if_zero:nF { \l__nmc_dbg_int } + { \__nmc_macros_reg_dbg: } + } +\cs_new_protected:Npn \__nmc_macros_reg_dbg: + { + \tl_if_empty:NTF \l_nmc_formula_tl + { + \__nmc_macros_reg_dbg_aux:Nn \c_true_bool { macros } + \clist_clear:N \l_tmpb_clist + \clist_map_inline:Nn \g__nmc_macros_clist { - \seq_set_split:NnV \l_tmpa_seq {,} \l__nmc_reuse_retrieved_tl - \seq_map_inline:Nn \l_tmpa_seq - { \__nmc_reuse_defcmds:Nnn ##1 { _props } } + \clist_put_right:Nx \l_tmpb_clist + { \exp_not:N ##1 {~\exp_not:f ##1} } } + \tl_set:No \l_nmc_formula_tl \l_tmpb_clist + } + { \__nmc_macros_reg_dbg_aux:Nn \l__nmc_macros_free_bool { added } } + } +\cs_new_protected:Npn \__nmc_macros_reg_dbg_aux:Nn #1#2 + { + \tl_set:Nn \l__nmc_dbg_idiii_tl { #2 } + \bool_if:NT #1 + { + \int_if_zero:nF { \l__nmc_dbg_int } + { \int_set:Nn \l__nmc_dbg_int { 3*5 } } + } + \seq_set_from_clist:NN \l__nmc_dbg_stored_seq \g__nmc_macros_clist + } +%%%%%%%%%%%% user-defined constants %%%%%%%%%%%%% +\seq_new:N \g__nmc_consts_seq % all +\seq_new:N \g__nmc_consts_vv_seq % multitok in vv-list +\int_new:N \g__nmc_consts_vv_int % count multitok + 1 +\bool_new:N \l__nmc_consts_add_bool +\nmc_define:NnN \nmcConstants { consts } \constants + +\cs_gset_protected:Npn \__nmc_consts_initialize: + { + \__nmc_error_where:n { \__nmc_verb:n { \nmcConstants } } + \tl_set:Nn \l__nmc_dbg_idiii_tl { added } + \tl_set:Nn \l__nmc_dbg_idv_tl { constants } + } +\cs_gset_protected:Npn \__nmc_consts_vv_digest:N #1 + { % #1=*reversed* vv-list + \bool_if:nT { !\l__nmc_consts_add_bool && + !\tl_if_empty_p:N \l_nmc_formula_tl } + { \__nmc_consts_clear: } + \clist_set:NV \l_tmpa_clist \l_nmc_formula_tl + \clist_reverse:N \l_tmpa_clist + \clist_concat:NNN \l_tmpb_clist #1 \l_tmpa_clist + \__nmc_vv_digest:N \l_tmpb_clist + \clist_set:No \l_nmc_formula_tl \l_nmc_formula_tl + \clist_reverse:N \l_nmc_formula_tl + \int_if_zero:nF \l__nmc_dbg_int + { \__nmc_dbg_vv_view:n { \clist_count:N \l_tmpa_clist } } + } +\cs_gset_protected:Npn \__nmc_consts_clear: + { + \seq_gclear:N \g__nmc_consts_vv_seq + \seq_map_inline:Nn \g__nmc_consts_seq + { + \__nmc_split_eq:w ##1\q_stop + \prop_gremove:NV \g__nmc_subst_var_prop \l__nmc_eq_var_tl + } + \seq_gclear:N \g__nmc_consts_seq + } +\cs_gset_protected:Npn \__nmc_consts_process: + { + \tl_if_empty:NF \l_nmc_formula_tl + { + \seq_set_from_clist:NN \l_tmpa_seq \l_nmc_formula_tl + \seq_map_inline:Nn \l_tmpa_seq + { + \__nmc_split_eq:w ##1\q_stop + \prop_get:NVN \l__nmc_subst_var_prop \l__nmc_eq_var_tl \l_tmpb_tl + \clist_pop:NN \l_tmpa_clist \l_tmpa_tl + \exp_last_unbraced:No\__nmc_split_eq:w \l_tmpa_tl\q_stop + \int_compare:nNnTF { \tl_count:N \l__nmc_eq_var_tl } = { 1 } + { + \prop_gput:NVV \g__nmc_subst_var_prop + \l__nmc_eq_var_tl \l_tmpb_tl + \tl_put_right:Nn \l__nmc_eq_var_tl { = } + \tl_put_right:NV \l__nmc_eq_var_tl \l_tmpb_tl + } + { + \tl_put_right:Nn \l__nmc_eq_var_tl { = } + \tl_set:Nx \l_tmpa_tl + { \exp_not:o\l__nmc_eq_var_tl { \fp_eval:n \l_tmpb_tl } } + \tl_put_right:NV \l__nmc_eq_var_tl \l_tmpb_tl + \seq_gput_right:NV \g__nmc_consts_vv_seq \l_tmpa_tl + } + \seq_gput_right:NV \g__nmc_consts_seq \l__nmc_eq_var_tl + } + \int_gset:Nn \g__nmc_consts_vv_int + { 1 + \seq_count:N \g__nmc_consts_vv_seq } + } + \bool_if:nT + { + (\tl_if_empty_p:N \l_nmc_formula_tl) && + (\int_compare_p:nNn { \l__nmc_dbg_int } = { 30 }) + } + { \int_set:Nn \l__nmc_dbg_int { 5 } } + \seq_set_eq:NN \l__nmc_dbg_stored_seq \g__nmc_consts_seq + \bool_if:NT \l__nmc_num_only_bool + { + \tl_set:Nx \l_nmc_result_tl + { \int_eval:n { \seq_count:N \g__nmc_consts_seq } } } - \bool_set_true:N \l__nmc_reuse_retrieved_bool - } -\cs_new_protected:Npn \__nmc_reuse_result:N #1 - { - \tl_set:Nn \l_tmpb_tl { #1 } - \tl_put_right:Nx \l_tmpb_tl { { \tl_to_str:N \g__nmc_reuse_tl } } - \bool_if:NF \l__nmc_reuse_retrieved_bool - { \__nmc_reuse_retrieve: } - \clist_put_right:NV \l__nmc_reuse_retrieved_tl \l_tmpb_tl - \exp_last_unbraced:NV\__nmc_reuse_defcmds:Nnn \l_tmpb_tl {} - \tl_gclear:N \g__nmc_reuse_tl } -\cs_generate_variant:Nn \__nmc_reuse_result:N { c } +\cs_gset_protected:Npn \__nmc_consts_display: + { \bool_if:NT \l__nmc_num_only_bool { \l_nmc_result_tl } } + +%%%%%%% save/retrieve results to/from file %%%%%% +\tl_new:N \g__nmc_reuse_tl +\tl_new:N \l__nmc_reuse_loaded_tl +\bool_new:N \l__nmc_reuse_loaded_bool +\int_new:N \l__nmc_reuse_mode_int +\ior_new:N \g__nmc_ior +\iow_new:N \g__nmc_iow +\tl_gset:Nn \g__nmc_reuse_filename_tl { .nmc } +\tl_gput_left:NV \g__nmc_reuse_filename_tl \jobname +% save last \eval-uation to \#1 +\nmc_define:NnN \nmcReuse { reuse } \reuse -\cs_new_protected:Npn \__nmc_reuse_defcmds:Nnn #1#2#3 +\cs_gset_protected:Npn \__nmc_reuse_settings_digest: { - \prop_get:NnNTF \g__nmc_subst_var_prop { #1 } \l__nmc_toss_tl - { \RenewDocumentCommand #1{}{#2} } - { \NewDocumentCommand #1{}{#2} } - \tl_set_rescan:Nnn #1 { \ExplSyntaxOn } { #2 } - \use:c { __nmc_reuse_write#3:Nn } #1{#2} + \tl_set:Nn \l__nmc_dbg_idii_tl { saved } + \__nmc_reuse_load: } -\cs_new_protected:Npn \__nmc_reuse_write:Nn #1#2 +\cs_gset_protected:Npn \__nmc_reuse_process: { - \__nmc_reuse_write_props:Nn #1{#2} - \file_get:VnNTF \g__nmc_reuse_filename_tl {} \l_tmpa_tl + \__nmc_error_where:n { \__nmc_verb:n { \nmcReuse }~command } + \tl_if_empty:NTF \l_nmc_formula_tl + { + \int_if_zero:nTF { 1 + \l__nmc_reuse_mode_int } + { \__nmc_reuse_delete_all: } + { \__nmc_reuse_load: } + } + { \__nmc_reuse_mode:Nn \l_nmc_formula_tl { \l__nmc_reuse_mode_int } } + \bool_if:NT \l__nmc_num_only_bool { - \tl_if_head_eq_meaning:VNTF \l_tmpa_tl \par - { \tl_clear:N \l_tmpa_tl } - { - \__nmc_reuse_delete:NN #1 \l_tmpa_tl - \tl_if_blank:VF \l_tmpa_tl + \tl_set:Nx \l_nmc_result_tl + { \int_eval:n { \clist_count:N \l__nmc_reuse_loaded_tl } } + } + \__nmc_reuse_dbg_display:Nn \l_nmc_formula_tl { \l__nmc_dbg_int } + } +\cs_gset_protected:Npn \__nmc_reuse_display: + { \bool_if:NT \l__nmc_num_only_bool { \l_nmc_result_tl } } +%%%%%%%%%% +\cs_new_protected:Npn \__nmc_reuse_load: + { + \bool_if:NF \l__nmc_reuse_loaded_bool + { + \file_get:VnNT \g__nmc_reuse_filename_tl {} \l_tmpa_tl + { + \clist_set:No \l__nmc_reuse_loaded_tl \l_tmpa_tl + \bool_lazy_or:nnTF + { \tl_if_blank_p:V \l__nmc_reuse_loaded_tl } + { \tl_if_head_eq_meaning_p:VN \l__nmc_reuse_loaded_tl \par } + { \tl_clear:N \l__nmc_reuse_loaded_tl } { - \tl_trim_spaces:N \l_tmpa_tl - \tl_put_right:Nn \l_tmpa_tl {,} - } + \seq_set_split:NnV \l_tmpa_seq {,} \l__nmc_reuse_loaded_tl + \seq_map_inline:Nn \l_tmpa_seq + { \__nmc_reuse_write_props:Nn ##1 } + } } + \bool_set_true:N \l__nmc_reuse_loaded_bool + } + } +\cs_new_protected:Npn \__nmc_reuse_mode:Nn #1#2 + { + \int_if_zero:nTF { 1 + #2 } % if #2=-1 + { \__nmc_reuse_delete_one:c #1 } + { + \tl_if_empty:NTF \g__nmc_reuse_tl + { \__nmc_error_what:n { No~result~available~for~\__nmc_verb:V #1\ in } } + { + \exp_args:NNc \tl_set:Nn \l_tmpa_tl #1 + \prop_if_in:NVTF \g__nmc_subst_var_prop \l_tmpa_tl + { + \int_if_zero:nTF { #2 } + { \__nmc_reuse_already_def:N \l_nmc_formula_tl } + { + \__nmc_reuse_delete_one:c #1 + \__nmc_reuse_save:c #1 + } + } + { \__nmc_reuse_save:c #1 } + } } - { \tl_clear:N \l_tmpa_tl } - \tl_put_right:Nn \l_tmpa_tl { #1 {#2} } + } +\cs_new_protected:Npn \__nmc_reuse_dbg_display:Nn #1#2 + { + \bool_if:nTF + { + !\int_if_zero_p:n { #2 } && + ( \int_if_zero_p:n { 1 + \l__nmc_reuse_mode_int } + || \tl_if_empty_p:N #1 ) + } + { + \tl_set:Nx \l__nmc_dbg_vv_tl + { \clist_use:Nn \l__nmc_reuse_loaded_tl {,~} } + } + { \clist_pop:NN \l__nmc_reuse_loaded_tl \l__nmc_dbg_vv_tl } + } +\cs_new_protected:Npn \__nmc_reuse_save:N #1 + { + \__nmc_reuse_load: + \tl_set:Nn \l_tmpb_tl { #1 } + \tl_put_right:Nx \l_tmpb_tl { { \exp_not:o \g__nmc_reuse_tl } } + \prop_get:NnNTF \l__nmc_subst_var_prop { #1 } \l_tmpa_tl + { \exp_last_unbraced:NV\__nmc_reuse_defcmds:Nn \l_tmpb_tl } + { + \cs_if_exist:NTF #1 + { \__nmc_reuse_already_def:N \l_nmc_formula_tl } + { \exp_last_unbraced:NV\__nmc_reuse_defcmds:Nn \l_tmpb_tl } + } + } +\cs_generate_variant:Nn \__nmc_reuse_save:N { c } + +\cs_new_protected:Npn \__nmc_reuse_defcmds:Nn #1#2 + { + \tl_set_rescan:Nnn #1 { \ExplSyntaxOn } { #2 } + \__nmc_reuse_write_props:Nn #1{#2} + \tl_if_empty:NF \l__nmc_reuse_loaded_tl + { \__nmc_reuse_delete:N #1 } + \clist_put_left:Nn \l__nmc_reuse_loaded_tl { #1 {#2} } \iow_open:NV \g__nmc_iow \g__nmc_reuse_filename_tl - \iow_now:NV \g__nmc_iow \l_tmpa_tl + \str_set:NV \l_tmpa_str \l__nmc_reuse_loaded_tl + \iow_now:NV \g__nmc_iow \l_tmpa_str \iow_close:N \g__nmc_iow } -\cs_new_protected:Npn \__nmc_reuse_delete:NN #1#2 +\cs_new_protected:Npn \__nmc_reuse_write_props:Nn #1#2 + { + \prop_gput:Nnn \g__nmc_subst_var_prop { #1 } { #2 } + \tl_gset:Nn #1 { #2 } + } +\cs_new_protected:Npn \__nmc_reuse_delete:N #1 { \seq_clear:N \l_tmpb_seq - \seq_set_split:NnV \l_tmpa_seq {,} #2 + \seq_set_split:NnV \l_tmpa_seq {,} \l__nmc_reuse_loaded_tl \seq_map_inline:Nn \l_tmpa_seq - { - \tl_if_head_eq_meaning:nNF { ##1 } #1 + { + \exp_args:No\str_if_eq:nnF { \use_i:nn ##1 } { #1 } { \seq_put_right:Nn \l_tmpb_seq { ##1 } } } - \tl_set:Nx #2 { \seq_use:Nn \l_tmpb_seq {,} } + \tl_set:Nx \l__nmc_reuse_loaded_tl { \seq_use:Nn \l_tmpb_seq {,} } } -\cs_new_protected:Npn \__nmc_reuse_write_props:Nn #1#2 +\cs_new_protected:Npn \__nmc_reuse_delete:Nn #1#2 + { + \prop_gremove:Nn \g__nmc_subst_var_prop { #1 } + \cs_undefine:N #1 + } +\cs_new_protected:Npn \__nmc_reuse_delete_one:N #1 { - \prop_put_if_new:Nnn \g__nmc_class_prop { #1 } - { \__nmc_fpify_var: \__nmc_delim_var: } - \prop_put:Nnn \g__nmc_subst_var_prop { #1 } { #2 } + \__nmc_reuse_load: + \tl_if_empty:NF \l__nmc_reuse_loaded_tl + { \__nmc_reuse_delete:N #1 } + \__nmc_reuse_delete:Nn #1 {} + \iow_open:NV \g__nmc_iow \g__nmc_reuse_filename_tl + \iow_now:NV \g__nmc_iow \l__nmc_reuse_loaded_tl + \iow_close:N \g__nmc_iow } +\cs_generate_variant:Nn \__nmc_reuse_delete_one:N { c } -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% settings +\cs_new_protected:Npn \__nmc_reuse_delete_all: + { + \__nmc_reuse_load: + \tl_if_empty:NF \l__nmc_reuse_loaded_tl + { + \seq_set_split:NnV \l_tmpa_seq {,} \l__nmc_reuse_loaded_tl + \seq_map_inline:Nn \l_tmpa_seq { \__nmc_reuse_delete:Nn ##1 } + \tl_clear:N \l__nmc_reuse_loaded_tl + } + \iow_open:NV \g__nmc_iow \g__nmc_reuse_filename_tl + \iow_close:N \g__nmc_iow + } +\cs_new_protected:Npn \__nmc_reuse_already_def:N #1 + { \__nmc_error_what:n { \__nmc_verb:c #1\ already~defined~in } } +%%%%%%%%%%%%%%%%%%% settings %%%%%%%%%%%%%%%%%%%% \bool_new:N \l__nmc_multitok_bool \bool_new:N \l__nmc_vv_multline_bool \bool_new:N \l__nmc_deg_bool -\tl_new:N \l__nmc_eq_num_tl +\tl_new:N \l__nmc_eqn_num_tl \int_new:N \l__nmc_posi_int +\int_set:Nn \l__nmc_posi_int { 1 } \int_new:N \l__nmc_eval_reuse_int -\int_new:N \l__nmc_debug_int -\tl_new:N \l__nmc_reuse_sep_tl % numerica-plus -\int_set_eq:NN \l__nmc_posi_int \c_one_int - +\int_new:N \l__nmc_dbg_int +\cs_new_protected:Npn \__nmc_dbg_int:nn #1#2 + { + \int_set:Nn \l__nmc_dbg_int + { + \int_compare:nNnTF { \int_abs:n { #1 } } = { 1 } + { \int_sign:n { #1 }*#2 } { #1 } + } + } \cs_new_protected:Npn \__nmc_set_trig_parsing:n #1 { % #1=1,2,3 - \int_set:Nn\l__nmc_posi_int { #1 } + \int_set:Nn \l__nmc_posi_int { #1 } \int_compare:nNnTF { #1 } > { 1 } - { % #1=2,3 - \int_set_eq:NN \l__nmc_trg_int \c__nmc_trg_int - \int_compare:nNnT { #1 } > { 2 } - { % #1=3 - \__nmc_fill_class:nn { \frac, \dfrac } - { \__nmc_fpify_frac: \__nmc_delim_tfrac: } - } - } + { \int_set_eq:NN \l__nmc_trg_int \c__nmc_trg_int } % #1=2,3 { \int_set_eq:NN \l__nmc_trg_int \c__nmc_uny_int } % #1=1 } -\cs_new:Npn \__nmc_deg: - { \bool_if:NT { \l__nmc_deg_bool } { d } } \cs_new:Npn \__nmc_int_to_bool:Nn #1#2 { \bool_set:Nn #1 { !\int_if_zero_p:n { #2 } } } +\cs_new:Npn \__nmc_deg: + { \bool_if:NT { \l__nmc_deg_bool } { d } } \keys_define:nn { numerica } { rounding .int_set:N = \l__nmc_round_int, @@ -2609,10 +2976,12 @@ \l__nmc_sci_num_out_bool { #1 }, output-exponent-char .tl_set:N = \l__nmc_sci_num_out_tl, input-sci-notation .code:n = \__nmc_int_to_bool:Nn - \l__nmc_sci_num_in_bool { #1 }, + \l__nmc_sci_num_in_bool { #1 }, input-exponent-char .tl_set:N = \l__nmc_sci_num_in_tl, multitoken-variables .code:n = \__nmc_int_to_bool:Nn \l__nmc_multitok_bool { #1 }, + use-degrees .code:n = \__nmc_int_to_bool:Nn + \l__nmc_deg_bool { #1 }, logarithm-base .tl_set:N = \l__nmc_log_base_tl, intify-rounding .tl_set:N = \l__nmc_intify_round_tl, vv-display .tl_set:N = \l__nmc_vv_display_tl, @@ -2630,6 +2999,7 @@ input-sci-notation .default:n = 0, input-exponent-char .default:n = e, multitoken-variables .default:n = 1, + use-degrees .default:n = 0, logarithm-base .default:n = 10, intify-rounding .default:n = 14, vv-display .default:n = {,}\mskip 36mu minus 24mu(vv), @@ -2643,50 +3013,64 @@ \keys_set_known:nn { numerica } { rounding,pad,output-sci-notation,output-exponent-char, - input-sci-notation,input-exponent-char, + input-sci-notation,input-exponent-char,use-degrees, multitoken-variables,logarithm-base,intify-rounding, vv-display,vv-inline,sum-extra-rounding,sum-query-terms, prod-extra-rounding,prod-query-terms,eval-reuse } \keys_define:nn { numerica/generic } { - dbg .code:n = \int_set:Nn \l__nmc_debug_int - { \int_compare:nNnTF { \int_abs:n { #1 } } = { 1 } - { \int_sign:n { #1 }*2*3*5*7 } { #1 } }, + dbg .code:n = \__nmc_dbg_int:nn { #1 } { 2*3*5*7 }, + dbg .initial:n = 0, + view .code:n = \__nmc_dbg_int:nn { 1 } { 2*3*5*7 }, ^ .code:n = \bool_set_true:N \l__nmc_sci_num_in_bool \tl_set:Nn \l__nmc_sci_num_in_tl { #1 }, xx .code:n = \__nmc_int_to_bool:Nn \l__nmc_multitok_bool { #1 }, () .code:n = \__nmc_set_trig_parsing:n { 2+\int_sign:n { #1-1 } }, () .initial:n = 0, - o .code:n = \bool_set_true:N \l__nmc_deg_bool, + o .code:n = \__nmc_int_to_bool:Nn \l__nmc_deg_bool { #1 }, + o .default:n = 1, log .tl_set:N = \l__nmc_log_base_tl, vvmode .code:n = \__nmc_calc_mode:n { \int_sign:n { #1*#1 } }, + vv@ .code:n = \__nmc_calc_mode:n { \int_sign:n { #1*#1 } }, + vv@ .initial:n = 0, vvd .code:n = \tl_set:Nn \l__nmc_vv_display_tl { #1 } \tl_if_in:NnT \l__nmc_vv_display_tl { \\ } { \bool_set_true:N \l__nmc_vv_multline_bool }, vvi .tl_set:N = \l__nmc_vv_inline_tl, - * .code:n = \tl_set:Nn \l__nmc_eq_num_tl { * }, - p .tl_set:N = \l__nmc_punc_tl, - p .default:n = {,}, + * .code:n = \tl_set:Nn \l__nmc_eqn_num_tl { * }, S+ .int_set:N = \l__nmc_sum_extra_int, S? .int_set:N = \l__nmc_sum_query_int, P+ .int_set:N = \l__nmc_prod_extra_int, P? .int_set:N = \l__nmc_prod_query_int, } \keys_define:nn { numerica/eval } - { reuse .int_set:N = \l__nmc_eval_reuse_int } -\keys_define:nn { numerica/package } { - plus .code:n = \file_input:n { numerica-plus.def }, - tables .code:n = \file_input:n { numerica-tables.def }, - % calculus .code:n = \file_input:n { numerica-calculus.def }, - lyx .code:n = \file_input:n { numerica-lyx.def } + p .tl_set:N = \l__nmc_punc_tl, + p .default:n = {,}, + reuse .int_set:N = \l__nmc_eval_reuse_int + } +\keys_define:nn { numerica/info } + { view .code:n = \__nmc_dbg_int:nn { 1 } { 2 } } +\keys_define:nn { numerica/macros } + { + view .code:n = \__nmc_dbg_int:nn { 1 } { 2*3*5 }, + free .code:n = \bool_set_true:N \l__nmc_macros_free_bool + } +\keys_define:nn { numerica/consts } + { + view .code:n = \__nmc_dbg_int:nn { 1 } { 2*3*5 }, + add .code:n = \bool_set_true:N \l__nmc_consts_add_bool + } +\keys_define:nn { numerica/reuse } + { + view .code:n = \__nmc_dbg_int:nn { 1 } { 2 }, + delete .code:n = \int_set:Nn \l__nmc_reuse_mode_int { -1 }, + renew .code:n = \int_set:Nn \l__nmc_reuse_mode_int { 1 } } -\ProcessKeysPackageOptions { numerica/package } - \file_if_exist:nT { numerica.cfg } { \file_get:nnN { numerica.cfg } {} \l_tmpa_tl \exp_args:NnV \keys_set_known:nn { numerica } \l_tmpa_tl } -% end of `numerica.sty' \ No newline at end of file +% end of file `numerica.sty' \ No newline at end of file -- cgit v1.2.3