diff options
author | Karl Berry <karl@freefriends.org> | 2021-05-13 21:13:13 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2021-05-13 21:13:13 +0000 |
commit | 6a388cdf8e758efeeeb4d614735137e275dd22de (patch) | |
tree | e105ee945f2b3607a51e50c50a9e36958df1971e /Master/texmf-dist/tex/latex/bnumexpr | |
parent | aac785f6c46081d4ec382ebb08c31b71064fc863 (diff) |
bnumexpr (13may21)
git-svn-id: svn://tug.org/texlive/trunk@59182 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/bnumexpr')
-rw-r--r-- | Master/texmf-dist/tex/latex/bnumexpr/bnumexpr.sty | 660 |
1 files changed, 385 insertions, 275 deletions
diff --git a/Master/texmf-dist/tex/latex/bnumexpr/bnumexpr.sty b/Master/texmf-dist/tex/latex/bnumexpr/bnumexpr.sty index 6854b28e37c..708694b02e5 100644 --- a/Master/texmf-dist/tex/latex/bnumexpr/bnumexpr.sty +++ b/Master/texmf-dist/tex/latex/bnumexpr/bnumexpr.sty @@ -22,363 +22,473 @@ %% in the same archive or directory.) %% --------------------------------------------------------------- %% The bnumexpr package: Expressions with big integers -%% Copyright (C) 2014-2019 by Jean-Francois Burnol +%% Copyright (C) 2014-2021 by Jean-Francois Burnol %% \NeedsTeXFormat{LaTeX2e}% -\ProvidesPackage{bnumexpr}[2019/01/08 v1.2e Expressions with big integers (JFB)]% -\edef\BNErestorecatcodes {\catcode`\noexpand\!\the\catcode`\! - \catcode`\noexpand\?\the\catcode`\? - \catcode`\noexpand\_\the\catcode`\_ - \catcode`\noexpand\:\the\catcode`\: - \catcode`\noexpand\(\the\catcode`\( - \catcode`\noexpand\)\the\catcode`\) - \catcode`\noexpand\*\the\catcode`\* - \catcode`\noexpand\,\the\catcode`\,\relax }% -\catcode`\! 11 -\catcode`\? 11 -\catcode`\_ 11 -\catcode`\: 11 -\catcode`\, 12 -\catcode`\* 12 -\catcode`\( 12 -\chardef\xint_c_ 0 -\chardef\xint_c_i 1 -\chardef\xint_c_ii 2 -\chardef\xint_c_vi 6 -\chardef\xint_c_vii 7 -\chardef\xint_c_viii 8 -\chardef\xint_c_ix 9 -\chardef\xint_c_x 10 -\long\def\xint_gobble_i #1{}% -\long\def\xint_gobble_iii #1#2#3{}% -\long\def\xint_firstofone #1{#1}% -\long\def\xint_firstoftwo #1#2{#1}% -\long\def\xint_secondoftwo #1#2{#2}% -\long\def\xint_firstofthree #1#2#3{#1}% -\long\def\xint_secondofthree #1#2#3{#2}% -\long\def\xint_thirdofthree #1#2#3{#3}% -\def\xint_gob_til_! #1!{}% this ! has catcode 11 -\long\def\xint_UDsignfork #1-#2#3\krof {#2}% -\long\def\xint_afterfi #1#2\fi {\fi #1}% -\long\def\xint_dothis #1#2\xint_orthat #3{\fi #1}% -\let\xint_orthat \xint_firstofone -\long\def\xint_zapspaces #1 #2{#1#2\xint_zapspaces }% -\catcode`! 3 -\def\bnumexprsetup #1{\BNE_parsekeys #1,=!,}% -\def\BNE_parsekeys #1=#2#3,{\ifx!#2\expandafter\BNE_parsedone\fi +\ProvidesPackage{bnumexpr}[2021/05/12 v1.4 Expressions with big integers (JFB)]% +\RequirePackage{xintbinhex}[2021/05/10]% +{\catcode`! 3 \catcode`_ 11 % + \gdef\bnumexprsetup #1{\BNE_parsekeys #1,=!,}% + \gdef\BNE_parsekeys #1=#2#3,% + {% + \ifx!#2\expandafter\BNE_parsedone\fi \expandafter -\let\csname BNE_Op_\xint_zapspaces #1 \xint_gobble_i\endcsname=#2\BNE_parsekeys + \let\csname BNE_Op_\xint_zapspaces #1 \xint_gobble_i\endcsname% + =#2\BNE_parsekeys + }% + \gdef\BNE_parsedone #1\BNE_parsekeys {}% }% -\catcode`! 11 -\def\BNE_parsedone #1\BNE_parsekeys {}% -\def\BNE_tmpa {0}% -\DeclareOption {custom}{\def\BNE_tmpa {1}}% +\def\BNEtmpa {0}% +\DeclareOption {custom}{\def\BNEtmpa {1}}% \ProcessOptions\relax -\if0\BNE_tmpa % Default is to load xintcore.sty - \RequirePackage{xintcore}[2019/01/06]% xintcore 1.3d +\edef\BNErestorecatcodes{\XINTrestorecatcodes}% +\XINTsetcatcodes% +\if0\BNEtmpa\expandafter\xint_secondoftwo\fi +\xint_gobble_i{% + \RequirePackage{xintcore}[2021/05/10]% \bnumexprsetup{add=\xintiiAdd, sub=\xintiiSub, mul=\xintiiMul, divround=\xintiiDivRound, div=\xintiiDivFloor, mod=\xintiiMod, pow=\xintiiPow, fac=\xintiiFac}% -\fi -\def\bnumexpr {\romannumeral0\bnumexpro }% -\def\bnumexpro{\expandafter\BNE_wrap\romannumeral0\BNE_eval }% -\def\BNE_eval {\expandafter\BNE_until_end_a\romannumeral-`0\BNE_getnext }% -\def\BNE_wrap {!\BNE_usethe\BNE_protect\BNE_unlock }% -\protected\def\BNE_usethe\BNE_protect {\BNE:missing_bnethe!}% -\def\BNE_protect\BNE_unlock - {\noexpand\BNE_protect\noexpand\BNE_unlock\noexpand }% -\let\BNE_done\space +}% +\long\def\xint_firstofthree #1#2#3{#1}% +\long\def\xint_secondofthree #1#2#3{#2}% +\long\def\xint_thirdofthree #1#2#3{#3}% +\def\XINTfstop {\noexpand\XINTfstop}% +\def\bnumexpr {\romannumeral0\bnumexpro}% +\def\bnumexpro {\expandafter\BNE_wrap\romannumeral0\bnebareeval }% +\def\BNE_wrap {\XINTfstop\BNEprint.}% +\def\bnumeval #1% + {\expanded\expandafter\BNEprint\expandafter.\romannumeral0\bnebareeval#1\relax}% +\def\evaltohex #1% + {\expanded\expandafter\BNEprinthex\expandafter.\romannumeral0\bnebareeval#1\relax}% \def\thebnumexpr - {\romannumeral-`0\expandafter\BNE_unlock\romannumeral0\BNE_eval }% -\def\bnethe #1{\romannumeral-`0\expandafter\xint_gobble_iii\romannumeral-`0#1}% -\def\bnumeval#1% - {\romannumeral-`0\expandafter\BNE_unlock\romannumeral0\BNE_eval#1\relax}% -\def\BNE_unlock {\expandafter\BNE_unlock_a\string }% -\def\BNE_unlock_a #1.={}% + {\expanded\expandafter\BNEprint\expandafter.\romannumeral0\bnebareeval}% +\def\bnebareeval{\BNE_start}% +\def\bnethe#1{\expanded\expandafter\xint_gobble_i\romannumeral`&&@#1}% +\protected\def\BNEprint.#1{{\BNE_print#1.}}% +\def\BNE_print#1{#1\expandafter\BNE_print_a\string}% +\def\BNE_print_a#1{\unless\if#1.\expandafter\BNE_print_b\fi}% +\def\BNE_print_b + {\expandafter\BNE_print_c\expandafter{\expandafter\xint_gobble_i\string}}% +\def\BNE_print_c#1{, #1\expandafter\BNE_print_a\string}% +\protected\def\BNEprinthex.#1{{\BNE_printhex#1.}}% +\def\BNE_printhex#1{\xintDecToHex{#1}\expandafter\BNE_printhex_a\string}% +\def\BNE_printhex_a#1{\unless\if#1.\expandafter\BNE_printhex_b\fi}% +\def\BNE_printhex_b + {\expandafter\BNE_printhex_c\expandafter{\expandafter\xint_gobble_i\string}}% +\def\BNE_printhex_c#1{, \xintDecToHex{#1}\expandafter\BNE_printhex_a\string}% \def\BNE_getnext #1% {% - \expandafter\BNE_getnext_a\romannumeral-`0#1% + \expandafter\BNE_put_op_first\romannumeral`&&@% + \expandafter\BNE_getnext_a\romannumeral`&&@#1% }% +\def\BNE_put_op_first #1#2#3{\expandafter#2\expandafter#3\expandafter{#1}}% \def\BNE_getnext_a #1% {% - \xint_gob_til_! #1\BNE_gn_foundexpr !% this ! has catcode 11 - \ifcat\relax#1% \count or \numexpr etc... token or count, dimen, skip cs - \expandafter\BNE_gn_countetc - \else - \expandafter\expandafter\expandafter\BNE_gn_fork\expandafter\string - \fi - #1% + \ifx\relax #1\xint_dothis\BNE_foundprematureend\fi + \ifx\XINTfstop#1\xint_dothis\BNE_subexpr\fi + \ifcat\relax#1\xint_dothis\BNE_countetc\fi + \xint_orthat{}\BNE_getnextfork #1% }% -\def\BNE_gn_foundexpr !#1\fi !{\expandafter\BNE_getop\xint_gobble_iii }% -\def\BNE_gn_countetc #1% +\def\BNE_foundprematureend\BNE_getnextfork #1{{}\xint_c_\relax}% +\def\BNE_subexpr #1.#2% {% - \ifx\count#1\else\ifx\dimen#1\else\ifx\numexpr#1\else\ifx\dimexpr#1\else - \ifx\skip#1\else\ifx\glueexpr#1\else\ifx\fontdimen#1\else\ifx\ht#1\else - \ifx\dp#1\else\ifx\wd#1\else\ifx\fontcharht#1\else\ifx\fontcharwd#1\else - \ifx\fontchardp#1\else\ifx\fontcharic#1\else - \BNE_gn_unpackvar - \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi - \expandafter\BNE_getnext\number #1% + \expanded{\unexpanded{{#2}}\expandafter}\romannumeral`&&@\BNE_getop }% -\def\BNE_gn_unpackvar\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi - \expandafter\BNE_getnext\number #1% +\def\BNE_countetc\BNE_getnextfork#1% {% - \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi - \expandafter\BNE_getop\csname .=\number#1\endcsname + \if0\ifx\count#11\fi + \ifx\dimen#11\fi + \ifx\numexpr#11\fi + \ifx\dimexpr#11\fi + \ifx\skip#11\fi + \ifx\glueexpr#11\fi + \ifx\fontdimen#11\fi + \ifx\ht#11\fi + \ifx\dp#11\fi + \ifx\wd#11\fi + \ifx\fontcharht#11\fi + \ifx\fontcharwd#11\fi + \ifx\fontchardp#11\fi + \ifx\fontcharic#11\fi 0\expandafter\BNE_fetch_as_number\fi + \expandafter\BNE_getnext_a\number #1% }% -\def\BNE_gn_fork #1{% - \if#1+\xint_dothis \BNE_getnext\fi - \if#1-\xint_dothis -\fi - \if#1(\xint_dothis \BNE_oparen \fi - \xint_orthat {\BNE_scan_number #1}% +\def\BNE_fetch_as_number + \expandafter\BNE_getnext_a\number #1% +{% + \expanded{{{\number#1}}\expandafter}\romannumeral`&&@\BNE_getop }% -\def\BNE_scan_number #1% this #1 has necessarily here catcode 12 +\def\BNE_getnextfork #1{% + \if#1+\xint_dothis \BNE_getnext_a \fi + \if#1-\xint_dothis {{}{}-}\fi + \if#1(\xint_dothis {{}\xint_c_ii^v (}\fi + \xint_orthat {\BNE_scan_number #1}% +}% +\def\BNE_scan_number #1% {% - \ifnum \xint_c_ix<1#1 \else\expandafter\BNE_notadigit\fi - \BNE_scan_nbr #1% + \if "#1\xint_dothis \BNE_scanhex\fi + \ifnum \xint_c_ix<1\string#1 \xint_dothis \BNE_startint\fi + \xint_orthat \BNE_notadigit #1% }% -\def\BNE_notadigit\BNE_scan_nbr #1{\BNE:not_a_digit!\BNE_getnext }% -\def\BNE_scan_nbr #1% -{% the #1 here is a catcode 12 digit - \if#10\expandafter\BNE_scan_nbr_gobzeroes - \else - \expandafter\BNE_scan_nbr_start - \fi #1% +\def\BNE_notadigit#1{\BNE_getnext }% +\def\BNE_startint #1% +{% + \if #10\expandafter\BNE_gobz_a\else\expandafter\BNE_scanint_a\fi #1% +}% +\def\BNE_scanint_a #1#2% + {\expanded\bgroup{{\iffalse}}\fi #1% + \expandafter\BNE_scanint_main\romannumeral`&&@#2}% +\def\BNE_gobz_a #1#2% + {\expanded\bgroup{{\iffalse}}\fi + \expandafter\BNE_gobz_scanint_main\romannumeral`&&@#2}% +\def\BNE_scanint_main #1% +{% + \ifcat \relax #1\expandafter\BNE_scanint_hit_cs \fi + \ifnum\xint_c_ix<1\string#1 \else\expandafter\BNE_scanint_next\fi + #1\BNE_scanint_again +}% +\def\BNE_scanint_again #1% +{% + \expandafter\BNE_scanint_main\romannumeral`&&@#1% +}% +\def\BNE_scanint_hit_cs \ifnum#1\fi#2\BNE_scanint_again +{% + \iffalse{{{\fi}}\expandafter}\romannumeral`&&@\BNE_getop#2% +}% +\def\BNE_scanint_next #1\BNE_scanint_again +{% + \if _#1\xint_dothis\BNE_scanint_again\fi + \xint_orthat + {\iffalse{{{\fi}}\expandafter}\romannumeral`&&@\BNE_getop#1}% +}% +\def\BNE_gobz_scanint_main #1% +{% + \ifcat \relax #1\expandafter\BNE_gobz_scanint_hit_cs\fi + \ifnum\xint_c_x<1\string#1 \else\expandafter\BNE_gobz_scanint_next\fi + #1\BNE_scanint_again }% -\def\BNE_scan_nbr_start #1#2% +\def\BNE_gobz_scanint_again #1% {% - \expandafter\BNE_getop\csname.=#1% - \expandafter\BNE_scanint_b\romannumeral-`0#2% + \expandafter\BNE_gobz_scanint_main\romannumeral`&&@#1% }% -\def\BNE_scan_nbr_gobzeroes #1% +\def\BNE_gobz_scanint_hit_cs\ifnum#1\fi#2\BNE_scanint_again {% - \expandafter\BNE_getop\csname.=% - \expandafter\BNE_gobz_scanint_b\romannumeral-`0#1% + 0\iffalse{{{\fi}}\expandafter}\romannumeral`&&@\BNE_getop#2% }% -\def\BNE_scanint_b #1% +\def\BNE_gobz_scanint_next #1\BNE_scanint_again {% - \ifcat \relax #1\expandafter\BNE_scanint_endbycs\expandafter #1\fi - \ifnum\xint_c_ix<1\string#1 \else\expandafter\BNE_scanint_c\fi - \string#1\BNE_scanint_d + \if _#1\xint_dothis\BNE_gobz_scanint_again\fi + \if 0#1\xint_dothis\BNE_gobz_scanint_again\fi + \xint_orthat + {0\iffalse{{{\fi}}\expandafter}\romannumeral`&&@\BNE_getop#1}% }% -\def\BNE_scanint_endbycs#1#2\BNE_scanint_d{\endcsname #1}% -\def\BNE_scanint_c\string #1\BNE_scanint_d +\def\BNE_hex_in #1.% {% - \if _#1\xint_dothis{\expandafter\BNE_scanint_d\xint_gobble_i}\fi - \ifcat a#1\xint_dothis{\endcsname*}\fi % tacit multiplication - \xint_orthat {\expandafter\endcsname \string}#1% + \expanded{{{\xintHexToDec{#1}}}\expandafter}\romannumeral`&&@\BNE_getop }% -\def\BNE_scanint_d #1% +\def\BNE_scanhex #1% #1=" {% - \expandafter\BNE_scanint_b\romannumeral-`0#1% + \expandafter\BNE_hex_in\expanded\bgroup\BNE_scanhex_a }% -\def\BNE_gobz_scanint_b #1% +\def\BNE_scanhex_a #1% {% - \ifcat \relax #1\expandafter\BNE_gobz_scanint_endbycs\expandafter #1\fi - \ifnum\xint_c_x<1\string#1 \else\expandafter\BNE_gobz_scanint_c\fi - \string#1\BNE_scanint_d + \ifcat #1\relax\xint_dothis{.\iffalse{\fi}#1}\fi + \xint_orthat {\BNE_scanhex_aa #1}% }% -\def\BNE_gobz_scanint_endbycs#1#2\BNE_scanint_d{0\endcsname #1}% -\def\BNE_gobz_scanint_c\string #1\BNE_scanint_d +\def\BNE_scanhex_aa #1% {% - \if _#1\xint_dothis\BNE_gobz_scanint_d\fi - \ifcat a#1\xint_dothis{0\endcsname*#1}\fi % tacit multiplication - \if 0#1\xint_dothis\BNE_gobz_scanint_d\fi - \xint_orthat {0\expandafter\endcsname \string#1}% + \if\ifnum`#1>`/ + \ifnum`#1>`9 + \ifnum`#1>`@ + \ifnum`#1>`F + 0\else1\fi\else0\fi\else1\fi\else0\fi 1% + \expandafter\BNE_scanhex_b + \else + \if _#1\xint_dothis{\expandafter\BNE_scanhex_bgob}\fi + \xint_orthat {\xint_afterfi {.\iffalse{\fi}}}% + \fi + #1% }% -\def\BNE_gobz_scanint_d #1% +\def\BNE_scanhex_b #1#2% {% - \expandafter\BNE_gobz_scanint_b\romannumeral-`0#1% + #1\expandafter\BNE_scanhex_a\romannumeral`&&@#2% }% -\def\BNE_getop #1#2% this #1 is the current locked computed value +\def\BNE_scanhex_bgob #1#2% {% - \expandafter\BNE_getop_a\expandafter #1\romannumeral-`0#2% + \expandafter\BNE_scanhex_a\romannumeral`&&@#2% +}% +\def\BNE_getop #1% +{% + \expandafter\BNE_getop_a\romannumeral`&&@#1% }% \catcode`* 11 -\def\BNE_getop_a #1#2% -{% if a control sequence is found, must be \relax, or possibly register or - % variable if tacit multiplication is allowed - \ifx \relax #2\xint_dothis\xint_firstofthree\fi - % tacit multiplications: - \ifcat \relax #2\xint_dothis\xint_secondofthree\fi - \if (#2\xint_dothis \xint_secondofthree\fi - \ifx !#2\xint_dothis \xint_secondofthree\fi +\def\BNE_getop_a #1% +{% + \ifx \relax #1\xint_dothis\xint_firstofthree\fi + \ifcat \relax #1\xint_dothis\xint_secondofthree\fi + \ifnum\xint_c_ix<1\string#1 \xint_dothis\xint_secondofthree\fi + \if (#1\xint_dothis \xint_secondofthree\fi %) \xint_orthat \xint_thirdofthree - {\BNE_foundend #1}% - {\BNE_precedence_* *#1#2}% tacit multiplication - {\BNE_scanop_a #2#1}% + {\BNE_foundend}% + {\BNE_precedence_*** *#1}% + {\expandafter\BNE_scanop_a \string#1}% }% \catcode`* 12 -\def\BNE_foundend {\xint_c_ \relax }% \relax is only a place-holder here. -\def\BNE_scanop_a #1#2#3% - {\expandafter\BNE_scanop_b\expandafter #1\expandafter #2\romannumeral-`0#3}% -\def\BNE_scanop_b #1#2#3% +\def\BNE_foundend {\xint_c_ \relax}% +\def\BNE_scanop_a #1#2% +{% + \expandafter\BNE_scanop_b\expandafter#1\romannumeral`&&@#2% +}% +\def\BNE_scanop_b #1#2% +{% + \ifcat#2\relax\xint_dothis{\BNE_foundop_a #1#2}\fi + \ifcsname BNE_itself_#1#2\endcsname + \xint_dothis + {\expandafter\BNE_scanop_c\csname BNE_itself_#1#2\endcsname}\fi + \xint_orthat {\BNE_foundop_a #1#2}% +}% +\def\BNE_scanop_c #1#2% {% - \ifcat#3\relax\xint_dothis{\BNE_foundop #1#2#3}\fi - \ifcsname BNE_itself_#1#3\endcsname + \expandafter\BNE_scanop_d\expandafter#1\romannumeral`&&@#2% +}% +\def\BNE_scanop_d #1#2% +{% + \ifcat#2\relax \xint_dothis{\BNE_foundop #1#2}\fi + \ifcsname BNE_itself_#1#2\endcsname \xint_dothis - {\expandafter\BNE_foundop\csname BNE_itself_#1#3\endcsname #2}\fi - \xint_orthat {\BNE_foundop #1#2#3}% + {\expandafter\BNE_scanop_c\csname BNE_itself_#1#2\endcsname }\fi + \xint_orthat {\csname BNE_precedence_#1\endcsname #1#2}% }% -\def\BNE_foundop #1% +\def\BNE_foundop_a #1% {% \ifcsname BNE_precedence_#1\endcsname \csname BNE_precedence_#1\expandafter\endcsname \expandafter #1% \else - \BNE_notanoperator {#1}\expandafter\BNE_getop + \xint_afterfi{\BNE_getop\romannumeral0% + \XINT_expandableerror + {"#1" is unknown as operator. (I)nsert one:} }%<<deliberate space \fi }% -\def\BNE_notanoperator #1{\BNE:not_an_operator! \xint_gobble_i {#1}}% -\catcode`) 11 -\def\BNE_tmpa #1{% - \def\BNE_until_end_a ##1% +\def\BNE_foundop #1{\csname BNE_precedence_#1\endcsname #1}% +\def\BNE_tmpa #1#2#3#4#5% +{% + \def#1% start + {% + \expandafter#2\romannumeral`&&@\BNE_getnext + }% + \def#2##1% check {% \xint_UDsignfork - ##1{\expandafter\BNE_until_end_a\romannumeral-`0#1}% - -{\BNE_until_end_b ##1}% + ##1{\expandafter#3\romannumeral`&&@#4}% + -{#3##1}% \krof }% -}\expandafter\BNE_tmpa\csname BNE_op_-vi\endcsname -\def\BNE_until_end_b #1#2% + \def#3##1##2% checkp {% - \ifcase #1\expandafter\BNE_done - \or - \xint_afterfi{\BNE:extra_)_?\expandafter - \BNE_until_end_a\romannumeral-`0\BNE_getop }% + \ifcase ##1% + \expandafter\BNE_done + \or\expandafter#5% \else - \xint_afterfi{\expandafter\BNE_until_end_a - \romannumeral-`0\csname BNE_op_#2\endcsname }% + \expandafter#3\romannumeral`&&@\csname BNE_op_##2\expandafter\endcsname \fi }% -\catcode`( 11 -\def\BNE_op_( {\expandafter\BNE_until_)_a\romannumeral-`0\BNE_getnext }% -\let\BNE_oparen\BNE_op_( -\catcode`( 12 -\def\BNE_tmpa #1{% - \def\BNE_until_)_a ##1{\xint_UDsignfork - ##1{\expandafter \BNE_until_)_a\romannumeral-`0#1}% - -{\BNE_until_)_b ##1}% - \krof }% -}\expandafter\BNE_tmpa\csname BNE_op_-vi\endcsname -\def \BNE_until_)_b #1#2% + \def#5% {% - \ifcase #1\expandafter \BNE_missing_)_? % missing ) ? - \or\expandafter \BNE_getop % found closing ) - \else \xint_afterfi - {\expandafter \BNE_until_)_a\romannumeral-`0\csname BNE_op_#2\endcsname }% - \fi + \XINT_expandableerror + {An extra ) has been removed. Hit Return, fingers crossed.}% + \expandafter#2\romannumeral`&&@\expandafter\BNE_put_op_first + \romannumeral`&&@\BNE_getop_legacy }% -\def\BNE_missing_)_? {\BNE:missing_)_inserted \xint_c_ \BNE_done }% -\let\BNE_precedence_) \xint_c_i -\let\BNE_op_) \BNE_getop -\catcode`) 12 -\def\BNE_tmpc #1#2#3#4#5#6#7% +}% +\let\BNE_done\space +\expandafter\BNE_tmpa + \csname BNE_start\expandafter\endcsname + \csname BNE_check\expandafter\endcsname + \csname BNE_checkp\expandafter\endcsname + \csname BNE_op_-xii\expandafter\endcsname + \csname BNE_extra_)\endcsname +\def\BNE_tmpa #1#2#3#4#5#6% {% - \def #1##1% \BNE_op_<op> - {% keep value, get next number and operator, then do until - \expandafter #2\expandafter ##1\romannumeral-`0\expandafter\BNE_getnext }% - \def #2##1##2% \BNE_until_<op>_a - {\xint_UDsignfork - ##2{\expandafter #2\expandafter ##1\romannumeral-`0#4}% - -{#3##1##2}% - \krof }% - \def #3##1##2##3##4% \BNE_until_<op>_b - {% either execute next operation now, or first do next (possibly unary) - \ifnum ##2>#5% - \xint_afterfi {\expandafter #2\expandafter ##1\romannumeral-`0% - \csname BNE_op_##3\endcsname {##4}}% - \else \xint_afterfi {\expandafter ##2\expandafter ##3% - \csname .=#6{\BNE_unlock ##1}{\BNE_unlock ##4}\endcsname }% - \fi }% - \let #7#5% -}% -\def\BNE_tmpb #1#2#3% -{% - \expandafter\BNE_tmpc - \csname BNE_op_#1\expandafter\endcsname - \csname BNE_until_#1_a\expandafter\endcsname - \csname BNE_until_#1_b\expandafter\endcsname - \csname BNE_op_-#2\expandafter\endcsname - \csname xint_c_#2\expandafter\endcsname - \csname #3\expandafter\endcsname - \csname BNE_precedence_#1\endcsname + \def #1##1% op_( + {% + \expandafter #4\romannumeral`&&@\BNE_getnext + }% + \def #2##1% op_) + {% + \expanded{\unexpanded{\BNE_put_op_first{##1}}\expandafter}\romannumeral`&&@\BNE_getop + }% + \def #3% oparen + {% + \expandafter #4\romannumeral`&&@\BNE_getnext + }% + \def #4##1% check- + {% + \xint_UDsignfork + ##1{\expandafter#5\romannumeral`&&@#6}% + -{#5##1}% + \krof + }% + \def #5##1##2% checkp + {% + \ifcase ##1\expandafter\BNE_missing_) + \or \csname BNE_op_##2\expandafter\endcsname + \else + \expandafter #5\romannumeral`&&@\csname BNE_op_##2\expandafter\endcsname + \fi + }% }% -\BNE_tmpb +{vi}{BNE_Op_add}% -\BNE_tmpb -{vi}{BNE_Op_sub}% -\BNE_tmpb *{vii}{BNE_Op_mul}% -\BNE_tmpb /{vii}{BNE_Op_divround}% -\BNE_tmpb ^{viii}{BNE_Op_pow}% -\expandafter\def\csname BNE_itself_**\endcsname {^}% shortcut for alias -\expandafter\def\csname BNE_itself_//\endcsname {//}% -\expandafter\def\csname BNE_itself_/:\endcsname {/:}% -\BNE_tmpb {//}{vii}{BNE_Op_div}% -\BNE_tmpb {/:}{vii}{BNE_Op_mod}% -\let\BNE_precedence_! \xint_c_x -\def\BNE_op_! #1% - {\expandafter\BNE_getop\csname .=\BNE_Op_fac{\BNE_unlock #1}\endcsname }% -\def\BNE_tmpa #1% +\expandafter\BNE_tmpa + \csname BNE_op_(\expandafter\endcsname + \csname BNE_op_)\expandafter\endcsname + \csname BNE_oparen\expandafter\endcsname + \csname BNE_check-_)\expandafter\endcsname + \csname BNE_checkp_)\expandafter\endcsname + \csname BNE_op_-xii\endcsname +\catcode`) 11 +\let\BNE_precedence_)\xint_c_i +\def\BNE_missing_) + {\XINT_expandableerror{Sorry to report a missing ) at the end of this journey.}% + \xint_c_ \BNE_done }% +\catcode`) 12 +\def\BNE_tmpa #1#2#3#4#5% {% -\expandafter\BNE_tmpb - \csname BNE_op_-#1\expandafter\endcsname - \csname BNE_until_-#1_a\expandafter\endcsname - \csname BNE_until_-#1_b\expandafter\endcsname - \csname xint_c_#1\endcsname + \def #1##1% \BNE_op_, + {% + \expanded{\unexpanded{#2{##1}}\expandafter}% + \romannumeral`&&@\expandafter#3\romannumeral`&&@\BNE_getnext + }% + \def #2##1##2##3##4{##2##3{##1##4}}% \BNE_exec_, + \def #3##1% \BNE_check-_, + {% + \xint_UDsignfork + ##1{\expandafter#4\romannumeral`&&@#5}% + -{#4##1}% + \krof + }% + \def #4##1##2% \BNE_checkp_, + {% + \ifnum ##1>\xint_c_iii + \expandafter#4% + \romannumeral`&&@\csname BNE_op_##2\expandafter\endcsname + \else + \expandafter##1\expandafter##2% + \fi + }% }% -\def\BNE_tmpb #1#2#3#4% +\expandafter\BNE_tmpa + \csname BNE_op_,\expandafter\endcsname + \csname BNE_exec_,\expandafter\endcsname + \csname BNE_check-_,\expandafter\endcsname + \csname BNE_checkp_,\expandafter\endcsname + \csname BNE_op_-xii\endcsname +\expandafter\let\csname BNE_precedence_,\endcsname\xint_c_iii +\def\BNE_tmpb #1#2#3#4#5% {% \def #1% \BNE_op_-<level> - {% get next number+operator then switch to _until macro - \expandafter #2\romannumeral-`0\BNE_getnext + {% + \expandafter #2\romannumeral`&&@\expandafter#3% + \romannumeral`&&@\BNE_getnext }% - \def #2##1% \BNE_until_-<level>_a - {\xint_UDsignfork - ##1{\expandafter #2\romannumeral-`0#1}% - -{#3##1}% - \krof }% - \def #3##1##2##3% \BNE_until_-<level>_b + \def #2##1##2##3% \BNE_exec_-<level> {% - \ifnum ##1>#4% - \xint_afterfi {\expandafter #2\romannumeral-`0% - \csname BNE_op_##2\endcsname {##3}}% - \else - \xint_afterfi {\expandafter ##1\expandafter ##2% - \csname .=\expandafter\BNE_Op_opp - \romannumeral-`0\BNE_unlock ##3\endcsname }% - \fi + \expandafter ##1\expandafter ##2\expandafter + {\expandafter{\romannumeral`&&@\expandafter\BNE_Op_opp\xint_firstofone##3}}% + }% + \def #3##1% \BNE_check-_-<level> + {% + \xint_UDsignfork + ##1{\expandafter #4\romannumeral`&&@#1}% + -{#4##1}% + \krof + }% + \def #4##1##2% \BNE_checkp_-<level> + {% + \ifnum ##1>#5% + \expandafter #4% + \romannumeral`&&@\csname BNE_op_##2\expandafter\endcsname + \else + \expandafter ##1\expandafter ##2% + \fi }% }% -\BNE_tmpa {vi}% -\BNE_tmpa {vii}% -\BNE_tmpa {viii}% -\def\BNE_Op_opp #1{\if-#1\else\if0#10\else-#1\fi\fi }% -\catcode`, 11 -\def\BNE_op_, #1% +\def\BNE_tmpa #1% {% - \expandafter \BNE_until_,_a\expandafter #1\romannumeral-`0\BNE_getnext +\expandafter\BNE_tmpb + \csname BNE_op_-#1\expandafter\endcsname + \csname BNE_exec_-#1\expandafter\endcsname + \csname BNE_check-_-#1\expandafter\endcsname + \csname BNE_checkp_-#1\expandafter\endcsname + \csname xint_c_#1\endcsname }% -\def\BNE_tmpa #1{% #1 = \BNE_op_-vi - \def\BNE_until_,_a ##1##2% +\BNE_tmpa {xii}% +\BNE_tmpa {xiv}% +\BNE_tmpa {xvi}% +\BNE_tmpa {xviii}% +\def\BNE_Op_opp #1{\if-#1\else\if0#10\else-#1\fi\fi }% +\def\BNE_defbin_c #1#2#3#4#5#6#7% +{% + \def #1##1% \BNE_op_<op> + {% + \expanded{\unexpanded{#2{##1}}\expandafter}% + \romannumeral`&&@\expandafter#3\romannumeral`&&@\BNE_getnext + }% + \def #2##1##2##3##4% \BNE_exec_<op> + {% + \expandafter##2\expandafter##3\expandafter + {\expandafter{\romannumeral`&&@#6##1##4}}% + }% + \def #3##1% \BNE_check-_<op> {% \xint_UDsignfork - ##2{\expandafter \BNE_until_,_a\expandafter ##1\romannumeral-`0#1}% - -{\BNE_until_,_b ##1##2}% - \krof }% -}\expandafter\BNE_tmpa\csname BNE_op_-vi\endcsname -\def\BNE_until_,_b #1#2#3#4% -{% - \ifnum #2>\xint_c_ii - \xint_afterfi {\expandafter \BNE_until_,_a - \expandafter #1\romannumeral-`0% - \csname BNE_op_#3\endcsname {#4}}% + ##1{\expandafter#4\romannumeral`&&@#5}% + -{#4##1}% + \krof + }% + \def #4##1##2% \BNE_checkp_<op> + {% + \ifnum ##1>#7% + \expandafter#4% + \romannumeral`&&@\csname BNE_op_##2\expandafter\endcsname \else - \xint_afterfi {\expandafter #2\expandafter #3% - \csname .=\BNE_unlock #1, \BNE_unlock #4\endcsname }% + \expandafter ##1\expandafter ##2% \fi + }% +}% +\def\BNE_defbin_b #1#2#3#4% +{% + \expandafter\BNE_defbin_c + \csname BNE_op_#1\expandafter\endcsname + \csname BNE_exec_#1\expandafter\endcsname + \csname BNE_check-_#1\expandafter\endcsname + \csname BNE_checkp_#1\expandafter\endcsname + \csname BNE_op_-#3\expandafter\endcsname + \csname #4\expandafter\endcsname + \csname BNE_precedence_#1\endcsname + \expandafter + \let\csname BNE_precedence_#1\expandafter\endcsname + \csname xint_c_#2\endcsname +}% +\BNE_defbin_b {//} {xiv}{xiv}{BNE_Op_div}% +\BNE_defbin_b {/:} {xiv}{xiv}{BNE_Op_mod}% +\BNE_defbin_b + {xii}{xii}{BNE_Op_add}% +\BNE_defbin_b - {xii}{xii}{BNE_Op_sub}% +\BNE_defbin_b * {xiv}{xiv}{BNE_Op_mul}% +\BNE_defbin_b / {xiv}{xiv}{BNE_Op_divround}% +\BNE_defbin_b ^ {xviii}{xviii}{BNE_Op_pow}% +\expandafter\def\csname BNE_itself_**\endcsname {^}% +\expandafter\def\csname BNE_itself_//\endcsname {//}% +\expandafter\def\csname BNE_itself_/:\endcsname {/:}% +\expandafter\let\csname BNE_precedence_***\endcsname \xint_c_xvi +\catcode`! 11 +\let\BNE_precedence_! \xint_c_xx +\def\BNE_op_! #1% +{% + \expandafter\BNE_put_op_first + \expanded{{{\BNE_Op_fac#1}}\expandafter}\romannumeral`&&@\BNE_getop }% -\let \BNE_precedence_, \xint_c_ii -\let\BNE_tmpa\relax \let\BNE_tmpb\relax \let\BNE_tmpc\relax -\BNErestorecatcodes +\let\BNEtmpa\relax \let\BNE_tmpa\relax \let\BNE_tmpb\relax \let\BNE_tmpc\relax +\BNErestorecatcodes% \endinput %% %% End of file `bnumexpr.sty'. |