% This is file `numerica-tables.sty'. % % 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.sty} {2023/08/25} {3.1.0} {Create mathematical tables of function values} \msg_new:nnn {numerica-tables} {version} { Package~too~old!~This~version~of~numerica-tables~requires~ numerica~version~3.0~(or~later). } \msg_new:nnn {numerica-tables} {load-order} { Please~load~version~3.0~(or~later)~of~the~numerica~ package~before~numerica~tables. } \cs_if_exist:NTF \c_nmc_version_tl { \int_compare:nNnT { \c_nmc_version_tl } < { 30 } { \msg_fatal:nn {numerica-tables} {version} } } { \msg_fatal:nn {numerica-tables} {load-order} } %---------------------------------------------------------- \cs_generate_variant:Nn \tl_if_head_eq_charcode:nNTF { V } \cs_generate_variant:Nn \tl_if_head_eq_charcode:nNT { V } \cs_generate_variant:Nn \seq_set_from_clist:Nn { No } \cs_generate_variant:Nn \int_compare:nNnTF { v } \cs_generate_variant:Nn \int_compare:nNnT { v } \cs_generate_variant:Nn \int_case:nnTF { v } \cs_generate_variant:Nn \clist_pop:NN { cc } \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_signs:n { #1 } } } { ( #2 )\,{ #1 } } } \cs_new:Npn \__nmc_sci_num_table_signs: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 } { + } } } \exp_not:o { #1 } } \cs_generate_variant:Nn \__nmc_sci_num_table_signs:n { x } \cs_new:Npn \__nmc_table_rc:N #1 { \str_if_eq:nVTF { #1 } \c__nmc_r_tl { row } { column } } \cs_new_protected:Npn \__nmc_table_rvround_pre: { \fp_set_eq:NN \l__nmc_table_r_fp \l__nmc_table_rstart_fp \prop_put:NVx \l__nmc_subst_var_prop \l__nmc_table_rvar_tl { \fp_use:N \l__nmc_table_r_fp } \__nmc_table_reset_rounding: } \cs_new_protected:Npn \__nmc_table_rvround_post: { \fp_add:Nn \l__nmc_table_r_fp { \l__nmc_table_rstep_fp } \prop_put:NVx \l__nmc_subst_var_prop \l__nmc_table_rvar_tl { \fp_use:N \l__nmc_table_r_fp } \__nmc_table_reset_rounding: } \cs_new_protected:Npn \__nmc_table_cvround_pre: { \fp_set_eq:NN \l__nmc_table_c_fp \l__nmc_table_cstart_fp \prop_put:NVx \l__nmc_subst_var_prop \l__nmc_table_cvar_tl { \fp_use:N \l__nmc_table_c_fp } \__nmc_table_reset_rounding: } \cs_new_protected:Npn \__nmc_table_cvround_post: { \fp_add:Nn \l__nmc_table_c_fp { \l__nmc_table_cstep_fp } \prop_put:NVx \l__nmc_subst_var_prop \l__nmc_table_cvar_tl { \fp_use:N \l__nmc_table_c_fp } \__nmc_table_reset_rounding: } \cs_new_protected:Npn \__nmc_table_reset_rounding: { \tl_clear:N \l__nmca_tl \__nmc_fpify:VN \l__nmc_round_xpr_tl \l__nmca_tl \int_set:Nn \l__nmc_round_int { \fp_to_int:n \l__nmca_tl } } %-------------------------------------- \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_multifn_bool \bool_new:N \l__nmc_table_round_bool \seq_new:N \l__nmc_table_multifn_seq \tl_new:N \l__nmc_table_valign_tl \tl_new:N \l__nmc_table_rvar_tl \tl_new:N \l__nmc_table_rvari_tl \tl_new:N \l__nmc_table_rstop_tl \tl_new:N \l__nmc_table_rstep_tl \tl_new:N \l__nmc_table_rspec_tl \tl_new:N \l__nmc_table_rvfn_tl \bool_new:N \l__nmc_table_rvfn_bool \fp_new:N \l__nmc_table_rstart_fp \fp_new:N \l__nmc_table_rstop_fp \tl_new:N \l__nmc_table_cspec_tl \fp_new:N \l__nmc_table_rstep_fp \fp_new:N \l__nmc_table_r_fp \fp_new:N \l__nmc_table_c_fp \fp_new:N \l__nmc_table_fn_val_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 \seq_new:N \l__nmc_table_rdata_seq \bool_new:N \l__nmc_table_rdata_bool \tl_new:N \l__nmc_table_cvar_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_recur_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_chfrac_int \int_new:N \l__nmc_table_chround_int \int_new:N \l__nmc_table_chstyle_int \int_const:Nn \c__nmc_table_chstyle_int { 5 } \tl_new:N \l__nmc_table_chnudge_tl \tl_new:N \l__nmc_table_ctitle_tl \int_new:N \l__nmc_table_ctitle_int \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_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_gset_protected:Npn \__nmc_table_initialize: { \bool_set_false:N \l__nmc_allow_TF_out_bool \int_set:Nn \l__nmc_table_rnum_int { -1 } \int_set:Nn \l__nmc_table_cnum_int { -1 } \bool_if:NT \l__nmc_num_only_bool { \tl_set:Nn \l__nmc_table_Q_tl { @=MAX } } } \cs_gset_protected:Npn \__nmc_table_settings: { \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 } } \seq_if_empty:NTF \l__nmc_table_rdata_seq { \clist_if_empty:NF \l__nmc_table_rspec_clist { \__nmc_table_settings_spec:N r } } { \bool_set_true:N \l__nmc_table_rdata_bool \int_set:Nn \l__nmc_table_rnum_int { \seq_count:N \l__nmc_table_rdata_seq } \int_if_zero:nF { \l__nmc_table_rverb_int } { \int_set_eq:NN \l__nmc_table_rround_int \c_max_int } \__nmc_table_rdata_fpstart: } \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:NTF \l__nmc_table_rheadi_tl { \tl_if_empty:NT \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_rvari_tl \l__nmc_table_rvar_tl } } { \tl_if_empty:NT \l__nmc_table_rvari_tl { \tl_set_eq:NN \l__nmc_table_rvari_tl \l__nmc_table_rvar_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 { Missing~ } } { \tl_set:Nn \l__nmc_table_query_tl { No~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_eq:NN \l__nmc_table_chstyle_int \c__nmc_table_chstyle_int } \tl_if_empty:NF \l__nmc_table_footer_tl { \tl_if_eq:VnT \l__nmc_table_footer_tl { * } { \bool_set_true:N \l__nmc_table_foot_bool } } \int_compare:nNnF \l__nmc_dbg_int = { 11 } { \int_zero:N \l__nmc_dbg_int } % \int_if_zero:nF { \l__nmc_table_rfrac_int + \l__nmc_table_chfrac_int } \int_if_zero:nF { \l__nmc_table_rfrac_int } { \int_compare:nNnT { \l__nmc_table_chstyle_int } > { 2 } { \int_zero:N \l__nmc_table_chstyle_int } } } \cs_new_protected:Npn \l__nmc_table_settings_ctitle: { \int_incr:N \l__nmc_table_ctitle_int % 1 \tl_if_eq:VnTF \l__nmc_table_ctitle_tl { * } { \int_incr:N \l__nmc_table_ctitle_int } % 2 { \tl_if_eq:VnT \l__nmc_table_ctitle_tl { ** } { \int_set:Nn \l__nmc_table_ctitle_int { 3 } } % 3 } } \cs_new_protected:Npn \__nmc_table_settings_rules: { \clist_map_inline:nn { {T}{*2},{t}{*3},{m}{*5},{s}{*5},{h}{*7},{f}{*11},{B}{*13} } { \tl_replace_once:Nnn \l__nmc_table_rules_tl ##1 } \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_settings_spec:N #1 { \bool_set_true:c { l__nmc_table_ #1 spec_bool } \clist_pop:cc { l__nmc_table_ #1 spec_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_tmpb_tl \__nmc_table_set_rcnum:Vn \l_tmpb_tl { #1 } } \cs_new:Npn \__nmc_table_total_cols: { \int_eval:n { \int_sign:n { \l__nmc_table_rpos_int } + \l__nmc_table_cnum_int + \int_div_truncate:nn { \l__nmc_table_rpos_int } { 3 } } } \cs_gset_protected:Npn \__nmc_table_vv_digest:N #1 { \bool_if:NTF \l__nmc_multitok_bool { \tl_if_empty:NF \l__nmc_table_cvar_tl { \clist_push:NV \l__nmc_formula_tl \l__nmc_table_cvar_tl } \tl_if_empty:NF \l__nmc_table_rvar_tl { \clist_push:NV \l__nmc_formula_tl \l__nmc_table_rvar_tl } \__nmc_vv_digest:N #1 \tl_if_empty:NF \l__nmc_table_rvar_tl { \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 } \int_compare:nNnT { \l__nmc_table_ctitle_int } > { 1 } { \tl_set_eq:NN \l__nmc_table_ctitle_tl \l__nmc_formula_dup_tl } \seq_gpop:NN \g__nmc_error_where_seq \l__nmc_toss_tl \__nmc_table_get_ini_vals: \bool_if:NF \g__nmc_error_bool { \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 } } \int_compare:nNnT { \l__nmc_table_ctitle_int } = { 3 } { \tl_put_right:Nx \l__nmc_table_ctitle_tl { \c__nmc_vv_delim_tl \mskip18muminus15mu( \seq_use:Nn \l__nmc_vv_visible_seq { \c__nmc_vv_delim_tl } ) } } } } \cs_new_protected:Npn \__nmc_table_get_ini_vals: { \__nmc_error_where:n { settings } \__nmc_table_get_ini_vals_aux:N r \bool_if:NF \g__nmc_error_bool { \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 } } \bool_if:NT \l__nmc_table_round_bool { \__nmc_fpify:VN \l__nmc_round_xpr_tl \l__nmc_toss_tl } \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 \l__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:cv { 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:cv { 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 } } { \tl_if_empty:cTF { l__nmc_table_ #1 var_tl } { \__nmc_error_what:n { No~ \__nmc_table_rc:N #1 \ variable~specified~in } } { \__nmc_error_where:n { variable=value~list } \__nmc_error_what:n { No~initial~value~for~\__nmc_table_rc:N #1\ variable~in } } } } \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:cv { l__nmc_table_ #1 step_fp } { l__nmc_table_ #1 step_tl } \bool_if:NF \g__nmc_error_bool { \__nmc_fpify_set:cv { 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 } { \bool_if:NF \l__nmc_table_rdata_bool { \__nmc_fpify_set:cv { 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_set_protected:Npn \__nmc_table_formula: { \tl_set:Nx \l_tmpa_tl { \tl_head:N \l__nmc_formula_tl } \tl_if_in:nVT { $ \( \[ } \l_tmpa_tl { \tl_set:Nx \l__nmc_formula_tl { \tl_range:Nnn \l__nmc_formula_tl {2}{-2} } } \tl_set_eq:NN \l__nmc_formula_dup_tl \l__nmc_formula_tl } %%%%%%%%%% \cs_gset_protected:Npn \__nmc_table_process: { \__nmc_error_where:n { formula } \__nmc_table_calc_rvar_col: \bool_if:NF \g__nmc_error_bool { \seq_clear:N \l__nmc_table_header_seq \tl_if_in:NVT \l__nmc_formula_tl \l__nmc_multi_delim_tl { \__nmc_table_multifn: } \__nmc_table_calc_cvar_cols: \bool_if:NF \g__nmc_error_bool { \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 \bool_gset_true:N \g__nmc_reuse_bool } { \__nmc_error_where:n { settings } \__nmc_error_what:n { \l__nmc_table_query_tl~query~\__nmc_verb:n {Q?}~in } \tl_clear:N \l__nmc_result_tl } } } } \int_compare:nNnT \l__nmc_dbg_int = { 11 } { \__nmc_table_display: \tl_set:NV \l__nmc_show_tl \l__nmc_result_tl } } \cs_new_protected:Npn \__nmc_table_multifn: { \bool_set_true:N \l__nmc_table_multifn_bool \seq_set_split:NVV \l__nmc_table_multifn_seq \l__nmc_multi_delim_tl \l__nmc_formula_tl \seq_remove_all:Nn \l__nmc_table_multifn_seq {} \seq_set_eq:NN \l__nmc_table_header_seq \l__nmc_table_multifn_seq \int_set:Nn \l__nmc_table_cnum_int { \seq_count:N \l__nmc_table_multifn_seq } \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 \l__nmc_subst_var_prop { \l__nmc_x_tl } { 1 } \int_set_eq:NN \l__nmc_table_chstyle_int \c__nmc_table_chstyle_int } \cs_new_protected:Npn \__nmc_table_calc_rvar_col: { \bool_if:NTF \l__nmc_table_rdata_bool { \__nmc_table_rdata_fpstart: \bool_if:NF \g__nmc_error_bool { \seq_map_inline:Nn \l__nmc_table_rdata_seq { \tl_clear:N \l_tmpb_tl \__nmc_fpify:nN { ##1 } \l_tmpb_tl \fp_set:Nn \l__nmc_table_r_fp { \int_if_zero:nTF \l__nmc_table_rfrac_int { round( \l_tmpb_tl, \l__nmc_table_rround_int ) } { \l_tmpb_tl } } \__nmc_error_fpflag: \bool_if:NT \g__nmc_error_bool { \seq_map_break: } \seq_put_right:NV \l__nmc_table_rvraw_seq \l__nmc_table_r_fp } } } { \tl_if_empty:NTF \l__nmc_table_rfunc_tl { \__nmc_table_runiform: } { \__nmc_table_rfunc: } } } \cs_new_protected:Npn \__nmc_table_runiform: { \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 } { \int_if_zero:nT \l__nmc_table_rfrac_int { \fp_set:Nn \l__nmc_table_r_fp { round( \l__nmc_table_r_fp, \l__nmc_table_rround_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_protected:Npn \__nmc_table_rdata_fpstart: { \seq_get_left:NN \l__nmc_table_rdata_seq \l_tmpa_tl \tl_put_left:Nn \l_tmpa_tl { = } \tl_put_left:NV \l_tmpa_tl \l__nmc_table_rvar_tl \seq_set_from_clist:NN \l_tmpa_seq \l_tmpa_tl \__nmc_vv_digest:N \l_tmpa_seq \bool_if:NF \g__nmc_error_bool { \prop_get:NVN \l__nmc_subst_var_prop \l__nmc_table_rvar_tl \l_tmpa_tl \fp_set:Nn \l__nmc_table_rstart_fp { \l_tmpa_tl } } } \cs_new_protected:Npn \__nmc_table_rfunc: { \bool_if:NF \g__nmc_error_bool { \__nmc_error_where:n { row-variable~function } \fp_set_eq:NN \l__nmc_table_r_fp \l__nmc_table_rstart_fp \seq_clear:N \l__nmc_table_rdata_seq \int_step_function:nN { \l__nmc_table_rnum_int } \__nmc_table_rfunc_step_fn:n \seq_gpop:NN \g__nmc_error_where_seq \l__nmc_toss_tl \bool_if:NF \g__nmc_error_bool { \__nmc_table_rdata_fpstart: \seq_set_eq:NN \l__nmc_table_rvraw_seq \l__nmc_table_rdata_seq \bool_set_true:N \l__nmc_table_rdata_bool } } } \cs_new_protected:Npn \__nmc_table_rfunc_step_fn:n #1 { \bool_if:NF \g__nmc_error_bool { \__nmc_calc_fn_val:VNnN \l__nmc_table_rvar_tl \l__nmc_table_rfunc_tl { \l__nmc_table_r_fp } \l_tmpa_fp \int_if_zero:nTF \l__nmc_table_rfrac_int { \__nmc_num_format:nNnN { \l_tmpa_fp } \l_tmpb_tl { \l__nmc_table_rround_int } \c_false_bool } { \tl_set:Nx \l_tmpb_tl { \fp_use:N \l_tmpa_fp } } \seq_put_right:NV \l__nmc_table_rdata_seq \l_tmpb_tl \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:NF \g__nmc_error_bool { \__nmc_table_multifn_header: \seq_clear:N \l__nmc_table_this_col_seq \seq_map_inline:Nn \l__nmc_table_rvraw_seq { \__nmc_calc_fn_val:VNnN \l__nmc_table_rvar_tl \l__nmc_formula_tl { ####1 } \l_tmpa_fp \bool_if:NT \g__nmc_error_bool { \seq_map_break: } \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 } } } } \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 \int_if_zero:nTF { \l__nmc_mode_tl } { \prop_put:NVV \l__nmc_subst_var_prop } { \prop_put:NVV \l__nmc_vv_change_prop } \l__nmc_table_rvar_tl \l__nmc_table_rstart_fp \int_compare:nNnF { ##1 } > { \l__nmc_table_cnum_int } { \__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_protected:Npn \__nmc_table_multifn_header: { \bool_if:NTF \l__nmc_table_multifn_bool { \seq_pop:NN \l__nmc_table_multifn_seq \l__nmc_formula_tl } { \seq_put_right:NV \l__nmc_table_header_seq { \l__nmc_table_c_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_gset_protected:Npn \__nmc_table_display: { \bool_if:NF \l__nmc_num_only_bool { \int_if_zero:nT \l__nmc_table_headless_int { \__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 \int_if_zero:nT \l__nmc_table_headless_int { \\~ \__nmc_if_mod_zero:nnT { \l__nmc_table_rules_int } { 7 } { \exp_not:N \midrule } } } \tl_put_right:Nx \l__nmc_result_tl { \__nmc_table_form_lower: } \bool_if:NF \l__nmc_num_only_bool { \bool_gset_false:N \g__nmc_reuse_bool \tl_gset:Nx \g__nmc_reuse_tl { \exp_not:o \l__nmc_result_tl } } } \int_if_zero:nT \l__nmc_dbg_int { \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 } \int_if_zero:nF { \l__nmc_table_ctitle_int } { \__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 } { $ \exp_not:o { \l__nmc_table_ctitle_tl } $ } #2 \\~ \__nmc_if_mod_zero:nnT { \l__nmc_table_rules_int } { 3 } { \exp_not:N \cmidrule(lr) { #3-\int_eval:n { #4 } } } \tl_if_empty:NF \l__nmc_table_csubttl_tl { \__nmc_table_csubttl: \\~ } \__nmc_if_mod_zero:nnT { \l__nmc_table_rules_int } { 5 } { \__nmc_table_csubttl_rule:nn { #3 } { #4 } } } %%%%%%%%% \cs_new:Npn \__nmc_table_csubttl: { \int_if_zero:nF { \l__nmc_table_cnum_int } { \int_case:nnF { \l__nmc_table_rpos_int } { { 0 } { \exp_not:o \l__nmc_table_csubttl_tl } { 1 } { & \exp_not:o \l__nmc_table_csubttl_tl } { 2 } { \exp_not:o \l__nmc_table_csubttl_tl & } } { & \exp_not:o \l__nmc_table_csubttl_tl & } } } \cs_new:Npn \__nmc_table_csubttl_rule:nn #1#2 { \int_compare:nNnTF { \l__nmc_table_rpos_int } > { 2 } { \exp_not:N \cmidrule(lr) { 1-\__nmc_table_total_cols: } } { \exp_not:N \cmidrule(lr) { { #1 } -\int_eval:n { #2 } } } } %%%%%%%%% \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 { \int_if_zero:nTF { \l__nmc_table_ctitle_int } { \exp_not:o \l__nmc_formula_dup_tl } { \exp_not:o \l__nmc_table_ctitle_tl } } \l__nmc_table_chnudge_tl } } } \cs_new:Npn \__nmc_table_headern: { \int_set_eq:NN \l__nmc_table_chfrac_int \l__nmc_frac_out_int \int_zero:N \l__nmc_frac_out_int \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_multifn_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 { & } } } \int_set_eq:NN \l__nmc_frac_out_int \l__nmc_table_chfrac_int } \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 = \exp_not:o #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 = \exp_not:o #2 } } { 3 } { \__nmc_table_header_auxiii:NV #1 #2 } { 4 } { \__nmc_table_header_auxiv:NV #1 #2 } { 5 } { \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:o { #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_protected:Npn \__nmc_table_header_auxiv:Nn #1#2 { \tl_set_eq:NN \l_tmpa_tl \l__nmc_formula_dup_tl \fp_compare:nNnTF { #2 } = { 1 } { \regex_replace_all:nnNT { \u{l__nmc_table_cvar_tl} } { } \l_tmpa_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_auxiv: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_generate_variant:Nn \__nmc_table_header_nudge:Nnn { NnV } %%%%%%%%%%%%%%%%%%%%%%%%%%%%% \cs_new_protected:Npn \__nmc_table_form_body:N #1 { % #1 <== \l__nmc_result_tl \int_if_zero:nF { \l__nmc_table_rpos_int } { \int_set_eq:NN \l__nmca_int \l__nmc_frac_out_int \int_set_eq:NN \l__nmc_frac_out_int \l__nmc_table_rfrac_int \int_set_eq:NN \l__nmc_table_rfrac_int \l__nmca_int \int_if_zero:nTF { \l__nmc_table_rverb_int } { \seq_clear:N \l_tmpa_seq \seq_map_inline:Nn \l__nmc_table_rvraw_seq { \__nmc_num_format:nNnN { ##1 } \l_tmpa_tl { \l__nmc_table_rround_int } \c_false_bool \seq_put_right:NV \l_tmpa_seq \l_tmpa_tl } \__nmc_table_form_rvcol:NN \l_tmpa_seq \l__nmc_table_rvcol_seq } { \__nmc_table_form_rvcol:NN \l__nmc_table_rdata_seq \l__nmc_table_rvcol_seq } \int_set_eq:NN \l__nmc_frac_out_int \l__nmc_table_rfrac_int } \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 { \seq_put_right:Nx \l_tmpb_seq { \exp_not:o \l__nmc_table_rfont_tl { \exp_not:o \l_tmpa_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 \\~ } \__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 \bool_if:NT \l__nmc_table_round_bool { \__nmc_table_cvround_pre: } \seq_clear:N \l_tmpd_seq \seq_map_variable:NNn \l__nmc_table_body_cols_seq \l_tmpa_seq { \bool_if:NT \l__nmc_table_round_bool { \__nmc_table_rvround_pre: } \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 } \__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 { & } \\~ \bool_if:NT \l_tmpa_bool { \exp_not:o \addlinespace[\l__nmc_table_blocsep_tl] } } } } \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 } \bool_if:NT \l__nmc_table_round_bool { \__nmc_table_cvround_post: } } \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 \bool_if:NT \l__nmc_table_round_bool { \__nmc_table_rvround_post: } \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 \bool_if:NT \l__nmc_table_round_bool { \__nmc_table_rvround_post: } } \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_signs:n { #1 } } } } { \tl_set:Nx #1 { \__nmc_sci_num_table_signs: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 #1 \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 } { 11 } { \exp_not:N \cmidrule(lr) { 1-\__nmc_table_total_cols: } } \exp_not:o \l__nmc_table_footer_tl \\~ } \__nmc_if_mod_zero:nnT { \l__nmc_table_rules_int } { 13 } { \exp_not:N \bottomrule } \exp_not:n { \end{tabular} } } %------------------------------------------------ \cs_new_protected:Npn \__nmc_table_set_rcnum:nn #1#2 { \__nmc_fpify_set:Nn \l_tmpb_fp { #1 } \int_set:cn { l__nmc_table_ #2 num_int } { \fp_to_int:N \l_tmpb_fp } } \cs_generate_variant:Nn \__nmc_table_set_rcnum:nn { V } \cs_new_protected:Npn \__nmc_table_rvfile:n #1 { \file_get:nnNTF { #1 } {} \l_tmpa_tl { \seq_set_from_clist:No \l__nmc_table_rdata_seq \l_tmpa_tl } { \__nmc_error_what:n { File~#1~not~found~in } } } \cs_new_protected:Npn \__nmc_table_rounding:n #1 { \bool_set:Nn \l__nmc_table_round_bool { !\tl_if_blank_p:n { #1 } } \tl_set:Nn \l__nmc_round_xpr_tl { #1 } } \keys_define:nn { numerica/table } { view .code:n = \__nmc_dbg_int:nn { 1 } { 11 }, round .code:n = \__nmc_table_rounding:n { #1 }, % 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 .code:n = \__nmc_table_set_rcnum:nn { #1 } { r }, rspec .clist_set:N = \l__nmc_table_rspec_clist, rfunc .tl_set:N = \l__nmc_table_rfunc_tl, rdata .code:n = \tl_if_single:nTF { #1 } { \seq_set_from_clist:NN \l__nmc_table_rdata_seq #1 } { \seq_set_from_clist:No \l__nmc_table_rdata_seq { ~#1 } }, rfile .code:n = \__nmc_table_rvfile:n { #1 }, rverb .int_set:N = \l__nmc_table_rverb_int, rfrac .int_set:N = \l__nmc_table_rfrac_int, rfrac .initial:n = 0, rround .int_set:N = \l__nmc_table_rround_int, rround .initial:n = 1, rfont .code:n = \tl_set:Nn \l__nmc_table_rfont_tl { \use:c { math#1 } }, ralign .tl_set:N = \l__nmc_table_rcalign_tl, ralign .initial:n = r, 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, rpos .initial:n = 1, 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 .code:n = \__nmc_table_set_rcnum:nn { #1 } { c }, cspec .clist_set:N = \l__nmc_table_cspec_clist, calign .tl_set:N = \l__nmc_table_ccalign_tl, calign .initial:n = r, 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, cmidrow .tl_set:N = \l__nmc_table_csubttl_tl, csubttl .tl_set:N = \l__nmc_table_csubttl_tl, headless .int_set:N = \l__nmc_table_headless_int, headless .initial:n = 0, rules .tl_set:N = \l__nmc_table_rules_tl, rules .initial:n = ThB, 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, rblocsep .initial:n = 1ex, 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, diffs .initial:n = 0, % Q? .tl_set:N = \l__nmc_table_Q_tl, A! .tl_set:N = \l__nmc_table_A_tl, valign .code:n = \tl_set:Nn \l__nmc_table_valign_tl { [#1] }, valign .initial:n = m } % end of `numerica-tables.sty'