summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/xint/xintexpr.sty
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/generic/xint/xintexpr.sty')
-rw-r--r--Master/texmf-dist/tex/generic/xint/xintexpr.sty105
1 files changed, 62 insertions, 43 deletions
diff --git a/Master/texmf-dist/tex/generic/xint/xintexpr.sty b/Master/texmf-dist/tex/generic/xint/xintexpr.sty
index c6889155f66..baf227ba966 100644
--- a/Master/texmf-dist/tex/generic/xint/xintexpr.sty
+++ b/Master/texmf-dist/tex/generic/xint/xintexpr.sty
@@ -21,7 +21,7 @@
%% same distribution. (The sources need not necessarily be
%% in the same archive or directory.)
%% ---------------------------------------------------------------
-%% The xint bundle 1.4d 2021/03/29
+%% The xint bundle 1.4e 2021/05/05
%% Copyright (C) 2013-2021 by Jean-Francois Burnol
%% xintexpr: Expandable expression parser
%% ---------------------------------------------------------------
@@ -82,17 +82,27 @@
\XINTsetupcatcodes%
\XINT_providespackage
\ProvidesPackage{xintexpr}%
- [2021/03/29 v1.4d Expandable expression parser (JFB)]%
+ [2021/05/05 v1.4e Expandable expression parser (JFB)]%
\catcode`! 11
\let\XINT_Cmp \xintiiCmp
\def\XINTfstop{\noexpand\XINTfstop}%
-\def\xintDigits {\futurelet\XINT_token\xintDigitss}%
-\def\xintDigitss #1={\afterassignment\xintDigitsss\mathchardef\XINTdigits=}%
-\def\xintDigitsss#1{\ifx*\XINT_token\expandafter\xintreloadxinttrig\fi}%
+\def\xintreloadscilibs{\xintreloadxintlog\xintreloadxinttrig}%
+\def\xintDigits {\futurelet\XINT_token\xintDigits_i}%
+\def\xintDigits_i#1={\afterassignment\xintDigits_j\mathchardef\XINT_digits=}%
+\def\xintDigits_j#1%
+{%
+ \let\XINTdigits=\XINT_digits
+ \ifx*\XINT_token\expandafter\xintreloadscilibs\fi
+}%
\let\xintfracSetDigits\xintSetDigits
-\def\xintSetDigits#1#{\if\relax\detokenize{#1}\relax
- \else\afterassignment\xintreloadxinttrig\fi
- \xintfracSetDigits}%
+\def\xintSetDigits#1#{\if\relax\detokenize{#1}\relax\expandafter\xintfracSetDigits
+ \else\expandafter\xintSetDigits_a\fi}%
+\def\xintSetDigits_a#1%
+{%
+ \mathchardef\XINT_digits=\numexpr#1\relax
+ \let\XINTdigits\XINT_digits
+ \xintreloadscilibs
+}%
\def\XINT:expr:toblistwith#1#2%
{%
{\expandafter\XINT:expr:toblist_checkempty
@@ -252,9 +262,9 @@
{%
\expandafter\XINT_expr_wrap
\expanded
- \XINT:NEhook:x:mapwithin\XINT:expr:mapwithin{\XINTbracediRoundzero}%
+ \XINT:NEhook:x:mapwithin\XINT:expr:mapwithin{\XINTiRoundzero_braced}%
}%
-\def\XINTbracediRoundzero#1{{\xintiRound{0}{#1}}}%
+\def\XINTiRoundzero_braced#1{{\xintiRound{0}{#1}}}%
\def\XINT_iexpr_withopt [#1]%
{%
\expandafter\XINT_iexpr_round
@@ -268,11 +278,11 @@
}%
\def\XINT_iexpr_round_a #1.%
{%
- \expandafter\XINT_expr_wrap
+ \expandafter\XINT_iexpr_wrap
\expanded
- \XINT:NEhook:x:mapwithin\XINT:expr:mapwithin{\XINTbracedRound{#1}}%
+ \XINT:NEhook:x:mapwithin\XINT:expr:mapwithin{\XINTiRound_braced{#1}}%
}%
-\def\XINTbracedRound#1#2{{\xintRound{#1}{#2}}}%
+\def\XINTiRound_braced#1#2{{\xintiRound{#1}{#2}[\the\numexpr-#1]}}%
\def\xintfloatexpro #1%
{%
\ifx [#1\expandafter\XINT_flexpr_withopt\else\expandafter\XINT_flexpr_noopt
@@ -298,23 +308,26 @@
\expandafter\XINT_flexpr_wrap
\the\numexpr#1\expandafter.%
\expanded
- \XINT:NEhook:x:mapwithin\XINT:expr:mapwithin{\XINTbracedinFloat[#1]}%
+ \XINT:NEhook:x:mapwithin\XINT:expr:mapwithin{\XINTinFloat_braced[#1]}%
}%
-\def\XINTbracedinFloat[#1]#2{{\XINTinFloat[#1]{#2}}}%
+\def\XINTinFloat_braced[#1]#2{{\XINTinFloat[#1]{#2}}}%
\def\XINT_expr_wrap {\XINTfstop\XINTexprprint.}%
+\def\XINT_iexpr_wrap {\XINTfstop\XINTiexprprint.}%
\def\XINT_iiexpr_wrap {\XINTfstop\XINTiiexprprint.}%
\def\XINT_flexpr_wrap {\XINTfstop\XINTflexprprint}%
\protected\def\XINTexprprint.%
{\XINT:NEhook:x:toblist\XINT:expr:toblistwith\xintexprPrintOne}%
\let\xintexprPrintOne\xintFracToSci
+\protected\def\XINTiexprprint.%
+ {\XINT:NEhook:x:toblist\XINT:expr:toblistwith\xintiexprPrintOne}%
+\let\xintiexprPrintOne\xintDecToString
\def\xintexprEmptyItem{[]}%
\protected\def\XINTiiexprprint.%
{\XINT:NEhook:x:toblist\XINT:expr:toblistwith\xintiiexprPrintOne}%
\let\xintiiexprPrintOne\xint_firstofone
\protected\def\XINTflexprprint #1.%
- {\XINT:NEhook:x:toblist\XINT:expr:toblistwith{\xintfloatexprPrintOne{#1}}}%
-\def\xintfloatexprPrintOne#1%
- {\romannumeral0\XINT_pfloat_opt [\xint:#1]}% bad direct jump
+ {\XINT:NEhook:x:toblist\XINT:expr:toblistwith{\xintfloatexprPrintOne[#1]}}%
+\let\xintfloatexprPrintOne\xintPFloat_wopt
\protected\def\XINTboolexprprint.%
{\XINT:NEhook:x:toblist\XINT:expr:toblistwith\xintboolexprPrintOne}%
\def\xintboolexprPrintOne#1{\xintiiifNotZero{#1}{True}{False}}%
@@ -339,9 +352,20 @@
\def\xintbareeval {\XINT_expr_start }%
\def\xintbarefloateval{\XINT_flexpr_start}%
\def\xintbareiieval {\XINT_iiexpr_start}%
+\def\XINT_expr_unlock {\expandafter\xint_firstofone\romannumeral`&&@}%
\def\xintthebareeval {\romannumeral0\expandafter\xint_stop_atfirstofone\romannumeral0\xintbareeval}%
-\def\xintthebarefloateval {\romannumeral0\expandafter\xint_stop_atfirstofone\romannumeral0\xintbarefloateval}%
\def\xintthebareiieval {\romannumeral0\expandafter\xint_stop_atfirstofone\romannumeral0\xintbareiieval}%
+\def\xintthebarefloateval {\romannumeral0\expandafter\xint_stop_atfirstofone\romannumeral0\xintbarefloateval}%
+\def\xintthebareroundedfloateval
+{%
+ \romannumeral0\expandafter\xintthebareroundedfloateval_a\romannumeral0\xintbarefloateval
+}%
+\def\xintthebareroundedfloateval_a
+{%
+ \expandafter\xint_stop_atfirstofone
+ \expanded\XINT:NEhook:x:mapwithin\XINT:expr:mapwithin{\XINTinFloatSdigits_braced}%
+}%
+\def\XINTinFloatSdigits_braced#1{{\XINTinFloatS[\XINTdigits]{#1}}}%
\def\xinteval #1%
{\expanded\expandafter\XINTexprprint\expandafter.\romannumeral0\xintbareeval#1\relax}%
\def\xintieval #1%
@@ -624,7 +648,7 @@
{%
\expandafter\XINT_expr_scanexp_main_b\romannumeral`&&@#1%
}%
-\def\XINT_expr_scanexpr_hit_cs\ifnum#1\fi#2\XINT_expr_scanexp_again
+\def\XINT_expr_scanexp_hit_cs\ifnum#1\fi#2\XINT_expr_scanexp_again
{%
]\iffalse{{{\fi}}\expandafter}\romannumeral`&&@\XINT_expr_getop#2%
}%
@@ -1134,7 +1158,7 @@
\XINT_expr_defbin_b {flexpr} / {xiv}{xiv}{XINTinFloatDiv}%
\XINT_expr_defbin_b {iiexpr} / {xiv}{xiv}{xintiiDivRound}%
\XINT_expr_defbin_b {expr} ^ {xviii}{xviii}{xintPow}%
-\XINT_expr_defbin_b {flexpr} ^ {xviii}{xviii}{XINTinFloatPowerH}%
+\XINT_expr_defbin_b {flexpr} ^ {xviii}{xviii}{XINTinFloatSciPow}%
\XINT_expr_defbin_b {iiexpr} ^ {xviii}{xviii}{xintiiPow}%
\catcode`& 12
\xintFor #1 in {and,or,xor,mod} \do
@@ -1817,7 +1841,7 @@
{%
\expandafter\XINT_expr_put_op_first
\expanded{{\romannumeral`&&@\XINT:NEhook:f:one:from:one
- {\romannumeral`&&@\XINTinFloatFac#1}}\expandafter}\romannumeral`&&@\XINT_expr_getop
+ {\romannumeral`&&@\XINTinFloatFacdigits#1}}\expandafter}\romannumeral`&&@\XINT_expr_getop
}%
\def\XINT_iiexpr_op_! #1%
{%
@@ -1860,7 +1884,8 @@
\def\XINT_expr_defvar #1#2%
{%
\def\XINT_defvar_tmpa{#2}%
- \expandafter\XINT_expr_defvar_a\expandafter#1\romannumeral\XINT_expr_fetch_to_semicolon
+ \expandafter\XINT_expr_defvar_a\expanded{\unexpanded{{#1}}\expandafter}%
+ \romannumeral\XINT_expr_fetch_to_semicolon
}%
\def\XINT_expr_defvar_a #1#2%
{%
@@ -1875,11 +1900,11 @@
{Aborting: not allowed to declare variable with empty name.}%
\or
\XINT_global
- \expandafter\edef\csname XINT_expr_varvalue_\XINT_defvar_tmpa\endcsname
- {\romannumeral0#1#2\relax}%
+ \expandafter
+ \edef\csname XINT_expr_varvalue_\XINT_defvar_tmpa\endcsname{#1#2\relax}%
\XINT_expr_defvar_one_b\XINT_defvar_tmpa
\else
- \edef\XINT_defvar_tmpb{\romannumeral0#1#2\relax}%
+ \edef\XINT_defvar_tmpb{#1#2\relax}%
\edef\XINT_defvar_tmpd{\expandafter\xintLength\expandafter{\XINT_defvar_tmpb}}%
\let\XINT_defvar_tmpe\empty
\if1\XINT_defvar_tmpd
@@ -1913,12 +1938,12 @@
}%
\catcode`~ 3
\catcode`: 11
-\def\xintdefvar {\xintexprSafeCatcodes\xintdefvar_a}%
-\def\xintdefiivar {\xintexprSafeCatcodes\xintdefiivar_a}%
-\def\xintdeffloatvar {\xintexprSafeCatcodes\xintdeffloatvar_a}%
-\def\xintdefvar_a #1={\XINT_expr_defvar\xintthebareeval {#1}}%
-\def\xintdefiivar_a #1={\XINT_expr_defvar\xintthebareiieval {#1}}%
-\def\xintdeffloatvar_a #1={\XINT_expr_defvar\xintthebarefloateval {#1}}%
+\def\xintdefvar {\xintexprSafeCatcodes\xintdefvar_a}%
+\def\xintdefvar_a#1={\XINT_expr_defvar\xintthebareeval{#1}}%
+\def\xintdefiivar {\xintexprSafeCatcodes\xintdefiivar_a}%
+\def\xintdefiivar_a#1={\XINT_expr_defvar\xintthebareiieval{#1}}%
+\def\xintdeffloatvar {\xintexprSafeCatcodes\xintdeffloatvar_a}%
+\def\xintdeffloatvar_a #1={\XINT_expr_defvar\xintthebareroundedfloateval{#1}}%
\def\xintunassignvar #1{%
\edef\XINT_unvar_tmpa{#1}%
\edef\XINT_unvar_tmpa {\xint_zapspaces_o\XINT_unvar_tmpa}%
@@ -2791,7 +2816,7 @@
{%
\expandafter #1\expandafter #2\expandafter{%
\romannumeral`&&@\XINT:NEhook:f:one:from:one
- {\romannumeral`&&@\XINTinFloatFracdigits#3}}%
+ {\romannumeral`&&@\XINTinFloatFrac#3}}%
}%
\def\XINT_expr_func_floor #1#2#3%
{%
@@ -2825,7 +2850,6 @@
\romannumeral`&&@\XINT:NEhook:f:one:from:one
{\romannumeral`&&@\xintSqr#3}}%
}%
-\def\XINTinFloatSqr#1{\XINTinFloatMul{#1}{#1}}%
\def\XINT_flexpr_func_sqr #1#2#3%
{%
\expandafter #1\expandafter #2\expandafter{%
@@ -2942,13 +2966,6 @@
}}%
}%
\let\XINT_flexpr_func_sqrt\XINT_expr_func_sqrt
-\def\XINT_expr_func_sqrt_ #1#2#3%
-{%
- \expandafter #1\expandafter #2\expandafter{%
- \romannumeral`&&@\XINT:NEhook:f:one:from:one
- {\romannumeral`&&@\XINTinFloatSqrtdigits#3}}%
-}%
-\let\XINT_flexpr_func_sqrt_\XINT_expr_func_sqrt_
\def\XINT_iiexpr_func_sqrt #1#2#3%
{%
\expandafter #1\expandafter #2\expandafter{%
@@ -4284,13 +4301,14 @@
\fi}@
}@
\catcode`% 14
-\XINT_setcatcodes % clean up to avoid surprises if something changes
+\XINTsetcatcodes % clean up to avoid surprises if something changes
\newif\ifxintexprsafecatcodes
\let\xintexprRestoreCatcodes\empty
\def\xintexprSafeCatcodes
{%
\unless\ifxintexprsafecatcodes
\edef\xintexprRestoreCatcodes {%
+ \endlinechar=\the\endlinechar
\catcode59=\the\catcode59 % ;
\catcode34=\the\catcode34 % "
\catcode63=\the\catcode63 % ?
@@ -4319,6 +4337,7 @@
}%
\fi
\xintexprsafecatcodestrue
+ \endlinechar=13 %
\catcode59=12 % ;
\catcode34=12 % "
\catcode63=12 % ?
@@ -4352,7 +4371,7 @@
{\input xinttrig.sty
\input xintlog.sty
}%
-\XINT_restorecatcodes_endinput%
+\XINTrestorecatcodesendinput%
\endinput
%%
%% End of file `xintexpr.sty'.