diff options
Diffstat (limited to 'Master/texmf-dist/tex/generic/xint/xintexpr.sty')
-rw-r--r-- | Master/texmf-dist/tex/generic/xint/xintexpr.sty | 105 |
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'. |