summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/bnumexpr/bnumexpr.sty
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2021-05-13 21:13:13 +0000
committerKarl Berry <karl@freefriends.org>2021-05-13 21:13:13 +0000
commit6a388cdf8e758efeeeb4d614735137e275dd22de (patch)
treee105ee945f2b3607a51e50c50a9e36958df1971e /Master/texmf-dist/tex/latex/bnumexpr/bnumexpr.sty
parentaac785f6c46081d4ec382ebb08c31b71064fc863 (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/bnumexpr.sty')
-rw-r--r--Master/texmf-dist/tex/latex/bnumexpr/bnumexpr.sty660
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'.