summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2023-08-22 22:46:17 +0000
committerKarl Berry <karl@freefriends.org>2023-08-22 22:46:17 +0000
commit7132d484d10d6a06ab868466f92eaf661d3cf2f9 (patch)
treefbbf4fb4cf32cbd396aaf1b15458e15308e2a241 /Master/texmf-dist/tex
parentef76cd6eb8886c8a636b76e696c08ad9e4c53ad9 (diff)
numerica (23aug23)
git-svn-id: svn://tug.org/texlive/trunk@68021 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex')
-rw-r--r--Master/texmf-dist/tex/latex/numerica/numerica.sty2789
1 files changed, 1705 insertions, 1084 deletions
diff --git a/Master/texmf-dist/tex/latex/numerica/numerica.sty b/Master/texmf-dist/tex/latex/numerica/numerica.sty
index 7a077ac422c..33a55085f89 100644
--- a/Master/texmf-dist/tex/latex/numerica/numerica.sty
+++ b/Master/texmf-dist/tex/latex/numerica/numerica.sty
@@ -7,49 +7,97 @@
%
% Andrew Parsloe (ajparsloe@gmail.com)
%
-\RequirePackage{l3keys2e}
\RequirePackage{amsmath,mathtools}
-\ProvidesExplPackage
- {numerica}
- {2023/06/28}
- {2.1.0}
+\ProvidesExplPackage{numerica} {2023/08/19} {3.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} }
-\cs_if_free:NT \csch { \DeclareMathOperator{\csch}{csch} }
-\cs_if_free:NT \sech { \DeclareMathOperator{\sech}{sech} }
-\cs_if_free:NT \asinh { \DeclareMathOperator{\asinh}{asinh} }
-\cs_if_free:NT \acosh { \DeclareMathOperator{\acosh}{acosh} }
-\cs_if_free:NT \atanh { \DeclareMathOperator{\atanh}{atanh} }
-\cs_if_free:NT \acsch { \DeclareMathOperator{\acsch}{acsch} }
-\cs_if_free:NT \asech { \DeclareMathOperator{\asech}{asech} }
-\cs_if_free:NT \acoth { \DeclareMathOperator{\acoth}{acoth} }
-\cs_if_free:NT \sgn { \DeclareMathOperator{\sgn}{sgn} }
-\cs_if_free:NT \lb { \DeclareMathOperator{\lb}{lb} }
-% 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} }
-%
+
+\tl_const:Nn \c_nmc_version_tl { 30 }
+\bool_new:N \l__nmc_dec_comma_bool
+\keys_define:nn { numerica/package }
+ {
+ comma .bool_set:N = \l__nmc_dec_comma_bool,
+ comma .default:n = true,
+ comma .initial:n = false,
+ rounding .int_set:N = \l__nmc_round_int,
+ rounding .initial:n = 6,
+ approx .tl_set:N = \l__nmc_eq_tl,
+ approx .default:n = \approx,
+ approx .initial:n = {=}
+ }
+\ProcessKeyOptions [ numerica/package ]
+% *unspaced* decimal comma
+\bool_if:NTF \l__nmc_dec_comma_bool
+ {
+ \tl_const:Nn \c__nmc_vv_delim_tl {;}
+ \mathchardef \nmcComma \mathcode`,
+ \AtBeginDocument
+ {
+ \char_set_active_eq:nN { `, } \__nmc_dec_comma:
+ \char_set_mathcode:nn { `, } { "8000 }
+ }
+ }
+ { \tl_const:Nn \c__nmc_vv_delim_tl {,} }
+
+\cs_new_protected:Npn \__nmc_dec_comma:
+ { \peek_after:Nw \__nmc_check_for_digit: }
+\cs_new:Npn \__nmc_check_for_digit:
+ {
+ \token_case_charcode:NnTF \l_peek_token
+ { {0}{} {1}{} {2}{} {3}{} {4}{} {5}{} {6}{} {7}{} {8}{} {9}{} }
+ { { \nmcComma } } { \nmcComma }
+ }
+% \sgn \lb; missing hyp & inverse trig & hyp fns
+\cs_new:Npn \__nmc_fn_def:N #1
+ { \cs_if_free:NT #1 { \DeclareMathOperator{#1}{\cs_to_str:N #1} } }
+\cs_generate_variant:Nn \__nmc_fn_def:N { c }
+\AtBeginDocument
+ {
+ \clist_map_inline:nn { sgn, lb } { \__nmc_fn_def:c {#1} }
+ \clist_map_inline:nn { csch, sech } { \__nmc_fn_def:c {#1} }
+ \clist_map_inline:nn { csc, sec, cot } { \__nmc_fn_def:c {arc#1} }
+ \clist_map_inline:nn { sinh, cosh, tanh, csch, sech, tanh }
+ {
+ \__nmc_fn_def:c {a#1}
+ \__nmc_fn_def:c {ar#1}
+ \__nmc_fn_def:c {arc#1}
+ }
+ \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} }
+ \cs_if_free:NT \sfrac
+ {
+ \NewDocumentCommand \sfrac { mm }
+ {
+ \mathchoice{{\scriptstyle #1/#2}} {{\scriptstyle #1/#2}}
+ {{\scriptscriptstyle #1/#2}} {{#1/#2}}
+ }
+ }
+ }
\RenewDocumentCommand \land {} { \,\wedge\, }
\RenewDocumentCommand \lor {} { \,\vee\, }
\NewDocumentCommand \Q {} { \prg_do_nothing: } % Qleave apart
\NewDocumentCommand \q {} { \prg_do_nothing: } % qleave to
+\ProvideDocumentCommand \comma {} {,}
+\ProvideDocumentCommand \equals {} { \ensuremath{=} }
+\ProvideDocumentCommand \degree {} { \ensuremath{^\circ} }
%
\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_const:Nn \c__nmc_uny_int { 3 }
+\int_const:Nn \c__nmc_prn_int { 4 }
+\int_const:Nn \c__nmc_srd_int { 5 }
\int_new:N \l__nmc_num_sgn_int % tables
\tl_new:N \l__nmc_toss_tl
+\tl_new:N \l__nmca_tl
+\fp_new:N \l_tmpc_fp
+\fp_new:N \l_tmpd_fp
+\int_new:N \l__nmca_int
\seq_new:N \l_tmpc_seq
-%
+%
+\cs_if_exist:NTF \seq_map_pairwise_function:NNN
+ { \cs_set_eq:NN \__nmc_braid:NNN \seq_map_pairwise_function:NNN }
+ { \cs_set_eq:NN \__nmc_braid:NNN \seq_mapthread_function:NNN }
\cs_if_exist:NF \int_if_zero_p:n
{
\prg_new_conditional:Npnn \int_if_zero:n #1 { p,T,F,TF }
@@ -79,7 +127,7 @@
{ \prop_gput:Nnn \g__nmc_class_prop { ##1 } { #2 } }
}
%
-\__nmc_fill_class:nn { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, . }
+\__nmc_fill_class:nn { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }
{ \__nmc_fpify_dec: \__nmc_delim_dec: }
\__nmc_fill_class:nn { e, \pi, \gamma, \phi, \deg, \infty }
{ \__nmc_fpify_const: \__nmc_delim_const: }
@@ -96,7 +144,7 @@
{ \__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_fill_class:nn { \tfrac, \sfrac }
{ \__nmc_fpify_frac: \__nmc_delim_tfrac: }
% comparisons
\__nmc_fill_class:nn
@@ -116,29 +164,26 @@
{ \__nmc_fpify_lparen: \__nmc_delim_lparen: }
\__nmc_fill_class:nn { |, \lvert, \lfloor, \lceil }
{ \__nmc_fpify_lvert: \__nmc_delim_lvert: }
-\__nmc_fill_class:nn { \left, \bigl, \Bigl, \biggl, \Biggl }
+\__nmc_fill_class:nn { \left, \mleft, \bigl, \Bigl, \biggl, \Biggl }
{ \__nmc_fpify_lmod: \__nmc_delim_lmod: }
% right
-\__nmc_fill_class:nn { \right, \bigr, \Bigr, \biggr, \Biggr }
- { \prg_do_nothing: \__nmc_delim_rparen: }
+\__nmc_fill_class:nn { \right, \mright, \bigr, \Bigr, \biggr, \Biggr }
+ { \__nmc_fpify_rmod: \__nmc_delim_rparen: }
% unary fns: f
-\__nmc_fill_class:nn { \sin, \cos, \tan, \csc, \sec, \cot }
- {
- { \__nmc_fpify_unary:n { \l__nmc_trg_int } }
- { \__nmc_delim_unary:n { \l__nmc_trg_int } }
- }
\__nmc_fill_class:nn
{
+ \sin, \cos, \tan, \csc, \sec, \cot,
\arcsin, \arccos, \arctan, \arccsc, \arcsec, \arccot,
\sinh, \cosh, \tanh, \csch, \sech, \coth,
\asinh, \acosh, \atanh, \acsch, \asech, \acoth,
+ \arsinh, \arcosh, \artanh, \arcsch, \arsech, \arcoth,
+ \arcsinh, \arccosh, \arctanh, \arccsch, \arcsech, \arccoth,
\exp, \ln, \lg, \lb, \sgn
}
- {
- { \__nmc_fpify_unary:n { \c__nmc_uny_int } }
- { \__nmc_delim_unary:n { \c__nmc_uny_int } }
- }
-% f!
+ { \__nmc_fpify_unary: \__nmc_delim_unary: }
+\prop_put:Nnn \g__nmc_class_prop { \degree }
+ { \__nmc_fpify_degree: \__nmc_delim_append: }
+% factorial
\prop_put:Nnn \g__nmc_class_prop { ! }
{ \__nmc_fpify_fact: \__nmc_delim_fact: }
% f{}
@@ -152,14 +197,26 @@
% nary f(arg1,...)
\__nmc_fill_class:nn { \min, \max, \gcd }
{ \__nmc_fpify_nary: \__nmc_delim_nary: }
-\prop_put:Nnn \g__nmc_class_prop { , }
- { \__nmc_fpify_comma: \__nmc_delim_comma: }
+\bool_if:NTF \l__nmc_dec_comma_bool
+ {
+ \prop_put:Nnn \g__nmc_class_prop { , }
+ { \__nmc_fpify_dec: \__nmc_delim_dec: }
+ \prop_put:Nnn \g__nmc_class_prop { ; }
+ {\__nmc_fpify_comma: \__nmc_delim_comma: }
+ }
+ {
+ \prop_put:Nnn \g__nmc_class_prop { . }
+ { \__nmc_fpify_dec: \__nmc_delim_dec: }
+ \prop_put:Nnn \g__nmc_class_prop { , }
+ {\__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
+ \ensuremath, \smash, \textrm, \textsf, \texttt,
+ \textit, \textsl, \textsc, \textbf
}
{ \__nmc_fpify_font: \__nmc_delim_font: }
% ignore cmd, [arg1], {arg2}; heed {arg3}
@@ -173,8 +230,11 @@
{
{{}}, \\, &, \to, \q_nil, \dots, \ldots, \cdots,
\quad, \qquad, \hfill, \hfil, \mathstrut, $, \(, \), \[, \],
- \ , \,, \;, \:, \!, \>, \thinspace, \medspace, \thickspace, \negthinspace, \negmedspace, \negthickspace,
+ \ , \,, \;, \:, \!, \>, \thinspace, \medspace, \thickspace,
+ \negthinspace, \negmedspace, \negthickspace, \lefteqn,
\displaystyle, \textstyle, \scriptstyle, \scriptscriptstyle,
+ \middle, \big, \Big, \bigg, \Bigg, \protect,
+ \mleftright, \mleftrightrestore, \comma, \equals
}
{ \prg_do_nothing: \__nmc_delim_absorb: }
\__nmc_fill_class:nn
@@ -184,6 +244,9 @@
{ \__nmc_fpify_absorb_sm: \__nmc_delim_absorb_ii: }
\__nmc_fill_class:nn { \xmathstrut, \color }
{ \__nmc_fpify_absorb_om: \__nmc_delim_absorb_ii: }
+% kerning
+\__nmc_fill_class:nn { \mskip, \mkern }
+ { \__nmc_fpify_mkern: \__nmc_delim_mkern: }
% ams environs f{arg1} (& f{arg1}{arg2} for aligned, aligned*)
\__nmc_fill_class:nn { \begin, \end }
{ \__nmc_fpify_BE: \__nmc_delim_BE: }
@@ -198,7 +261,7 @@
{
\eval, \nmcEvaluate, \iter, \nmcIterate, \solve, \nmcSolve,
\recur, \nmcRecur, \tabulate, \nmcTabulate, \info, \nmcInfo,
- \constants, \nmcConstants, \reuse, \nmcReuse
+ \constants, \nmcConstants, \macros, \nmcMacros, \reuse, \nmcReuse
}
{ \__nmc_fpify_cmd: \__nmc_delim_cmd: }
% substitution classes %%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -212,7 +275,7 @@
{
\cs_set_protected:Npn \__nmc_substitutions:nn ##1##2
{ \prop_gput:Nnn #1 { ##1 } { ##2 } }
- \seq_mapthread_function:NNN #2 #3 \__nmc_substitutions:nn
+ \__nmc_braid:NNN #2 #3 \__nmc_substitutions:nn
}
\seq_set_from_clist:Nn \l_tmpa_seq
{
@@ -221,6 +284,8 @@
\arcsin, \arccos, \arctan, \arccsc, \arcsec, \arccot,
\sinh, \cosh, \tanh, \csch, \sech, \coth,
\asinh, \acosh, \atanh, \acsch, \asech, \acoth,
+ \arsinh, \arcosh, \artanh, \arcsch, \arsech, \arcoth,
+ \arcsinh, \arccosh, \arctanh, \arccsch, \arcsech, \arccoth,
\exp, \ln, \lg, \lb, \sgn,
\max, \min, \surd, \sqrt, \times, \cdot, \div,
\abs, \floor, \ceil, \lvert, \lfloor, \lceil,
@@ -240,7 +305,9 @@
acsc\__nmc_deg:, asec\__nmc_deg:, acot\__nmc_deg:,
sinh, cosh, tanh, csch, sech, coth,
asinh, acosh, atanh, acsch, asech, acoth,
- exp, ln, (0.4342944819032518)ln, (1.442695040888963)ln, sign,
+ asinh, acosh, atanh, acsch, asech, acoth,
+ 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,
!, !, &&, &&, ||, ||,
@@ -250,100 +317,179 @@
\__nmc_subst:NNN \g__nmc_subst_fpfn_prop \l_tmpa_seq \l_tmpb_seq
\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, deriv, integ, iter, solve,
- \eval, \nmcEvaluate, \iter, \nmcIterate, \solve, \nmcSolve,
- \recur, \nmcRecur, \tabulate, \nmcTabulate, \info, \nmcInfo,
- \constants, \nmcConstants, \reuse, \nmcReuse
- }
+ {
+ \cosh, \sinh, \tanh, \csch, \sech, \coth,
+ (, [, \{, \lparen, \lbrack, \lbrace,
+ \left, \bigl, \Bigl, \biggl, \Biggl,
+ \lvert, \lceil, \lfloor,
+ sum, prod, deriv, integ, iter, solve,
+ \eval, \nmcEvaluate, \iter, \nmcIterate, \solve, \nmcSolve,
+ \recur, \nmcRecur, \tabulate, \nmcTabulate, \info, \nmcInfo,
+ \constants, \nmcConstants, \macros, \nmcMacros, \reuse, \nmcReuse,
+ <=, =<, >=, =>
+ }
\seq_set_from_clist:Nn \l_tmpb_seq
- {
- acosh, asinh, atanh, acsch, asech, acoth,
- ), ], \}, \rparen, \rbrack, \rbrace,
- \right, \bigr, \Bigr, \biggr, \Biggr,
- \rvert, \rceil, \rfloor,
- term, factor, bisection, subdivision, iteration, step,
- eval, eval, iter, iter, solve, solve,
- recur, recur, table, table, info, info,
- consts, consts, reuse, reuse
- }
+ {
+ acosh, asinh, atanh, acsch, asech, acoth,
+ ), ], \}, \rparen, \rbrack, \rbrace,
+ \right, \bigr, \Bigr, \biggr, \Biggr,
+ \rvert, \rceil, \rfloor,
+ term, factor, bisection, subdivision, iteration, step,
+ eval, eval, iter, iter, solve, solve,
+ recur, recur, table, table, info, info,
+ consts, consts, macros, macros, reuse, reuse,
+ \leq, \leq, \geq, \geq
+ }
\__nmc_subst:NNN \g__nmc_subst_misc_prop \l_tmpa_seq \l_tmpb_seq
-
% 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 }
-\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 \tl_if_head_eq_charcode:nNF { V }
\cs_generate_variant:Nn \tl_if_head_is_group:nTF { V }
\cs_generate_variant:Nn \tl_if_in:NnTF { NV }
\cs_generate_variant:Nn \tl_if_in:NnT { NV }
\cs_generate_variant:Nn \tl_if_in:nnTF { nV }
-\cs_generate_variant:Nn \tl_if_eq:nnTF { V }
+\cs_generate_variant:Nn \tl_if_in:nnT { nV }
+\cs_generate_variant:Nn \tl_if_eq:nnTF { V, VV }
\cs_generate_variant:Nn \tl_if_eq:nnT { V }
\cs_generate_variant:Nn \tl_if_eq:nnF { V }
-\cs_generate_variant:Nn \tl_replace_once:Nnn { Nnx }
+\cs_generate_variant:Nn \tl_replace_once:Nnn { NV, NnV, Nnx }
\cs_generate_variant:Nn \tl_count_tokens:n { V }
-\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_generate_variant:Nn \str_if_eq:nnTF { V }
+\cs_generate_variant:Nn \str_if_in:NnTF { NV }
+\cs_generate_variant:Nn \seq_set_split:Nnn { NV, NVV }
+\cs_generate_variant:Nn \seq_use:Nn { NV }
\cs_generate_variant:Nn \prop_put_if_new:Nnn { No }
\cs_generate_variant:Nn \iow_open:Nn { NV }
\cs_generate_variant:Nn \iow_now:Nn { NV }
+\cs_generate_variant:Nn \regex_extract_once:NnN { NV }
\cs_generate_variant:Nn \keys_set_known:nn { x }
\cs_generate_variant:Nn \file_get:nnN { V }
\cs_generate_variant:Nn \file_get:nnNT { V }
\cs_generate_variant:Nn \file_get:nnNTF { V }
+% environments
+\tl_new:N \l__nmc_equals_tl
+\int_new:N \l__nmc_env_def_int % 0 undefined; 1 provisional; 2 defined
+\prop_new:N \g__nmc_env_prop
+\prop_new:N \g__nmc_envi_prop
+\prop_gput_from_keyval:Nn \g__nmc_env_prop
+ {
+ $ = \__nmc_math_env_sym:nnnnn {$}{}{}{}{$},
+ math = \__nmc_math_env:nnnn
+ {math}{}{\mskip 12muplus6muminus9mu(vv)}{\quad},
+ \( = \__nmc_math_env_sym:nnnnn {\(}{}{}{}{\)},
+ \[ = \__nmc_math_env_sym:nnnnn
+ {\[}{}{\mskip 36muminus24mu(vv)}{\]\[}{\]},
+ displaymath = \__nmc_math_env:nnnn {displaymath}{}{}{},
+ equation = \__nmc_math_env:nnnn {equation}{}{}{},
+ equation* = \__nmc_math_env:nnnn {equation*}{}{}{},
+ multline = \mode_if_math:TF
+ { \__nmc_math_env:nnnn {multline}{}{}{\hfill\\} }
+ { \__nmc_math_env:nnnn {multline}{}{\\(vv)}{} },
+ multline* = \mode_if_math:TF
+ { \__nmc_math_env:nnnn {multline*}{}{}{\hfill\\} }
+ { \__nmc_math_env:nnnn {multline*}{}{\\(vv)}{} },
+ eqnarray = \__nmc_math_env_cum:nnnn {eqnarray}{&=&}
+ {\mskip 36muminus24mu(vv)}{},
+ eqnarray* = \__nmc_math_env_cum:nnnn {eqnarray*}{&=&}
+ {\mskip 36muminus24mu(vv)}{},
+ align = \__nmc_math_env_cum:nnnn {align}{}{}{},
+ align* = \__nmc_math_env_cum:nnnn {align*}{}{}{},
+ gather = \__nmc_math_env_cum:nnnn {gather}{=}
+ {\mskip 12muplus6muminus9mu(vv)}{},
+ gather* = \__nmc_math_env_cum:nnnn {gather*}{=}
+ {\mskip 12muplus6muminus9mu(vv)}{},
+ flalign = \__nmc_math_env_cum:nnnn {flalign}{}{}{},
+ flalign* = \__nmc_math_env_cum:nnnn {flalign*}{}{}{},
+ alignat = \__nmc_math_env_cum:nnnn {alignat}{&=\;&}{\qquad&(vv)}{}
+ \tl_set:Nn \l__nmc_env_arg_tl {2},
+ alignat* = \__nmc_math_env_cum:nnnn {alignat*}{&=\;&}{\qquad&(vv)}{}
+ \tl_set:Nn \l__nmc_env_arg_tl {2},
+ }
+\prop_gput_from_keyval:Nn \g__nmc_envi_prop
+ {
+ aligned = \__nmc_math_env_cum:nnnn {aligned}{}{}{},
+ alignedat = \__nmc_math_env_cum:nnnn {alignedat}{&=\;&}{\qquad&(vv)}{}
+ \tl_set:Nn \l__nmc_env_arg_tl {2},
+ array = \__nmc_math_env_cum:nnnn {array}{&=&}{&(vv)}{}
+ \tl_set:Nn \l__nmc_env_arg_tl {rcrl},
+ gathered = \__nmc_math_env_cum:nnnn {gathered}{=}
+ {\mskip 12muplus6muminus9mu(vv)}{},
+ cases = \__nmc_math_env_cum:nnnn {cases}{=}{\quad\hfill(vv)}{},
+ dcases = \__nmc_math_env_cum:nnnn {dcases}{=}{\quad\hfill(vv)}{}
+ }
+% #1 env #2 equals #3 vv #4 multisep #5 \) et al or arg
+\cs_new_protected:Npn \__nmc_math_env_sym:nnnnn #1#2#3#4#5
+ {
+ \__nmc_math_env_delims:nn {#1}{#5}
+ \__nmc_math_env_set:Vnnnn \c__nmc_vv_delim_tl{#1}{=}
+ {\mskip 12muplus6muminus9mu(vv)}{\quad}
+ \tl_if_blank:nF {#2#3#4}
+ { \__nmc_math_env_aux:Vnnn \c__nmc_vv_delim_tl {#2}{#3}{#4} }
+ \tl_replace_once:NnV \l__nmc_equals_tl { = } \l__nmc_eq_tl
+ }
+\cs_new_protected:Npn \__nmc_math_env:nnnn #1#2#3#4
+ {
+ \__nmc_math_env_delims:n { #1 }
+ \__nmc_math_env_set:Vnnnn \c__nmc_vv_delim_tl {#1}{=}
+ {\mskip 36muminus24mu(vv)}{\end{#1}\begin{#1}}
+ \tl_if_blank:nF {#2#3#4}
+ { \__nmc_math_env_aux:Vnnn \c__nmc_vv_delim_tl {#2}{#3}{#4} }
+ \tl_replace_once:NnV \l__nmc_equals_tl { = } \l__nmc_eq_tl
+ }
+\cs_new_protected:Npn \__nmc_math_env_cum:nnnn #1#2#3#4
+ {
+ \__nmc_math_env_delims:n { #1 }
+ \__nmc_math_env_set:Vnnnn \c__nmc_vv_delim_tl{#1}{&=}
+ {\mskip 36muminus24mu(vv)}{\\}
+ \tl_if_blank:nF {#2#3#4}
+ { \__nmc_math_env_aux:Vnnn \c__nmc_vv_delim_tl {#2}{#3}{#4} }
+ \tl_replace_once:NnV \l__nmc_equals_tl { = } \l__nmc_eq_tl
+ }
+\cs_new_protected:Npn \__nmc_math_env_set:nnnnn #1#2#3#4#5
+ {
+ \tl_clear:N \l__nmc_env_arg_tl
+ \tl_set:Nn \l__nmc_env_tl {#2}
+ \tl_set:Nn \l__nmc_equals_tl {#3}
+ \tl_set:Nn \l__nmc_vv_tl {#1#4}
+ \tl_set:Nn \l__nmc_multi_sep_tl {#5}
+ }
+\cs_generate_variant:Nn \__nmc_math_env_set:nnnnn { V }
+\cs_new_protected:Npn \__nmc_math_env_aux:nnnn #1#2#3#4
+ {
+ \tl_if_blank:nF { #2 } { \tl_set:Nn \l__nmc_equals_tl {#2} }
+ \tl_if_blank:nF { #3 } { \tl_set:Nn \l__nmc_vv_tl {#1#3} }
+ \tl_if_blank:nF { #4 } { \tl_set:Nn \l__nmc_multi_sep_tl {#4} }
+ }
+\cs_generate_variant:Nn \__nmc_math_env_aux:nnnn { V }
% general purpose routines %%%%%%%%%%%%%%%%%%%%%%
-% \tl_new:N \l__nmc_A_tl etc.
+% \tl_new:N \l__nmcA_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 }
+ { \exp_last_unbraced:NV\__nmc_next:w \l__nmcA_tl\q_stop}
\cs_new_protected:Npn \__nmc_next:w #1#2#3\q_stop
- { \__nmc_assign_vals:nnnN {#1} {#2} {#3} \l__nmc_B_tl }
+ { \__nmc_assign_vals:nnnN {#1} {#2} {#3} \l__nmcB_tl }
% get |arg|
\cs_new_protected:Npn \__nmc_absval_arg:N #1
- { \exp_last_unbraced:NV \__nmc_absval_arg:wN \l__nmc_A_tl\q_stop #1 }
+ { \exp_last_unbraced:NV \__nmc_absval_arg:wN \l__nmcA_tl\q_stop #1 }
\cs_new_protected:Npn \__nmc_absval_arg:wN #1|#2#3\q_stop #4
{ \__nmc_assign_vals:nnnN {#1} {#2} {#3} #4 }
\cs_new_protected:Npn \__nmc_assign_vals:nnnN #1#2#3#4
{
\tl_if_single:nTF { #2 }
- { \tl_set:Nn \l__nmc_A_tl { #2#3 } }
- { \tl_set:Nn \l__nmc_A_tl { {#2}#3 } }
+ { \tl_set:Nn \l__nmcA_tl { #2#3 } }
+ { \tl_set:Nn \l__nmcA_tl { {#2}#3 } }
\tl_set:Nn #4 { #1 }
- \tl_set:Nn \l__nmc_C_tl { #2 }
+ \tl_set:Nn \l__nmcC_tl { #2 }
}
\cs_new_protected:Npn \__nmc_parenth:N #1
{ \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
- {
- \group_begin:
- \tl_clear:N \l_tmpa_tl
- \__nmc_fpify:VN #2 \l_tmpa_tl
- \exp_args:NNNV
- \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
- {
- \__nmc_next:
- \__nmc_accum_fpify_parenth:NN #1 \l__nmc_B_tl
- }
+\cs_new_protected:Npn \__nmc_accum_fn_parenth:Nnn #1#2#3
+ { \tl_put_right:Nx #1 { #3( \exp_not:o {#2} ) } }
+\cs_generate_variant:Nn \__nmc_accum_fn_parenth:Nnn { NV }
% 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 }
@@ -359,94 +505,48 @@
% #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 }
- \tl_map_inline:Nn \l__nmc_A_tl
+ {
+ \int_set:Nn \l__nmca_int { 1 }
+ \tl_map_inline:Nn \l__nmcA_tl
{
\str_case:nn { ##1 }
{
- { #1 } { \int_incr:N \l_tmpa_int }
- { #3 } { \__nmc_get_arg_LR_rdelim: }
- { \q_nil } { \__nmc_get_arg_LR_qnil:N #1 }
+ { #1 } { \int_incr:N \l__nmca_int }
+ { #3 }
+ {
+ \int_decr:N \l__nmca_int
+ \int_if_zero:nT { \l__nmca_int }
+ { \__nmc_next: \tl_map_break: }
+ }
+ { \q_nil }
+ {
+ \__nmc_error_what:n { Unmatched~\__nmc_verb:n { #1 }\ in }
+ \tl_map_break:
+ }
}
\__nmc_next:
\tl_if_single:nTF { ##1 }
{ \tl_put_right:Nn #2 { ##1 } }
{ \tl_put_right:Nn #2 { {##1} } }
}
-
- }
-\cs_new_protected:Npn \__nmc_get_arg_LR_rdelim:
- {
- \int_decr:N \l_tmpa_int
- \int_if_zero:nT { \l_tmpa_int }
- { \__nmc_next: \tl_map_break: }
- }
-\cs_new_protected:Npn \__nmc_get_arg_LR_qnil:N #1
- {
- \__nmc_error_what:n { Unmatched~\__nmc_verb:n { #1 }{}~in }
- \tl_map_break:
}
+% number parsing
% #1 <== multi-char num poss. in sci notation
-% #2 delim: vs fpify: bool
+% #2 delim: vs fpify: boolean
\cs_new_protected:Npn \__nmc_get_dec:NN #1#2
- {
- \tl_set:NV #1 \l__nmc_B_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 }
- }
-\cs_new_protected:Npn \__nmc_get_dec_aux:NN #1#2
- { % l3fp uses "e"
- \__nmc_next:
- \tl_if_eq:VnTF \l__nmc_C_tl { - }
- {
- \__nmc_next:
- \__nmc_get_dec_aux:NNn #1#2 { e- }
- }
- { \__nmc_get_dec_aux:NNn #1#2 { e } }
- }
- \cs_new_protected:Npn \__nmc_get_dec_aux:NNn #1#2#3
- {
- \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 { -1234567890 }
- }
- {
- \tl_set_eq:NN \l__nmc_C_tl \l__nmc_sci_num_in_tl
- \str_if_in:nnT { #3 } { - }
- { \tl_put_left:Nn \l__nmc_A_tl { - } }
- \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
- {
- \tl_map_inline:Nn \l__nmc_A_tl
- {
- \tl_if_in:nnTF { #2 } { ##1 }
- {
- \tl_put_right:Nn #1 { ##1 }
- \__nmc_next:
- }
- { \tl_map_break: }
- }
- }
-% 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
{
- \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) } } }
+ \tl_concat:NNN \l__nmcA_tl \l__nmcB_tl \l__nmcA_tl
+ \regex_extract_once:NVN \l__nmc_num_regex \l__nmcA_tl \l_tmpa_seq
+ \seq_pop:NN \l_tmpa_seq #1
+ \bool_if:NF #2
{
- \fp_compare:nNnTF { #2 } = { -inf }
- { \__nmc_error_what:n { Integer~required~in } }
- { \__nmc_error_what:n { Integer~$\ge#2$~required~in } }
+ \bool_if:NT \l__nmc_dec_comma_bool
+ { \tl_replace_once:Nnn #1 {,} {.} }
+ \bool_if:NT \l__nmc_sci_num_in_bool
+ { \tl_replace_once:NVn #1 \l__nmc_sci_num_in_tl {e} }
}
+ \regex_replace_once:NnN \l__nmc_num_regex {} \l__nmcA_tl
+ \tl_set:Nx \l__nmcC_tl { \tl_head:N \l__nmcA_tl }
}
% calc fn vals; explicit/implicit eval. of vv-list
% #1(tl) var; #2(tl) fn; #3(fp) var val; #4(fp) <-- fn val
@@ -497,43 +597,53 @@
\exp_args:NNNV
\group_end:
\tl_set:Nn \l__nmc_fp_exprn_tl \l_tmpa_tl
+ \bool_if:NF \g__nmc_error_bool
+ {
\fp_set:Nn #1 { \l__nmc_fp_exprn_tl }
- \__nmc_error_fpflag:
+ \__nmc_error_fpflag:
+ }
}
\cs_generate_variant:Nn \__nmc_fpify_set:Nn { NV, cv }
\cs_new:Npn \__nmc_verb:n #1
- { \texttt{\string #1} }
+ { \texttt{ \tl_to_str:n { #1 } } }
\cs_generate_variant:Nn \__nmc_verb:n { V }
\cs_new:Npn \__nmc_verb:N #1
- { \texttt{\string #1} }
+ { \texttt{ \tl_to_str:N #1 } }
\cs_generate_variant:Nn \__nmc_verb:N { c }
-% Error handling %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% numerica errors %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\int_new:N \l__nmc_depth_int
\seq_new:N \g__nmc_error_where_seq
\bool_new:N \g__nmc_error_bool
+\msg_new:nnn { numerica } { base }
+ { numerica~error~in~#1~on~line~\msg_line_number:. }
+\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
+ \textsf{ !!!~#1:~\l_tmpa_tl.~!!! }
+ }
+ \msg_log:nnx { numerica } { base } \l_tmpa_tl
+ }
\cs_new_protected:Npn \__nmc_error_where:n #1
{
- \seq_gpush:Nn \g__nmc_error_where_seq
- { #1
+ \seq_gpush:Nx \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
\tl_gclear:N \g__nmc_reuse_tl
- \__nmc_error_msg:n { #1 }
- }
-\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.~!!! }
- }
+ \int_compare:nNnF \l__nmc_dbg_int < { 0 }
+ { \__nmc_error_msg:n { #1 } }
}
+\cs_generate_variant:Nn \__nmc_error_what:n { V, x }
% l3fp exceptions; ln(1),cos(90),sin(360) underflow ignored!
% Invalid op --> LaTeX *error*, hence
\fp_trap:nn { invalid_operation } { flag }
@@ -548,40 +658,41 @@
}
\cs_new_protected:Npn \__nmc_flag:n #1
{
- \__nmc_error_what:n
- {
- \__nmc_verb:n{l3fp}~error~` \clist_item:nn
- { Overflow, Division~by~zero, Invalid~operation }{ #1 }'~in
- }
- }
+ \__nmc_error_what:V { \__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
+\seq_new:N \l__nmc_multitoka_seq
+\seq_new:N \l__nmc_multitokb_seq
\cs_new_protected:Npn \__nmc_prep_multitok:NN #1#2
- {
- \seq_clear:N \l_tmpa_seq
+ {
+ \seq_clear:N \l__nmc_multitoka_seq
\seq_map_inline:Nn #1
{
- \seq_set_split:Nnn \l_tmpb_seq { = } { ##1 }
- \seq_pop:NN \l_tmpb_seq \l_tmpb_tl
+ \seq_set_split:Nnn \l__nmc_multitokb_seq { = } { ##1 }
+ \seq_pop:NN \l__nmc_multitokb_seq \l_tmpb_tl
\int_compare:nNnT { \tl_count_tokens:V \l_tmpb_tl } > { 1 }
- { \seq_push:NV \l_tmpa_seq \l_tmpb_tl }
+ { \seq_push:NV \l__nmc_multitoka_seq \l_tmpb_tl }
}
- \seq_sort:Nn \l_tmpa_seq
- { % big --> small
+ % big --> small
+ \seq_sort:Nn \l__nmc_multitoka_seq
+ {
\int_compare:nNnTF { \tl_count:n {##2} } > { \tl_count:n { ##1 } }
{ \sort_return_swapped: }
{ \sort_return_same: }
}
- \seq_map_inline:Nn \l_tmpa_seq
- { % multitoks => \nmc_a, \nmc_b, etc
+ % multitoks => \nmc_a, \nmc_b, etc
+ \seq_map_inline:Nn \l__nmc_multitoka_seq
+ {
\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
{ \g__nmc_prep_multitok_int } \cs_end: }
- \tl_set:cn { nmc_\int_to_alph:n { \g__nmc_prep_multitok_int } }
+ \tl_gset: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
@@ -590,56 +701,69 @@
}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\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_tl
\tl_new:N \l__nmc_formula_dup_tl
+\tl_new:N \l__nmc_env_tl
+\tl_new:N \l__nmc_result_tl
+\tl_new:N \l__nmc_show_tl
+\tl_new:N \l__nmc_display_tl
\tl_new:N \l__nmc_fp_expr_tl
\tl_new:N \l__nmc_fp_exprn_tl
-\bool_new:N \l__nmc_dbg_count_bool
+\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_vv_tl
+\tl_new:N \l__nmc_vvv_tl
+\tl_new:N \l__nmc_punc_tl
+\tl_new:N \l__nmc_math_delimi_tl
+\tl_new:N \l__nmc_math_delimii_tl
+\tl_new:N \l__nmc_outer_delimi_tl
+\tl_new:N \l__nmc_outer_delimii_tl
+\tl_new:N \l__nmc_env_arg_tl
\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_idii_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_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
+\int_new:N \l__nmc_sci_expon_int
+\int_new:N \l__nmc_num_alt_int
+\int_new:N \l__nmc_multi_int
+\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
+\seq_new:N \l__nmc_dbg_stored_seq
+\seq_new:N \l__nmc_vva_seq
+\seq_new:N \l__nmc_vvb_seq
\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
+\bool_new:N \l__nmc_num_only_bool
+\bool_new:N \l__nmc_round_bool
+\bool_new:N \l__nmc_see_formula_bool
+\bool_new:N \l__nmc_see_vv_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
+\bool_new:N \l__nmc_dbg_count_bool
\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 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:
- \__nmc_initialize:Nn ##1 { #2 }
-
- \__nmc_inputs_get:nnnnn { #2 } { ##2 } { ##3 } {##4 } {##5 }
-
+ \bool_set_eq:NN \l__nmc_num_only_bool ##1
+ \__nmc_initialize:n { #2 }
+ \bool_if:NF \g__nmc_error_bool
+ { \__nmc_settings:nn { #2 } { ##2 } }
+ \bool_if:NF \g__nmc_error_bool
+ { \__nmc_formula:nn { #2 } { ##3 } }
+ \bool_if:NF \g__nmc_error_bool
+ { \__nmc_trailing_args:nnn { #2 } { ##4 } { ##5 } }
\bool_if:NF \g__nmc_error_bool
{ \use:c { __nmc_#2_process: } }
\int_if_zero:nTF { \l__nmc_dbg_int }
@@ -647,92 +771,105 @@
\bool_if:NF \g__nmc_error_bool
{ \use:c { __nmc_#2_display: } }
}
- { \__nmc_dbg_display:nn { \l__nmc_dbg_int } { #2 } }
+ { \__nmc_dbg_display:nn { \l__nmc_dbg_int } { #2 } }
\group_end:
}
\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: } }
+
+ \cs_new_protected:cpn { __nmc_#2_vv_digest:N } ##1 {}
+ \clist_map_inline:nn { initialize, formula, settings, process, display }
+ { \cs_new_protected:cpn { __nmc_#2_##1: } {} }
}
\nmc_define:NnN \nmcEvaluate { eval } \eval
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\cs_new_protected:Npn \__nmc_initialize:Nn #1#2
- {
+
+% initialize
+\cs_new_protected:Npn \__nmc_initialize:n #1
+ {
\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
+ \bool_set_false:N \l__nmc_round_bool
+ \tl_set:Nn \l__nmc_dbg_idiii_tl { vv-list }
+ \int_zero:N \l__nmc_multi_int
+%
\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: }
+ \use:c { __nmc_#1_initialize: }
}
-\cs_new_protected:Npn \__nmc_inputs_get:nnnnn #1#2#3#4#5
+% #1 id, #2 settings
+\cs_new_protected:Npn \__nmc_settings:nn #1#2
{
\__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: }
+ }
+
+ \tl_if_empty:NT \l__nmc_multi_delim_tl
+ { \tl_set_eq:NN \l__nmc_multi_delim_tl \c__nmc_vv_delim_tl }
+ \use:c { __nmc_#1_settings: }
+ \int_compare:nNnT \l__nmc_depth_int > { 1 } % for nesting
+ { \int_zero:N \l__nmc_dbg_int }
\seq_gpop:NN \g__nmc_error_where_seq \l__nmc_toss_tl
- \bool_if:NF \g__nmc_error_bool
+ }
+\cs_new_protected:Npn \__nmc_formula:nn #1#2
+ {
+ \__nmc_error_where:n { formula }
+ \tl_set:Nn \l__nmc_formula_tl { #2 }
+ \tl_trim_spaces:N \l__nmc_formula_tl
+ \use:c { __nmc_#1_formula: }
+ }
+% #2=vv, #3=number format
+\cs_new_protected:Npn \__nmc_trailing_args:nnn #1#2#3
+ {
+ \__nmc_error_where:n { variable=value~list }
+ \tl_if_in:nnTF { #2 } { = }% vv-list
{
- \mode_if_math:TF
- { \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
+ \__nmc_vv_extract_visible:nN { #2 } \l__nmc_vva_seq
+ \use:c { __nmc_#1_vv_digest:N } \l__nmc_vva_seq
+ \seq_gpop:NN \g__nmc_error_where_seq \l__nmc_toss_tl
+ \__nmc_get_num_format:n { #3 }
+ \tl_if_blank:nF { #3 }
+ { \bool_set_true:N \l__nmc_round_bool }
}
- \bool_if:NF \g__nmc_error_bool
- {
- \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
- }
- { % 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
- \bool_set_true:N \l__nmc_vv_invisible_bool
- }
- \seq_gpop:NN \g__nmc_error_where_seq \l__nmc_toss_tl
+ { % empty vv-list
+ \use:c { __nmc_#1_vv_digest:N } \c_empty_seq
+ \bool_set_false:N \l__nmc_see_vv_bool
+ \seq_gpop:NN \g__nmc_error_where_seq \l__nmc_toss_tl
+ \__nmc_get_num_format:n { #2#3 }
+ \tl_if_blank:nF { #2#3 }
+ { \bool_set_true:N \l__nmc_round_bool }
}
}
-%%%%%%%%%%%%%%%%% debug routines %%%%%%%%%%%%%%%%
+%%%%%%%%%% debug %%%%%%%%%%
\cs_new_protected:Npn \__nmc_dbg_display:nn #1#2
- { \__nmc_dbg_display:xnn { \mode_if_math:TF { ed }{ * } } { #1 } { #2 } }
+ {
+ \__nmc_dbg_display:xnn { \mode_if_math:TF { ed }{ * } } { #1 } { #2 }
+ \tl_clear:N \l__nmc_show_tl
+ }
\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_if_mod_zero:nnT { #2 } { 2 }
- { \__nmc_dbg:Nnn \l__nmc_dbg_vv_tl { #2 } \l__nmc_dbg_idii_tl }
+ { \__nmc_dbg:Nnn \l__nmc_formula_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_dbg:Nnn \l__nmc_dbg_vv_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 } }
- }
+ { \__nmc_dbg:Nnn \l__nmc_fp_expr_tl { #2 } { fp-form } }
+ \__nmc_if_mod_zero:nnT { #2 } { 11 }
+ {\__nmc_dbg:Nnn \l__nmc_show_tl { #2 } { LaTeX } }
\end{ align#1 }
\bool_set_false:N \l__nmc_dbg_count_bool
}
@@ -780,87 +917,36 @@
{
\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 }
+ \int_compare:nNnTF \l__nmc_depth_int > { 1 }
+ { \hbox:n } { \vbox_top: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
- { % #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 $
- { \__nmc_math_delims_aux:n { 1 } }
- {
- \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 \[
- { \__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
- \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_eqn_num_tl }
- }
- }
-\cs_new:Npn \__nmc_math_delims_mliner:n #1
- {
- \bool_if:nT { \l__nmc_wraps_math_bool || !\mode_if_math_p: }
- {
- \tl_set:Nn \l__nmc_math_delimi_tl { \begin{multline#1} }
- \tl_set:Nn \l__nmc_math_delimii_tl { \end{multline#1} }
- }
- }
-\cs_generate_variant:Nn \__nmc_math_delims_mliner:n { V }
-\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 } }
- \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 } }
- }
-\cs_new_protected:Npn \__nmc_math_delims_aux:nn #1#2
- {
- \tl_set:Nn \l__nmc_math_delimi_tl { #1 }
- \tl_set:Nn \l__nmc_math_delimii_tl { #2 }
- }
-\cs_generate_variant:Nn \__nmc_math_delims_aux:nn { xx }
-
%%%%%%%%%% number-formatting routines %%%%%%%%%%%
+\int_zero_new:N \l__nmc_frac_out_int
+\bool_new:N \l__nmc_pad_zeros_bool
+\bool_new:N \l__nmc_sci_num_out_bool
\cs_new_protected:Npn \__nmc_get_num_format:n #1
{
- \__nmc_error_where:n { result~format~spec. }
- \str_set:Nn \l_tmpa_str { #1 }
+ \__nmc_error_where:n { result~format~spec }
\tl_clear:N \l_tmpa_tl
+ \str_set:Nn \l_tmpa_str { #1 }
\int_zero:N \l__nmc_num_alt_int
- \str_if_in:NnTF \l_tmpa_str { ? }
+ \str_if_in:nnTF { #1 } { ? }
{ \__nmc_num_bool_spec: }
- {
- \str_if_in:NnT \l_tmpa_str { * }
+ {
+ \str_if_in:nnTF { #1 } { / }
+ { \__nmc_num_frac_spec: }
{
- \bool_set_true:N \l__nmc_pad_zeros_bool
- \str_remove_all:Nn \l_tmpa_str { * }
+ \str_if_in:nnT { #1 } { * }
+ {
+ \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 } }
@@ -890,6 +976,25 @@
\bool_if:NT \l__nmc_num_only_bool
{ \int_set:Nn \l__nmc_num_alt_int { 1 } }
}
+\cs_new_protected:Npn \__nmc_num_frac_spec:
+ {
+ \int_incr:N \l__nmc_frac_out_int % 1
+ \str_remove_once:Nn \l_tmpa_str { / }
+ \str_if_in:NnTF \l_tmpa_str { / }
+ {
+ \int_incr:N \l__nmc_frac_out_int % 2
+ \str_if_in:NnTF \l_tmpa_str { t }
+ { \int_incr:N \l__nmc_frac_out_int } % 3
+ {
+ \str_if_in:NnT \l_tmpa_str { d }
+ { \int_set:Nn \l__nmc_frac_out_int { 4 } }
+ }
+ }
+ {
+ \str_if_in:NnT \l_tmpa_str { s }
+ { \int_set:Nn \l__nmc_frac_out_int { 5 } }
+ }
+ }
\cs_new_protected:Npn \__nmc_num_sci_spec:n #1
{
\str_case:nn { #1 }
@@ -911,26 +1016,86 @@
\int_zero:N \l__nmc_num_alt_int
}
%%%%%%%%%%
-% #1=fpify-ed in; #2=tl fmt'ed out; #3=int rnd; #4 sci bool
+% #1=fpify-ed in; #2=tl fmt'ed out; #3=int rndg; #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 }
+ \int_if_zero:nTF \l__nmc_frac_out_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 } }
+ \bool_if:NT \l__nmc_dec_comma_bool
+ { \tl_replace_once:Nnn #2 {.} {,} }
}
- { \__nmc_num_format_decimal:nNn { #1 } #2 { #3 } }
+ { \__nmc_num_frac_out:nNn { #1 } #2 { #3 }}
}
}
\cs_new_protected:Npn \__nmc_num_bool_out:nNn #1#2#3
- {
- \fp_compare:nNnTF { 0 } = { #1 }
+ {
+ \fp_compare:nNnTF { 0 } = { round(#1, \l__nmc_round_int) }
{ \tl_set:Nx #2 { \clist_item:nn {0,F,\texttt{F}} { #3 } } }
- { \tl_set:Nx #2 { \clist_item:nn {1,T,\texttt{T}} { #3 } } }
+ { \tl_set:Nx #2 { \clist_item:nn {1,T,\texttt{T}} { #3 } } }
+ }
+\cs_new_protected:Npn \__nmc_num_frac_out:nNn #1#2#3
+ {
+ \group_begin:
+ \int_set:Nn \l_tmpa_int { \l__nmc_frac_denom_min_int - 1 }
+ \fp_set:Nn \l_tmpc_fp { #1 }
+ \fp_set_eq:NN \l_tmpb_fp \c_one_fp
+ \fp_set:Nn \l_tmpa_fp { \l_tmpc_fp * \l_tmpa_int }
+ \fp_do_until:nNnn { 0 } = { \l_tmpb_fp }
+ {
+ \int_incr:N \l_tmpa_int
+ \int_compare:nNnTF { \l_tmpa_int } > { \l__nmc_frac_denom_max_int }
+ {
+ \__nmc_error_what:n { No~result~to~\int_use:N \l__nmc_round_int\
+ zeros~with~$ \int_use:N \l__nmc_frac_denom_min_int \le
+ \texttt{denom} \le \int_use:N \l__nmc_frac_denom_max_int $~in }
+ \fp_zero:N \l_tmpb_fp
+ }
+ {
+ \fp_add:Nn \l_tmpa_fp { \l_tmpc_fp }
+ \fp_set:Nn \l_tmpb_fp { round( ( \l_tmpa_fp -
+ round( \l_tmpa_fp, 0 ) ) / \l_tmpa_int, #3 ) }
+ }
+ }
+ \bool_if:NF \g__nmc_error_bool
+ {
+ \__nmc_num_frac_out_aux:xxNNN { \fp_to_int:n {abs(\l_tmpa_fp)} }
+ { \int_use:N \l_tmpa_int } \l__nmca_tl
+ \l__nmc_frac_out_int \l_tmpa_fp
+
+ }
+ \exp_args:NNNV
+ \group_end:
+ \tl_set:Nn #2 { \l__nmca_tl }
+ }
+\cs_new_protected:Npn \__nmc_num_frac_out_aux:nnNNN #1#2#3#4#5
+ {
+ \int_case:nn { #4 }
+ {
+ { 1 } { \tl_set:Nn #3 { #1 / #2 } }
+ { 2 } { \tl_set:Nn #3 { \frac { #1 } { #2 } } }
+ { 3 } { \tl_set:Nn #3 { \tfrac { #1 } { #2 } } }
+ { 4 } { \tl_set:Nn #3 { \dfrac { #1 } { #2 } } }
+ { 5 }
+ {
+ \cs_if_exist:NTF \sfrac
+ { \tl_set:Nn #3 { \sfrac { #1 } { #2 } } }
+ { \tl_set:Nn #3 { \scriptstyle #1 / #2 } }
+ }
+ }
+ \fp_compare:nNnT { #5 } < { 0 }
+ { \tl_put_left:Nn #3 {-} }
}
+\cs_generate_variant:Nn \__nmc_num_frac_out_aux:nnNNN { xx }
+
\cs_new_protected:Npn \__nmc_num_format_decimal:nNn #1#2#3
{
\tl_set:Nx #2 { \fp_eval:n { 0 + round( #1, #3 ) } }
@@ -938,9 +1103,8 @@
\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 } }
+ \bool_lazy_and:nnT { \int_compare_p:nNn { #3 } > { 0 } }
+ { \l__nmc_pad_zeros_bool } { \__nmc_num_pad:Nn #2 { #3 } }
}
}
\cs_new_protected:Npn \__nmc_num_pad:Nn #1#2
@@ -991,7 +1155,7 @@
{
\bool_if:NTF \l__nmc_sci_num_x_bool
{ \exp_not:N \times 10^{#1} }
- { \hbox:n { \l__nmc_sci_num_out_tl {#1} } }
+ { \text{ \l__nmc_sci_num_out_tl {#1} } }
}
}
\cs_new:Npn \__nmc_sci_num_table:n #1
@@ -1000,50 +1164,31 @@
\cs_new_protected:Npn \__nmc_vv_extract_visible:nN #1#2
{ % #2 reverses #1
\seq_clear:N \l__nmc_vv_visible_seq
- \clist_set:Nn \l_tmpa_clist { #1 }
- \mode_if_math:F
- {
- \__nmc_vv_remove_delims:N \l_tmpa_clist
- \tl_trim_spaces:N \l_tmpa_clist
- }
- \clist_clear:N #2
- \clist_map_inline:Nn \l_tmpa_clist % to remove { }
+ \seq_set_split:NVn \l__nmc_vvb_seq \c__nmc_vv_delim_tl { #1 }
+ \seq_remove_all:Nn \l__nmc_vvb_seq {}
+ \seq_clear:N #2
+ \seq_map_inline:Nn \l__nmc_vvb_seq % remove { } from {var}
{
\tl_if_head_is_group:nTF { ##1 }
- { \clist_put_left:Nx #2 { \tl_head:n { ##1 } \tl_tail:n { ##1 } } }
+ { \seq_put_left:Nx #2 { \tl_head:n { ##1 } \tl_tail:n { ##1 } } }
{
\seq_put_right:Nn \l__nmc_vv_visible_seq { ##1 }
- \clist_put_left:Nn #2 { ##1 }
+ \seq_put_left:Nn #2 { ##1 }
}
}
- \__nmc_vv_subst_style:
- }
-\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 }
+ \seq_if_empty:NTF \l__nmc_vv_visible_seq
+ { \bool_set_false:N \l__nmc_see_vv_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 { , } } }
+ \tl_replace_once:Nnx \l__nmc_vv_tl { vv }
+ { \seq_use:NV \l__nmc_vv_visible_seq \c__nmc_vv_delim_tl }
}
}
+% #1 is reversed vv seq
\cs_new_protected:Npn \__nmc_vv_digest:N #1
{
- \seq_set_from_clist:NN \l__nmc_vv_all_seq #1
- \seq_concat:NNN \l__nmc_vv_all_seq
- \g__nmc_consts_vv_seq \l__nmc_vv_all_seq
+ \seq_concat:NNN \l__nmc_vv_all_seq \g__nmc_consts_vv_seq #1
\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)
@@ -1066,7 +1211,7 @@
\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
+% changed var=vals in prop #3
\cs_new_protected:Npn \__nmc_vv_record:NnN #1#2#3
{
\prop_get:NVNF #3 #1 \l__nmc_vv_fp_expr_tl
@@ -1101,7 +1246,8 @@
{
\__nmc_split_eq:w #1\q_stop
\tl_if_empty:NT \l__nmc_eq_val_tl
- { \__nmc_error_what:n { No~value~for~$\l__nmc_eq_var_tl$~in } }
+ { \__nmc_error_what:n
+ { No~value~for~\__nmc_verb:N\l__nmc_eq_var_tl\ in } }
}
{
\bool_set_true:N \l__nmc_vv_val_only_bool
@@ -1115,65 +1261,341 @@
\tl_trim_spaces:N \l__nmc_eq_var_tl
\tl_set:Nn \l__nmc_eq_val_tl { #2 }
}
-% eval-specific routines %%%%%%%%%%%%%%%%%%%%%%%%
-\cs_gset_protected:Npn \__nmc_eval_initialize:
- {
- \tl_set:Nn \l__nmc_dbg_idiii_tl { formula }
+%%%%%%%%%%%% eval-specific routines %%%%%%%%%%%%%
+\cs_set_protected:Npn \__nmc_eval_initialize:
+ {
+ \tl_set:Nn \l__nmc_dbg_idii_tl { formula }
\tl_set:Nn \l__nmc_dbg_idv_tl { stored }
+ \tl_clear:N \l__nmc_show_tl
+ \__nmc_env_initialize:
}
-\cs_gset_protected:Npn \__nmc_eval_settings_digest:
- { \bool_set_true:N \l__nmc_allow_TF_out_bool }
-
-\cs_gset_eq:NN \__nmc_eval_vv_digest:N \__nmc_vv_digest:N
-
-\cs_gset_protected:Npn \__nmc_eval_process:
+\cs_new_protected:Npn \__nmc_env_initialize:
+ {
+ \int_zero:N \l__nmc_env_def_int
+ \bool_set_true:N \l__nmc_allow_TF_out_bool
+ \bool_if:NTF \l__nmc_num_only_bool
+ {
+ \bool_set_false:N \l__nmc_see_formula_bool
+ \bool_set_false:N \l__nmc_see_vv_bool
+ \__nmc_math_env_delims:nn {}{}
+ \tl_clear:N \l__nmc_env_arg_tl
+ \tl_set:Nn \l__nmc_multi_sep_tl { ~ }
+ \int_set:Nn \l__nmc_env_def_int { 2 }
+ }
+ {
+ \mode_if_math:T
+ {
+ \int_incr:N \l__nmc_env_def_int
+ \prop_get:NVNT \g__nmc_envi_prop \@currenvir \l_tmpb_tl
+ {
+ \__nmc_env_params_def:Nnn \l_tmpb_tl { 0 } { 1 }
+ \__nmc_math_env_delims:nn {}{}
+ \tl_clear:N \l__nmc_env_arg_tl
+ \int_incr:N \l__nmc_env_def_int
+ }
+ }
+ }
+ }
+\cs_set_protected:Npn \__nmc_eval_settings:
+ { \__nmc_env_settings: }
+\cs_set_protected:Npn \__nmc_env_settings:
+ {
+ \int_if_zero:nTF \l__nmc_env_def_int % math mode F/T
+ { \exp_args:NV \__nmc_env_s_zero:n \l__nmc_env_s_tl }
+ { \exp_args:NV \__nmc_env_s_one:n \l__nmc_env_s_tl }
+ }
+\cs_new_protected:Npn \__nmc_env_s_zero:n #1
+ {
+ \prop_get:NnNTF \g__nmc_envi_prop { #1 } \l_tmpb_tl
+ {
+ \__nmc_error_what:n { Math~mode~needed~for~\__nmc_verb:n {#1}\
+ environment~in }
+ }
+ {
+ \prop_if_in:NnT \g__nmc_env_prop { #1 }
+ {
+ \__nmc_env_delims_outer:n { #1 }
+ \int_incr:N \l__nmc_env_def_int
+ }
+ }
+ }
+\cs_new_protected:Npn \__nmc_env_s_one:n #1
+ {
+ \int_compare:nNnT { \l__nmc_env_def_int } = { 1 }
+ {
+ \prop_get:NnNT \g__nmc_envi_prop { #1 } \l_tmpb_tl
+ {
+ \__nmc_env_params_def:Nnn \l_tmpb_tl { 1 } { 1 }
+ \int_incr:N \l__nmc_env_def_int
+ }
+ }
+ }
+\cs_set_protected:Npn \__nmc_eval_formula:
+ { \__nmc_env_formula: }
+\cs_new_protected:Npn \__nmc_env_formula:
+ {
+ \__nmc_env_extract_formula:x { \tl_head:N \l__nmc_formula_tl }
+ \int_if_zero:nTF \l__nmc_env_def_int % m mode F, no or invalid env
+ { \exp_args:NVV \__nmc_env_f_zero:nn \l__nmc_env_s_tl \l__nmc_env_f_tl }
+ {
+ \int_compare:nNnT { \l__nmc_env_def_int } = { 1 }
+ { \exp_args:NVV \__nmc_env_f_one:nn
+ \l__nmc_env_s_tl \l__nmc_env_f_tl } % mmode T or set env
+ }
+ \__nmc_env_params_set:oooN \l__nmc_s_equals_tl \l__nmc_s_vv_tl
+ \l__nmc_s_multi_sep_tl \l__nmc_env_s_arg_tl
+ \bool_if:NT \l__nmc_env_rbrace_bool
+ {
+ \exp_args:NV \__nmc_env_rbrace:n \l__nmc_env_rbrace_tl
+ \bool_if:NF \l__nmc_vv_settings_bool
+ { \tl_set:Nn \l__nmc_vv_tl { ,\mskip 12muplus6muminus6mu (vv) } }
+ }
+ }
+\cs_new_protected:Npn \__nmc_env_rbrace:n #1
+ {
+ \prop_if_in:NVT \g__nmc_envi_prop \l__nmc_env_tl
+ {
+ \tl_if_blank:nTF { #1 }
+ { \tl_set:Nn \l__nmcA_tl { .\q_nil } }
+ { \tl_set:Nn \l__nmcA_tl { #1\q_nil } }
+ \__nmc_next:
+ \quark_if_nil:NTF \l__nmcC_tl
+ {
+ \tl_set:Nn \l__nmc_env_sp_rbrace_tl { \right }
+ \tl_set_eq:NN \l__nmc_env_rbrace_tl \l__nmcB_tl
+ }
+ {
+ \tl_concat:NNN \l__nmc_env_sp_rbrace_tl \l__nmcB_tl \right
+ \tl_set_eq:NN \l__nmc_env_rbrace_tl \l__nmcC_tl
+ }
+ \tl_set:Nn \l__nmc_multi_sep_tl { \\ }
+ }
+ }
+\cs_new_protected:Npn \__nmc_env_f_zero:nn #1#2
+ {
+ \prop_get:NnNTF \g__nmc_envi_prop { #2 } \l_tmpb_tl
+ {
+ \__nmc_error_what:n { Math~mode~needed~for~\__nmc_verb:n {#2}\
+ environment~in }
+ }
+ {
+ \prop_get:NnNTF \g__nmc_env_prop { #2 } \l_tmpb_tl
+ { \__nmc_env_params_def:Nnn \l_tmpb_tl { 1 } { 1 } }
+ { \__nmc_env_f_zero_aux:nn { #1 } { #2 } }
+ }
+ }
+\cs_new_protected:Npn \__nmc_env_f_zero_aux:nn #1#2
+ {
+ \bool_if:nTF { \tl_if_blank_p:n { #1 } && \tl_if_blank_p:n { #2 } }
+ {
+ \prop_get:NnN \g__nmc_env_prop { $ } \l_tmpb_tl
+ \__nmc_env_params_def:Nnn \l_tmpb_tl { 0 } { 0 }
+ }
+ {
+ \tl_if_empty:nTF { #1 }
+ { \__nmc_error_what:n { Unknown~math~environment~
+ \__nmc_verb:n { #2 }~in } }
+ {
+ \__nmc_error_where:n { settings }
+ \__nmc_error_what:n { Unknown~math~environment~
+ \__nmc_verb:n { #1 }~in }
+ }
+ }
+ }
+\cs_new_protected:Npn \__nmc_env_f_one:nn #1#2
+ {
+ \prop_get:NnNTF \g__nmc_envi_prop { #2 } \l_tmpb_tl
+ {
+ \__nmc_env_params_def:Nnn \l_tmpb_tl { 1 } { 1 }
+ \mode_if_math:F
+ {
+ \tl_concat:NNN \l__nmc_math_delimi_tl
+ \l__nmc_outer_delimi_tl\l__nmc_math_delimi_tl
+ \tl_concat:NNN \l__nmc_math_delimii_tl
+ \l__nmc_math_delimii_tl \l__nmc_outer_delimii_tl
+ }
+ }
+ {
+ \mode_if_math:TF
+ {
+ \exp_args:NV \__nmc_env_params_def:nn \@currenvir { 0 }
+ \__nmc_math_env_delims:nn {}{}
+ }
+ { \__nmc_env_params_def:nn { #1 } { 1 } }
+ }
+ }
+\cs_new_protected:Npn \__nmc_env_params_def:nn #1#2
+ {
+ \prop_get:NnNTF \g__nmc_env_prop { #1 } \l_tmpb_tl
+ { \__nmc_env_params_def:Nnn \l_tmpb_tl { #2 } { 1 } }
+ {
+ \prop_get:NnN \g__nmc_env_prop { $ } \l_tmpb_tl
+ \__nmc_env_params_def:Nnn \l_tmpb_tl { 0 } { 0 }
+ }
+ }
+\cs_new_protected:Npn \__nmc_env_params_def:Nnn #1#2#3
+ {
+ #1
+ \__nmc_int_to_bool:Nn \l__nmc_see_formula_bool { #2 }
+ \__nmc_int_to_bool:Nn \l__nmc_see_vv_bool { #3 }
+ }
+\cs_new_protected:Npn \__nmc_env_params_set:nnnN #1#2#3#4
+ {
+ \tl_if_empty:nF { #1 } { \tl_set:Nn \l__nmc_equals_tl { #1 } }
+ \bool_if:NT \l__nmc_vv_settings_bool { \tl_set:Nn \l__nmc_vv_tl { #2 } }
+ \tl_if_empty:nF { #3 } { \tl_set:Nn \l__nmc_multi_sep_tl { #3 } }
+ \tl_if_empty:NF { #4 } { \tl_set_eq:NN \l__nmc_env_arg_tl #4 }
+ \int_if_zero:nF { 1 + \l__nmc_see_force_int }
+ {
+ \__nmc_int_to_bool:Nn \l__nmc_see_formula_bool
+ { \l__nmc_see_force_int }
+ }
+ }
+\cs_generate_variant:Nn \__nmc_env_params_set:nnnN { ooo }
+\tl_new:N \l__nmc_env_f_tl
+\cs_new_protected:Npn \__nmc_env_extract_formula:n #1
+ {
+ \str_case:nn {#1}
+ {
+ {$} { \__nmc_env_extract_formula_aux:n {$} }
+ {\(} { \__nmc_env_extract_formula_aux:n {\(} }
+ {\[} { \__nmc_env_extract_formula_aux:n {\[} }
+ {\begin}
+ {
+ \tl_set:Nx \l__nmc_env_f_tl
+ { \tl_item:Nn \l__nmc_formula_tl { 2 } }
+ \tl_set:Nx \l__nmc_formula_tl
+ { \tl_range:Nnn\l__nmc_formula_tl {3}{-3} }
+ }
+ }
+ }
+\cs_generate_variant:Nn \__nmc_env_extract_formula:n { x }
+\cs_new_protected:Npn \__nmc_env_extract_formula_aux:n #1
+ {
+ \tl_set:Nx \l__nmc_formula_tl
+ { \tl_range:Nnn\l__nmc_formula_tl {2}{-2} }
+ \tl_set:Nn \l__nmc_env_f_tl { #1 }
+ }
+\cs_new_protected:Npn \__nmc_math_env_delims:nn #1#2
+ {
+ \tl_set:Nn \l__nmc_math_delimi_tl {#1}
+ \tl_set:Nn \l__nmc_math_delimii_tl {#2}
+ }
+\cs_new_protected:Npn \__nmc_math_env_delims:n #1
+ { \__nmc_math_env_delims:nn { \begin{#1} } { \end{#1} } }
+\cs_new_protected:Npn \__nmc_env_delims_outer:n #1
+ {
+ \str_case:nnF {#1}
+ {
+ {$} { \__nmc_math_env_delims:nn {$}{$} }
+ {\(} { \__nmc_math_env_delims:nn {\(}{\)} }
+ {\[} { \__nmc_math_env_delims:nn {\[}{\]} }
+ }
+ { \__nmc_math_env_delims:n {#1} }
+ \tl_set_eq:NN \l__nmc_outer_delimi_tl \l__nmc_math_delimi_tl
+ \tl_set_eq:NN \l__nmc_outer_delimii_tl \l__nmc_math_delimii_tl
+ }
+\cs_generate_variant:Nn \__nmc_env_delims_outer:n { V }
+%
+\cs_set_protected:Npn \__nmc_eval_vv_digest:N #1
+ { \__nmc_vv_digest:N #1 }
+%
+\cs_set_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
- \bool_if:NF \g__nmc_error_bool
+ % prepare
+ \seq_set_split:NVV \l__nmc_multi_seq
+ \l__nmc_multi_delim_tl \l__nmc_formula_tl
+ \seq_remove_all:Nn \l__nmc_multi_seq {}
+ \int_set:Nn \l__nmc_multi_int { \seq_count:N \l__nmc_multi_seq }
+ % loop: process -> display/debug
+ \seq_map_variable:NNn \l__nmc_multi_seq \l__nmc_formula_tl
{
- \tl_set:Nx \l_nmc_result_tl { \fp_to_tl:n { \l__nmc_fp_expr_tl } }
- \__nmc_error_fpflag:
+ \int_decr:N \l__nmc_multi_int
+ \tl_clear:N \l__nmc_display_tl
+ \tl_set_eq:NN \l__nmc_formula_dup_tl \l__nmc_formula_tl
+ \tl_clear:N \l__nmc_fp_expr_tl
+ \__nmc_fpify:VN \l__nmc_formula_tl \l__nmc_fp_expr_tl
+ \bool_if:NF \g__nmc_error_bool
+ {
+ \tl_set:Nx \l__nmc_result_tl { \fp_to_tl:n { \l__nmc_fp_expr_tl } }
+ \__nmc_error_fpflag:
+ }
+ \bool_if:NT \g__nmc_error_bool
+ { \seq_map_break: }
+ \int_compare:nNnTF { \l__nmc_depth_int } < { 3 }
+ { \__nmc_eval_process_aux: }
+ { \tl_put_right:NV \l__nmc_show_tl \l__nmc_result_tl }
}
+
\int_if_zero:nF \l__nmc_dbg_int
- { \__nmc_dbg_get_data: }
+ {
+ \__nmc_dbg_get_data:
+ \__nmc_if_mod_zero:nnT \l__nmc_dbg_int { 11 }
+ { \__nmc_eval_display: }
+ }
}
-\cs_gset_protected:Npn \__nmc_eval_display:
- {
- \__nmc_num_format:nNnN { \l_nmc_result_tl } \l_nmc_result_tl
+\cs_new_protected:Npn \__nmc_eval_process_aux:
+ {
+ \__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
- {
- \tl_set:Nx \l_nmc_result_tl
+ \tl_put_right:Nx \l__nmc_display_tl
+ {
+ \bool_if:NT \l__nmc_see_formula_bool
+ {
+ \exp_not:o \l__nmc_formula_dup_tl
+ \bool_if:NTF \l__nmc_TF_out_bool
+ { \rightarrow } { \l__nmc_equals_tl }
+ }
+ \exp_not:o \l__nmc_result_tl
+ \bool_if:nT { \l__nmc_see_vv_bool && !\l__nmc_env_rbrace_bool }
+ { \exp_not:o \l__nmc_vv_tl }
+ }
+ \int_if_zero:nF { \l__nmc_multi_int }
+ {
+ \__nmc_eval_rdisplay:ooo \l__nmc_display_tl
+ \l__nmc_multi_punc_tl \l__nmc_multi_sep_tl
+ }
+ }
+\cs_set_protected:Npn \__nmc_eval_display:
+ {
+ \tl_gset:NV \g__nmc_reuse_tl \l__nmc_result_tl
+ \__nmc_eval_rdisplay:ooo \l__nmc_display_tl
+ \l__nmc_punc_tl \l__nmc_math_delimii_tl
+ \bool_if:NTF \l__nmc_env_rbrace_bool
+ {
+ \bool_if:NF \l__nmc_see_vv_bool
+ { \tl_clear:N \l__nmc_vv_tl }
+ \__nmc_eval_rdisplay:ooo \l__nmc_env_sp_rbrace_tl
+ \l__nmc_env_rbrace_tl \l__nmc_vv_tl
+ \__nmc_eval_ldisplay:noo {\left.}
+ \l__nmc_math_delimi_tl \l__nmc_env_arg_tl
+ }
+ {
+ \__nmc_eval_ldisplay:noo {}
+ \l__nmc_math_delimi_tl \l__nmc_env_arg_tl
+ }
+ \__nmc_if_mod_zero:nnF { \l__nmc_dbg_int } { 11 }
+ {
+ \mode_if_math:TF
{
- \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_TF_out_bool
- { \rightarrow } { = }
- }
- \exp_not:o \l_nmc_result_tl
- \bool_if:NTF \l__nmc_vv_multline_bool
- { \exp_not:o \l__nmc_vv_display_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
+ \exp_after:wN \group_end: \l__nmc_show_tl
+ \group_begin:
}
- \int_if_zero:nT { \l__nmc_eval_reuse_int }
- { \tl_gset_eq:NN \g__nmc_reuse_tl \l_nmc_result_tl }
+ { \l__nmc_show_tl }
}
- \l_nmc_result_tl
- }
-% fpify LaTeX math expr %%%%%%%%%%%%%%%%%%%%%%%%%
+ }
+\cs_new_protected:Npn \__nmc_eval_rdisplay:nnn #1#2#3
+ { \tl_put_right:Nn \l__nmc_show_tl { #1 #2 #3 } }
+\cs_generate_variant:Nn \__nmc_eval_rdisplay:nnn { ooo }
+\cs_new_protected:Npn \__nmc_eval_ldisplay:nnn #1#2#3
+ {
+ \tl_if_blank:nTF { #3 }
+ { \tl_put_left:Nn \l__nmc_show_tl { #1 #2 } }
+ { \tl_put_left:Nn \l__nmc_show_tl { #1 #2 {#3} } }
+ }
+\cs_generate_variant:Nn \__nmc_eval_ldisplay:nnn { noo }
+%%%%%%%%%%%% 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
@@ -1183,6 +1605,7 @@
\tl_new:N \l__nmc_fn_arg_tl
\tl_new:N \l__nmc_power_arg_tl
\bool_new:N \l__nmc_hyperbolic_bool
+\bool_new:N \l__nmc_trig_bool
% factorial
\fp_new:N \l__nmc_fact_fp
\tl_new:N \l__nmc_fact_arg_tl
@@ -1200,6 +1623,7 @@
\tl_new:N \l__nmc_summand_tl
\tl_new:N \l__nmc_sum_op_tl
\tl_new:N \l__nmc_sum_type_tl
+\tl_new:N \l__nmc_sum_typei_tl
\tl_new:N \g__nmc_sum_A_tl
\bool_new:N \l__nmc_sum_bool
\int_new:N \l__nmc_sum_index_int
@@ -1213,40 +1637,64 @@
% #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
+ \bool_set_false:N \l__nmc_trig_bool
\tl_clear:N \l__nmc_accum_tl
- \tl_clear:N \l__nmc_C_tl
- \tl_set:Nn \l__nmc_A_tl { #1\q_nil }
- \tl_if_empty:nT { #1 }
+ \tl_clear:N \l__nmcC_tl
+ \tl_if_empty:nTF { #1 }
{ \__nmc_error_what:n { Empty~argument~to~fp-ify~in } }
+ { \tl_set:Nn \l__nmcA_tl { #1\q_nil } }
\bool_until_do:nn
{
- \quark_if_nil_p:N \l__nmc_C_tl
+ \quark_if_nil_p:N \l__nmcC_tl
|| \g__nmc_error_bool
}
- {
+ {
\tl_clear:N \l__nmc_arg_tl
- \__nmc_next:
- \prop_get:NVNTF \g__nmc_class_prop \l__nmc_B_tl \l_tmpb_tl
+ \__nmc_next:
+ \prop_get:NVNTF \g__nmc_class_prop \l__nmcB_tl \l_tmpb_tl
{ \exp_last_unbraced:NV \use_i:nn \l_tmpb_tl }
- { \__nmc_fpify_var: }
+ { \tl_if_empty:NF \l__nmcB_tl { \__nmc_fpify_var: } }
}
\exp_args:NNNV
\group_end:
\tl_put_right:Nn #2 \l__nmc_accum_tl
- }
+ }
\cs_generate_variant:Nn \__nmc_fpify:nN { V }
-
-\cs_new_protected:Npn \__nmc_fpify_unknown:
+% (fpify) #2, append to #1
+\cs_new_protected:Npn \__nmc_accum_fpify_parenth:NN #1#2
{
- \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 } }
+ \group_begin:
+ \tl_clear:N \l_tmpa_tl
+ \__nmc_fpify:VN #2 \l_tmpa_tl
+ \exp_args:NNNV
+ \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
+ {
+ \__nmc_next:
+ \__nmc_accum_fpify_parenth:NN #1 \l__nmcB_tl
+ }
+%%%%%%%%%%
+\cs_new_protected:Npn \__nmc_fpify_unknown:
+ {
+ \exp_args:NnV\str_if_in:nnTF { )]\}\rbrace } \l__nmcB_tl
+ { \__nmc_error_what:n { Unmatched~\__nmc_verb:N\l__nmcB_tl\ in } }
+ {
+ \tl_if_single:NTF \l__nmcB_tl
+ {
+ \__nmc_error_what:n
+ { Unknown~token~\__nmc_verb:V\l__nmcB_tl\ in }
+ }
+ { \__nmc_fpify:VN \l__nmcB_tl \l__nmc_accum_tl } % brace group
+ }
}
-% to avoid e.g. 34 instead of 3*4
+% to ensure e.g. 3*4 instead of 34
\cs_new_protected:Npn \__nmc_insert_aster:
{
\bool_if:NT \l__nmc_insert_aster_bool
@@ -1255,7 +1703,7 @@
\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 { ! }
+ \tl_if_eq:VnF \l__nmcC_tl { ! }
{
\__nmc_insert_aster:
\tl_put_right:NV \l__nmc_accum_tl \l__nmc_fact_arg_tl
@@ -1264,24 +1712,29 @@
}
\cs_new_protected:Npn \__nmc_fpify_var:
{ % ( ) in case var < 0 raised to power
- \prop_get:NVNTF \l__nmc_subst_var_prop \l__nmc_B_tl \l__nmc_subst_tl
+
+ \prop_get:NVNTF \l__nmc_subst_var_prop \l__nmcB_tl \l__nmc_subst_tl
{
\tl_set_eq:NN \l__nmc_fact_arg_tl \l__nmc_subst_tl
- \tl_if_in:noF { ! } \l__nmc_C_tl
+ \tl_if_in:noF { ! } \l__nmcC_tl
{
- \__nmc_accum_fn_parenth:NNn \l__nmc_accum_tl \l__nmc_subst_tl {}
+ \__nmc_accum_fn_parenth:NVn \l__nmc_accum_tl \l__nmc_subst_tl {}
\bool_set_true:N \l__nmc_insert_aster_bool
}
}
- { \__nmc_fpify_unknown: }
+ {
+ \tl_trim_spaces:N \l__nmcB_tl
+ \tl_if_empty:NF \l__nmcB_tl
+ { \__nmc_fpify_unknown:{} }
+ }
}
\cs_new_protected:Npn \__nmc_fpify_const:
{ % if const used as var
- \prop_get:NVNTF \l__nmc_subst_var_prop \l__nmc_B_tl \l__nmc_subst_tl
+ \prop_get:NVNTF \l__nmc_subst_var_prop \l__nmcB_tl \l__nmc_subst_tl
{ \__nmc_fpify_var: }
{
- \prop_get:NVN \g__nmc_subst_fpfn_prop \l__nmc_B_tl \l__nmc_subst_tl
- \tl_if_eq:VnTF \l__nmc_C_tl { ! }
+ \prop_get:NVN \g__nmc_subst_fpfn_prop \l__nmcB_tl \l__nmc_subst_tl
+ \tl_if_eq:VnTF \l__nmcC_tl { ! }
{ \tl_clear:N \l__nmc_fact_arg_tl }
{ \tl_put_right:NV \l__nmc_accum_tl \l__nmc_subst_tl }
\bool_set_true:N \l__nmc_insert_aster_bool
@@ -1289,45 +1742,48 @@
}
\cs_new_protected:Npn \__nmc_fpify_arith:
{
- \tl_put_right:NV \l__nmc_accum_tl \l__nmc_B_tl
+ \tl_put_right:NV \l__nmc_accum_tl \l__nmcB_tl
\bool_set_false:N \l__nmc_insert_aster_bool
}
\cs_new_protected:Npn \__nmc_fpify_slash:
- {
- \tl_put_right:NV \l__nmc_accum_tl \l__nmc_B_tl
+ {
+ \tl_put_right:NV \l__nmc_accum_tl \l__nmcB_tl
\__nmc_delim_arg:Nnn \l__nmc_arg_tl { 1 } { \c__nmc_uny_int }
\__nmc_accum_fpify_parenth:NN \l__nmc_accum_tl \l__nmc_arg_tl
\bool_set_true:N \l__nmc_insert_aster_bool
}
\cs_new_protected:Npn \__nmc_fpify_arith_alt:
{
- \prop_get:NVN \g__nmc_subst_fpfn_prop \l__nmc_B_tl \l__nmc_B_tl
- \tl_put_right:NV \l__nmc_accum_tl \l__nmc_B_tl
+ \prop_get:NVN \g__nmc_subst_fpfn_prop \l__nmcB_tl \l__nmcB_tl
+ \tl_put_right:NV \l__nmc_accum_tl \l__nmcB_tl
\bool_set_false:N \l__nmc_insert_aster_bool
}
\cs_new_protected:Npn \__nmc_fpify_comparison:
{
- \tl_if_in:noTF { <=> } \l__nmc_C_tl
- { \__nmc_error_what:n { Multi-token~comparison~in } }
+ \tl_if_in:noTF { <=> } \l__nmcC_tl
+ {
+ \tl_concat:NNN \l_tmpa_tl \l__nmcB_tl \l__nmcC_tl
+ \__nmc_next:
+ }
{
- \prop_get:NVNF \g__nmc_subst_fpfn_prop \l__nmc_B_tl \l_tmpa_tl
- { \tl_set_eq:NN \l_tmpa_tl \l__nmc_B_tl } % < = >
- \__nmc_delim_arg:Nnn \l__nmc_arg_tl { 1 } { \c__nmc_cmp_int }
- \tl_clear:N \l_tmpb_tl
- \__nmc_fpify:VN \l__nmc_arg_tl \l_tmpb_tl
- \bool_if:NF \g__nmc_error_bool
- {
- \__nmc_accum_fn_parenth:NNn \l__nmc_accum_tl \l_tmpb_tl { - }
- \tl_set:Nx \l__nmc_accum_tl
- { round( \l__nmc_accum_tl, \int_use:N \l__nmc_round_int ) }
- \tl_put_right:NV \l__nmc_accum_tl \l_tmpa_tl
- \tl_put_right:Nn \l__nmc_accum_tl { 0 }
- }
+ \prop_get:NVNF \g__nmc_subst_fpfn_prop \l__nmcB_tl \l_tmpa_tl
+ { \tl_set_eq:NN \l_tmpa_tl \l__nmcB_tl } % < = >
+ }
+ \__nmc_delim_arg:Nnn \l__nmc_arg_tl { 1 } { \c__nmc_cmp_int }
+ \tl_clear:N \l_tmpb_tl
+ \__nmc_fpify:VN \l__nmc_arg_tl \l_tmpb_tl
+ \bool_if:NF \g__nmc_error_bool
+ {
+ \__nmc_accum_fn_parenth:NVn \l__nmc_accum_tl \l_tmpb_tl { - }
+ \tl_set:Nx \l__nmc_accum_tl
+ { round( \l__nmc_accum_tl, \int_use:N \l__nmc_round_int ) }
+ \tl_put_right:NV \l__nmc_accum_tl \l_tmpa_tl
+ \tl_put_right:Nn \l__nmc_accum_tl { 0 }
}
}
\cs_new_protected:Npn \__nmc_fpify_andor:
{
- \prop_get:NVN \g__nmc_subst_fpfn_prop \l__nmc_B_tl \l_tmpa_tl
+ \prop_get:NVN \g__nmc_subst_fpfn_prop \l__nmcB_tl \l_tmpa_tl
\tl_put_right:NV \l__nmc_accum_tl \l_tmpa_tl
\__nmc_delim_arg:Nnn \l__nmc_arg_tl { 1 } { \c__nmc_and_int }
\tl_clear:N \l_tmpa_tl
@@ -1337,9 +1793,9 @@
}
\cs_new_protected:Npn \__nmc_fpify_lparen:
{
- \__nmc_get_arg_L:VN \l__nmc_B_tl \l__nmc_arg_tl
+ \__nmc_get_arg_L:VN \l__nmcB_tl \l__nmc_arg_tl
\tl_set_eq:NN \l__nmc_fact_arg_tl \l__nmc_arg_tl
- \tl_if_eq:VnTF \l__nmc_C_tl { ! }
+ \tl_if_eq:VnTF \l__nmcC_tl { ! }
{ \bool_set_false:N \l__nmc_insert_aster_bool }
{
\__nmc_accum_fpify_parenth:NN \l__nmc_accum_tl \l__nmc_arg_tl
@@ -1348,21 +1804,21 @@
}
\cs_new_protected:Npn \__nmc_fpify_lvert:
{
- \tl_if_eq:VnTF \l__nmc_B_tl { | }
+ \tl_if_eq:VnTF \l__nmcB_tl { | }
{
\tl_set:Nn \l__nmc_L_tl { \lvert }
\__nmc_absval_arg:N \l__nmc_arg_tl
\tl_set:Nn \l__nmc_R_tl { \rvert }
}
{
- \tl_set_eq:NN \l__nmc_L_tl \l__nmc_B_tl
- \__nmc_get_arg_L:VN \l__nmc_B_tl \l__nmc_arg_tl
+ \tl_set_eq:NN \l__nmc_L_tl \l__nmcB_tl
+ \__nmc_get_arg_L:VN \l__nmcB_tl \l__nmc_arg_tl
}
\__nmc_fpify_lvert_aux:
}
\cs_new_protected:Npn \__nmc_fpify_lvert_aux:
{
- \tl_if_eq:VnTF \l__nmc_C_tl { ! }
+ \tl_if_eq:VnTF \l__nmcC_tl { ! }
{
\tl_set:NV \l__nmc_fact_arg_tl \l__nmc_L_tl
\tl_put_right:NV \l__nmc_fact_arg_tl \l__nmc_arg_tl
@@ -1390,13 +1846,13 @@
}
\cs_new_protected:Npn \__nmc_fpify_lmod:
{
- \tl_set_eq:NN \l__nmc_L_tl \l__nmc_B_tl
+ \tl_set_eq:NN \l__nmc_L_tl \l__nmcB_tl
\prop_get:NVN \g__nmc_subst_misc_prop \l__nmc_L_tl \l__nmc_R_tl
- \str_case:on \l__nmc_C_tl
+ \str_case:on \l__nmcC_tl
{
{ | } { \__nmc_fpify_lmod_abs:V \l__nmc_L_tl }
- { . } { \__nmc_fpify_lmod_aux:V \l__nmc_L_tl }
- { / }
+ { . } { \__nmc_next: } %\__nmc_fpify_lmod_aux:V \l__nmc_L_tl }
+ { / } %{ \__nmc_next: }
{
\tl_put_right:Nn \l__nmc_accum_tl { / }
\__nmc_fpify_lmod_aux:V \l__nmc_L_tl
@@ -1404,7 +1860,7 @@
}
}
\cs_new_protected:Npn \__nmc_fpify_lmod_abs:n #1
- {
+ {
\__nmc_next:
\tl_put_right:Nn \l__nmc_accum_tl { abs( }
\exp_args:NNNV\__nmc_get_arg_LR:NNN { #1 } \l__nmc_arg_tl \l__nmc_R_tl
@@ -1418,10 +1874,10 @@
\cs_generate_variant:Nn \__nmc_fpify_lmod_abs:n { V }
\cs_new_protected:Npn \__nmc_fpify_lmod_aux:n #1
- {
+ {
\__nmc_next:
\exp_args:NNNV\__nmc_get_arg_LR:NNN #1 \l__nmc_arg_tl \l__nmc_R_tl
- \tl_if_eq:VnT \l__nmc_C_tl { . }
+ \tl_if_eq:VnT \l__nmcC_tl { . }
{ \__nmc_next: }
\tl_clear:N \l_tmpa_tl
\__nmc_fpify:VN \l__nmc_arg_tl \l_tmpa_tl
@@ -1432,20 +1888,23 @@
\cs_new_protected:Npn \__nmc_fpify_rmod:
{
- \tl_if_eq:VnT \l__nmc_C_tl { . }
+ \tl_if_eq:VnT \l__nmcC_tl { . }
{ \__nmc_next: }
}
-\cs_new_protected:Npn \__nmc_fpify_unary:n #1
+\cs_new_protected:Npn \__nmc_fpify_unary:
{
- \tl_set:NV \l__nmc_fn_tl \l__nmc_B_tl
- \tl_if_eq:VnTF \l__nmc_C_tl { ^ }
+ \tl_set:NV \l__nmc_fn_tl \l__nmcB_tl
+ \tl_if_eq:VnTF \l__nmcC_tl { ^ }
{ \__nmc_fpify_unary_superscript: }
{ \prop_get:NVN \g__nmc_subst_fpfn_prop \l__nmc_fn_tl \l__nmc_fn_tl }
\str_if_in:NnTF \l__nmc_fn_tl { h }
{ \bool_set_true:N \l__nmc_hyperbolic_bool }
- { \bool_set_false:N \l__nmc_hyperbolic_bool }
+ {
+ \bool_set_false:N \l__nmc_hyperbolic_bool
+ \bool_set_true:N \l__nmc_trig_bool
+ }
% get fn arg
- \__nmc_delim_arg:Nnn \l__nmc_arg_tl { 1 } { #1 }
+ \__nmc_delim_arg:Nnn \l__nmc_arg_tl { 1 } { \c__nmc_uny_int }
\tl_clear:N \l__nmc_fn_arg_tl
\__nmc_fpify:VN \l__nmc_arg_tl \l__nmc_fn_arg_tl
\bool_if:NT \l__nmc_hyperbolic_bool
@@ -1457,7 +1916,7 @@
\bool_if:NTF \l__nmc_hyperbolic_bool
{ \tl_put_right:NV \l__nmc_accum_tl \l__nmc_fn_tl }
{
- \__nmc_accum_fn_parenth:NNn \l__nmc_accum_tl
+ \__nmc_accum_fn_parenth:NVn \l__nmc_accum_tl
\l__nmc_fn_arg_tl \l__nmc_fn_tl
}
\bool_if:NT \l__nmc_superscript_bool
@@ -1505,6 +1964,11 @@
{ acoth } { ( 0.5 ln( ((#1)+1)/((#1)-1) ) ) }
}
}
+\cs_new_protected:Npn \__nmc_fpify_degree:
+ {
+ \bool_if:NF \l__nmc_deg_bool
+ { \tl_put_right:Nn \l__nmc_accum_tl { (0.0174532925199433) } }
+ }
\cs_new_protected:Npn \__nmc_fpify_power:
{
\tl_put_right:Nn \l__nmc_accum_tl { ^ }
@@ -1522,10 +1986,10 @@
}
\cs_new_protected:Npn \__nmc_fpify_unarybrace:
{
- \prop_get:NVN \g__nmc_subst_fpfn_prop \l__nmc_B_tl \l__nmc_subst_tl
- \tl_if_eq:VnT \l__nmc_C_tl { * }
+ \prop_get:NVN \g__nmc_subst_fpfn_prop \l__nmcB_tl \l__nmc_subst_tl
+ \tl_if_eq:VnT \l__nmcC_tl { * }
{ \__nmc_next: }
- \tl_if_eq:VnTF \l__nmc_C_tl { [ }
+ \tl_if_eq:VnTF \l__nmcC_tl { [ }
{ % n-th root
\tl_if_eq:VnTF \l__nmc_subst_tl { sqrt }
{
@@ -1544,24 +2008,30 @@
{
\tl_set_eq:NN \l_tmpa_tl \l__nmc_subst_tl
\__nmc_fpify_next_braced:N \l_tmpa_tl
- \tl_if_eq:VnTF \l__nmc_C_tl { ! }
+ \tl_if_eq:VnTF \l__nmcC_tl { ! }
{ \__nmc_fpify_ubrace_fact: }
{ \tl_put_right:NV \l__nmc_accum_tl \l_tmpa_tl }
}
\cs_new_protected:Npn \__nmc_fpify_ubrace_n:
- {
- \__nmc_error_where:n { [~]~argument~of~\__nmc_verb:n { \sqrt } }
+ {
+ \__nmc_error_where:n { \textbackslash sqrt }
\tl_clear:N \l__nmc_arg_tl
\tl_clear:N \l__nmc_ubrace_n_tl
+ \tl_put_right:Nn \l__nmc_accum_tl { ( }
\__nmc_get_arg_LR:NNN [ \l__nmc_arg_tl ]
\__nmc_fpify:VN \l__nmc_arg_tl \l__nmc_ubrace_n_tl
- \__nmc_intify:Nn \l__nmc_ubrace_n_tl { 1 }
+ \tl_set:Nx \l__nmc_ubrace_n_tl { \fp_to_int:n \l__nmc_ubrace_n_tl }
+ \int_compare:nNnF { \l__nmc_ubrace_n_tl } > { 0 }
+ {
+ \__nmc_error_what:n
+ { Integer~$>0$~required~for~[arg]~of }
+ }
\bool_if:NF \g__nmc_error_bool
{
\seq_gpop:NN \g__nmc_error_where_seq \l__nmc_toss_tl
\__nmc_next:
\tl_clear:N \l_tmpa_tl
- \__nmc_fpify:VN \l__nmc_B_tl \l_tmpa_tl
+ \__nmc_fpify:VN \l__nmcB_tl \l_tmpa_tl
\bool_if:nTF
{
\fp_compare_p:nNn { \l_tmpa_tl } < { 0 }
@@ -1573,6 +2043,7 @@
{ \__nmc_fpify_ubrace_n_aux:VV {\l_tmpa_tl}{ \l__nmc_ubrace_n_tl }}
}
}
+ \tl_put_right:Nn \l__nmc_accum_tl { ) }
}
\cs_new:Npn \__nmc_fpify_ubrace_n_aux:nn #1#2
{ sign( #1 )( abs( #1 ) )^( 1/( #2 ) ) }
@@ -1590,16 +2061,16 @@
}
{
\tl_put_right:Nx \l__nmc_fact_arg_tl
- { { \exp_not:o \l__nmc_B_tl } }
+ { { \exp_not:o \l__nmcB_tl } }
}
}
}
\cs_new_protected:Npn \__nmc_fpify_unarysub:
{ % e.g. \log_{10}
- \str_if_eq:VnTF \l__nmc_C_tl { _ }
+ \str_if_eq:VnTF \l__nmcC_tl { _ }
{
\__nmc_next: \__nmc_next:
- \__nmc_fpify_unarysub:N \l__nmc_B_tl
+ \__nmc_fpify_unarysub:N \l__nmcB_tl
}
{ \__nmc_fpify_unarysub:N \l__nmc_log_base_tl }
}
@@ -1621,13 +2092,13 @@
}
\bool_if:NF \g__nmc_error_bool
{
- \__nmc_accum_fn_parenth:NNn \l__nmc_accum_tl \l_tmpa_tl {}
- \tl_put_left:Nn \l__nmc_A_tl { \ln }
+ \__nmc_accum_fn_parenth:NVn \l__nmc_accum_tl \l_tmpa_tl {}
+ \tl_put_left:Nn \l__nmcA_tl { \ln }
}
}
\cs_new_protected:Npn \__nmc_fpify_surd:
{
- \prop_get:NVN \g__nmc_subst_fpfn_prop \l__nmc_B_tl \l__nmc_subst_tl
+ \prop_get:NVN \g__nmc_subst_fpfn_prop \l__nmcB_tl \l__nmc_subst_tl
\tl_put_right:NV \l__nmc_accum_tl \l__nmc_subst_tl
\tl_clear:N \l__nmc_arg_tl
\__nmc_delim_arg:Nnn \l__nmc_arg_tl { 1 } { \c__nmc_srd_int }
@@ -1640,29 +2111,35 @@
\__nmc_error_where:n { factorial }
\tl_clear:N \l_tmpa_tl
\__nmc_fpify:VN \l__nmc_fact_arg_tl \l_tmpa_tl
- \tl_if_eq:VnTF \l__nmc_C_tl { ! }
- { \__nmc_fpify_fact_repeated: }
- {
- \__nmc_intify:Nn \l_tmpa_tl { 0 }
- \bool_if:NF \g__nmc_error_bool
- {
- \seq_gpop:NN \g__nmc_error_where_seq \l__nmc_toss_tl
- \__nmc_accum_fn_parenth:NNn \l__nmc_accum_tl \l_tmpa_tl { fact }
+ \bool_if:NF \g__nmc_error_bool
+ {
+ \tl_set:Nx \l_tmpa_tl { \fp_to_int:n \l_tmpa_tl }
+ \tl_if_eq:VnTF \l__nmcC_tl { ! }
+ { \__nmc_fpify_fact_repeated: }
+ {
+ \int_compare:nNnTF { \l_tmpa_tl } < { 0 }
+ { \__nmc_error_what:n { Integer~$\ge 0$~required~in } }
+ {
+ \seq_gpop:NN \g__nmc_error_where_seq \l__nmc_toss_tl
+ \__nmc_accum_fn_parenth:NVn \l__nmc_accum_tl
+ \l_tmpa_tl { fact }
+ }
}
}
\bool_set_true:N \l__nmc_insert_aster_bool
}
\cs_new_protected:Npn \__nmc_fpify_fact_repeated:
{
- \__nmc_intify:Nn \l_tmpa_tl { -1 }
- \bool_if:NF \g__nmc_error_bool
+ \int_compare:nNnTF { \l_tmpa_tl } < { -1 }
+ {
+ \__nmc_error_what:n
+ { Integer~$\ge -1$~required~for~double~factorial~in }
+ }
{
- \seq_gpop:NN \g__nmc_error_where_seq \l__nmc_toss_tl
\__nmc_fpify_double_fact:N \l_tmpa_tl
\tl_set:Nx \l_tmpa_tl { \fp_use:N \l__nmc_fact_fp }
- \tl_if_eq:VnTF \l__nmc_C_tl { ! }
- { \tl_set_eq:NN \l__nmc_fact_arg_tl \l_tmpa_tl }
- { \__nmc_accum_fn_parenth:NNn \l__nmc_accum_tl \l_tmpa_tl {} }
+ \__nmc_accum_fn_parenth:NVn \l__nmc_accum_tl \l_tmpa_tl {}
+ \seq_gpop:NN \g__nmc_error_where_seq \l__nmc_toss_tl
}
}
\cs_new_protected:Npn \__nmc_fpify_double_fact:N #1
@@ -1677,23 +2154,17 @@
{ \fp_set:Nn \l__nmc_fact_fp { 1 } }
}
% multiply nos from #1 to #2, put in \l__nmc_fact_fp
-% #3 = 1 (!), = 2 (!!)
+% step #3 = 1 (!), = 2 (!!)
\cs_new_protected:Npn \__nmc_fpify_fact_do:nNn #1#2#3
{
- \fp_set:Nn \l_tmpa_fp { #1 }
- \fp_set:Nn \l_tmpb_fp { #2 }
- \int_set:Nn \l_tmpb_int { #3 }
- \fp_set_eq:NN \l__nmc_fact_fp \l_tmpa_fp
- \fp_while_do:nNnn { \l_tmpa_fp } < { \l_tmpb_fp }
- {
- \fp_add:Nn \l_tmpa_fp { \l_tmpb_int }
- \fp_set:Nn \l__nmc_fact_fp { \l__nmc_fact_fp * \l_tmpa_fp }
- }
+ \fp_set:Nn \l__nmc_fact_fp { #1 }
+ \int_step_inline:nnnn { #1 + #3 } { #3 } { #2 }
+ { \fp_set:Nn \l__nmc_fact_fp { \l__nmc_fact_fp * ##1 } }
}
\cs_new_protected:Npn \__nmc_fpify_nary:
- {
+ {
\bool_set_true:N \l__nmc_comma_nary_bool
- \str_case:on \l__nmc_B_tl
+ \str_case:on \l__nmcB_tl
{
{ \gcd } { \__nmc_fpify_nary_gcd: }
{ \max } { \__nmc_fpify_nary_maxmin: }
@@ -1705,10 +2176,10 @@
{
\__nmc_insert_aster:
\__nmc_delim_arg:Nnn \l__nmc_arg_tl { 1 } { \c_max_int }
- \tl_set:Nx \l__nmc_arg_tl { \tl_range:Nnn \l__nmc_arg_tl { 2 } { -2 } }
+ \tl_set:Nx \l__nmc_arg_tl { \tl_range:Nnn \l__nmc_arg_tl { 2 } { -2 } }
\tl_clear:N \l_tmpa_tl
\__nmc_fpify:VN \l__nmc_arg_tl \l_tmpa_tl
- \seq_set_split:NnV \l_tmpa_seq {,} \l_tmpa_tl
+ \seq_set_split:NnV \l_tmpa_seq {,} \l_tmpa_tl % , for l3fp
% eval. 1st expr.
\seq_pop:NN \l_tmpa_seq \l_tmpb_tl
\int_set:Nn \l_tmpb_int { \fp_to_int:n \l_tmpb_tl }
@@ -1718,7 +2189,6 @@
\int_set:Nn \l_tmpa_int { \int_max:nn { \l_tmpd_int } { \l_tmpb_int } }
\int_set:Nn \l_tmpb_int { \int_min:nn { \l_tmpd_int } { \l_tmpb_int } }
\int_set:Nn \l_tmpc_int { \int_mod:nn { \l_tmpa_int } { \l_tmpb_int } }
-
\int_until_do:nNnn { \l_tmpc_int } = { 0 }
{
\int_set_eq:NN \l_tmpa_int \l_tmpb_int
@@ -1731,9 +2201,9 @@
\bool_set_false:N \l__nmc_insert_aster_bool
}
\cs_new_protected:Npn \__nmc_fpify_nary_maxmin:
- {
- \prop_get:NVN \g__nmc_subst_fpfn_prop \l__nmc_B_tl \l__nmc_subst_tl
- \__nmc_delim_arg:Nnn \l__nmc_arg_tl { 1 } { \c_max_int }
+ {
+ \prop_get:NVN \g__nmc_subst_fpfn_prop \l__nmcB_tl \l__nmc_subst_tl
+ \__nmc_delim_arg:Nnn \l__nmc_arg_tl { 1 } { \c_max_int }
\tl_clear:N \l_tmpa_tl
\__nmc_fpify:VN \l__nmc_arg_tl \l_tmpa_tl
% em-brace in case nested
@@ -1742,16 +2212,18 @@
\bool_set_true:N \l__nmc_insert_aster_bool
}
\cs_new_protected:Npn \__nmc_fpify_comma:
- {
- \tl_put_right:Nn \l__nmc_accum_tl { , }
+ {
+ \tl_put_right:Nn \l__nmc_accum_tl {,}
\bool_set_false:N \l__nmc_insert_aster_bool
}
\cs_new_protected:Npn \__nmc_fpify_binom:
{
\__nmc_fpify_next_braced:N \l__nmc_binom_top_tl
\__nmc_fpify_next_braced:N \l__nmc_binom_bot_tl
- \__nmc_error_where:n { 2nd~argument~of~\__nmc_verb:n { \binom } }
- \__nmc_intify:Nn \l__nmc_binom_bot_tl { 0 }
+ \__nmc_error_where:n { binomial~coeff }
+ \tl_set:Nx \l__nmc_binom_bot_tl { \fp_to_int:n \l__nmc_binom_bot_tl }
+ \int_compare:nNnT \l__nmc_binom_bot_tl < { 0 }
+ { \__nmc_error_what:n {Integer~$\ge 0$~required~in~\{arg2\}~of } }
\bool_if:NF \g__nmc_error_bool
{
\seq_gpop:NN \g__nmc_error_where_seq \l__nmc_toss_tl
@@ -1765,28 +2237,27 @@
\int_if_zero:nTF { #2 }
{ \tl_put_right:Nn \l__nmc_accum_tl { 1 } }
{ % calc. top
- \__nmc_fpify_binom_calc_do:nN { #1 - #2 + 1 } #1
+ \fp_set:Nn \l_tmpa_fp { #1 }
+ \int_step_inline:nnnn { 1 } { 1 } { #2 - 1 }
+ { \fp_set:Nn \l_tmpa_fp { \l_tmpa_fp * ( #1 - ##1 ) } }
+ \tl_put_right:Nx \l__nmc_accum_tl { \fp_use:N \l_tmpa_fp }
\tl_put_right:Nn \l__nmc_accum_tl { / }
- \__nmc_fpify_binom_calc_do:nN { 1 } #2 % calc. bot.
+ \__nmc_fpify_fact_do:nNn { 1 } #2 { 1 }
+ \tl_put_right:Nx \l__nmc_accum_tl { \fp_use:N \l__nmc_fact_fp }
}
\tl_put_right:Nn \l__nmc_accum_tl { ) }
}
-\cs_new_protected:Npn \__nmc_fpify_binom_calc_do:nN #1 #2
- {
- \__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_font:
{
\__nmc_next:
- \__nmc_accum_fpify_parenth:NN \l__nmc_accum_tl \l__nmc_B_tl
+ \__nmc_accum_fpify_parenth:NN \l__nmc_accum_tl \l__nmcB_tl
}
\cs_new_protected:Npn \__nmc_fpify_splitfrac:
{
\__nmc_next:
- \tl_set_eq:NN \l_tmpb_tl \l__nmc_B_tl
+ \tl_set_eq:NN \l_tmpb_tl \l__nmcB_tl
\__nmc_next:
- \tl_put_right:NV \l_tmpb_tl \l__nmc_B_tl
+ \tl_put_right:NV \l_tmpb_tl \l__nmcB_tl
\__nmc_accum_fpify_parenth:NN \l__nmc_accum_tl \l_tmpb_tl
}
% \cs { m }, \cs { o m }, \cs { * m }
@@ -1794,7 +2265,7 @@
{ \__nmc_next: }
\cs_new_protected:Npn \__nmc_fpify_absorb_om:
{
- \str_if_eq:VnT \l__nmc_C_tl { [ }
+ \str_if_eq:VnT \l__nmcC_tl { [ }
{
\__nmc_next:
\__nmc_get_arg_LR:NNN [ \l__nmc_toss_tl ]
@@ -1803,7 +2274,7 @@
}
\cs_new_protected:Npn \__nmc_fpify_absorb_sm:
{
- \str_if_eq:VnT \l__nmc_C_tl { * }
+ \str_if_eq:VnT \l__nmcC_tl { * }
{ \__nmc_next: }
\__nmc_next:
}
@@ -1813,16 +2284,34 @@
\__nmc_fpify_next_braced:N \l__nmc_accum_tl
\bool_set_true:N \l__nmc_insert_aster_bool
}
+\regex_new:N \l__nmc_glue_regex
+\regex_set:Nn \l__nmc_glue_regex
+ { (\d+\s*mu)|(\1\s*plus\s*\d+\s*mu)|\2\s*minus\s*\d+\s*mu }
+\cs_new_protected:Npn \__nmc_fpify_mkern:
+ {
+ \exp_args:NV \token_if_eq_catcode:NNTF \l__nmcC_tl \mkern
+ { \__nmc_next: }
+ {
+ \regex_replace_case_once:nNT
+ {
+ { \d+\s*mu\s*plus\s*\d+\s*mu\s*minus\s*\d+\s*mu } {}
+ { \d+\s*mu\s*plus\s*\d+\s*mu } {}
+ { \d+\s*mu\s*minus\s*\d+\s*mu } {}
+ { \d+\s*mu } {}
+ } \l__nmcA_tl
+ { \tl_set:Nx \l__nmcC_tl { \tl_head:N \l__nmcA_tl } }
+ }
+ }
\cs_new_protected:Npn \__nmc_fpify_BE:
{
\__nmc_next:
- \tl_if_in:VnT \l__nmc_B_tl { alignat }
+ \tl_if_in:VnT \l__nmcB_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
+ { % \cm { s O m O O }
+ % \__nmc_insert_aster:
+ \prop_get:NoNT \g__nmc_subst_misc_prop \l__nmcB_tl \l_tmpa_tl
{
\exp_args:NV \__nmc_cmd:n \l_tmpa_tl
\bool_set_false:N \l__nmc_insert_aster_bool
@@ -1830,65 +2319,79 @@
}
}
\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 { * }
+ { % #1=id; \cm { s O m O O }
+ \tl_put_right:Nn \l__nmc_accum_tl { ( }
+ \tl_set:Nn \l__nmc_arg_tl { {#1} }
+ \tl_if_eq:VnT \l__nmcC_tl { * }
{ \__nmc_next: }
\bool_set_true:N \l__nmc_num_only_bool
- \__nmc_append_sqbrarg: % settings
+ \__nmc_get_sqbrarg:N \l__nmc_arg_tl % 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 { ( }
+ \tl_put_right:Nx \l__nmc_arg_tl { { \exp_not:o \l__nmcB_tl } }
+ \__nmc_get_sqbrarg:N \l__nmc_arg_tl % vv
+ \__nmc_get_sqbrarg:N \l__nmc_arg_tl % num format
\group_begin:
- \int_add:Nn \l__nmc_depth_int { 2 }
- \exp_last_unbraced:No \__nmc_inputs_get:nnnnn \l__nmc_delim_arg_tl
+ \int_add:Nn \l__nmc_depth_int { 2 }
+ \exp_last_unbraced:No \__nmc_cmd_aux:nnnnn \l__nmc_arg_tl
+ \bool_if:nT { \l__nmc_round_bool && !\g__nmc_error_bool }
+ {
+ \tl_set:Nx \l__nmc_result_tl
+ { \fp_eval:n { round(\l__nmc_result_tl, \l__nmc_round_int) } }
+ }
+ \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_cmd_aux:nnnnn #1#2#3#4#5
+ {
+ \__nmc_initialize:n { #1 }
+ \__nmc_formula:nn {#1} {#3}
+ \bool_if:NF \g__nmc_error_bool
+ { \__nmc_settings:nn {#1} {#2} }
+ \bool_if:NF \g__nmc_error_bool
+ { \__nmc_trailing_args:nnn {#1} {#4} {#5} }
\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:
+\cs_new_protected:Npn \__nmc_get_sqbrarg:N #1
{
- \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 } }
+ \tl_if_eq:VnTF \l__nmcC_tl { [ }
+ {
+ \__nmc_next:
+ \tl_clear:N \l_tmpa_tl
+ \__nmc_get_arg_LR:NNN [ \l_tmpa_tl ]
+ \tl_put_right:Nx #1 { { \exp_not:o \l_tmpa_tl } }
+ }
+ { \tl_put_right:Nn #1 { {} } }
}
% sum/prod %%%%%%%%%%%%%%%%%%
\cs_new_protected:Npn \__nmc_fpify_sum:
{
\__nmc_insert_aster:
\group_begin:
- \tl_if_eq:VnTF \l__nmc_B_tl { \sum }
+ \tl_if_eq:VnTF \l__nmcB_tl { \sum }
{ % sum
\tl_set:Nn \l__nmc_sum_op_tl { + }
\fp_zero:N \l__nmc_sum_total_fp
\fp_set:Nn \l__nmc_sum_prev_fp { 1 }
\tl_set:Nn \l__nmc_sum_type_tl { sum }
+ \tl_set:Nn \l__nmc_sum_typei_tl { summation }
\bool_set_true:N \l__nmc_sum_bool
}
{ % product
\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 { prod }
+ \tl_set:Nn \l__nmc_sum_type_tl { product }
+ \tl_set:Nn \l__nmc_sum_typei_tl { product }
\bool_set_false:N \l__nmc_sum_bool
}
\__nmc_error_where:n { \l__nmc_sum_type_tl }
\bool_if:NF \g__nmc_error_bool
{
- \__nmc_error_where:n { \l__nmc_sum_type_tl~\ limits }
+ \__nmc_error_where:n { \l__nmc_sum_type_tl }
\__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
@@ -1897,19 +2400,19 @@
{ \group_end: }
{ % get the summand/multiplicand
\__nmc_delim_arg:Nnn \l__nmc_arg_tl { 1 } { \c__nmc_sum_int }
- \tl_if_eq:VnF \l__nmc_C_tl { ( }
+ \tl_if_eq:VnF \l__nmcC_tl { ( }
{ \__nmc_parenth:N \l__nmc_arg_tl }
\tl_set_eq:NN \l__nmc_summand_tl \l__nmc_arg_tl
% do the sum/prod
\__nmc_error_where:n { \l__nmc_sum_type_tl }
\__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
+ \tl_gset_eq:NN \g_tmpa_tl \l__nmcA_tl
+ \tl_gset_eq:NN \g_tmpb_tl \l__nmcC_tl
\exp_args:NNNV
\group_end:
\fp_set:Nn \l__nmc_sum_total_fp { \l__nmc_sum_total_fp }
- \tl_set_eq:NN \l__nmc_A_tl \g_tmpa_tl
- \tl_set_eq:NN \l__nmc_C_tl \g_tmpb_tl
+ \tl_set_eq:NN \l__nmcA_tl \g_tmpa_tl
+ \tl_set_eq:NN \l__nmcC_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
@@ -1917,7 +2420,7 @@
}
\cs_new_protected:Npn \__nmc_sum_get_limits:NNN #1#2#3
{ % #1 (tl) sum var #2, #3 (ints) lower, upper limits
- \str_if_eq:VnTF \l__nmc_C_tl { _ }
+ \str_if_eq:VnTF \l__nmcC_tl { _ }
{
\__nmc_sum_limit_lower:NN #1#2
\bool_if:NF \g__nmc_error_bool
@@ -1934,32 +2437,31 @@
\bool_if:NT \l__nmc_multitok_bool
{ % may not be in vv-list
\seq_clear:N \l_tmpc_seq
- \seq_push:NV \l_tmpc_seq \l__nmc_B_tl
- \__nmc_prep_multitok:NN \l_tmpc_seq \l__nmc_A_tl
- \seq_pop:NN \l_tmpc_seq \l__nmc_B_tl
+ \seq_push:NV \l_tmpc_seq \l__nmcB_tl
+ \__nmc_prep_multitok:NN \l_tmpc_seq \l__nmcA_tl
+ \seq_pop:NN \l_tmpc_seq \l__nmcB_tl
}
- \str_if_in:NnTF \l__nmc_B_tl { = }
+ \str_if_in:NnTF \l__nmcB_tl { = }
{
- \__nmc_vv_get_vars_vals_lims:NN \l__nmc_B_tl \c_empty_prop
+ \__nmc_vv_get_vars_vals_lims:NN \l__nmcB_tl \c_empty_prop
\tl_set_eq:NN #1 \l__nmc_eq_var_tl
- \__nmc_sum_limit_assign:NN #2 \l__nmc_vv_fp_expr_tl
- \seq_if_in:NVF \l__nmc_calc_fn_seq \l__nmc_B_tl
- { \seq_put_left:NV \l__nmc_calc_fn_seq \l__nmc_B_tl }
+ \__nmc_sum_limit_assign:NNn #2 \l__nmc_vv_fp_expr_tl { lower }
+ \seq_if_in:NVF \l__nmc_calc_fn_seq \l__nmcB_tl
+ { \seq_put_left:NV \l__nmc_calc_fn_seq \l__nmcB_tl }
}
{
\__nmc_error_what:n
- { No~\__nmc_verb:V \l__nmc_sum_type_tl\ variable~in }
+ { No~\l__nmc_sum_typei_tl\ variable~in }
}
}
\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_vv_get_vars_vals_lims:NN \l__nmcB_tl \c_empty_prop
\bool_if:NF \g__nmc_error_bool
- { \__nmc_sum_limit_assign:NN #1 \l__nmc_vv_fp_expr_tl }
+ { \__nmc_sum_limit_assign:NNn #1 \l__nmc_vv_fp_expr_tl { upper } }
}
-\cs_new_protected:Npn \__nmc_sum_limit_assign:NN #1#2
+\cs_new_protected:Npn \__nmc_sum_limit_assign:NNn #1#2#3
{
\tl_if_in:VnTF #2 { inf }
{ \int_set:Nn #1 { \fp_sign:n { #2 } * \c_max_int } }
@@ -1967,7 +2469,7 @@
\fp_compare:nNnTF { abs(#2) } > { \c_max_int }
{ \int_set:Nn #1 { \fp_sign:n { #2 } * \c_max_int } }
{
- \__nmc_intify:Nn #2 { -inf }
+ \tl_set:Nx #2 { \fp_to_int:n #2 }
\bool_if:NF \g__nmc_error_bool
{ \int_set:Nn #1 { #2 } }
}
@@ -2051,13 +2553,13 @@
\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 }
+\prg_new_conditional:Npnn \__nmc_if_pospas_gtr:n #1 { p, TF }
{
\bool_if:nTF
{
- \int_compare_p:nNn { \l__nmc_delim_pos_int } > { #1 }
+ \int_compare_p:nNn { \l__nmc_delim_pos_int } > { 1 }
&&
- \int_compare_p:nNn { \l__nmc_delim_pas_int } > { #2 }
+ \int_compare_p:nNn { \l__nmc_delim_pas_int } > { #1 }
}
{ \prg_return_true: }
{ \prg_return_false: }
@@ -2065,36 +2567,43 @@
% #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
- \int_set:Nn \l__nmc_delim_pos_int { #2 }
- \int_set:Nn \l__nmc_delim_pas_int { #3 }
- \tl_clear:N \l__nmc_delim_arg_tl
- \bool_until_do:nn
- {
- \l__nmc_delim_stop_bool ||
- \quark_if_nil_p:N \l__nmc_C_tl
- }
- {
- \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: }
- \int_incr:N \l__nmc_delim_pos_int
+ {
+ \tl_if_head_is_group:VTF \l__nmcA_tl
+ {
+ \__nmc_next:
+ \tl_set_eq:NN #1 \l__nmcB_tl
+ }
+ {
+ \group_begin:
+ \bool_set_false:N \__nmc_delim_stop_bool
+ \bool_set_false:N \l__nmc_delim_lmod_bool
+ \int_set:Nn \l__nmc_delim_pos_int { #2 }
+ \int_set:Nn \l__nmc_delim_pas_int { #3 }
+ \tl_clear:N \l__nmc_delim_arg_tl
+ \bool_until_do:nn
+ {
+ \l__nmc_delim_stop_bool ||
+ \quark_if_nil_p:N \l__nmcC_tl
+ }
+ {
+ \prop_get:NVNTF \g__nmc_class_prop \l__nmcC_tl \l__nmc_class_tl
+ { \exp_last_unbraced:NV \use_ii:nn \l__nmc_class_tl }
+ { \__nmc_delim_var: }
+ \int_incr:N \l__nmc_delim_pos_int
+ }
+ \tl_gset_eq:NN \g_tmpa_tl \l__nmcA_tl
+ \tl_gset_eq:NN \g_tmpb_tl \l__nmc_delim_arg_tl
+ \exp_args:NNNV
+ \group_end:
+ \tl_set:Nn \l__nmcC_tl \l__nmcC_tl
+ \tl_set_eq:NN \l__nmcA_tl \g_tmpa_tl
+ \tl_set_eq:NN #1 \g_tmpb_tl
}
- \tl_gset_eq:NN \g_tmpa_tl \l__nmc_A_tl
- \tl_gset_eq:NN \g_tmpb_tl \l__nmc_delim_arg_tl
- \exp_args:NNNV
- \group_end:
- \tl_set:Nn \l__nmc_C_tl \l__nmc_C_tl
- \tl_set_eq:NN \l__nmc_A_tl \g_tmpa_tl
- \tl_set_eq:NN #1 \g_tmpb_tl
}
% delimit arg routines %%%%%%%%%%%%%%%%
\cs_new_protected:Npn \__nmc_delim_stop:
{
- \tl_if_eq:VnTF \l__nmc_C_tl { \q }
+ \tl_if_eq:VnTF \l__nmcC_tl { \q }
{ \bool_set_false:N \l__nmc_delim_stop_bool }
{ \bool_set_true:N \l__nmc_delim_stop_bool }
}
@@ -2106,12 +2615,12 @@
\cs_new_protected:Npn \__nmc_delim_append:
{
\__nmc_next:
- \tl_put_right:NV \l__nmc_delim_arg_tl \l__nmc_B_tl
+ \tl_put_right:NV \l__nmc_delim_arg_tl \l__nmcB_tl
}
\cs_new_protected:Npn \__nmc_delim_append_braced:
{
\__nmc_next:
- \tl_put_right:Nx \l__nmc_delim_arg_tl { { \exp_not:o\l__nmc_B_tl } }
+ \tl_put_right:Nx \l__nmc_delim_arg_tl { { \exp_not:o\l__nmcB_tl } }
}
\cs_new_protected:Npn \__nmc_delim_append_twobraced:
{
@@ -2129,35 +2638,47 @@
}
\cs_new_protected:Npn \__nmc_delim_dec:
{
- \__nmc_if_pospas_gtr:nnTF { 1 } { \c__nmc_uny_int }
+ \__nmc_if_pospas_gtr:nTF { \c__nmc_uny_int }
{ \__nmc_delim_stop: }
{
\__nmc_next:
\__nmc_get_dec:NN \l_tmpa_tl \c_true_bool
- \tl_put_right:NV \l__nmc_delim_arg_tl \l_tmpa_tl
+ \tl_put_right:NV \l__nmc_delim_arg_tl \l_tmpa_tl
+ \bool_if:NT \l__nmc_trig_bool
+ { \__nmc_degrees: }
+ }
+ }
+\cs_new_protected:Npn \__nmc_degrees:
+ {
+ \tl_if_eq:VnT \l__nmcC_tl { \degree }
+ {
+ \bool_if:NF \l__nmc_deg_bool
+ { \tl_put_right:Nn \l__nmc_delim_arg_tl
+ { (0.0174532925199433) } }
+ \__nmc_next:
}
}
\cs_new_protected:Npn \__nmc_delim_var:
{
- \__nmc_if_pospas_gtr:nnTF { 1 } { \c__nmc_uny_int }
+ \__nmc_if_pospas_gtr:nTF { \c__nmc_uny_int }
{ \__nmc_delim_stop: }
{ \__nmc_delim_append: }
}
\cs_new_protected:Npn \__nmc_delim_const:
{
- \__nmc_if_pospas_gtr:nnTF { 1 } { \c__nmc_uny_int }
+ \__nmc_if_pospas_gtr:nTF { \c__nmc_uny_int }
{ \__nmc_delim_stop: }
{ \__nmc_delim_append: }
}
\cs_new_protected:Npn \__nmc_delim_arith:
- {
- \__nmc_if_pospas_gtr:nnTF { 1 } { \c__nmc_sum_int }
+ {
+ \__nmc_if_pospas_gtr:nTF { \c__nmc_sum_int }
{ \__nmc_delim_stop: }
{ \__nmc_delim_append: }
}
\cs_new_protected:Npn \__nmc_delim_pm:
{
- \__nmc_if_pospas_gtr:nnTF { 1 } { \c__nmc_cmp_int }
+ \__nmc_if_pospas_gtr:nTF { \c__nmc_cmp_int }
{ \__nmc_delim_stop: }
{ \__nmc_delim_append: }
}
@@ -2165,11 +2686,11 @@
{
\int_compare:nNnT { \l__nmc_delim_pas_int } = { \c__nmc_cmp_int }
{
- \tl_put_left:NV \l__nmc_A_tl \l__nmc_delim_arg_tl
- \tl_put_left:Nn \l__nmc_A_tl { \land }
- \tl_put_left:Nn \l__nmc_C_tl { \land }
+ \tl_put_left:NV \l__nmcA_tl \l__nmc_delim_arg_tl
+ \tl_put_left:Nn \l__nmcA_tl { \land }
+ \tl_put_left:Nn \l__nmcC_tl { \land }
}
- \__nmc_if_pospas_gtr:nnTF { 1 } { \c__nmc_and_int }
+ \__nmc_if_pospas_gtr:nTF { \c__nmc_and_int }
{ \__nmc_delim_stop: }
{
\__nmc_delim_append:
@@ -2181,13 +2702,12 @@
{ \__nmc_delim_stop: }
\cs_new_protected:Npn \__nmc_delim_lparen:
- {
- \bool_lazy_or:nnTF { \__nmc_if_pospas_gtr_p:nn { 1 } { \c__nmc_trg_int } }
- { \__nmc_if_pospas_gtr_p:nn { \l__nmc_posi_int } { \c__nmc_sum_int } }
+ {
+ \__nmc_if_pospas_gtr:nTF { \c__nmc_sum_int }
{ \__nmc_delim_stop: }
{
\__nmc_next:
- \str_case:on \l__nmc_B_tl
+ \str_case:on \l__nmcB_tl
{
{ ( } { \__nmc_delim_lparen:nn { ( } { ) } }
{ [ } { \__nmc_delim_lparen:nn { [ } { ] } }
@@ -2196,7 +2716,7 @@
{ \lbrack } { \__nmc_delim_lparen:nn { \lbrack } { \rbrack } }
{ \lbrace } { \__nmc_delim_lparen:nn { \lbrace } { \rbrace } }
}
- \__nmc_delim_lparen_auxi:n { \l__nmc_posi_int }
+ \__nmc_delim_lparen_auxi:
}
}
\cs_new_protected:Npn \__nmc_delim_lparen:nn #1#2
@@ -2213,40 +2733,33 @@
}
\cs_generate_variant:Nn \__nmc_delim_lparen:nn { VV }
-\cs_new_protected:Npn \__nmc_delim_lparen_auxi:n #1
- { % #1 is first pos.
- \int_compare:nNnTF { \l__nmc_delim_pas_int } = { \c__nmc_trg_int }
- { % +1 to prevent ( )( )
- \__nmc_delim_arg:Nnn
- \l__nmc_delim_argi_tl { #1 + 1 } { \c__nmc_trg_int }
- }
+\cs_new_protected:Npn \__nmc_delim_lparen_auxi:
+ {
+ \int_compare:nNnT { \l__nmc_delim_pas_int } = { \c__nmc_uny_int }
{
- \int_compare:nNnT { \l__nmc_delim_pas_int } = { \c__nmc_uny_int }
- {
- \__nmc_delim_arg:Nnn
- \l__nmc_delim_argi_tl { 2 } { \c__nmc_prn_int }
- }
+ \__nmc_delim_arg:Nnn
+ \l__nmc_delim_argi_tl { 2 } { \c__nmc_prn_int }
}
\tl_put_right:NV \l__nmc_delim_arg_tl \l__nmc_delim_argi_tl
\__nmc_delim_stop_if_gtr:n { \c__nmc_sum_int }
}
\cs_new_protected:Npn \__nmc_delim_rparen:
{
- \__nmc_if_pospas_gtr:nnTF { 1 } { \c__nmc_cmp_int }
+ \__nmc_if_pospas_gtr:nTF { \c__nmc_cmp_int }
{ \__nmc_delim_stop: }
{
\__nmc_next:
- \tl_put_right:NV \l__nmc_delim_arg_tl \l__nmc_B_tl
+ \tl_put_right:NV \l__nmc_delim_arg_tl \l__nmcB_tl
}
}
\cs_new_protected:Npn \__nmc_delim_lvert:
{
- \__nmc_if_pospas_gtr:nnTF { 1 } { \c__nmc_sum_int }
+ \__nmc_if_pospas_gtr:nTF { \c__nmc_sum_int }
{ \__nmc_delim_stop: }
{
\__nmc_next:
- \tl_put_right:NV \l__nmc_delim_arg_tl \l__nmc_B_tl
- \str_case:on \l__nmc_B_tl
+ \tl_put_right:NV \l__nmc_delim_arg_tl \l__nmcB_tl
+ \str_case:on \l__nmcB_tl
{
{ \lvert } { \__nmc_delim_lvert:nn { \lvert } { \rvert } }
{ \lceil } { \__nmc_delim_lvert:nn { \lceil } { \rceil } }
@@ -2266,52 +2779,60 @@
\tl_put_right:Nn \l__nmc_delim_arg_tl { #2 }
}
\cs_new_protected:Npn \__nmc_delim_lmod:
- {
- \bool_lazy_and:nnT { \int_compare_p:nNn { \l__nmc_posi_int } < { 3 } }
- { \int_compare_p:nNn { \l__nmc_delim_pas_int } = { \l__nmc_trg_int } }
- { \int_incr:N \l__nmc_delim_pas_int }
- \__nmc_if_pospas_gtr:nnTF { \l__nmc_posi_int } { \l__nmc_trg_int }
+ {
+ \__nmc_if_pospas_gtr:nTF { \c__nmc_sum_int }
{ \__nmc_delim_stop: }
{
\__nmc_next:
- \tl_if_in:nVTF { |./ } \l__nmc_C_tl
+ \tl_if_in:nVTF { |/ } \l__nmcC_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
+ \prop_get:NVN \g__nmc_subst_misc_prop \l__nmcB_tl \l_tmpb_tl
+ \__nmc_delim_lparen:VV \l__nmcB_tl \l_tmpb_tl
\__nmc_next:
- \tl_put_right:NV \l__nmc_delim_arg_tl \l__nmc_B_tl
- \tl_if_eq:VnTF \l__nmc_C_tl { | }
+ \tl_put_right:NV \l__nmc_delim_arg_tl \l__nmcB_tl
+ \tl_if_eq:VnTF \l__nmcC_tl { | }
{ \__nmc_delim_lparen_auxi:n { 0 } }
{
\__nmc_next:
- \tl_put_right:NV \l__nmc_delim_arg_tl \l__nmc_B_tl
+ \tl_put_right:NV \l__nmc_delim_arg_tl \l__nmcB_tl
\__nmc_delim_stop:
}
}
{
+ \tl_if_eq:VnTF \l__nmcC_tl { . }
+ { \__nmc_next: }
+ { \bool_set_true:N \l__nmc_delim_lmod_bool }
\int_decr:N \l__nmc_delim_pos_int
- \bool_set_true:N \l__nmc_delim_lmod_bool
}
}
}
-\cs_new_protected:Npn \__nmc_delim_unary:n #1
+\cs_new_protected:Npn \__nmc_delim_unary:
{
- \__nmc_if_pospas_gtr:nnTF { 1 } { \c__nmc_sum_int }
+ \__nmc_if_pospas_gtr:nTF { \c__nmc_sum_int }
{ \__nmc_delim_stop: }
{
\__nmc_delim_append:
- \tl_if_eq:VnT \l__nmc_C_tl { ^ }
- {
- \__nmc_delim_append:
+ \tl_if_head_is_group:VTF \l__nmcA_tl
+ {
\__nmc_delim_append_braced:
+ \__nmc_delim_stop:
+ }
+ {
+ \tl_if_eq:VnT \l__nmcC_tl { ^ }
+ {
+ \__nmc_delim_append:
+ \__nmc_delim_append_braced:
+ }
+ \__nmc_delim_arg:Nnn
+ \l__nmc_delim_argi_tl { 1 } { \c__nmc_uny_int }
+ \tl_put_right:NV \l__nmc_delim_arg_tl \l__nmc_delim_argi_tl
+ \__nmc_delim_stop_if_gtr:n { \c__nmc_sum_int }
}
- \__nmc_delim_arg:Nnn \l__nmc_delim_argi_tl { 1 } { #1 }
- \tl_put_right:NV \l__nmc_delim_arg_tl \l__nmc_delim_argi_tl
}
}
\cs_new_protected:Npn \__nmc_delim_power:
{
- \__nmc_if_pospas_gtr:nnTF { 1 } { \c__nmc_prn_int }
+ \__nmc_if_pospas_gtr:nTF { \c__nmc_prn_int }
{ \__nmc_delim_stop: }
{
\__nmc_delim_append:
@@ -2321,30 +2842,26 @@
}
\cs_new_protected:Npn \__nmc_delim_tfrac:
{
- \__nmc_if_pospas_gtr:nnTF { 1 } { \c__nmc_uny_int }
+ \__nmc_if_pospas_gtr:nTF { \c__nmc_uny_int }
{ \__nmc_delim_stop: }
{ \__nmc_delim_append_twobraced: }
}
\cs_new_protected:Npn \__nmc_delim_frac: % also \(d)binom
{
- \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 }
- }
+ \__nmc_if_pospas_gtr:nTF { \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:
{
- \__nmc_if_pospas_gtr:nnTF { 1 } { \c__nmc_sum_int }
+ \__nmc_if_pospas_gtr:nTF { \c__nmc_sum_int }
{ \__nmc_delim_stop: }
{
\__nmc_delim_append:
- \str_case:on \l__nmc_C_tl
+ \str_case:on \l__nmcC_tl
{
{ * } { \__nmc_delim_append: }
{ [ } { \__nmc_delim_append_sqbra: }
@@ -2358,41 +2875,48 @@
}
\cs_new_protected:Npn \__nmc_delim_log:
{
- \__nmc_if_pospas_gtr:nnTF { 1 } { \c__nmc_sum_int }
+ \__nmc_if_pospas_gtr:nTF { \c__nmc_sum_int }
{ \__nmc_delim_stop: }
{
\__nmc_delim_append:
\__nmc_delim_append:
\__nmc_delim_append_braced:
\__nmc_delim_arg:Nnn \l__nmc_delim_argi_tl { 1 } { \c__nmc_uny_int }
- \__nmc_accum_fn_parenth:NNn \l__nmc_delim_arg_tl
+ \__nmc_accum_fn_parenth:NVn \l__nmc_delim_arg_tl
\l__nmc_delim_argi_tl {}
}
}
\cs_new_protected:Npn \__nmc_delim_surd:
{
- \__nmc_if_pospas_gtr:nnTF { 1 } { \c__nmc_uny_int }
+ \__nmc_if_pospas_gtr:nTF { \c__nmc_uny_int }
{ \__nmc_delim_stop: }
{
\__nmc_delim_append:
\tl_clear:N \l__nmc_delim_argi_tl
- \tl_if_eq:VnT \l__nmc_B_tl { \prod }
+ \tl_if_eq:VnT \l__nmcB_tl { \prod }
{
\prg_replicate:nn { 2 }
{ \__nmc_delim_append: \__nmc_delim_append_braced: }
}
- \__nmc_delim_arg:Nnn \l__nmc_delim_argi_tl { 1 } { \c__nmc_srd_int }
- \tl_put_right:NV \l__nmc_delim_arg_tl \l__nmc_delim_argi_tl
- \__nmc_delim_stop_if_gtr:n { \c__nmc_sum_int }
+ \tl_if_head_is_group:VTF \l__nmcA_tl
+ {
+ \__nmc_delim_append_braced:
+ \__nmc_delim_stop:
+ }
+ {
+ \__nmc_delim_arg:Nnn \l__nmc_delim_argi_tl { 1 } { \c__nmc_srd_int }
+ \tl_put_right:NV \l__nmc_delim_arg_tl \l__nmc_delim_argi_tl
+ \__nmc_delim_stop_if_gtr:n { \c__nmc_sum_int }
+ }
}
}
\cs_new_protected:Npn \__nmc_delim_fact:
{
- \__nmc_if_pospas_gtr:nnTF { 1 } { \c__nmc_prn_int }
+ \__nmc_if_pospas_gtr:nTF { \c__nmc_prn_int }
{ \__nmc_delim_stop: }
{
\__nmc_delim_append:
- \tl_if_eq:VnT \l__nmc_C_tl { ! }
+ \tl_if_eq:VnT \l__nmcC_tl { ! }
{ \__nmc_delim_append: }
\__nmc_delim_stop_if_gtr:n { \c__nmc_sum_int }
}
@@ -2400,31 +2924,31 @@
\cs_new_protected:Npn \__nmc_delim_cleave:
{
\__nmc_next:
- \tl_if_eq:VnTF \l__nmc_B_tl { \q }
+ \tl_if_eq:VnTF \l__nmcB_tl { \q }
{ \int_zero:N \l__nmc_delim_pos_int } % adhere
{ \bool_set_true:N \l__nmc_delim_stop_bool } % sever
}
\cs_new_protected:Npn \__nmc_delim_nary:
{
- \__nmc_if_pospas_gtr:nnTF { 1 } { \c__nmc_sum_int }
+ \__nmc_if_pospas_gtr:nTF { \c__nmc_sum_int }
{ \__nmc_delim_stop: }
{
\__nmc_delim_append:
- \__nmc_get_arg_LR:NNN ( \l__nmc_B_tl )
+ \__nmc_get_arg_LR:NNN ( \l__nmcB_tl )
\__nmc_put_right_wrap:NnNn \l__nmc_delim_arg_tl
- { ( } \l__nmc_B_tl { ) }
+ { ( } \l__nmcB_tl { ) }
\__nmc_delim_stop_if_gtr:n { \c__nmc_sum_int }
}
}
\cs_new_protected:Npn \__nmc_delim_comma:
{
- \__nmc_if_pospas_gtr:nnTF { 1 } { \c__nmc_cmp_int }
+ \__nmc_if_pospas_gtr:nTF { \c__nmc_cmp_int }
{ \__nmc_delim_stop: }
{ \__nmc_delim_append: }
}
\cs_new_protected:Npn \__nmc_delim_sum:
{
- \__nmc_if_pospas_gtr:nnTF { 1 } { \c__nmc_sum_int }
+ \__nmc_if_pospas_gtr:nTF { \c__nmc_sum_int }
{ \__nmc_delim_stop: }
{
\__nmc_delim_append:
@@ -2450,7 +2974,7 @@
\cs_new_protected:Npn \__nmc_delim_absorb_ii:
{
\__nmc_delim_absorb_i:
- \str_case:VnT \l__nmc_B_tl
+ \str_case:VnT \l__nmcB_tl
{
{ * } { }
{ [ } { \__nmc_get_arg_LR:NNN [ \l__nmc_toss_tl ] }
@@ -2460,7 +2984,7 @@
\cs_new_protected:Npn \__nmc_delim_color:
{
\__nmc_next:
- \str_if_eq:VnT \l__nmc_C_tl { [ }
+ \str_if_eq:VnT \l__nmcC_tl { [ }
{
\__nmc_next:
\__nmc_get_arg_LR:NNN [ \l__nmc_toss_tl ]
@@ -2470,17 +2994,22 @@
\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 }
+ \tl_put_left:NV \l__nmcA_tl \l__nmcB_tl
+ \tl_set:Nx \l__nmcC_tl { \tl_head:N \l__nmcB_tl }
\int_decr:N \l__nmc_delim_pos_int
}
+\cs_new_protected:Npn \__nmc_delim_mkern:
+ {
+ \__nmc_delim_absorb:
+ \__nmc_fpify_mkern:
+ }
\cs_new_protected:Npn \__nmc_delim_BE:
{
- \__nmc_if_pospas_gtr:nnTF { 1 } { \c__nmc_cmp_int }
+ \__nmc_if_pospas_gtr:nTF { \c__nmc_cmp_int }
{ \__nmc_delim_stop: }
{
\__nmc_next: \__nmc_next:
- \str_if_in:VnTF \l__nmc_B_tl { alignat }
+ \str_if_in:VnTF \l__nmcB_tl { alignat }
{ \__nmc_next: }
\tl_put_right:Nn \l__nmc_delim_arg_tl { \c_group_begin_token }
\__nmc_get_arg_LR:NNN \begin \l__nmc_delim_arg_tl \end
@@ -2490,25 +3019,25 @@
}
\cs_new_protected:Npn \__nmc_delim_cmd:
{ % \cmd { s O m O O }
- \__nmc_if_pospas_gtr:nnTF { 1 } { \c__nmc_sum_int }
+ \__nmc_if_pospas_gtr:nTF { \c__nmc_sum_int }
{ \__nmc_delim_stop: }
{
- \tl_put_right:NV \l__nmc_delim_arg_tl \l__nmc_C_tl
+ \tl_put_right:NV \l__nmc_delim_arg_tl \l__nmcC_tl
\__nmc_next:
- \tl_if_eq:VnT \l__nmc_C_tl { * }
+ \tl_if_eq:VnT \l__nmcC_tl { * }
{ \__nmc_next: }
\tl_put_right:Nn \l__nmc_delim_arg_tl { * }
\__nmc_delim_nmcfn_aux:NN [ ]
\__nmc_next:
\tl_put_right:Nx
- \l__nmc_delim_arg_tl { { \exp_not:o \l__nmc_B_tl } }
+ \l__nmc_delim_arg_tl { { \exp_not:o \l__nmcB_tl } }
\__nmc_delim_nmcfn_aux:NN [ ]
\__nmc_delim_nmcfn_aux:NN [ ]
}
}
\cs_new_protected:Npn \__nmc_delim_nmcfn_aux:NN #1#2
{
- \tl_if_eq:VnT \l__nmc_C_tl { [ }
+ \tl_if_eq:VnT \l__nmcC_tl { [ }
{
\__nmc_next:
\tl_clear:N \l_tmpa_tl
@@ -2525,102 +3054,139 @@
\tl_new:c { g__nmc_info_#1_tl }
\tl_gset:cn { g__nmc_info_#1_tl } { 0 }
}
+\seq_new:N \l_nmc_info_seq
\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:
+
+\cs_set_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
{
- \seq_put_right:Nx \l_tmpa_seq
+ \seq_put_right:Nx \l_nmc_info_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_set_protected:Npn \__nmc_info_formula:
+ { \tl_clear:N \l__nmc_formula_dup_tl }
+
+\cs_set_protected:Npn \__nmc_info_process:
+ {
+ \int_if_zero:nTF \l__nmc_dbg_int
+ {
+ \tl_set_eq:Nc \l__nmc_result_tl
+ { g__nmc_info_\l__nmc_formula_tl _tl }
+ }
+ { \tl_set:Nx \l__nmc_formula_tl { \seq_use:Nn \l_nmc_info_seq {,~} } }
}
-\cs_gset_protected:Npn \__nmc_info_display:
+\cs_set_protected:Npn \__nmc_info_display:
{
- \bool_if:NTF \l__nmc_num_only_bool
- { \l_nmc_result_tl }
+ \tl_set_eq:NN \l__nmc_show_tl \l__nmc_result_tl
+ \bool_if:NF \l__nmc_num_only_bool
{
- \prop_if_in:NVTF \g__nmc_subst_misc_prop \l_nmc_formula_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 }
+ \tl_if_empty:cT { g__nmc_info_\l__nmc_formula_tl _tl }
+ { \tl_set:Nn \l__nmc_show_tl { 0 } }
+ \prop_get:NVN \g__nmc_subst_misc_prop \l__nmc_formula_tl \l_tmpb_tl
+ \tl_put_right:Nn \l__nmc_show_tl { \ }
+ \tl_put_right:NV \l__nmc_show_tl \l_tmpb_tl % pluralise?
+ \int_if_zero:nF { \l__nmc_result_tl - 1 }
+ { \tl_put_right:Nn \l__nmc_show_tl { s } }
\seq_gpop:NN \g__nmc_error_where_seq \l__nmc_toss_tl
}
{
- \__nmc_error_where:n { \__nmc_verb:n {\nmcInfo}~command }
+ \__nmc_error_where:n { info~command }
\__nmc_error_what:n
- { Unknown~process~\__nmc_verb:V \l_nmc_formula_tl\ in }
+ { Unknown~process~\__nmc_verb:N \l__nmc_formula_tl\ in }
}
}
+ \l__nmc_show_tl
}
%%%%%%%%%%%%% user-defined macros %%%%%%%%%%%%%%%
\clist_new:N \g__nmc_macros_clist
+\clist_new:N \l__nmc_macrosa_clist
+\clist_new:N \l__nmc_macrosb_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 }
+\cs_set_protected:Npn \__nmc_macros_initialize:
+ {
+ \tl_set:Nn \l__nmc_dbg_idii_tl { macros }
\tl_set:Nn \l__nmc_dbg_idv_tl { stored }
+ \tl_set_eq:NN \l__nmc_multi_delim_tl \c__nmc_vv_delim_tl
}
-\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_set_protected:Npn \__nmc_macros_vv_digest:N #1
+ {
+ \__nmc_error_where:n { macros~command }
+ \seq_set_split:NVV \l_tmpa_seq \l__nmc_multi_delim_tl \l__nmc_formula_tl
+ \clist_set:Nx \l__nmc_macrosa_clist { \seq_use:Nn \l_tmpa_seq {,} }
+ \clist_clear:N \l__nmc_macrosb_clist
+ \clist_map_inline:Nn \l__nmc_macrosa_clist
{
\cs_if_exist:NTF ##1
- {
- \clist_put_right:Nx \l_tmpb_clist
- {\exp_not:N ##1 {~\exp_not:f ##1} }
- }
+ { \__nmc_storemacros:NN \l__nmc_macrosb_clist ##1 }
{
- \__nmc_error_what:n { Undefined~macro~\__nmc_verb:n {##1}\ in }
+ \__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
+ \tl_set:No \l__nmc_formula_tl \l__nmc_macrosb_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
+ \clist_set:No \l__nmc_macrosb_clist \l__nmc_formula_tl
}
}
-\cs_gset_protected:Npn \__nmc_macros_process:
+% https://tex.stackexchange.com/questions/683578/storing-the-unknown-contents-of-a-macro-in-a-clist
+% (thanks to David Carlisle) % #1 clist #2 macro
+\cs_new_protected:Npn \__nmc_storemacros:NN #1#2
{
+ \ifcsname
+ \exp_after:wN \use_none:n \token_to_str:N #2~ code
+ \endcsname
+ \exp_after:wN\exp_after:wN\exp_after:wN \clist_put_right:Nn
+ \exp_after:wN\exp_after:wN\exp_after:wN #1
+ \exp_after:wN\exp_after:wN\exp_after:wN
+ {
+ \exp_after:wN\exp_after:wN\exp_after:wN #2
+ \exp_after:wN\exp_after:wN \exp_after:wN
+ {
+ \csname
+ \exp_after:wN \use_none:n \token_to_str:N #2~ code
+ \endcsname
+ }
+ }
+ \else
+ \exp_after:wN \clist_put_right:Nn \exp_after:wN #1
+ \exp_after:wN { \exp_after:wN #2 \exp_after:wN { #2 } }
+ \fi
+ }
+\cs_set_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 }
+ { \__nmc_macros_deregister:N \l__nmc_macrosa_clist }
+ { \__nmc_macros_register:N \l__nmc_macrosb_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 } }
- }
+ { \tl_set:Nx \l__nmc_result_tl {\clist_count:N \g__nmc_macros_clist }}
+ }
+\cs_set_protected:Npn \__nmc_macros_display:
+ {
+ \bool_if:NT \l__nmc_num_only_bool
+ { \l__nmc_result_tl }
}
-\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
+\cs_new_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
+ \tl_set:No \l__nmc_formula_tl \g__nmc_macros_clist
}
\clist_map_inline:Nn #1
{
@@ -2632,12 +3198,12 @@
}
\__nmc_macros_reg_dbg_aux:Nn \c_true_bool { freed }
}
-\cs_gset_protected:Npn \__nmc_macros_register:N #1
+\cs_new_protected:Npn \__nmc_macros_register:N #1
{
- \__nmc_error_where:n { \__nmc_verb:n { \nmcMacros } }
+ \__nmc_error_where:n { macros~command }
\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: }
@@ -2657,10 +3223,11 @@
}
}
\cs_new_protected:Npn \__nmc_macros_reg_props:
- {
- \clist_gconcat:NNN \g__nmc_macros_clist \l_tmpa_clist \g__nmc_macros_clist
+ {
+ \clist_gconcat:NNN \g__nmc_macros_clist
+ \l__nmc_macrosa_clist \g__nmc_macros_clist
\clist_remove_duplicates:N \g__nmc_macros_clist
- \clist_map_inline:Nn \l_tmpa_clist
+ \clist_map_inline:Nn \l__nmc_macrosa_clist
{
\prop_get:NnN \l__nmc_subst_var_prop { ##1 } \l_tmpa_tl
\prop_gput:Nno \g__nmc_subst_var_prop { ##1 } \l_tmpa_tl
@@ -2671,57 +3238,64 @@
}
\cs_new_protected:Npn \__nmc_macros_reg_dbg:
{
- \tl_if_empty:NTF \l_nmc_formula_tl
+ \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_clear:N \l__nmc_macrosb_clist
\clist_map_inline:Nn \g__nmc_macros_clist
- {
- \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_storemacros:NN \l__nmc_macrosb_clist ##1 }
+ \tl_set:No \l__nmc_formula_tl \l__nmc_macrosb_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
+ \tl_set:Nn \l__nmc_dbg_idii_tl { #2 }
+ \bool_if:nT { #1 || \seq_if_empty_p:N \l__nmc_vva_seq }
{
\int_if_zero:nF { \l__nmc_dbg_int }
- { \int_set:Nn \l__nmc_dbg_int { 3*5 } }
+ { \int_set:Nn \l__nmc_dbg_int { 2*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
+\seq_new:N \l__nmc_constsa_seq
+\seq_new:N \l__nmc_constsb_seq
\int_new:N \g__nmc_consts_vv_int % count multitok + 1
+\int_gincr:N \g__nmc_consts_vv_int % the +1 if zero
\bool_new:N \l__nmc_consts_add_bool
+
\nmc_define:NnN \nmcConstants { consts } \constants
-\cs_gset_protected:Npn \__nmc_consts_initialize:
+\cs_set_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_idii_tl { added }
\tl_set:Nn \l__nmc_dbg_idv_tl { constants }
+ \tl_set_eq:NN \l__nmc_multi_delim_tl \c__nmc_vv_delim_tl
}
-\cs_gset_protected:Npn \__nmc_consts_vv_digest:N #1
+\cs_set_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 }
+ \bool_if:nF
+ { \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
+ \seq_set_split:NVV \l__nmc_constsa_seq
+ \l__nmc_multi_delim_tl \l__nmc_formula_tl
+ \seq_remove_all:Nn \l__nmc_constsa_seq {}
+ \seq_reverse:N \l__nmc_constsa_seq
+ \seq_concat:NNN \l__nmc_constsb_seq #1 \l__nmc_constsa_seq
+ \__nmc_vv_digest:N \l__nmc_constsb_seq
+ \seq_set_split:NVV \l__nmc_constsb_seq
+ \l__nmc_multi_delim_tl \l__nmc_formula_tl
+ \seq_remove_all:Nn \l__nmc_constsb_seq {}
+ \seq_reverse:N \l__nmc_constsb_seq
+ \tl_set:Nx \l__nmc_formula_tl
+ { \seq_use:NV \l__nmc_constsb_seq \c__nmc_vv_delim_tl }
\int_if_zero:nF \l__nmc_dbg_int
- { \__nmc_dbg_vv_view:n { \clist_count:N \l_tmpa_clist } }
+ { \__nmc_dbg_vv_view:n { \seq_count:N \l__nmc_constsa_seq } }
}
-\cs_gset_protected:Npn \__nmc_consts_clear:
+\cs_new_protected:Npn \__nmc_consts_clear:
{
\seq_gclear:N \g__nmc_consts_vv_seq
\seq_map_inline:Nn \g__nmc_consts_seq
@@ -2731,330 +3305,368 @@
}
\seq_gclear:N \g__nmc_consts_seq
}
-\cs_gset_protected:Npn \__nmc_consts_process:
+\cs_set_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_error_where:n { constants~command }
+ \tl_if_empty:NF \l__nmc_formula_tl
+ {
+ \seq_map_inline:Nn \l__nmc_constsb_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
+ \seq_pop:NN \l__nmc_constsa_seq \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_set:Nx \l_tmpa_tl
+ { \exp_not:o \l__nmc_eq_var_tl = \l_tmpb_tl }
}
- {
- \tl_put_right:Nn \l__nmc_eq_var_tl { = }
+ {
+ \tl_set:Nx \l_tmpb_tl { \fp_eval:n \l_tmpb_tl } % 1e2 => 100
\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
+ { \exp_not:o \l__nmc_eq_var_tl = \l_tmpb_tl }
+ \bool_if:NT \l__nmc_dec_comma_bool
+ { \tl_replace_once:Nnn \l_tmpb_tl {.} {,} }
+ \tl_put_left:Nx \l_tmpb_tl { \exp_not:o \l__nmc_eq_var_tl = }
+ \seq_gput_right:NV \g__nmc_consts_vv_seq \l_tmpb_tl % ,
}
- \seq_gput_right:NV \g__nmc_consts_seq \l__nmc_eq_var_tl
+ \seq_gput_right:NV \g__nmc_consts_seq \l_tmpa_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 } }
+ \int_compare:nNnT { \l__nmc_dbg_int } = { 30 }
+ {
+ \tl_if_empty:NT \l__nmc_formula_tl
+ { \int_set:Nn \l__nmc_dbg_int { \l__nmc_dbg_int / 2 } }
+ \seq_if_empty:NT \l__nmc_vva_seq
+ { \int_set:Nn \l__nmc_dbg_int { \l__nmc_dbg_int / 3 } }
+ }
\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 } }
- }
+ { \tl_set:Nx \l__nmc_result_tl { \seq_count:N \g__nmc_consts_seq } }
+ }
+\cs_set_protected:Npn \__nmc_consts_display:
+ {
+ \bool_if:NT \l__nmc_num_only_bool
+ { \bool_if:NT \l__nmc_num_only_bool { \l__nmc_result_tl } }
}
-\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
+\bool_new:N \l__nmc_reuse_named_bool
+\bool_new:N \g__nmc_reuse_filed_bool
+\bool_new:N \g__nmc_reuse_defined_bool
+\tl_new:N \g__nmc_reuse_filed_tl
+\clist_new:N \g__nmc_reuse_exclude_clist
+\seq_new:N \g__nmc_reuse_names_seq
\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
+% save \g__nmc_reuse_tl from last \eval-uation etc to \#1
\nmc_define:NnN \nmcReuse { reuse } \reuse
-\cs_gset_protected:Npn \__nmc_reuse_settings_digest:
+\cs_set_protected:Npn \__nmc_reuse_initialize:
+ { \tl_set:Nn \l__nmc_dbg_idiii_tl { saved } }
+\cs_set_protected:Npn \__nmc_reuse_process:
{
- \tl_set:Nn \l__nmc_dbg_idii_tl { saved }
- \__nmc_reuse_load:
- }
-\cs_gset_protected:Npn \__nmc_reuse_process:
- {
- \__nmc_error_where:n { \__nmc_verb:n { \nmcReuse }~command }
- \tl_if_empty:NTF \l_nmc_formula_tl
- {
+ \__nmc_error_where:n { reuse~command }
+ \__nmc_reuse_filed:
+ \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_define: }
}
- { \__nmc_reuse_mode:Nn \l_nmc_formula_tl { \l__nmc_reuse_mode_int } }
+ {
+ \int_case:nn \l__nmc_reuse_mode_int
+ {
+ { -1 } { \__nmc_reuse_delete_one:c \l__nmc_formula_tl }
+ { 0 } { \__nmc_reuse_save_one:c \l__nmc_formula_tl }
+ { 1 }
+ {
+ \__nmc_reuse_delete_one:c \l__nmc_formula_tl
+ \__nmc_reuse_save_one:c \l__nmc_formula_tl
+ }
+ { 2 } { \__nmc_reuse_load_one: }
+ }
+ }
+ \__nmc_reuse_view:Nn \l__nmc_formula_tl { \l__nmc_dbg_int }
+ }
+\cs_set_protected:Npn \__nmc_reuse_display:
+ {
\bool_if:NT \l__nmc_num_only_bool
{
- \tl_set:Nx \l_nmc_result_tl
- { \int_eval:n { \clist_count:N \l__nmc_reuse_loaded_tl } }
+ \bool_if:NF \g__nmc_reuse_filed_bool
+ { \__nmc_reuse_filed: }
+ \clist_count:N \g__nmc_reuse_filed_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:
+\cs_new_protected:Npn \__nmc_reuse_filed:
{
- \bool_if:NF \l__nmc_reuse_loaded_bool
+ \bool_gset_false:N \g__nmc_reuse_filed_bool
+ \file_get:VnNT \g__nmc_reuse_filename_tl {} \g__nmc_reuse_filed_tl
{
- \file_get:VnNT \g__nmc_reuse_filename_tl {} \l_tmpa_tl
+ \bool_lazy_or:nnTF
+ { \tl_if_empty_p:N \g__nmc_reuse_filed_tl }
+ { \tl_if_head_eq_meaning_p:VN \g__nmc_reuse_filed_tl \par }
+ { \tl_gclear:N \g__nmc_reuse_filed_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 }
- {
- \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_gset_true:N \g__nmc_reuse_filed_bool
+ \seq_gclear:N \g__nmc_reuse_names_seq
+ \clist_gclear:N \g__nmc_reuse_exclude_clist
+ \clist_gset:NV \g__nmc_reuse_filed_tl \g__nmc_reuse_filed_tl
+ \clist_map_inline:Nn \g__nmc_reuse_filed_tl
+ { \__nmc_reuse_names: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 }
- }
}
}
-\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_names:Nn #1#2
+ {
+ \seq_gput_right:Nn \g__nmc_reuse_names_seq #1
+ \cs_if_free:NF #1
+ { \clist_gput_right:Nn \g__nmc_reuse_exclude_clist #1 }
}
-\cs_new_protected:Npn \__nmc_reuse_save:N #1
+\cs_new_protected:Npn \__nmc_reuse_define:
{
- \__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 }
- }
+ \__nmc_error_where:n { \g__nmc_reuse_filename_tl }
+ \clist_map_inline:Nn \g__nmc_reuse_filed_tl
+ { \__nmc_reuse_gset:Nn ##1 }
+ \bool_gset_true:N \g__nmc_reuse_defined_bool
+ \seq_gpop:NN \g__nmc_error_where_seq \l_tmpa_tl
}
-\cs_generate_variant:Nn \__nmc_reuse_save:N { c }
-
-\cs_new_protected:Npn \__nmc_reuse_defcmds:Nn #1#2
+\cs_new_protected:Npn \__nmc_reuse_gset:Nn #1#2
+ { \cs_if_free:NT #1 { \tl_gset:Nn #1 { #2 } } }
+%%%%%%%%%
+\cs_new_protected:Npn \__nmc_reuse_load_one:
{
- \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
- \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
+ \clist_map_inline:Nn \g__nmc_reuse_filed_tl
+ { \__nmc_reuse_load_one:cNn \l__nmc_formula_tl ##1 }
}
-\cs_new_protected:Npn \__nmc_reuse_write_props:Nn #1#2
+\cs_new_protected:Npn \__nmc_reuse_load_one:NNn #1#2#3
{
- \prop_gput:Nnn \g__nmc_subst_var_prop { #1 } { #2 }
- \tl_gset:Nn #1 { #2 }
+ \tl_if_eq:nnT { #1 } { #2 }
+ {
+ \__nmc_reuse_gset:Nn #2 { #3 }
+ \clist_map_break:
+ }
}
-\cs_new_protected:Npn \__nmc_reuse_delete:N #1
+\cs_generate_variant:Nn \__nmc_reuse_load_one:NNn { c }
+\cs_new_protected:Npn \__nmc_reuse_delete_all:
{
- \seq_clear:N \l_tmpb_seq
- \seq_set_split:NnV \l_tmpa_seq {,} \l__nmc_reuse_loaded_tl
- \seq_map_inline:Nn \l_tmpa_seq
+ \seq_map_inline:Nn \g__nmc_reuse_names_seq
{
- \exp_args:No\str_if_eq:nnF { \use_i:nn ##1 } { #1 }
- { \seq_put_right:Nn \l_tmpb_seq { ##1 } }
+ \clist_if_in:NnF \g__nmc_reuse_exclude_clist { ##1 }
+ { \cs_undefine:N ##1 }
}
- \tl_set:Nx \l__nmc_reuse_loaded_tl { \seq_use:Nn \l_tmpb_seq {,} }
- }
-\cs_new_protected:Npn \__nmc_reuse_delete:Nn #1#2
- {
- \prop_gremove:Nn \g__nmc_subst_var_prop { #1 }
- \cs_undefine:N #1
+ \tl_gclear:N \g__nmc_reuse_filed_tl
+ \seq_gclear:N \g__nmc_reuse_names_seq
+ \clist_gclear:N \g__nmc_reuse_exclude_clist
+ \bool_gset_false:N \g__nmc_reuse_filed_bool
+ \bool_gset_false:N \g__nmc_reuse_defined_bool
+ \iow_open:NV \g__nmc_iow \g__nmc_reuse_filename_tl
+ \iow_close:N \g__nmc_iow
}
\cs_new_protected:Npn \__nmc_reuse_delete_one:N #1
{
- \__nmc_reuse_load:
- \tl_if_empty:NF \l__nmc_reuse_loaded_tl
- { \__nmc_reuse_delete:N #1 }
- \__nmc_reuse_delete:Nn #1 {}
+ \seq_gremove_all:Nn \g__nmc_reuse_names_seq { #1 }
+ \clist_gremove_all:Nn \g__nmc_reuse_exclude_clist { #1 }
+ \tl_gset:NV \g_tmpa_tl \g__nmc_reuse_filed_tl
+ \tl_gclear:N \g__nmc_reuse_filed_tl
+ \clist_map_inline:Nn \g_tmpa_tl
+ { \__nmc_reuse_undefine:NNn #1 ##1 }
\iow_open:NV \g__nmc_iow \g__nmc_reuse_filename_tl
- \iow_now:NV \g__nmc_iow \l__nmc_reuse_loaded_tl
+ \iow_now:NV \g__nmc_iow \g__nmc_reuse_filed_tl
\iow_close:N \g__nmc_iow
}
\cs_generate_variant:Nn \__nmc_reuse_delete_one:N { c }
-\cs_new_protected:Npn \__nmc_reuse_delete_all:
+\cs_new_protected:Npn \__nmc_reuse_undefine:NNn #1#2#3
+ {
+ \tl_if_eq:nnTF { #1 } { #2 }
+ { \cs_undefine:N #1 }
+ { \clist_gput_right:Nn \g__nmc_reuse_filed_tl { #2 { #3 } } }
+ }
+\cs_new_protected:Npn \__nmc_reuse_save_one:N #1
+ {
+ \__nmc_reuse_check_name:N #1
+ \bool_if:nF { \g__nmc_error_bool || \l__nmc_reuse_named_bool }
+ {
+ \tl_set:Nx \l_tmpa_tl { { \exp_not:o \g__nmc_reuse_tl } }
+ \tl_put_left:Nn \l_tmpa_tl { #1 }
+ \exp_last_unbraced:NV \tl_gset:Nn \l_tmpa_tl
+ \clist_gput_left:NV \g__nmc_reuse_filed_tl \l_tmpa_tl
+ \iow_open:NV \g__nmc_iow \g__nmc_reuse_filename_tl
+ \str_set:NV \l_tmpa_str \g__nmc_reuse_filed_tl
+ \iow_now:NV \g__nmc_iow \l_tmpa_str
+ \iow_close:N \g__nmc_iow
+ }
+ }
+\cs_generate_variant:Nn \__nmc_reuse_save_one:N { c }
+
+\cs_new_protected:Npn \__nmc_reuse_check_name:N #1
{
- \__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
+ \seq_if_in:NnTF \g__nmc_reuse_names_seq { #1 }
+ {
+ \__nmc_error_where:n { \g__nmc_reuse_filename_tl }
+ \tl_set:Nx \l_tmpa_tl { { \exp_not:o \g__nmc_reuse_tl } }
+ \tl_put_left:Nn \l_tmpa_tl { #1 }
+ \str_if_in:NVTF \g__nmc_reuse_filed_tl \l_tmpa_tl
+ {
+ \exp_last_unbraced:NV \tl_gset:Nn \l_tmpa_tl
+ \bool_set_true:N \l__nmc_reuse_named_bool
+ }
+ {
+ \tl_if_empty:NTF \g__nmc_reuse_tl
+ {
+ \__nmc_reuse_load_one:
+ \bool_set_true:N \l__nmc_reuse_named_bool
+ \__nmc_error_what:n
+ { Nothing~to~save~to~\__nmc_verb:n { #1 } in }
+ }
+ {
+ \__nmc_error_what:n { Saved~value~for~\__nmc_verb:n {#1}
+ already~exists~in~file }
+ }
+ }
+ \seq_gpop:NN \g__nmc_error_where_seq \l__nmc_toss_tl
+ }
+ {
+ \tl_if_empty:NTF \g__nmc_reuse_tl
+ { \__nmc_error_what:n
+ { Nothing~to~save~to~\__nmc_verb:n {#1} in } }
+ {
+ \cs_if_exist:NT #1
+ {
+ \__nmc_error_what:n { \__nmc_verb:n { #1 }
+ defined~elsewhere;~failed~save~in }
+ }
+ }
}
- \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 } }
+\cs_new_protected:Npn \__nmc_reuse_view:Nn #1#2
+ {
+ \tl_set:Nx \l__nmc_dbg_vv_tl
+ { \clist_use:Nn \g__nmc_reuse_filed_tl {,~} }
+ }
%%%%%%%%%%%%%%%%%%% settings %%%%%%%%%%%%%%%%%%%%
+\bool_new:N \l__nmc_vv_settings_bool
+\bool_new:N \l__nmc_env_rbrace_bool
+\bool_new:N \l__nmc_num_spaces_bool
\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_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
+\bool_new:N \l__nmc_sci_num_in_bool
+\int_new:N \l__nmc_see_force_int
+\tl_new:N \l__nmc_sci_num_in_tl
+\tl_new:N \l__nmc_s_vv_tl
+\tl_new:N \l__nmc_multi_punc_tl
+\tl_new:N \l__nmc_env_rbrace_tl
+\tl_new:N \l__nmc_env_sp_rbrace_tl
+\tl_new:N \l__nmc_multi_sep_tl
\int_new:N \l__nmc_dbg_int
-\cs_new_protected:Npn \__nmc_dbg_int:nn #1#2
+\int_new:N \l__nmc_prod_extra_int
+\int_new:N \l__nmc_prod_query_int
+\regex_new:N \l__nmc_num_regex
+
+\cs_new_protected:Npn \__nmc_num_spaces:n #1
+ {
+ \int_if_zero:nTF { #1 }
+ { \regex_set:Nn \l__nmc_num_regex { (\-?\d*[.,]?\d*) } }
+ { \regex_set:Nn \l__nmc_num_regex { (\-?[\s\d]*[.,]?[\s\d]*) } }
+ \bool_if:NT \l__nmc_sci_num_in_bool
+ { \exp_args:NV \__nmc_sci_num_in:nn \l__nmc_sci_num_in_tl { #1 } }
+ }
+\cs_set_protected:Npn \__nmc_sci_num_in:nn #1#2
{
- \int_set:Nn \l__nmc_dbg_int
- {
- \int_compare:nNnTF { \int_abs:n { #1 } } = { 1 }
- { \int_sign:n { #1 }*#2 } { #1 }
- }
+ \int_if_zero:nTF { #2 }
+ { \regex_set:Nn \l__nmc_num_regex
+ { (\-?\d*[.,]?\d*(?:#1\d+|#1\-\d+)?) } }
+ { \regex_set:Nn \l__nmc_num_regex
+ { (\-?[\s\d]*[.,]?[\s\d]*(?:#1\d+|#1\-\d+)?) } }
}
-\cs_new_protected:Npn \__nmc_set_trig_parsing:n #1
- { % #1=1,2,3
- \int_set:Nn \l__nmc_posi_int { #1 }
- \int_compare:nNnTF { #1 } > { 1 }
- { \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_protected:Npn \__nmc_dbg_int:nn #1#2
+ {
+ \int_compare:nNnTF { \int_abs:n { #1 } } = { 1 }
+ { \int_set:Nn \l__nmc_dbg_int { \int_sign:n { #1 }*#2 } }
+ { \int_set:Nn \l__nmc_dbg_int { #1 } }
}
\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,
- pad .code:n = \__nmc_int_to_bool:Nn
- \l__nmc_pad_zeros_bool { #1 },
- output-sci-notation .code:n = \__nmc_int_to_bool:Nn
- \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 },
- 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,
- vv-inline .tl_set:N = \l__nmc_vv_inline_tl,
- sum-extra-rounding .int_set:N = \l__nmc_sum_extra_int,
- sum-query-terms .int_set:N = \l__nmc_sum_query_int,
- prod-extra-rounding .int_set:N = \l__nmc_prod_extra_int,
- prod-query-terms .int_set:N = \l__nmc_prod_query_int,
- eval-reuse .int_set:N = \l__nmc_eval_reuse_int,
-%
- rounding .default:n = 6,
- pad .default:n = 0,
- output-sci-notation .default:n = 0,
- output-exponent-char .default:n = e,
- 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),
- vv-inline .default:n = {,}\mskip 12mu plus 6mu minus 9mu(vv),
- sum-extra-rounding .default:n = 2,
- sum-query-terms .default:n = 0,
- prod-extra-rounding .default:n = 2,
- prod-query-terms .default:n = 0,
- eval-reuse .default:n = 0,
- }
-\keys_set_known:nn { numerica }
- {
- rounding,pad,output-sci-notation,output-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
- }
+\cs_new:Npn \__nmc_set_dead:n #1
+ { See~the~documentation;~\__nmc_verb:n {`#1'}~key~discontinued~in }
\keys_define:nn { numerica/generic }
{
- 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 = \__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_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 }
- {
- p .tl_set:N = \l__nmc_punc_tl,
- p .default:n = {,},
- reuse .int_set:N = \l__nmc_eval_reuse_int
- }
+ dbg .code:n = \__nmc_dbg_int:nn { #1 } { 2*3*5*7*11 },
+ dbg .initial:n = 0,
+ ^ .code:n = \bool_set_true:N \l__nmc_sci_num_in_bool
+ \tl_set:Nn \l__nmc_sci_num_in_tl { #1 }
+ \__nmc_sci_num_in:nn { #1 } { 0 },
+ ^ .default:n = e,
+ xx .code:n = \__nmc_int_to_bool:Nn \l__nmc_multitok_bool { #1 },
+ xx .initial:n = 1,
+ ff .tl_set:N = \l__nmc_multi_delim_tl,
+ ff .default:V = \c__nmc_vv_delim_tl,
+ ff .initial:n = \prg_do_nothing:,
+ 1s2 .code:n = \__nmc_num_spaces:n { #1 },
+ 1s2 .default:n = 1,
+ 1s2 .initial:n = 0,
+ /min .int_set:N = \l__nmc_frac_denom_min_int,
+ /min .initial:n = 1,
+ /max .int_set:N = \l__nmc_frac_denom_max_int,
+ /max .initial:n = 200,
+ vvmode .code:n = \__nmc_calc_mode:n { \int_if_zero:nTF { #1 }01 },
+ vv@ .code:n = \__nmc_calc_mode:n { \int_if_zero:nTF { #1 }01 },
+ vv@ .initial:n = 0,
+ o .code:n = \__nmc_int_to_bool:Nn \l__nmc_deg_bool { #1 },
+ o .default:n = 1,
+ o .initial:n = 0,
+ log .tl_set:N = \l__nmc_log_base_tl,
+ log .initial:n = 10,
+ S+ .int_set:N = \l__nmc_sum_extra_int,
+ S+ .initial:n = 2,
+ S? .int_set:N = \l__nmc_sum_query_int,
+ S? .initial:n = 0,
+ P+ .int_set:N = \l__nmc_prod_extra_int,
+ P+ .initial:n = 2,
+ P? .int_set:N = \l__nmc_prod_query_int,
+ P? .initial:n = 0,
+%
+ env .tl_set:N = \l__nmc_env_s_tl,
+ arg .tl_set:N = \l__nmc_env_s_arg_tl,
+ eq .tl_set:N = \l__nmc_s_equals_tl,
+ eq .default:n = {=},
+ vvi .code:n = \bool_set_true:N \l__nmc_vv_settings_bool
+ \tl_set:Nn \l__nmc_s_vv_tl { #1 }, % deprecated
+ vvd .code:n = \bool_set_true:N \l__nmc_vv_settings_bool
+ \tl_set:Nn \l__nmc_s_vv_tl { #1 }, % deprecated
+ vv .code:n = \bool_set_true:N \l__nmc_vv_settings_bool
+ \tl_set:Nn \l__nmc_s_vv_tl { #1 },
+ pp .tl_set:N = \l__nmc_multi_punc_tl,
+ pp .default:n = {,},
+ sep .tl_set:N = \l__nmc_s_multi_sep_tl,
+ \} .code:n = \tl_set:Nn \l__nmc_env_rbrace_tl { #1 }
+ \bool_set_true:N \l__nmc_env_rbrace_bool,
+ \} .default:n = \ \},
+ p .tl_set:N = \l__nmc_punc_tl,
+ p .default:n = {,},
+ f .int_set:N = \l__nmc_see_force_int,
+ f .initial:n = -1,
+%
+ () .code:n = \__nmc_error_what:n { \__nmc_set_dead:n { () } }
+ \int_zero:N \l__nmc_dbg_int,
+ reuse .code:n = \__nmc_error_what:n { \__nmc_set_dead:n { reuse } },
+ * .code:n = \msg_warning:nnn {numerica} {base}
+ { settings:~*~key~discontinued;~use~e.g.~env=multline* }
+ }
+% display related
+\keys_define:nn { numerica/eval }
+ { view .code:n = \__nmc_dbg_int:nn { 1 } { 2*3*5*7*11 } }
\keys_define:nn { numerica/info }
{ view .code:n = \__nmc_dbg_int:nn { 1 } { 2 } }
\keys_define:nn { numerica/macros }
@@ -3069,13 +3681,22 @@
}
\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 }
+ view .code:n = \__nmc_dbg_int:nn { 1 } { 3 },
+ delete .code:n = \int_set:Nn \l__nmc_reuse_mode_int { -1 },
+ save .code:n = \int_set:Nn \l__nmc_reuse_mode_int { 0 },
+ renew .code:n = \int_set:Nn \l__nmc_reuse_mode_int { 1 },
+ load .code:n = \int_set:Nn \l__nmc_reuse_mode_int { 2 }
}
-\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 file `numerica.sty' \ No newline at end of file
+%%%%%%%%%%
+% for debugging \__nmc_fpify:nN & \__nmc_delim_arg:Nnn
+% A, B, C generated by \__nmc_next:
+% \ProvideDocumentCommand \abc {}
+ % {
+ % \exp_args:Nx \clist_show:n
+ % {
+ % { A~=~\exp_not:o \l__nmcA_tl },
+ % { B~=~\exp_not:o \l__nmcB_tl },
+ % { C~=~\exp_not:o \l__nmcC_tl }
+ % }
+ % }
+% end of file `numerica.sty'