%% %% This is file `xintexpr.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% xint.dtx (with options: `xintexpr') %% %% IMPORTANT NOTICE: %% %% For the copyright see the source file. %% %% Any modified versions of this file must be renamed %% with new filenames distinct from xintexpr.sty. %% %% For distribution of the original source see the terms %% for copying and modification in the file xint.dtx. %% %% This generated file may be distributed as long as the %% original source files, as listed above, are part of the %% same distribution. (The sources need not necessarily be %% in the same archive or directory.) %% --------------------------------------------------------------- %% The xint bundle v1.1c 2015/09/12 %% Copyright (C) 2013-2015 by Jean-Francois Burnol %% xintexpr: Expandable expression parser %% --------------------------------------------------------------- \begingroup\catcode61\catcode48\catcode32=10\relax% \catcode13=5 % ^^M \endlinechar=13 % \catcode123=1 % { \catcode125=2 % } \catcode64=11 % @ \catcode35=6 % # \catcode44=12 % , \catcode45=12 % - \catcode46=12 % . \catcode58=12 % : \def\z {\endgroup}% \expandafter\let\expandafter\x\csname ver@xintexpr.sty\endcsname \expandafter\let\expandafter\w\csname ver@xintfrac.sty\endcsname \expandafter\let\expandafter\t\csname ver@xinttools.sty\endcsname \expandafter \ifx\csname PackageInfo\endcsname\relax \def\y#1#2{\immediate\write-1{Package #1 Info: #2.}}% \else \def\y#1#2{\PackageInfo{#1}{#2}}% \fi \expandafter \ifx\csname numexpr\endcsname\relax \y{xintexpr}{\numexpr not available, aborting input}% \aftergroup\endinput \else \ifx\x\relax % plain-TeX, first loading of xintexpr.sty \ifx\w\relax % but xintfrac.sty not yet loaded. \expandafter\def\expandafter\z\expandafter {\z\input xintfrac.sty\relax}% \fi \ifx\t\relax % but xinttools.sty not yet loaded. \expandafter\def\expandafter\z\expandafter {\z\input xinttools.sty\relax}% \fi \else \def\empty {}% \ifx\x\empty % LaTeX, first loading, % variable is initialized, but \ProvidesPackage not yet seen \ifx\w\relax % xintfrac.sty not yet loaded. \expandafter\def\expandafter\z\expandafter {\z\RequirePackage{xintfrac}}% \fi \ifx\t\relax % xinttools.sty not yet loaded. \expandafter\def\expandafter\z\expandafter {\z\RequirePackage{xinttools}}% \fi \else \aftergroup\endinput % xintexpr already loaded. \fi \fi \fi \z% \XINTsetupcatcodes% \XINT_providespackage \ProvidesPackage{xintexpr}% [2015/09/12 v1.1c Expandable expression parser (jfB)]% \def\xint_gob_til_! #1!{}% this ! has catcode 11 \edef\XINT_expr_lockscan#1!{\noexpand\expandafter\space\noexpand\csname .=#1\endcsname }% \edef\XINT_expr_lockit #1{\noexpand\expandafter\space\noexpand\csname .=#1\endcsname }% \def\XINT_expr_inintpart #1!{\XINT_num{#1}}% \def\XINT_expr_infracpart #1e#2!{#1![\the\numexpr#2-\xintLength{#1}]!}% \def\XINT_expr_inexppart e#1!{![\the\numexpr #1]!}% \def\XINT_expr_unlock {\expandafter\XINT_expr_unlock_a\string }% \def\XINT_expr_unlock_a #1.={}% \def\XINT_expr_unexpectedtoken {\xintError:ignored }% \let\XINT_expr_done\space \def\XINT_expr_wrap { !\XINT_expr_usethe\XINT_protectii\XINT_expr_print }% \def\XINT_iiexpr_wrap { !\XINT_expr_usethe\XINT_protectii\XINT_iiexpr_print }% \def\XINT_protectii #1{\noexpand\XINT_protectii\noexpand #1\noexpand }% \protected\def\XINT_expr_usethe\XINT_protectii {\xintError:missing_xintthe!}% \def\XINT_expr_print #1{\xintSPRaw::csv {\XINT_expr_unlock #1}}% \def\XINT_iiexpr_print #1{\xintCSV::csv {\XINT_expr_unlock #1}}% \def\XINT_boolexpr_print #1{\xintIsTrue::csv {\XINT_expr_unlock #1}}% \def\xintexpr {\romannumeral0\xinteval }% \def\xintiexpr {\romannumeral0\xintieval }% \def\xintfloatexpr {\romannumeral0\xintfloateval }% \def\xintiiexpr {\romannumeral0\xintiieval }% \def\xinttheexpr {\romannumeral-`0\expandafter\XINT_expr_print\romannumeral0\xintbareeval }% \def\xinttheiexpr {\romannumeral-`0\xintthe\xintiexpr }% \def\xintthefloatexpr {\romannumeral-`0\xintthe\xintfloatexpr }% \def\xinttheiiexpr {\romannumeral-`0\expandafter\XINT_iiexpr_print\romannumeral0\xintbareiieval }% \def\xintthe #1{\romannumeral-`0\expandafter\xint_gobble_iii\romannumeral-`0#1}% \def\xintthecoords #1{\romannumeral-`0\expandafter\expandafter\expandafter \XINT_thecoords_a \expandafter\xint_gobble_iii\romannumeral0#1}% \def\XINT_thecoords_a #1#2% #1=print macro, indispensible for scientific notation {\expandafter\XINT_expr_unlock\csname.=\expandafter\XINT_thecoords_b \romannumeral-`0#1#2,!,!,^\endcsname }% \def\XINT_thecoords_b #1#2,#3#4,% {\xint_gob_til_! #3\XINT_thecoords_c ! (#1#2, #3#4)\XINT_thecoords_b }% \def\XINT_thecoords_c #1^{}% \def\xintbareeval {\expandafter\XINT_expr_until_end_a\romannumeral-`0\XINT_expr_getnext }% \def\xintbarefloateval {\expandafter\XINT_flexpr_until_end_a\romannumeral-`0\XINT_expr_getnext }% \def\xintbareiieval {\expandafter\XINT_iiexpr_until_end_a\romannumeral-`0\XINT_expr_getnext }% \def\xinteval {\expandafter\XINT_expr_wrap\romannumeral0\xintbareeval }% \def\xintiieval {\expandafter\XINT_iiexpr_wrap\romannumeral0\xintbareiieval }% \def\xintieval #1% {\ifx [#1\expandafter\XINT_iexpr_withopt\else\expandafter\XINT_iexpr_noopt \fi #1}% \def\XINT_iexpr_noopt {\expandafter\XINT_iexpr_wrap \expandafter 0\romannumeral0\xintbareeval }% \def\XINT_iexpr_withopt [#1]% {% \expandafter\XINT_iexpr_wrap\expandafter {\the\numexpr \xint_zapspaces #1 \xint_gobble_i\expandafter}% \romannumeral0\xintbareeval }% \def\XINT_iexpr_wrap #1#2% {% \expandafter\XINT_expr_wrap \csname .=\xintRound::csv {#1}{\XINT_expr_unlock #2}\endcsname }% \def\xintfloateval #1% {% \ifx [#1\expandafter\XINT_flexpr_withopt_a\else\expandafter\XINT_flexpr_noopt \fi #1% }% \def\XINT_flexpr_noopt {% \expandafter\XINT_flexpr_withopt_b\expandafter\xinttheDigits \romannumeral0\xintbarefloateval }% \def\XINT_flexpr_withopt_a [#1]% {% \expandafter\XINT_flexpr_withopt_b\expandafter {\the\numexpr\xint_zapspaces #1 \xint_gobble_i\expandafter}% \romannumeral0\xintbarefloateval }% \def\XINT_flexpr_withopt_b #1#2% {% \expandafter\XINT_flexpr_wrap\csname .;#1.=% ; and not : as before b'cause NewExpr \XINTinFloat::csv {#1}{\XINT_expr_unlock #2}\endcsname }% \def\XINT_flexpr_wrap { !\XINT_expr_usethe\XINT_protectii\XINT_flexpr_print }% \def\XINT_flexpr_print #1% {% \expandafter\xintPFloat::csv \romannumeral-`0\expandafter\XINT_expr_unlock_sp\string #1!% }% \catcode`: 12 \def\XINT_expr_unlock_sp #1.;#2.=#3!{{#2}{#3}}% \catcode`: 11 \def\xintboolexpr {\romannumeral0\expandafter\expandafter\expandafter \XINT_boolexpr_done \expandafter\xint_gobble_iv\romannumeral0\xinteval }% \def\xinttheboolexpr {\romannumeral-`0\expandafter\expandafter\expandafter \XINT_boolexpr_print\expandafter\xint_gobble_iv\romannumeral0\xinteval }% \def\XINT_boolexpr_done { !\XINT_expr_usethe\XINT_protectii\XINT_boolexpr_print }% \def\xintifboolexpr #1{\romannumeral0\xintifnotzero {\xinttheexpr #1\relax}}% \def\xintifboolfloatexpr #1{\romannumeral0\xintifnotzero {\xintthefloatexpr #1\relax}}% \def\xintifbooliiexpr #1{\romannumeral0\xintifnotzero {\xinttheiiexpr #1\relax}}% \def\XINT_::_end #1,#2{\xint_gobble_i #2}% \def\xintCSV::csv #1{\expandafter\XINT_csv::_a\romannumeral-`0#1,^,}% \def\XINT_csv::_a {\XINT_csv::_b {}}% \def\XINT_csv::_b #1#2,{\expandafter\XINT_csv::_c \romannumeral-`0#2,{#1}}% \def\XINT_csv::_c #1{\if ^#1\expandafter\XINT_::_end\fi\XINT_csv::_d #1}% \def\XINT_csv::_d #1,#2{\XINT_csv::_b {#2, #1}}% possibly, item #1 is empty. \def\xintSPRaw {\romannumeral0\xintspraw }% \def\xintspraw #1{\expandafter\XINT_spraw\romannumeral-`0#1[\W]}% \def\XINT_spraw #1[#2#3]{\xint_gob_til_W #2\XINT_spraw_a\W\XINT_spraw_p #1[#2#3]}% \def\XINT_spraw_a\W\XINT_spraw_p #1[\W]{ #1}% \def\XINT_spraw_p #1[\W]{\xintpraw {#1}}% \def\xintSPRaw::csv #1{\romannumeral0\expandafter\XINT_spraw::_a\romannumeral-`0#1,^,}% \def\XINT_spraw::_a {\XINT_spraw::_b {}}% \def\XINT_spraw::_b #1#2,{\expandafter\XINT_spraw::_c \romannumeral-`0#2,{#1}}% \def\XINT_spraw::_c #1{\if ,#1\xint_dothis\XINT_spraw::_e\fi \if ^#1\xint_dothis\XINT_::_end\fi \xint_orthat\XINT_spraw::_d #1}% \def\XINT_spraw::_d #1,{\expandafter\XINT_spraw::_e\romannumeral0\XINT_spraw #1[\W],}% \def\XINT_spraw::_e #1,#2{\XINT_spraw::_b {#2, #1}}% \def\xintIsTrue::csv #1{\romannumeral0\expandafter\XINT_istrue::_a\romannumeral-`0#1,^,}% \def\XINT_istrue::_a {\XINT_istrue::_b {}}% \def\XINT_istrue::_b #1#2,{\expandafter\XINT_istrue::_c \romannumeral-`0#2,{#1}}% \def\XINT_istrue::_c #1{\if ,#1\xint_dothis\XINT_istrue::_e\fi \if ^#1\xint_dothis\XINT_::_end\fi \xint_orthat\XINT_istrue::_d #1}% \def\XINT_istrue::_d #1,{\expandafter\XINT_istrue::_e\romannumeral0\xintisnotzero {#1},}% \def\XINT_istrue::_e #1,#2{\XINT_istrue::_b {#2, #1}}% \def\XINT_:::_end #1,#2#3{\xint_gobble_i #3}% \def\xintRound::csv #1#2{\romannumeral0\expandafter\XINT_round::_b\expandafter {\the\numexpr#1\expandafter}\expandafter{\expandafter}\romannumeral-`0#2,^,}% \def\XINT_round::_b #1#2#3,{\expandafter\XINT_round::_c \romannumeral-`0#3,{#1}{#2}}% \def\XINT_round::_c #1{\if ,#1\xint_dothis\XINT_round::_e\fi \if ^#1\xint_dothis\XINT_:::_end\fi \xint_orthat\XINT_round::_d #1}% \def\XINT_round::_d #1,#2{% \expandafter\XINT_round::_e\romannumeral0\ifnum#2>\xint_c_ \expandafter\xintround\else\expandafter\xintiround\fi {#2}{#1},{#2}}% \def\XINT_round::_e #1,#2#3{\XINT_round::_b {#2}{#3, #1}}% \def\XINTinFloat::csv #1#2{\romannumeral0\expandafter\XINT_infloat::_b\expandafter {\the\numexpr #1\expandafter}\expandafter{\expandafter}\romannumeral-`0#2,^,}% \def\XINT_infloat::_b #1#2#3,{\XINT_infloat::_c #3,{#1}{#2}}% \def\XINT_infloat::_c #1{\if ,#1\xint_dothis\XINT_infloat::_e\fi \if ^#1\xint_dothis\XINT_:::_end\fi \xint_orthat\XINT_infloat::_d #1}% \def\XINT_infloat::_d #1,#2% {\expandafter\XINT_infloat::_e\romannumeral0\XINTinfloat [#2]{#1},{#2}}% \def\XINT_infloat::_e #1,#2#3{\XINT_infloat::_b {#2}{#3, #1}}% \def\xintPFloat::csv #1#2{\romannumeral0\expandafter\XINT_pfloat::_b\expandafter {\the\numexpr #1\expandafter}\expandafter{\expandafter}\romannumeral-`0#2,^,}% \def\XINT_pfloat::_b #1#2#3,{\expandafter\XINT_pfloat::_c \romannumeral-`0#3,{#1}{#2}}% \def\XINT_pfloat::_c #1{\if ,#1\xint_dothis\XINT_pfloat::_e\fi \if ^#1\xint_dothis\XINT_:::_end\fi \xint_orthat\XINT_pfloat::_d #1}% \def\XINT_pfloat::_d #1,#2% {\expandafter\XINT_pfloat::_e\romannumeral0\XINT_pfloat_opt [\xint_relax #2]{#1},{#2}}% \def\XINT_pfloat::_e #1,#2#3{\XINT_pfloat::_b {#2}{#3, #1}}% \def\XINT_expr_getnext #1% {% \expandafter\XINT_expr_getnext_a\romannumeral-`0#1% }% \def\XINT_expr_getnext_a #1% {% screens out sub-expressions and \count or \dimen registers/variables \xint_gob_til_! #1\XINT_expr_subexpr !% recall this ! has catcode 11 \ifcat\relax#1% \count or \numexpr etc... token or count, dimen, skip cs \expandafter\XINT_expr_countetc \else \expandafter\expandafter\expandafter\XINT_expr_getnextfork\expandafter\string \fi #1% }% \def\XINT_expr_subexpr !#1\fi !{\expandafter\XINT_expr_getop\xint_gobble_iii }% \def\XINT_expr_countetc #1% {% \ifx\count#1\else\ifx#1\dimen\else\ifx#1\numexpr\else\ifx#1\dimexpr\else \ifx\skip#1\else\ifx\glueexpr#1\else\ifx\fontdimen#1\else \XINT_expr_unpackvar \fi\fi\fi\fi\fi\fi\fi \expandafter\XINT_expr_getnext\number #1% }% \def\XINT_expr_unpackvar\fi\fi\fi\fi\fi\fi\fi\expandafter\XINT_expr_getnext\number #1% {\fi\fi\fi\fi\fi\fi\fi\expandafter\XINT_expr_getop\csname .=\number#1\endcsname }% \begingroup \lccode`*=`# \lowercase{\endgroup \def\XINT_expr_getnextfork #1{% \if#1*\xint_dothis {\XINT_expr_scan_macropar *}\fi \if#1[\xint_dothis {\xint_c_xviii ({}}\fi \if#1+\xint_dothis \XINT_expr_getnext \fi \if#1.\xint_dothis {\XINT_expr_scandec_II\XINT_expr_infracpart}\fi \if#1-\xint_dothis -\fi \if#1(\xint_dothis {\xint_c_xviii ({}}\fi \xint_orthat {\XINT_expr_scan_nbr_or_func #1}% }}% \def\XINT_expr_scan_macropar #1#2{\expandafter\XINT_expr_getop\csname .=#1#2\endcsname }% \catcode96 11 % ` \def\XINT_expr_scan_nbr_or_func #1% this #1 has necessarily here catcode 12 {% \if "#1\xint_dothis \XINT_expr_scanhex_I\fi \if `#1\xint_dothis {\XINT_expr_onlitteral_`}\fi \ifnum \xint_c_ix<1#1 \xint_dothis \XINT_expr_scandec_I\fi \xint_orthat \XINT_expr_scanfunc #1% }% \catcode96 12 % ` \def\XINT_expr_scandec_I {% \expandafter\XINT_expr_getop\romannumeral-`0\expandafter \XINT_expr_lockscan\romannumeral0\expandafter\XINT_expr_inintpart \romannumeral-`0\XINT_expr_scanintpart_b }% \def\XINT_expr_scandec_II {% \expandafter\XINT_expr_getop\romannumeral-`0\expandafter \XINT_expr_lockscan\romannumeral0\expandafter\XINT_expr_inintpart \romannumeral-`0\XINT_expr_scanfracpart_b }% \def\XINT_expr_scanintpart_a #1% {% careful that ! has catcode letter here \ifcat \relax #1\xint_dothis{!!#1}\fi % stops the scan \if e#1\xint_dothis{\expandafter\XINT_expr_inexppart \romannumeral-`0\XINT_expr_scanexppart_a e}\fi \if E#1\xint_dothis{\expandafter\XINT_expr_inexppart \romannumeral-`0\XINT_expr_scanexppart_a e}\fi \ifcat a#1\xint_dothis{!!*#1}\fi % includes subexpressions (#1=! letter) \xint_orthat {\expandafter\XINT_expr_scanintpart_aa\string #1}% }% \def\XINT_expr_scanintpart_aa #1% {% \if .#1\xint_dothis\XINT_expr_scandec_transition\fi \ifnum \xint_c_ix<1#1 \xint_dothis\XINT_expr_scanintpart_b\fi \xint_orthat {!!}#1% }% \def\XINT_expr_scanintpart_b #1#2% {% \expandafter #1\romannumeral-`0\expandafter \XINT_expr_scanintpart_a\romannumeral-`0#2% }% \def\XINT_expr_scandec_transition .#1% {% \expandafter\XINT_expr_scandec_trans_a\romannumeral-`0#1% }% \def\XINT_expr_scandec_trans_a #1% {% \if .#1\xint_dothis{!!..}\fi \xint_orthat {\expandafter\XINT_expr_infracpart \romannumeral-`0\XINT_expr_scanfracpart_a #1}% }% \def\XINT_expr_scanfracpart_a #1% {% \ifcat \relax #1\xint_dothis{e!#1}\fi % stops the scan \if e#1\xint_dothis{\XINT_expr_scanexppart_a e}\fi \if E#1\xint_dothis{\XINT_expr_scanexppart_a e}\fi \ifcat a#1\xint_dothis{e!*#1}\fi % and also the case of subexpressions (!) \xint_orthat {\expandafter\XINT_expr_scanfracpart_aa\string #1}% }% \def\XINT_expr_scanfracpart_aa #1% {% \ifnum \xint_c_ix<1#1 \expandafter\XINT_expr_scanfracpart_b \else \xint_afterfi {e!}% \fi #1% }% \def\XINT_expr_scanfracpart_b #1#2% {% \expandafter #1\romannumeral-`0\expandafter \XINT_expr_scanfracpart_a\romannumeral-`0#2% }% \def\XINT_expr_scanexppart_a #1#2% {% \expandafter #1\romannumeral-`0\expandafter \XINT_expr_scanexppart_b\romannumeral-`0#2% }% \def\XINT_expr_scanexppart_b #1% {% \ifcat \relax #1\xint_dothis{0!#1}\fi % stops the scan (incorrect syntax) \ifcat a#1\xint_dothis{0!*#1}\fi % idem \if +#1\xint_dothis {\XINT_expr_scanexppart_a +}\fi \if -#1\xint_dothis {\XINT_expr_scanexppart_a -}\fi \xint_orthat {\expandafter\XINT_expr_scanexppart_c\string #1}% }% \def\XINT_expr_scanexppart_c #1% {% \ifnum \xint_c_ix<1#1 \expandafter\XINT_expr_scanexppart_d \else \expandafter !% \fi #1% }% \def\XINT_expr_scanexppart_d #1#2% {% \expandafter #1\romannumeral-`0\expandafter \XINT_expr_scanexppart_e\romannumeral-`0#2% }% \def\XINT_expr_scanexppart_e #1% {% \ifcat \relax #1\xint_dothis{!#1}\fi % stops the scan \ifcat a#1\xint_dothis{!*#1}\fi % idem \xint_orthat {\expandafter\XINT_expr_scanexppart_f\string #1}% }% \def\XINT_expr_scanexppart_f #1% {% \ifnum \xint_c_ix<1#1 \expandafter\XINT_expr_scanexppart_d \else \expandafter !% \fi #1% }% \def\XINT_expr_scanhex_I #1% {% \expandafter\XINT_expr_getop\romannumeral-`0\expandafter \XINT_expr_lockscan\expandafter\XINT_expr_inhex \romannumeral-`0\XINT_expr_scanhexI_a }% \def\XINT_expr_inhex #1.#2#3;% expanded inside \csname..\endcsname {% \if#2I\xintHexToDec{#1}% \else \xintiiMul{\xintiiPow{625}{\xintLength{#3}}}{\xintHexToDec{#1#3}}% [\the\numexpr-4*\xintLength{#3}]% \fi }% \def\XINT_expr_scanhexI_a #1% {% \ifcat #1\relax\xint_dothis{.I;!#1}\fi \ifx !#1\xint_dothis{.I;!*!}\fi % tacit multiplication \xint_orthat {\expandafter\XINT_expr_scanhexI_aa\string #1}% }% \def\XINT_expr_scanhexI_aa #1% {% \if\ifnum`#1>`/ \ifnum`#1>`9 \ifnum`#1>`@ \ifnum`#1>`F 0\else1\fi\else0\fi\else1\fi\else0\fi 1% \expandafter\XINT_expr_scanhexI_b \else \if .#1% \expandafter\xint_firstoftwo \else % gather what we got so far, leave catcode 12 #1 in stream \expandafter\xint_secondoftwo \fi {\expandafter\XINT_expr_scanhex_transition}% {\xint_afterfi {.I;!}}% \fi #1% }% \def\XINT_expr_scanhexI_b #1#2% {% \expandafter #1\romannumeral-`0\expandafter \XINT_expr_scanhexI_a\romannumeral-`0#2% }% \def\XINT_expr_scanhex_transition .#1% {% \expandafter.\expandafter.\romannumeral-`0\expandafter \XINT_expr_scanhexII_a\romannumeral-`0#1% }% \def\XINT_expr_scanhexII_a #1% {% \ifcat #1\relax\xint_dothis{;!#1}\fi \ifx !#1\xint_dothis{;!*!}\fi % tacit multiplication \xint_orthat {\expandafter\XINT_expr_scanhexII_aa\string #1}% }% \def\XINT_expr_scanhexII_aa #1% {% \if\ifnum`#1>`/ \ifnum`#1>`9 \ifnum`#1>`@ \ifnum`#1>`F 0\else1\fi\else0\fi\else1\fi\else0\fi 1% \expandafter\XINT_expr_scanhexII_b \else \xint_afterfi {;!}% \fi #1% }% \def\XINT_expr_scanhexII_b #1#2% {% \expandafter #1\romannumeral-`0\expandafter \XINT_expr_scanhexII_a\romannumeral-`0#2% }% \def\XINT_expr_scanfunc {% \expandafter\XINT_expr_func\romannumeral-`0\XINT_expr_scanfunc_a }% \def\XINT_expr_scanfunc_a #1#2% {% \expandafter #1\romannumeral-`0\expandafter\XINT_expr_scanfunc_b\romannumeral-`0#2% }% \def\XINT_expr_scanfunc_b #1% {% \ifx !#1\xint_dothis{\xint_firstoftwo{(_*!}}\fi \ifcat \relax#1\xint_dothis{(_}\fi \if (#1\xint_dothis{\xint_firstoftwo{(`}}\fi \if _#1\xint_dothis \XINT_expr_scanfunc_a \fi \if @#1\xint_dothis \XINT_expr_scanfunc_a \fi \ifnum \xint_c_ix<1\string#1 \xint_dothis \XINT_expr_scanfunc_a \fi \ifcat a#1\xint_dothis \XINT_expr_scanfunc_a \fi \xint_orthat {(_}% #1% }% \def\XINT_expr_func #1(#2% {% #2=` pour une fonction, #2=_ pour une variable \if #2`\ifcsname XINT_expr_var_#1\endcsname \expandafter\expandafter\expandafter\xint_thirdofthree \fi\fi \xint_firstoftwo {\xint_c_xviii #2{#1}}{\xint_c_xviii _{#1}*(}% }% \def\XINT_expr_getop #1#2% this #1 is the current locked computed value {% \expandafter\XINT_expr_getop_a\expandafter #1\romannumeral-`0#2% }% \catcode`* 11 \def\XINT_expr_getop_a #1#2% {% \ifx \relax #2\xint_dothis\xint_firstofthree\fi \ifcat \relax #2\xint_dothis\xint_secondofthree\fi \if _#2\xint_dothis \xint_secondofthree\fi \if @#2\xint_dothis \xint_secondofthree\fi \if (#2\xint_dothis \xint_secondofthree\fi \ifx !#2\xint_dothis \xint_secondofthree\fi \xint_orthat \xint_thirdofthree {\XINT_expr_foundend #1}% {\XINT_expr_precedence_* *#1#2}% tacit multiplication {\XINT_expr_getop_b #2#1}% }% \catcode`* 12 \def\XINT_expr_foundend {\xint_c_ \relax }% \relax is a place holder here. \def\XINT_expr_getop_b #1% {% \if '#1\xint_dothis{\XINT_expr_binopwrd }\fi \if ?#1\xint_dothis{\XINT_expr_precedence_? ?}\fi \xint_orthat {\XINT_expr_scanop_a #1}% }% \def\XINT_expr_binopwrd #1#2'{\expandafter\XINT_expr_foundop_a \csname XINT_expr_itself_\xint_zapspaces #2 \xint_gobble_i\endcsname #1}% \def\XINT_expr_scanop_a #1#2#3% {\expandafter\XINT_expr_scanop_b\expandafter #1\expandafter #2\romannumeral-`0#3}% \def\XINT_expr_scanop_b #1#2#3% {% \ifcat#3\relax\xint_dothis{\XINT_expr_foundop_a #1#2#3}\fi \ifcsname XINT_expr_itself_#1#3\endcsname \xint_dothis {\expandafter\XINT_expr_scanop_c\csname XINT_expr_itself_#1#3\endcsname #2}\fi \xint_orthat {\XINT_expr_foundop_a #1#2#3}% }% \def\XINT_expr_scanop_c #1#2#3% {% \expandafter\XINT_expr_scanop_d\expandafter #1\expandafter #2\romannumeral-`0#3% }% \def\XINT_expr_scanop_d #1#2#3% {% \ifcat#3\relax \xint_dothis{\XINT_expr_foundop #1#2#3}\fi \ifcsname XINT_expr_itself_#1#3\endcsname \xint_dothis {\expandafter\XINT_expr_scanop_c\csname XINT_expr_itself_#1#3\endcsname #2}\fi \xint_orthat {\csname XINT_expr_precedence_#1\endcsname #1#2#3}% }% \def\XINT_expr_foundop_a #1% {% \ifcsname XINT_expr_precedence_#1\endcsname \csname XINT_expr_precedence_#1\expandafter\endcsname \expandafter #1% \else \xint_afterfi{\XINT_expr_unknown_operator {#1}\XINT_expr_getop}% \fi }% \def\XINT_expr_unknown_operator #1{\xintError:removed \xint_gobble_i {#1}}% \def\XINT_expr_foundop #1{\csname XINT_expr_precedence_#1\endcsname #1}% \catcode`) 11 \def\XINT_tmpa #1#2#3#4% (avant #4#5) {% \def#1##1% {% \xint_UDsignfork ##1{\expandafter#1\romannumeral-`0#3}% -{#2##1}% \krof }% \def#2##1##2% {% \ifcase ##1\xint_afterfi {\ifx\XINT_expr_itself_^C ##2\xint_dothis {\expandafter#1\romannumeral-`0\expandafter\XINT_expr_getnext\xint_gobble_i}\fi \xint_orthat \XINT_expr_done }% \or\xint_afterfi{\XINT_expr_extra_) \expandafter #1\romannumeral-`0\XINT_expr_getop }% \else \xint_afterfi{\expandafter#1\romannumeral-`0\csname XINT_#4_op_##2\endcsname }% \fi }% }% \def\XINT_expr_extra_) {\xintError:removed }% \xintFor #1 in {expr,flexpr,iiexpr} \do {% \expandafter\XINT_tmpa \csname XINT_#1_until_end_a\expandafter\endcsname \csname XINT_#1_until_end_b\expandafter\endcsname \csname XINT_#1_op_-vi\endcsname {#1}% }% \def\XINT_tmpa #1#2#3#4#5#6% {% \def #1##1{\expandafter #3\romannumeral-`0\XINT_expr_getnext }% \def #2{\expandafter #3\romannumeral-`0\XINT_expr_getnext }% \def #3##1{\xint_UDsignfork ##1{\expandafter #3\romannumeral-`0#5}% -{#4##1}% \krof }% \def #4##1##2{\ifcase ##1% \xint_afterfi{\ifx\XINT_expr_itself_^C ##2\xint_dothis{\xint_c_ ##2}\fi \xint_orthat\XINT_expr_missing_) }% \or \csname XINT_#6_op_##2\expandafter\endcsname \else \xint_afterfi{\expandafter #3\romannumeral-`0\csname XINT_#6_op_##2\endcsname }% \fi }% }% \def\XINT_expr_missing_) {\xintError:inserted \xint_c_ \XINT_expr_done }% \catcode`) 12 \xintFor #1 in {expr,flexpr,iiexpr} \do {% \expandafter\XINT_tmpa \csname XINT_#1_op_(\expandafter\endcsname \csname XINT_#1_oparen\expandafter\endcsname \csname XINT_#1_until_)_a\expandafter\endcsname \csname XINT_#1_until_)_b\expandafter\endcsname \csname XINT_#1_op_-vi\endcsname {#1}% }% \expandafter\let\csname XINT_expr_precedence_)\endcsname\xint_c_i \expandafter\let\csname XINT_expr_precedence_]\endcsname\xint_c_i \expandafter\let\csname XINT_expr_precedence_;\endcsname\xint_c_i \let\XINT_expr_precedence_a \xint_c_xviii \expandafter\let\csname XINT_expr_precedence_^C\endcsname \xint_c_ \expandafter\let\csname XINT_expr_precedence_++)\endcsname \xint_c_i \catcode`. 11 \catcode`= 11 \catcode`+ 11 \xintFor #1 in {expr,flexpr,iiexpr} \do {% \expandafter\let\csname XINT_#1_op_)\endcsname \XINT_expr_getop \expandafter\let\csname XINT_#1_op_;\endcsname \space \expandafter\def\csname XINT_#1_op_]\endcsname ##1{\XINT_expr_getop ##1a}% \expandafter\let\csname XINT_#1_op_a\endcsname \XINT_expr_getop \expandafter\def\csname XINT_#1_op_++)\endcsname ##1##2\relax {\expandafter\XINT_expr_foundend \expandafter {\expandafter\.=+\xintiCeil{\XINT_expr_unlock ##1}}}% }% \catcode`. 12 \catcode`= 12 \catcode`+ 12 \xintFor* #1 in {{==}{<=}{>=}{!=}{&&}{||}{**}{//}{/:}{..}{..[}{].}{]..}% {+[}{-[}{*[}{/[}{**[}{^[}{a+}{a-}{a*}{a/}{a**}{a^}% {][}{][:}{:]}{^C}{++}{++)}} \do {\expandafter\def\csname XINT_expr_itself_#1\endcsname {#1}}% \def\XINT_tmpc #1#2#3#4#5#6#7#8% {% \def #1##1% \XINT_expr_op_ ou flexpr ou iiexpr {% keep value, get next number and operator, then do until \expandafter #2\expandafter ##1% \romannumeral-`0\expandafter\XINT_expr_getnext }% \def #2##1##2% \XINT_expr_until__a ou flexpr ou iiexpr {\xint_UDsignfork ##2{\expandafter #2\expandafter ##1\romannumeral-`0#4}% -{#3##1##2}% \krof }% \def #3##1##2##3##4% \XINT_expr_until__b ou flexpr ou iiexpr {% either execute next operation now, or first do next (possibly unary) \ifnum ##2>#5% \xint_afterfi {\expandafter #2\expandafter ##1\romannumeral-`0% \csname XINT_#8_op_##3\endcsname {##4}}% \else \xint_afterfi {\expandafter ##2\expandafter ##3% \csname .=#6{\XINT_expr_unlock ##1}{\XINT_expr_unlock ##4}\endcsname }% \fi }% \let #7#5% }% \def\XINT_tmpb #1#2#3#4#5#6% {% \expandafter\XINT_tmpc \csname XINT_#1_op_#3\expandafter\endcsname \csname XINT_#1_until_#3_a\expandafter\endcsname \csname XINT_#1_until_#3_b\expandafter\endcsname \csname XINT_#1_op_-#5\expandafter\endcsname \csname xint_c_#4\expandafter\endcsname \csname #2#6\expandafter\endcsname \csname XINT_expr_precedence_#3\endcsname {#1}% }% \xintFor #1 in {expr, flexpr} \do {% \def\XINT_tmpa ##1{\XINT_tmpb {#1}{xint}##1}% \xintApplyInline {\XINT_tmpa }{% {|{iii}{vi}{OR}}% {&{iv}{vi}{AND}}% {{xor}{iii}{vi}{XOR}}% {<{v}{vi}{Lt}}% {>{v}{vi}{Gt}}% {={v}{vi}{Eq}}% {{<=}{v}{vi}{LtorEq}}% {{>=}{v}{vi}{GtorEq}}% {{!=}{v}{vi}{Neq}}% {{..}{iii}{vi}{Seq::csv}}% {{//}{vii}{vii}{DivTrunc}}% {{/:}{vii}{vii}{Mod}}% }% }% \def\XINT_tmpa #1{\XINT_tmpb {expr}{xint}#1}% \xintApplyInline {\XINT_tmpa }{% {+{vi}{vi}{Add}}% {-{vi}{vi}{Sub}}% {*{vii}{vii}{Mul}}% {/{vii}{vii}{Div}}% {^{viii}{viii}{Pow}}% {{..[}{iii}{vi}{SeqA::csv}}% {{]..}{iii}{vi}{SeqB::csv}}% }% \def\XINT_tmpa #1{\XINT_tmpb {flexpr}{XINTinFloat}#1}% \xintApplyInline {\XINT_tmpa }{% {+{vi}{vi}{Add}}% {-{vi}{vi}{Sub}}% {*{vii}{vii}{Mul}}% {/{vii}{vii}{Div}}% {^{viii}{viii}{Power}}% {{..[}{iii}{vi}{SeqA::csv}}% {{]..}{iii}{vi}{SeqB::csv}}% }% \def\XINT_tmpa #1{\XINT_tmpb {iiexpr}{xint}#1}% \xintApplyInline {\XINT_tmpa }{% {|{iii}{vi}{OR}}% {&{iv}{vi}{AND}}% {{xor}{iii}{vi}{XOR}}% {<{v}{vi}{iiLt}}% {>{v}{vi}{iiGt}}% {={v}{vi}{iiEq}}% {{<=}{v}{vi}{iiLtorEq}}% {{>=}{v}{vi}{iiGtorEq}}% {{!=}{v}{vi}{iiNeq}}% {+{vi}{vi}{iiAdd}}% {-{vi}{vi}{iiSub}}% {*{vii}{vii}{iiMul}}% {/{vii}{vii}{iiDivRound}}% CHANGED IN 1.1! PREVIOUSLY DID EUCLIDEAN QUOTIENT {^{viii}{viii}{iiPow}}% {{..[}{iii}{vi}{iiSeqA::csv}}% {{]..}{iii}{vi}{iiSeqB::csv}}% {{..}{iii}{vi}{iiSeq::csv}}% {{//}{vii}{vii}{iiDivTrunc}}% {{/:}{vii}{vii}{iiMod}}% }% \def\XINT_expr_binop_inline_a {\expandafter\xint_gobble_i\romannumeral-`0\XINT_expr_binop_inline_b }% \def\XINT_expr_binop_inline_b #1#2,{\XINT_expr_binop_inline_c #2,{#1}}% \def\XINT_expr_binop_inline_c #1{% \if ,#1\xint_dothis\XINT_expr_binop_inline_e\fi \if ^#1\xint_dothis\XINT_expr_binop_inline_end\fi \xint_orthat\XINT_expr_binop_inline_d #1}% \def\XINT_expr_binop_inline_d #1,#2{,#2{#1}\XINT_expr_binop_inline_b {#2}}% \def\XINT_expr_binop_inline_e #1,#2{,\XINT_expr_binop_inline_b {#2}}% \def\XINT_expr_binop_inline_end #1,#2{}% \def\XINT_tmpc #1#2#3#4#5#6#7#8% {% \def #1##1% \XINT_expr_op_ ou flexpr ou iiexpr {% keep value, get next number and operator, then do until \expandafter #2\expandafter ##1% \romannumeral-`0\expandafter\XINT_expr_getnext }% \def #2##1##2% \XINT_expr_until__a ou flexpr ou iiexpr {\xint_UDsignfork ##2{\expandafter #2\expandafter ##1\romannumeral-`0#4}% -{#3##1##2}% \krof }% \def #3##1##2##3##4% \XINT_expr_until__b ou flexpr ou iiexpr {% either execute next operation now, or first do next (possibly unary) \ifnum ##2>#5% \xint_afterfi {\expandafter #2\expandafter ##1\romannumeral-`0% \csname XINT_#8_op_##3\endcsname {##4}}% \else \xint_afterfi {\expandafter ##2\expandafter ##3% \csname .=\expandafter\XINT_expr_binop_inline_a\expandafter {\expandafter\expandafter\expandafter#6\expandafter \xint_exchangetwo_keepbraces\expandafter {\expandafter\XINT_expr_unlock\expandafter ##4\expandafter}\expandafter}% \romannumeral-`0\XINT_expr_unlock ##1,^,\endcsname }% \fi }% \let #7#5% }% \def\XINT_tmpb #1#2#3#4% {% \expandafter\XINT_tmpc \csname XINT_#1_op_#2\expandafter\endcsname \csname XINT_#1_until_#2_a\expandafter\endcsname \csname XINT_#1_until_#2_b\expandafter\endcsname \csname XINT_#1_op_-#3\expandafter\endcsname \csname xint_c_#3\expandafter\endcsname \csname #4\expandafter\endcsname \csname XINT_expr_precedence_#2\endcsname {#1}% }% \xintApplyInline {\expandafter\XINT_tmpb \xint_firstofone}{% {{expr}{a+}{vi}{xintAdd}}% {{expr}{a-}{vi}{xintSub}}% {{expr}{a*}{vii}{xintMul}}% {{expr}{a/}{vii}{xintDiv}}% {{expr}{a^}{viii}{xintPow}}% {{iiexpr}{a+}{vi}{xintiiAdd}}% {{iiexpr}{a-}{vi}{xintiiSub}}% {{iiexpr}{a*}{vii}{xintiiMul}}% {{iiexpr}{a/}{vii}{xintiiDivRound}}% {{iiexpr}{a^}{viii}{xintiiPow}}% {{flexpr}{a+}{vi}{XINTinFloatAdd}}% {{flexpr}{a-}{vi}{XINTinFloatSub}}% {{flexpr}{a*}{vii}{XINTinFloatMul}}% {{flexpr}{a/}{vii}{XINTinFloatDiv}}% {{flexpr}{a^}{viii}{XINTinFloatPower}}% }% \def\XINT_tmpc #1#2#3#4#5#6#7% {% \def #1##1{\expandafter#2\expandafter##1\romannumeral-`0% \expandafter #3\romannumeral-`0\XINT_expr_getnext }% \def #2##1##2##3##4% {% either execute next operation now, or first do next (possibly unary) \ifnum ##2>#4% \xint_afterfi {\expandafter #2\expandafter ##1\romannumeral-`0% \csname XINT_#7_op_##3\endcsname {##4}}% \else \xint_afterfi {\expandafter ##2\expandafter ##3% \csname .=\expandafter\XINT_expr_binop_inline_a\expandafter {\expandafter#5\expandafter {\expandafter\XINT_expr_unlock\expandafter ##1\expandafter}\expandafter}% \romannumeral-`0\XINT_expr_unlock ##4,^,\endcsname }% \fi }% \let #6#4% }% \def\XINT_tmpb #1#2#3#4% {% \expandafter\XINT_tmpc \csname XINT_#1_op_#2\expandafter\endcsname \csname XINT_#1_until_#2\expandafter\endcsname \csname XINT_#1_until_)_a\expandafter\endcsname \csname xint_c_#3\expandafter\endcsname \csname #4\expandafter\endcsname \csname XINT_expr_precedence_#2\endcsname {#1}% }% \xintApplyInline {\expandafter\XINT_tmpb\xint_firstofone }{% {{expr}{+[}{vi}{xintAdd}}% {{expr}{-[}{vi}{xintSub}}% {{expr}{*[}{vii}{xintMul}}% {{expr}{/[}{vii}{xintDiv}}% {{expr}{^[}{viii}{xintPow}}% {{iiexpr}{+[}{vi}{xintiiAdd}}% {{iiexpr}{-[}{vi}{xintiiSub}}% {{iiexpr}{*[}{vii}{xintiiMul}}% {{iiexpr}{/[}{vii}{xintiiDivRound}}% {{iiexpr}{^[}{viii}{xintiiPow}}% {{flexpr}{+[}{vi}{XINTinFloatAdd}}% {{flexpr}{-[}{vi}{XINTinFloatSub}}% {{flexpr}{*[}{vii}{XINTinFloatMul}}% {{flexpr}{/[}{vii}{XINTinFloatDiv}}% {{flexpr}{^[}{viii}{XINTinFloatPower}}% }% \xintFor #1 in {and,or,xor,mod} \do {% \expandafter\def\csname XINT_expr_itself_#1\endcsname {#1}}% \expandafter\let\csname XINT_expr_precedence_and\expandafter\endcsname \csname XINT_expr_precedence_&\endcsname \expandafter\let\csname XINT_expr_precedence_or\expandafter\endcsname \csname XINT_expr_precedence_|\endcsname \expandafter\let\csname XINT_expr_precedence_mod\expandafter\endcsname \csname XINT_expr_precedence_/:\endcsname \xintFor #1 in {expr, flexpr, iiexpr} \do {% \expandafter\let\csname XINT_#1_op_and\expandafter\endcsname \csname XINT_#1_op_&\endcsname \expandafter\let\csname XINT_#1_op_or\expandafter\endcsname \csname XINT_#1_op_|\endcsname \expandafter\let\csname XINT_#1_op_mod\expandafter\endcsname \csname XINT_#1_op_/:\endcsname }% \expandafter\let\csname XINT_expr_precedence_==\expandafter\endcsname \csname XINT_expr_precedence_=\endcsname \expandafter\let\csname XINT_expr_precedence_&&\expandafter\endcsname \csname XINT_expr_precedence_&\endcsname \expandafter\let\csname XINT_expr_precedence_||\expandafter\endcsname \csname XINT_expr_precedence_|\endcsname \expandafter\let\csname XINT_expr_precedence_**\expandafter\endcsname \csname XINT_expr_precedence_^\endcsname \expandafter\let\csname XINT_expr_precedence_a**\expandafter\endcsname \csname XINT_expr_precedence_a^\endcsname \expandafter\let\csname XINT_expr_precedence_**[\expandafter\endcsname \csname XINT_expr_precedence_^[\endcsname \xintFor #1 in {expr, flexpr, iiexpr} \do {% \expandafter\let\csname XINT_#1_op_==\expandafter\endcsname \csname XINT_#1_op_=\endcsname \expandafter\let\csname XINT_#1_op_&&\expandafter\endcsname \csname XINT_#1_op_&\endcsname \expandafter\let\csname XINT_#1_op_||\expandafter\endcsname \csname XINT_#1_op_|\endcsname \expandafter\let\csname XINT_#1_op_**\expandafter\endcsname \csname XINT_#1_op_^\endcsname \expandafter\let\csname XINT_#1_op_a**\expandafter\endcsname \csname XINT_#1_op_a^\endcsname \expandafter\let\csname XINT_#1_op_**[\expandafter\endcsname \csname XINT_#1_op_^[\endcsname }% \def\XINT_tmpa #1#2#3#4#5#6% {% \def #1##1% \XINT_expr_op_][ {% \expandafter #2\expandafter ##1\romannumeral-`0\XINT_expr_getnext }% \def #2##1##2% \XINT_expr_until_][_a {\xint_UDsignfork ##2{\expandafter #2\expandafter ##1\romannumeral-`0#4}% -{#3##1##2}% \krof }% \def #3##1##2##3##4% \XINT_expr_until_][_b {% \ifnum ##2>\xint_c_ii \xint_afterfi {\expandafter #2\expandafter ##1\romannumeral-`0% \csname XINT_#6_op_##3\endcsname {##4}}% \else \xint_afterfi {\expandafter ##2\expandafter ##3\csname .=\expandafter\xintListSel:csv \romannumeral-`0\XINT_expr_unlock ##4;% \XINT_expr_unlock ##1;\endcsname % unlock for \xintNewExpr }% \fi }% \let #5\xint_c_ii }% \xintFor #1 in {expr,flexpr,iiexpr} \do {% \expandafter\XINT_tmpa \csname XINT_#1_op_][\expandafter\endcsname \csname XINT_#1_until_][_a\expandafter\endcsname \csname XINT_#1_until_][_b\expandafter\endcsname \csname XINT_#1_op_-vi\expandafter\endcsname \csname XINT_expr_precedence_][\endcsname {#1}% }% \def\XINT_tmpa #1#2#3#4#5#6% {% \def #1##1% \XINT_expr_op_: {% \expandafter #2\expandafter ##1\romannumeral-`0\XINT_expr_getnext }% \def #2##1##2% \XINT_expr_until_:_a {\xint_UDsignfork ##2{\expandafter #2\expandafter ##1\romannumeral-`0#4}% -{#3##1##2}% \krof }% \def #3##1##2##3##4% \XINT_expr_until_:_b {% \ifnum ##2>\xint_c_iii \xint_afterfi {\expandafter #2\expandafter ##1\romannumeral-`0% \csname XINT_#6_op_##3\endcsname {##4}}% \else \xint_afterfi {\expandafter ##2\expandafter ##3\csname .=:\xintiiifSgn{\XINT_expr_unlock ##1}NPP.% \xintiiifSgn{\XINT_expr_unlock ##4}NPP.% \xintNum{\XINT_expr_unlock ##1};\xintNum{\XINT_expr_unlock ##4}\endcsname }% \fi }% \let #5\xint_c_iii }% \xintFor #1 in {expr,flexpr,iiexpr} \do {% \expandafter\XINT_tmpa \csname XINT_#1_op_:\expandafter\endcsname \csname XINT_#1_until_:_a\expandafter\endcsname \csname XINT_#1_until_:_b\expandafter\endcsname \csname XINT_#1_op_-vi\expandafter\endcsname \csname XINT_expr_precedence_:\endcsname {#1}% }% \catcode`[ 11 \catcode`] 11 \let\XINT_expr_precedence_:] \xint_c_iii \def\XINT_expr_op_:] #1{\expandafter\xint_c_i\expandafter )% \csname .=]\xintiiifSgn{\XINT_expr_unlock #1}npp\XINT_expr_unlock #1\endcsname }% \let\XINT_flexpr_op_:] \XINT_expr_op_:] \let\XINT_iiexpr_op_:] \XINT_expr_op_:] \let\XINT_expr_precedence_][: \xint_c_iii \edef\XINT_expr_op_][: #1{\xint_c_ii \expandafter\noexpand \csname XINT_expr_itself_][\endcsname #10\string :}% \let\XINT_flexpr_op_][: \XINT_expr_op_][: \let\XINT_iiexpr_op_][: \XINT_expr_op_][: \catcode`[ 12 \catcode`] 12 \def\xintListSel:csv #1{% \if ]\noexpand#1\xint_dothis{\expandafter\XINT_listsel:_s\romannumeral-`0}\fi \if :\noexpand#1\xint_dothis{\XINT_listsel:_:}\fi \xint_orthat {\XINT_listsel:_nth #1}% }% \def\XINT_listsel:_s #1{\if p#1\expandafter\XINT_listsel:_trim\else \expandafter\XINT_listsel:_keep\fi }% \def\XINT_listsel:_: #1.#2.{\csname XINT_listsel:_#1#2\endcsname }% \def\XINT_listsel:_trim #1;#2;% {\xintListWithSep,{\xintTrim {\xintNum{#1}}{\xintCSVtoListNonStripped{#2}}}}% \def\XINT_listsel:_keep #1;#2;% {\xintListWithSep,{\xintKeep {\xintNum{#1}}{\xintCSVtoListNonStripped{#2}}}}% \def\XINT_listsel:_nth#1;#2;% {\xintNthElt {\xintNum{#1}}{\xintCSVtoListNonStripped{#2}}}% \def\XINT_listsel:_PP #1;#2;#3;% {\xintListWithSep,% {\xintTrim {\xintNum{#1}}% {\xintKeep {\xintNum{#2}}% {\xintCSVtoListNonStripped{#3}}% }% }% }% \def\XINT_listsel:_NN #1;#2;#3;% {\xintListWithSep,% {\xintTrim {\xintNum{#2}}% {\xintKeep {\xintNum{#1}}% {\xintCSVtoListNonStripped{#3}}% }% }% }% \def\XINT_listsel:_NP #1;#2;#3;% {\expandafter\XINT_listsel:_NP_a \the\numexpr #1+% \xintNthElt{0}{\xintCSVtoListNonStripped{#3}};#2;#3;}% \def\XINT_listsel:_NP_a #1#2;{\if -#1\expandafter\XINT_listsel:_OP\fi \XINT_listsel:_PP #1#2;}% \def\XINT_listsel:_OP\XINT_listsel:_PP #1;{\XINT_listsel:_PP 0;}% \def\XINT_listsel:_PN #1;#2;#3;% {\expandafter\XINT_listsel:_PN_a \the\numexpr #2+% \xintNthElt{0}{\xintCSVtoListNonStripped{#3}};#1;#3;}% \def\XINT_listsel:_PN_a #1#2;#3;{\if -#1\expandafter\XINT_listsel:_PO\fi \XINT_listsel:_PP #3;#1#2;}% \def\XINT_listsel:_PO\XINT_listsel:_PP #1;#2;{\XINT_listsel:_PP #1;0;}% \def\xintSeq::csv {\romannumeral0\xintseq::csv }% \def\xintseq::csv #1#2% {% \expandafter\XINT_seq::csv\expandafter {\the\numexpr \xintiCeil{#1}\expandafter}\expandafter {\the\numexpr \xintiFloor{#2}}% }% \def\XINT_seq::csv #1#2% {% \ifcase\ifnum #1=#2 0\else\ifnum #2>#1 1\else -1\fi\fi\space \expandafter\XINT_seq::csv_z \or \expandafter\XINT_seq::csv_p \else \expandafter\XINT_seq::csv_n \fi {#2}{#1}% }% \def\XINT_seq::csv_z #1#2{ #1/1[0]}% \def\XINT_seq::csv_p #1#2% {% \ifnum #1>#2 \expandafter\expandafter\expandafter\XINT_seq::csv_p \else \expandafter\XINT_seq::csv_e \fi \expandafter{\the\numexpr #1-\xint_c_i}{#2},#1/1[0]% }% \def\XINT_seq::csv_n #1#2% {% \ifnum #1<#2 \expandafter\expandafter\expandafter\XINT_seq::csv_n \else \expandafter\XINT_seq::csv_e \fi \expandafter{\the\numexpr #1+\xint_c_i}{#2},#1/1[0]% }% \def\XINT_seq::csv_e #1,{ }% \def\xintiiSeq::csv {\romannumeral0\xintiiseq::csv }% \def\xintiiseq::csv #1#2% {% \expandafter\XINT_iiseq::csv\expandafter {\the\numexpr #1\expandafter}\expandafter{\the\numexpr #2}% }% \def\XINT_iiseq::csv #1#2% {% \ifcase\ifnum #1=#2 0\else\ifnum #2>#1 1\else -1\fi\fi\space \expandafter\XINT_iiseq::csv_z \or \expandafter\XINT_iiseq::csv_p \else \expandafter\XINT_iiseq::csv_n \fi {#2}{#1}% }% \def\XINT_iiseq::csv_z #1#2{ #1}% \def\XINT_iiseq::csv_p #1#2% {% \ifnum #1>#2 \expandafter\expandafter\expandafter\XINT_iiseq::csv_p \else \expandafter\XINT_seq::csv_e \fi \expandafter{\the\numexpr #1-\xint_c_i}{#2},#1% }% \def\XINT_iiseq::csv_n #1#2% {% \ifnum #1<#2 \expandafter\expandafter\expandafter\XINT_iiseq::csv_n \else \expandafter\XINT_seq::csv_e \fi \expandafter{\the\numexpr #1+\xint_c_i}{#2},#1% }% \def\XINT_seq::csv_e #1,{ }% \def\xintSeqA::csv #1% {\expandafter\XINT_seqa::csv\expandafter{\romannumeral0\xintraw {#1}}}% \def\XINT_seqa::csv #1#2{\expandafter\XINT_seqa::csv_a \romannumeral0\xintraw {#2};#1;}% \def\xintiiSeqA::csv #1#2{\XINT_iiseqa::csv #1#2}% \def\XINT_iiseqa::csv #1#2#3#4{\expandafter\XINT_seqa::csv_a \romannumeral-`0\expandafter \XINT_expr_unlock\expandafter#4% \expandafter;\romannumeral-`0\XINT_expr_unlock #2;}% \def\XINTinFloatSeqA::csv #1{\expandafter\XINT_flseqa::csv\expandafter {\romannumeral0\XINTinfloat [\XINTdigits]{#1}}}% \def\XINT_flseqa::csv #1#2% {\expandafter\XINT_seqa::csv_a\romannumeral0\XINTinfloat [\XINTdigits]{#2};#1;}% \def\XINT_seqa::csv_a #1{\xint_UDzerominusfork #1-{z}% 0#1{n}% 0-{p}% \krof #1}% \def\xintSeqB::csv #1#2% {\expandafter\XINT_seqb::csv \expandafter{\romannumeral0\xintraw{#2}}{#1}}% \def\XINT_seqb::csv #1#2{\expandafter\XINT_seqb::csv_a\romannumeral-`0#2#1!}% \def\XINT_seqb::csv_a #1#2;#3;#4!{\expandafter\XINT_expr_seq_empty? \romannumeral0\csname XINT_seqb::csv_#1\endcsname {#3}{#4}{#2}}% \def\XINT_seqb::csv_p #1#2#3% {% \xintifCmp {#1}{#2}{,#1\expandafter\XINT_seqb::csv_p\expandafter}% {,#1\xint_gobble_iii}{\xint_gobble_iii}% {\romannumeral0\xintadd {#3}{#1}}{#2}{#3}% }% \def\XINT_seqb::csv_n #1#2#3% {% \xintifCmp {#1}{#2}{\xint_gobble_iii}{,#1\xint_gobble_iii}% {,#1\expandafter\XINT_seqb::csv_n\expandafter}% {\romannumeral0\xintadd {#3}{#1}}{#2}{#3}% }% \def\XINT_seqb::csv_z #1#2#3{,#1}% \def\xintiiSeqB::csv #1#2{\XINT_iiseqb::csv #1#2}% \def\XINT_iiseqb::csv #1#2#3#4% {\expandafter\XINT_iiseqb::csv_a \romannumeral-`0\expandafter \XINT_expr_unlock\expandafter#2% \romannumeral-`0\XINT_expr_unlock #4!}% \def\XINT_iiseqb::csv_a #1#2;#3;#4!{\expandafter\XINT_expr_seq_empty? \romannumeral-`0\csname XINT_iiseqb::csv_#1\endcsname {#3}{#4}{#2}}% \def\XINT_iiseqb::csv_p #1#2#3% {% \xintSgnFork{\XINT_Cmp {#1}{#2}}{,#1\expandafter\XINT_iiseqb::csv_p\expandafter}% {,#1\xint_gobble_iii}{\xint_gobble_iii}% {\romannumeral0\xintiiadd {#3}{#1}}{#2}{#3}% }% \def\XINT_iiseqb::csv_n #1#2#3% {% \xintSgnFork{\XINT_Cmp {#1}{#2}}{\xint_gobble_iii}{,#1\xint_gobble_iii}% {,#1\expandafter\XINT_iiseqb::csv_n\expandafter}% {\romannumeral0\xintiiadd {#3}{#1}}{#2}{#3}% }% \def\XINT_iiseqb::csv_z #1#2#3{,#1}% \def\XINTinFloatSeqB::csv #1#2{\expandafter\XINT_flseqb::csv \expandafter {\romannumeral0\XINTinfloat [\XINTdigits]{#2}}{#1}}% \def\XINT_flseqb::csv #1#2{\expandafter\XINT_flseqb::csv_a\romannumeral-`0#2#1!}% \def\XINT_flseqb::csv_a #1#2;#3;#4!{\expandafter\XINT_expr_seq_empty? \romannumeral-`0\csname XINT_flseqb::csv_#1\endcsname {#3}{#4}{#2}}% \def\XINT_flseqb::csv_p #1#2#3% {% \xintifCmp {#1}{#2}{,#1\expandafter\XINT_flseqb::csv_p\expandafter}% {,#1\xint_gobble_iii}{\xint_gobble_iii}% {\romannumeral0\XINTinfloatadd {#3}{#1}}{#2}{#3}% }% \def\XINT_flseqb::csv_n #1#2#3% {% \xintifCmp {#1}{#2}{\xint_gobble_iii}{,#1\xint_gobble_iii}% {,#1\expandafter\XINT_flseqb::csv_n\expandafter}% {\romannumeral0\XINTinfloatadd {#3}{#1}}{#2}{#3}% }% \def\XINT_flseqb::csv_z #1#2#3{,#1}% \def\XINT_tmpa #1#2#3#4#5#6% {% \def #1##1% \XINT_expr_op_, {% \expandafter #2\expandafter ##1\romannumeral-`0\XINT_expr_getnext }% \def #2##1##2% \XINT_expr_until_,_a {\xint_UDsignfork ##2{\expandafter #2\expandafter ##1\romannumeral-`0#4}% -{#3##1##2}% \krof }% \def #3##1##2##3##4% \XINT_expr_until_,_b {% \ifnum ##2>\xint_c_ii \xint_afterfi {\expandafter #2\expandafter ##1\romannumeral-`0% \csname XINT_#6_op_##3\endcsname {##4}}% \else \xint_afterfi {\expandafter ##2\expandafter ##3% \csname .=\XINT_expr_unlock ##1,\XINT_expr_unlock ##4\endcsname }% \fi }% \let #5\xint_c_ii }% \xintFor #1 in {expr,flexpr,iiexpr} \do {% \expandafter\XINT_tmpa \csname XINT_#1_op_,\expandafter\endcsname \csname XINT_#1_until_,_a\expandafter\endcsname \csname XINT_#1_until_,_b\expandafter\endcsname \csname XINT_#1_op_-vi\expandafter\endcsname \csname XINT_expr_precedence_,\endcsname {#1}% }% \def\XINT_tmpa #1#2#3% {% \expandafter\XINT_tmpb \csname XINT_#1_op_-#3\expandafter\endcsname \csname XINT_#1_until_-#3_a\expandafter\endcsname \csname XINT_#1_until_-#3_b\expandafter\endcsname \csname xint_c_#3\endcsname {#1}#2% }% \def\XINT_tmpb #1#2#3#4#5#6% {% \def #1% \XINT_expr_op_- {% get next number+operator then switch to _until macro \expandafter #2\romannumeral-`0\XINT_expr_getnext }% \def #2##1% \XINT_expr_until_-_a {\xint_UDsignfork ##1{\expandafter #2\romannumeral-`0#1}% -{#3##1}% \krof }% \def #3##1##2##3% \XINT_expr_until_-_b {% _until tests precedence level with next op, executes now or postpones \ifnum ##1>#4% \xint_afterfi {\expandafter #2\romannumeral-`0% \csname XINT_#5_op_##2\endcsname {##3}}% \else \xint_afterfi {\expandafter ##1\expandafter ##2% \csname .=#6{\XINT_expr_unlock ##3}\endcsname }% \fi }% }% \xintApplyInline{\XINT_tmpa {expr}\xintOpp}{{vi}{vii}{viii}{ix}}% \xintApplyInline{\XINT_tmpa {flexpr}\xintOpp}{{vi}{vii}{viii}{ix}}% \xintApplyInline{\XINT_tmpa {iiexpr}\xintiiOpp}{{vi}{vii}{viii}{ix}}% \let\XINT_expr_precedence_? \xint_c_x \def\XINT_expr_op_? #1#2{\if ?#2\expandafter \XINT_expr_op_??\fi \XINT_expr_op_?a #1{#2}}% \def\XINT_expr_op_?a #1#2#3% {% \xintiiifNotZero{\XINT_expr_unlock #1}{\XINT_expr_getnext #2}{\XINT_expr_getnext #3}% }% \let\XINT_flexpr_op_?\XINT_expr_op_? \let\XINT_iiexpr_op_?\XINT_expr_op_? \def\XINT_expr_op_?? #1#2#3#4#5#6% {% \xintiiifSgn {\XINT_expr_unlock #2}{\XINT_expr_getnext #4}{\XINT_expr_getnext #5}% {\XINT_expr_getnext #6}% }% \let\XINT_expr_precedence_! \xint_c_x \def\XINT_expr_op_! #1{\expandafter\XINT_expr_getop \csname .=\xintFac{\XINT_expr_unlock #1}\endcsname }% \let\XINT_flexpr_op_!\XINT_expr_op_! \def\XINT_iiexpr_op_! #1{\expandafter\XINT_expr_getop \csname .=\xintiFac{\XINT_expr_unlock #1}\endcsname }% \catcode`[ 11 \catcode`* 11 \let\XINT_expr_precedence_[ \xint_c_vii \def\XINT_expr_op_[ #1#2]{\expandafter\XINT_expr_getop \csname .=\xintE{\XINT_expr_unlock #1}% {\xint_zapspaces #2 \xint_gobble_i}\endcsname}% \def\XINT_iiexpr_op_[ #1#2]{\expandafter\XINT_expr_getop \csname .=\xintiiE{\XINT_expr_unlock #1}% {\xint_zapspaces #2 \xint_gobble_i}\endcsname}% \def\XINT_flexpr_op_[ #1#2]{\expandafter\XINT_expr_getop \csname .=\XINTinFloatE{\XINT_expr_unlock #1}% {\xint_zapspaces #2 \xint_gobble_i}\endcsname}% \catcode`[ 12 \catcode`* 12 \def\XINT_expr_op__ #1% op__ with two _'s {% \ifcsname XINT_expr_var_#1\endcsname \expandafter\xint_firstoftwo \else \expandafter\xint_secondoftwo \fi {\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter \XINT_expr_getop\csname XINT_expr_var_#1\endcsname}% {\XINT_expr_unknown_variable {#1}% \expandafter\XINT_expr_getop\csname .=0\endcsname}% }% \def\XINT_expr_unknown_variable #1{\xintError:removed \xint_gobble_i {#1}}% \let\XINT_flexpr_op__ \XINT_expr_op__ \let\XINT_iiexpr_op__ \XINT_expr_op__ \catcode`: 12 \def\xintdefvar #1:=#2;{\expandafter\odef \csname XINT_expr_var_\xint_zapspaces #1 \xint_gobble_i\endcsname {\expandafter\empty\romannumeral0\xintbareeval #2\relax }}% \def\xintdefiivar #1:=#2;{\expandafter\odef \csname XINT_expr_var_\xint_zapspaces #1 \xint_gobble_i\endcsname {\expandafter\empty\romannumeral0\xintbareiieval #2\relax }% }% \def\xintdeffloatvar #1:=#2;{\expandafter\odef \csname XINT_expr_var_\xint_zapspaces #1 \xint_gobble_i\endcsname {\expandafter\empty\romannumeral0\xintbarefloateval #2\relax }% }% \catcode`: 11 \def\XINT_tmpa #1% {% \expandafter\def\csname XINT_expr_var_#1\endcsname ##1\relax !#1##2% {\romannumeral0\XINT_expr_lockscan ##2!##1\relax !#1{##2}}% }% \xintApplyUnbraced \XINT_tmpa {abcdefghijklmnopqrstuvwxyz}% \xintApplyUnbraced \XINT_tmpa {ABCDEFGHIJKLMNOPQRSTUVWXYZ}% \expandafter\def\expandafter\XINT_expr_var_nil\expandafter {\expandafter\empty\csname .= \endcsname}% \catcode`. 11 \catcode`= 11 \def\XINT_expr_var_omit #1\relax !{1^C!{}{}{}\.=!\relax !}% 24 juin \def\XINT_expr_var_abort #1\relax !{1^C!{}{}{}\.=^\relax !}% 25 juin \catcode`. 12 \catcode`= 12 \catcode`? 3 \def\XINT_expr_var_@ #1~#2{ #2#1~#2}% \expandafter\let\csname XINT_expr_var_@1\endcsname \XINT_expr_var_@ \expandafter\def\csname XINT_expr_var_@2\endcsname #1~#2#3{ #3#1~#2#3}% \expandafter\def\csname XINT_expr_var_@3\endcsname #1~#2#3#4{ #4#1~#2#3#4}% \expandafter\def\csname XINT_expr_var_@4\endcsname #1~#2#3#4#5{ #5#1~#2#3#4#5}% \def\XINT_expr_func_@@ #1#2#3#4~#5?% {% \expandafter#1\expandafter#2\romannumeral0\xintntheltnoexpand {\xintNum{\XINT_expr_unlock#3}}{#5}#4~#5?% }% \def\XINT_expr_func_@@@ #1#2#3#4~#5~#6?% {% \expandafter#1\expandafter#2\romannumeral0\xintntheltnoexpand {\xintNum{\XINT_expr_unlock#3}}{#6}#4~#5~#6?% }% \def\XINT_expr_func_@@@@ #1#2#3#4~#5~#6~#7?% {% \expandafter#1\expandafter#2\romannumeral0\xintntheltnoexpand {\xintNum{\XINT_expr_unlock#3}}{#7}#4~#5~#6~#7?% }% \let\XINT_flexpr_func_@@\XINT_expr_func_@@ \let\XINT_flexpr_func_@@@\XINT_expr_func_@@@ \let\XINT_flexpr_func_@@@@\XINT_expr_func_@@@@ \def\XINT_iiexpr_func_@@ #1#2#3#4~#5?% {% \expandafter#1\expandafter#2\romannumeral0\xintntheltnoexpand {\XINT_expr_unlock#3}{#5}#4~#5?% }% \def\XINT_iiexpr_func_@@@ #1#2#3#4~#5~#6?% {% \expandafter#1\expandafter#2\romannumeral0\xintntheltnoexpand {\XINT_expr_unlock#3}{#6}#4~#5~#6?% }% \def\XINT_iiexpr_func_@@@@ #1#2#3#4~#5~#6~#7?% {% \expandafter#1\expandafter#2\romannumeral0\xintntheltnoexpand {\XINT_expr_unlock#3}{#7}#4~#5~#6~#7?% }% \catcode`? 11 \def\XINT_tmpa #1#2#3{% \def #1##1% \XINT_expr_op_`, #2=\XINT_expr_oparen {% \ifcsname XINT_expr_onlitteral_##1\endcsname \xint_dothis{\csname XINT_expr_onlitteral_##1\endcsname}\fi \ifcsname XINT_#3_func_##1\endcsname \xint_dothis{\expandafter\expandafter \csname XINT_#3_func_##1\endcsname\romannumeral-`0#2}\fi \xint_orthat{\XINT_expr_unknown_function {##1}% \expandafter\XINT_expr_func_unknown\romannumeral-`0#2}% }% }% \def\XINT_expr_unknown_function #1{\xintError:removed \xint_gobble_i {#1}}% \xintFor #1 in {expr,flexpr,iiexpr} \do {% \expandafter\XINT_tmpa \csname XINT_#1_op_`\expandafter\endcsname \csname XINT_#1_oparen\endcsname {#1}% }% \expandafter\def\csname XINT_expr_onlitteral_`\endcsname #1#2#3({\xint_c_xviii `{#2}}% \def\XINT_expr_onlitteral_bool #1)% {\expandafter\XINT_expr_getop\csname .=\xintBool{#1}\endcsname }% \def\XINT_expr_onlitteral_togl #1)% {\expandafter\XINT_expr_getop\csname .=\xintToggle{#1}\endcsname }% \def\XINT_expr_onlitteral_protect #1)% {\expandafter\XINT_expr_getop\csname .=\detokenize{#1}\endcsname }% \def\XINT_expr_func_unknown #1#2#3{\expandafter #1\expandafter #2\csname .=0\endcsname }% \def\XINT_expr_func_break #1#2#3% {\expandafter #1\expandafter #2\csname.=?\romannumeral-`0\XINT_expr_unlock #3\endcsname }% \let\XINT_flexpr_func_break \XINT_expr_func_break \let\XINT_iiexpr_func_break \XINT_expr_func_break \def\XINT_expr_onlitteral_seq {\expandafter\XINT_expr_onlitteral_seq_f\romannumeral-`0\XINT_expr_onlitteral_seq_a {}}% \def\XINT_expr_onlitteral_seq_f #1#2{\xint_c_xviii `{seqx}#2)\relax #1}% \def\XINT_expr_onlitteral_seq_a #1#2,% {% checks balancing of parentheses \ifcase\XINT_isbalanced_a \relax #1#2(\xint_bye)\xint_bye \expandafter\XINT_expr_onlitteral_seq_c \or\expandafter\XINT_expr_onlitteral_seq_b \else\expandafter\xintError:we_are_doomed \fi {#1#2},% }% \def\XINT_expr_onlitteral_seq_b #1,{\XINT_expr_onlitteral_seq_a {#1,}}% \def\XINT_expr_onlitteral_seq_c #1,#2#3% #3 pour absorber le = {% \XINT_expr_onlitteral_seq_d {#2{#1}}{}% }% \def\XINT_expr_onlitteral_seq_d #1#2#3)% {% \ifcase\XINT_isbalanced_a \relax #2#3(\xint_bye)\xint_bye \or\expandafter\XINT_expr_onlitteral_seq_e \else\expandafter\xintError:we_are_doomed \fi {#1}{#2#3}% }% \def\XINT_expr_onlitteral_seq_e #1#2{\XINT_expr_onlitteral_seq_d {#1}{#2)}}% \def\XINT_isbalanced_a #1({\XINT_isbalanced_b #1)\xint_bye }% \def\XINT_isbalanced_b #1)#2% {\xint_bye #2\XINT_isbalanced_c\xint_bye\XINT_isbalanced_error }% \def\XINT_isbalanced_error #1)\xint_bye {\m@ne}% \def\XINT_isbalanced_c\xint_bye\XINT_isbalanced_error #1% {\xint_bye #1\XINT_isbalanced_yes\xint_bye\XINT_isbalanced_d #1}% \def\XINT_isbalanced_yes\xint_bye\XINT_isbalanced_d\xint_bye )\xint_bye {\xint_c_ }% \def\XINT_isbalanced_d #1)#2% {\xint_bye #2\XINT_isbalanced_no\xint_bye\XINT_isbalanced_a #1#2}% \def\XINT_isbalanced_no\xint_bye #1\xint_bye\xint_bye {\xint_c_i }% \def\XINT_expr_func_seqx #1#2{\XINT_allexpr_seqx \xintbareeval }% \def\XINT_flexpr_func_seqx #1#2{\XINT_allexpr_seqx \xintbarefloateval}% \def\XINT_iiexpr_func_seqx #1#2{\XINT_allexpr_seqx \xintbareiieval }% \def\XINT_allexpr_seqx #1#2#3#4% #2 is the index list, fully evaluated and encapsulated {% #3 is the Latin letter serving as dummy variable, #4 is the expression to evaluate \expandafter \XINT_expr_getop \csname .=\expandafter\XINT_expr_seq:_aa \romannumeral-`0\XINT_expr_unlock #2!{#1#4\relax !#3},^,\endcsname }% \def\XINT_expr_seq:_aa #1{\if +#1\expandafter\XINT_expr_seq:_A\else \expandafter\XINT_expr_seq:_a\fi #1}% \def\XINT_expr_seq:_a #1!#2{\expandafter\XINT_expr_seq_empty? \romannumeral0\XINT_expr_seq:_b {#2}#1}% \def\XINT_expr_seq:_b #1#2,{\XINT_expr_seq:_c #2,{#1}}% \def\XINT_expr_seq:_c #1{\if ,#1\xint_dothis\XINT_expr_seq:_noop\fi \if ^#1\xint_dothis\XINT_expr_seq:_end\fi \xint_orthat\XINT_expr_seq:_d #1}% \def\XINT_expr_seq:_d #1,#2{\expandafter\XINT_expr_seq:_e \romannumeral-`0\expandafter\XINT_expr_unlock\romannumeral0#2{#1}{#2}}% \def\XINT_expr_seq:_e #1{\if #1^\xint_dothis\XINT_expr_seq:_abort\fi \if #1?\xint_dothis\XINT_expr_seq:_break\fi \if #1!\xint_dothis\XINT_expr_seq:_omit\fi \xint_orthat{\XINT_expr_seq:_goon #1}}% \def\XINT_expr_seq:_goon #1!#2#3#4{,#1\XINT_expr_seq:_b {#4}}% \def\XINT_expr_seq:_omit #1!#2#3#4{\XINT_expr_seq:_b {#4}}% \def\XINT_expr_seq:_abort #1!#2#3#4#5^,{}% \def\XINT_expr_seq:_break #1!#2#3#4#5^,{,#1}% \def\XINT_expr_seq:_noop ,#1{\XINT_expr_seq:_b {#1}}% \def\XINT_expr_seq:_end ^,#1{}% if all is omit, _empty? constructs "nil" \def\XINT_expr_seq_empty? #1{% \def\XINT_expr_seq_empty? ##1{\if ,##1\expandafter\xint_gobble_i\fi #1\endcsname }}% \XINT_expr_seq_empty? { }% \def\XINT_expr_seq:_A +#1!#2,^,% {\expandafter\XINT_expr_seq_empty?\romannumeral0\XINT_expr_seq:_D {#1}{#2}}% \def\XINT_expr_seq:_D #1#2{\expandafter\XINT_expr_seq:_E \romannumeral-`0\expandafter\XINT_expr_unlock\romannumeral0#2{#1}{#2}}% \def\XINT_expr_seq:_E #1{\if #1^\xint_dothis\XINT_expr_seq:_Abort\fi \if #1?\xint_dothis\XINT_expr_seq:_Break\fi \if #1!\xint_dothis\XINT_expr_seq:_Omit\fi \xint_orthat{\XINT_expr_seq:_Goon #1}}% \def\XINT_expr_seq:_Goon #1!#2#3#4% {,#1\expandafter\XINT_expr_seq:_D\expandafter{\the\numexpr #3+\xint_c_i}{#4}}% \def\XINT_expr_seq:_Omit #1!#2#3#4% {\expandafter\XINT_expr_seq:_D\expandafter{\the\numexpr #3+\xint_c_i}{#4}}% \def\XINT_expr_seq:_Abort #1!#2#3#4{}% \def\XINT_expr_seq:_Break #1!#2#3#4{,#1}% \def\XINT_expr_onlitteral_add {\expandafter\XINT_expr_onlitteral_add_f\romannumeral-`0\XINT_expr_onlitteral_seq_a {}}% \def\XINT_expr_onlitteral_add_f #1#2{\xint_c_xviii `{opx}#2)\relax #1+}% \def\XINT_expr_onlitteral_mul {\expandafter\XINT_expr_onlitteral_mul_f\romannumeral-`0\XINT_expr_onlitteral_seq_a {}}% \def\XINT_expr_onlitteral_mul_f #1#2{\xint_c_xviii `{opx}#2)\relax #1*}% \expandafter\edef\csname XINT_expr_op:_+\endcsname {\noexpand\xint_gobble_v {}{}{}\expandafter\noexpand\csname .=0\endcsname}% \expandafter\edef\csname XINT_expr_op:_*\endcsname {\noexpand\xint_gobble_v {}{}{}\expandafter\noexpand\csname .=1\endcsname}% \def\XINT_expr_func_opx #1#2{\XINT_allexpr_opx \xintexpr }% \def\XINT_flexpr_func_opx #1#2{\XINT_allexpr_opx \xintfloatexpr }% \def\XINT_iiexpr_func_opx #1#2{\XINT_allexpr_opx \xintiiexpr }% \def\XINT_allexpr_opx #1#2#3#4#5% {% \expandafter\XINT_expr_getop\romannumeral0\expandafter\XINT_expr_op:_a \csname XINT_expr_op:_#5\expandafter\endcsname \romannumeral-`0\XINT_expr_unlock #2!#5#1#3{#4}% }% \def\XINT_expr_op:_a #1#2!#3#4#5#6{\XINT_expr_op:_b {#1#4#3{#6\relax\relax !#5}}#2,^,}% \def\XINT_expr_op:_b #1#2,{\XINT_expr_op:_c #2,#1}% \def\XINT_expr_op:_c #1{\if ,#1\xint_dothis\XINT_expr_op:_noop\fi \if ^#1\xint_dothis\XINT_expr_op:_end\fi \xint_orthat\XINT_expr_op:_d #1}% \def\XINT_expr_op:_noop #1,#2#3#4#5{\XINT_expr_op:_b {{#2}#3#4{#5}}}% \def\XINT_expr_op:_d #1,#2#3#4#5% {\expandafter\expandafter\expandafter\XINT_expr_op:_e #3#2#4#3#5{#1}{#3#4{#5}}}% \def\XINT_expr_op:_e !#1!#2#3#4{\XINT_expr_op:_b {{!#1}#4}}% \def\XINT_expr_op:_end ^,#1#2#3#4{\expandafter\expandafter\expandafter\space \expandafter\xint_gobble_iv #1}% \def\XINT_expr_onlitteral_subs {\expandafter\XINT_expr_onlitteral_subs_f\romannumeral-`0\XINT_expr_onlitteral_seq_a {}}% \def\XINT_expr_onlitteral_subs_f #1#2{\xint_c_xviii `{subx}#2)\relax #1}% \def\XINT_expr_func_subx #1#2{\XINT_allexpr_subx \xintbareeval }% \def\XINT_flexpr_func_subx #1#2{\XINT_allexpr_subx \xintbarefloateval}% \def\XINT_iiexpr_func_subx #1#2{\XINT_allexpr_subx \xintbareiieval }% \def\XINT_allexpr_subx #1#2#3#4% #2 is the value to assign to the dummy variable {% #3 is the dummy variable, #4 is the expression to evaluate \expandafter \XINT_expr_getop \csname .=\expandafter\XINT_expr_subx:_a \romannumeral-`0\XINT_expr_unlock #2!{#1#4\relax !#3}\endcsname }% \def\XINT_expr_subx:_a #1!#2% {\expandafter\XINT_expr_subx:_end \romannumeral0#2{#1}}% \def\XINT_expr_subx:_end #1!#2#3{\XINT_expr_unlock #1}% \def\XINT_expr_func_rseq {\XINT_allexpr_rseq \xintbareeval }% \def\XINT_flexpr_func_rseq {\XINT_allexpr_rseq \xintbarefloateval }% \def\XINT_iiexpr_func_rseq {\XINT_allexpr_rseq \xintbareiieval }% \def\XINT_allexpr_rseq #1#2% {% \expandafter\XINT_expr_rseqx\expandafter #1\expandafter #2\romannumeral-`0\XINT_expr_onlitteral_seq_a {}% }% \def\XINT_expr_rseqx #1#2#3#4% {% \expandafter\XINT_expr_rseqy\romannumeral0#1(#4)\relax #2#3#1% }% \def\XINT_expr_rseqy #1#2#3#4#5% {% \expandafter \XINT_expr_getop \csname .=\XINT_expr_unlock #2% \expandafter\XINT_expr_rseq:_aa \romannumeral-`0\XINT_expr_unlock #1!{#5#4\relax !#3}#2,^,\endcsname }% \def\XINT_expr_rseq:_aa #1{\if +#1\expandafter\XINT_expr_rseq:_A\else \expandafter\XINT_expr_rseq:_a\fi #1}% \def\XINT_expr_rseq:_a #1!#2#3{\XINT_expr_rseq:_b #3{#2}#1}% \def\XINT_expr_rseq:_b #1#2#3,{\XINT_expr_rseq:_c #3,~#1{#2}}% \def\XINT_expr_rseq:_c #1{\if ,#1\xint_dothis\XINT_expr_rseq:_noop\fi \if ^#1\xint_dothis\XINT_expr_rseq:_end\fi \xint_orthat\XINT_expr_rseq:_d #1}% \def\XINT_expr_rseq:_d #1,~#2#3{\expandafter\XINT_expr_rseq:_e \romannumeral-`0\expandafter\XINT_expr_unlock\romannumeral0#3{#1}~#2{#3}}% \def\XINT_expr_rseq:_e #1{% \if ^#1\xint_dothis\XINT_expr_rseq:_abort\fi \if ?#1\xint_dothis\XINT_expr_rseq:_break\fi \if !#1\xint_dothis\XINT_expr_rseq:_omit\fi \xint_orthat{\XINT_expr_rseq:_goon #1}}% \def\XINT_expr_rseq:_goon #1!#2#3~#4#5{,#1\expandafter\XINT_expr_rseq:_b \romannumeral0\XINT_expr_lockit {#1}{#5}}% \def\XINT_expr_rseq:_omit #1!#2#3~{\XINT_expr_rseq:_b }% \def\XINT_expr_rseq:_abort #1!#2#3~#4#5#6^,{}% \def\XINT_expr_rseq:_break #1!#2#3~#4#5#6^,{,#1}% \def\XINT_expr_rseq:_noop ,~#1#2{\XINT_expr_rseq:_b #1{#2}}% \def\XINT_expr_rseq:_end ^,~#1#2{}% no nil for rseq \def\XINT_expr_rseq:_A +#1!#2#3,^,{\XINT_expr_rseq:_D {#1}#3{#2}}% \def\XINT_expr_rseq:_D #1#2#3{\expandafter\XINT_expr_rseq:_E \romannumeral-`0\expandafter\XINT_expr_unlock\romannumeral0#3{#1}~#2{#3}}% \def\XINT_expr_rseq:_E #1{\if #1^\xint_dothis\XINT_expr_rseq:_Abort\fi \if #1?\xint_dothis\XINT_expr_rseq:_Break\fi \if #1!\xint_dothis\XINT_expr_rseq:_Omit\fi \xint_orthat{\XINT_expr_rseq:_Goon #1}}% \def\XINT_expr_rseq:_Goon #1!#2#3~#4#5% {,#1\expandafter\XINT_expr_rseq:_D\expandafter{\the\numexpr #3+\xint_c_i\expandafter}% \romannumeral0\XINT_expr_lockit{#1}{#5}}% \def\XINT_expr_rseq:_Omit #1!#2#3~%#4#5% {\expandafter\XINT_expr_rseq:_D\expandafter{\the\numexpr #3+\xint_c_i}}% \def\XINT_expr_rseq:_Abort #1!#2#3~#4#5{}% \def\XINT_expr_rseq:_Break #1!#2#3~#4#5{,#1}% \def\XINT_expr_func_rrseq {\XINT_allexpr_rrseq \xintbareeval }% \def\XINT_flexpr_func_rrseq {\XINT_allexpr_rrseq \xintbarefloateval }% \def\XINT_iiexpr_func_rrseq {\XINT_allexpr_rrseq \xintbareiieval }% \def\XINT_allexpr_rrseq #1#2% {% \expandafter\XINT_expr_rrseqx\expandafter #1\expandafter #2\romannumeral-`0\XINT_expr_onlitteral_seq_a {}% }% \def\XINT_expr_rrseqx #1#2#3#4% {% \expandafter\XINT_expr_rrseqy\romannumeral0#1(#4)\expandafter\relax \expandafter{\romannumeral0\xintapply \XINT_expr_lockit {\xintRevWithBraces{\xintCSVtoListNonStripped{\XINT_expr_unlock #2}}}}% #2#3#1% }% \def\XINT_expr_rrseqy #1#2#3#4#5#6% {% \expandafter \XINT_expr_getop \csname .=\XINT_expr_unlock #3% \expandafter\XINT_expr_rrseq:_aa \romannumeral-`0\XINT_expr_unlock #1!{#6#5\relax !#4}{#2},^,\endcsname }% \def\XINT_expr_rrseq:_aa #1{\if +#1\expandafter\XINT_expr_rrseq:_A\else \expandafter\XINT_expr_rrseq:_a\fi #1}% \catcode`? 3 \def\XINT_expr_rrseq:_a #1!#2#3{\XINT_expr_rrseq:_b {#3}{#2}#1}% \def\XINT_expr_rrseq:_b #1#2#3,{\XINT_expr_rrseq:_c #3,~#1?{#2}}% \def\XINT_expr_rrseq:_c #1{\if ,#1\xint_dothis\XINT_expr_rrseq:_noop\fi \if ^#1\xint_dothis\XINT_expr_rrseq:_end\fi \xint_orthat\XINT_expr_rrseq:_d #1}% \def\XINT_expr_rrseq:_d #1,~#2?#3{\expandafter\XINT_expr_rrseq:_e \romannumeral-`0\expandafter\XINT_expr_unlock\romannumeral0#3{#1}~#2?{#3}}% \def\XINT_expr_rrseq:_goon #1!#2#3~#4?#5{,#1\expandafter\XINT_expr_rrseq:_b\expandafter {\romannumeral0\xinttrim{-1}{\XINT_expr_lockit{#1}#4}}{#5}}% \def\XINT_expr_rrseq:_omit #1!#2#3~{\XINT_expr_rrseq:_b }% \def\XINT_expr_rrseq:_abort #1!#2#3~#4?#5#6^,{}% \def\XINT_expr_rrseq:_break #1!#2#3~#4?#5#6^,{,#1}% \def\XINT_expr_rrseq:_noop ,~#1?#2{\XINT_expr_rrseq:_b {#1}{#2}}% \def\XINT_expr_rrseq:_end ^,~#1?#2{}% No nil for rrseq. \catcode`? 11 \def\XINT_expr_rrseq:_e #1{% \if ^#1\xint_dothis\XINT_expr_rrseq:_abort\fi \if ?#1\xint_dothis\XINT_expr_rrseq:_break\fi \if !#1\xint_dothis\XINT_expr_rrseq:_omit\fi \xint_orthat{\XINT_expr_rrseq:_goon #1}% }% \catcode`? 3 \def\XINT_expr_rrseq:_A +#1!#2#3,^,{\XINT_expr_rrseq:_D {#1}{#3}{#2}}% \def\XINT_expr_rrseq:_D #1#2#3{\expandafter\XINT_expr_rrseq:_E \romannumeral-`0\expandafter\XINT_expr_unlock\romannumeral0#3{#1}~#2?{#3}}% \def\XINT_expr_rrseq:_Goon #1!#2#3~#4?#5% {,#1\expandafter\XINT_expr_rrseq:_D\expandafter{\the\numexpr #3+\xint_c_i\expandafter}% \expandafter{\romannumeral0\xinttrim{-1}{\XINT_expr_lockit{#1}#4}}{#5}}% \def\XINT_expr_rrseq:_Omit #1!#2#3~%#4?#5% {\expandafter\XINT_expr_rrseq:_D\expandafter{\the\numexpr #3+\xint_c_i}}% \def\XINT_expr_rrseq:_Abort #1!#2#3~#4?#5{}% \def\XINT_expr_rrseq:_Break #1!#2#3~#4?#5{,#1}% \catcode`? 11 \def\XINT_expr_rrseq:_E #1{\if #1^\xint_dothis\XINT_expr_rrseq:_Abort\fi \if #1?\xint_dothis\XINT_expr_rrseq:_Break\fi \if #1!\xint_dothis\XINT_expr_rrseq:_Omit\fi \xint_orthat{\XINT_expr_rrseq:_Goon #1}}% \def\XINT_expr_func_iter {\XINT_allexpr_iter \xintbareeval }% \def\XINT_flexpr_func_iter {\XINT_allexpr_iter \xintbarefloateval }% \def\XINT_iiexpr_func_iter {\XINT_allexpr_iter \xintbareiieval }% \def\XINT_allexpr_iter #1#2% {% \expandafter\XINT_expr_iterx\expandafter #1\expandafter #2\romannumeral-`0\XINT_expr_onlitteral_seq_a {}% }% \def\XINT_expr_iterx #1#2#3#4% {% \expandafter\XINT_expr_itery\romannumeral0#1(#4)\expandafter\relax \expandafter{\romannumeral0\xintapply \XINT_expr_lockit {\xintRevWithBraces{\xintCSVtoListNonStripped{\XINT_expr_unlock #2}}}}% #2#3#1% }% \def\XINT_expr_itery #1#2#3#4#5#6% {% \expandafter \XINT_expr_getop \csname .=% \expandafter\XINT_expr_iter:_aa \romannumeral-`0\XINT_expr_unlock #1!{#6#5\relax !#4}{#2},^,\endcsname }% \def\XINT_expr_iter:_aa #1{\if +#1\expandafter\XINT_expr_iter:_A\else \expandafter\XINT_expr_iter:_a\fi #1}% \catcode`? 3 \def\XINT_expr_iter:_a #1!#2#3{\XINT_expr_iter:_b {#3}{#2}#1}% \def\XINT_expr_iter:_b #1#2#3,{\XINT_expr_iter:_c #3,~#1?{#2}}% \def\XINT_expr_iter:_c #1{\if ,#1\xint_dothis\XINT_expr_iter:_noop\fi \if ^#1\xint_dothis\XINT_expr_iter:_end\fi \xint_orthat\XINT_expr_iter:_d #1}% \def\XINT_expr_iter:_d #1,~#2?#3{\expandafter\XINT_expr_iter:_e \romannumeral-`0\expandafter\XINT_expr_unlock\romannumeral0#3{#1}~#2?{#3}}% \def\XINT_expr_iter:_goon #1!#2#3~#4?#5{\expandafter\XINT_expr_iter:_b\expandafter {\romannumeral0\xinttrim{-1}{\XINT_expr_lockit{#1}#4}}{#5}}% \def\XINT_expr_iter:_omit #1!#2#3~{\XINT_expr_iter:_b }% \def\XINT_expr_iter:_abort #1!#2#3~#4?#5#6^,% {\expandafter\xint_gobble_i\romannumeral0\xintapplyunbraced {,\XINT_expr:_unlock}{\xintReverseOrder{#4\space}}}% \def\XINT_expr_iter:_break #1!#2#3~#4?#5#6^,% {\expandafter\xint_gobble_iv\romannumeral0\xintapplyunbraced {,\XINT_expr:_unlock}{\xintReverseOrder{#4\space}},#1}% \def\XINT_expr_iter:_noop ,~#1?#2{\XINT_expr_iter:_b {#1}{#2}}% \def\XINT_expr_iter:_end ^,~#1?#2% {\expandafter\xint_gobble_i\romannumeral0\xintapplyunbraced {,\XINT_expr:_unlock}{\xintReverseOrder{#1\space}}}% \catcode`? 11 \def\XINT_expr_iter:_e #1{% \if ^#1\xint_dothis\XINT_expr_iter:_abort\fi \if ?#1\xint_dothis\XINT_expr_iter:_break\fi \if !#1\xint_dothis\XINT_expr_iter:_omit\fi \xint_orthat{\XINT_expr_iter:_goon #1}% }% \def\XINT_expr:_unlock #1{\XINT_expr_unlock #1}% \catcode`? 3 \def\XINT_expr_iter:_A +#1!#2#3,^,{\XINT_expr_iter:_D {#1}{#3}{#2}}% \def\XINT_expr_iter:_D #1#2#3{\expandafter\XINT_expr_iter:_E \romannumeral-`0\expandafter\XINT_expr_unlock\romannumeral0#3{#1}~#2?{#3}}% \def\XINT_expr_iter:_Goon #1!#2#3~#4?#5% {\expandafter\XINT_expr_iter:_D\expandafter{\the\numexpr #3+\xint_c_i\expandafter}% \expandafter{\romannumeral0\xinttrim{-1}{\XINT_expr_lockit{#1}#4}}{#5}}% \def\XINT_expr_iter:_Omit #1!#2#3~%#4?#5% {\expandafter\XINT_expr_iter:_D\expandafter{\the\numexpr #3+\xint_c_i}}% \def\XINT_expr_iter:_Abort #1!#2#3~#4?#5% {\expandafter\xint_gobble_i\romannumeral0\xintapplyunbraced {,\XINT_expr:_unlock}{\xintReverseOrder{#4\space}}}% \def\XINT_expr_iter:_Break #1!#2#3~#4?#5% {\expandafter\xint_gobble_iv\romannumeral0\xintapplyunbraced {,\XINT_expr:_unlock}{\xintReverseOrder{#4\space}},#1}% \catcode`? 11 \def\XINT_expr_iter:_E #1{\if #1^\xint_dothis\XINT_expr_iter:_Abort\fi \if #1?\xint_dothis\XINT_expr_iter:_Break\fi \if #1!\xint_dothis\XINT_expr_iter:_Omit\fi \xint_orthat{\XINT_expr_iter:_Goon #1}}% \def\xintANDof:csv #1{\expandafter\XINT_andof:_a\romannumeral-`0#1,,^}% \def\XINT_andof:_a #1{\if ,#1\expandafter\XINT_andof:_e \else\expandafter\XINT_andof:_c\fi #1}% \def\XINT_andof:_c #1,{\xintiiifNotZero {#1}{\XINT_andof:_a}{\XINT_andof:_no}}% \def\XINT_andof:_no #1^{0}% \def\XINT_andof:_e #1^{1}% works with empty list \def\xintORof:csv #1{\expandafter\XINT_orof:_a\romannumeral-`0#1,,^}% \def\XINT_orof:_a #1{\if ,#1\expandafter\XINT_orof:_e \else\expandafter\XINT_orof:_c\fi #1}% \def\XINT_orof:_c #1,{\xintiiifNotZero{#1}{\XINT_orof:_yes}{\XINT_orof:_a}}% \def\XINT_orof:_yes #1^{1}% \def\XINT_orof:_e #1^{0}% works with empty list \def\xintXORof:csv #1{\expandafter\XINT_xorof:_a\expandafter 0\romannumeral-`0#1,,^}% \def\XINT_xorof:_a #1#2,{\XINT_xorof:_b #2,#1}% \def\XINT_xorof:_b #1{\if ,#1\expandafter\XINT_xorof:_e \else\expandafter\XINT_xorof:_c\fi #1}% \def\XINT_xorof:_c #1,#2% {\xintiiifNotZero {#1}{\if #20\xint_afterfi{\XINT_xorof:_a 1}% \else\xint_afterfi{\XINT_xorof:_a 0}\fi}% {\XINT_xorof:_a #2}% }% \def\XINT_xorof:_e ,#1#2^{#1}% allows empty list (then returns 0) \def\XINT_oncsv:_empty #1,^,#2{#2}% \def\XINT_oncsv:_end ^,#1#2#3#4{#1}% \def\XINT_oncsv:_a #1#2#3% {\if ,#3\expandafter\XINT_oncsv:_empty\else\expandafter\XINT_oncsv:_b\fi #1#2#3}% \def\XINT_oncsv:_b #1#2#3,% {\expandafter\XINT_oncsv:_c \expandafter{\romannumeral-`0#2{#3}}#1#2}% \def\XINT_oncsv:_c #1#2#3#4,{\expandafter\XINT_oncsv:_d \romannumeral-`0#4,{#1}#2#3}% \def\XINT_oncsv:_d #1% {\if ^#1\expandafter\XINT_oncsv:_end\else\expandafter\XINT_oncsv:_e\fi #1}% \def\XINT_oncsv:_e #1,#2#3#4% {\expandafter\XINT_oncsv:_c\expandafter {\romannumeral-`0#3{#4{#1}}{#2}}#3#4}% \def\xintMaxof:csv #1{\expandafter\XINT_oncsv:_a\expandafter\xintmax \expandafter\xint_firstofone\romannumeral-`0#1,^,{0/1[0]}}% \def\xintiiMaxof:csv #1{\expandafter\XINT_oncsv:_a\expandafter\xintiimax \expandafter\xint_firstofone\romannumeral-`0#1,^,0}% \def\xintMinof:csv #1{\expandafter\XINT_oncsv:_a\expandafter\xintmin \expandafter\xint_firstofone\romannumeral-`0#1,^,{0/1[0]}}% \def\xintiiMinof:csv #1{\expandafter\XINT_oncsv:_a\expandafter\xintiimin \expandafter\xint_firstofone\romannumeral-`0#1,^,0}% \def\xintSum:csv #1{\expandafter\XINT_oncsv:_a\expandafter\xintadd \expandafter\xint_firstofone\romannumeral-`0#1,^,{0/1[0]}}% \def\xintiiSum:csv #1{\expandafter\XINT_oncsv:_a\expandafter\xintiiadd \expandafter\xint_firstofone\romannumeral-`0#1,^,0}% \def\xintPrd:csv #1{\expandafter\XINT_oncsv:_a\expandafter\xintmul \expandafter\xint_firstofone\romannumeral-`0#1,^,{1/1[0]}}% \def\xintiiPrd:csv #1{\expandafter\XINT_oncsv:_a\expandafter\xintiimul \expandafter\xint_firstofone\romannumeral-`0#1,^,1}% \def\xintGCDof:csv #1{\expandafter\XINT_oncsv:_a\expandafter\xintgcd \expandafter\xint_firstofone\romannumeral-`0#1,^,1}% \def\xintLCMof:csv #1{\expandafter\XINT_oncsv:_a\expandafter\xintlcm \expandafter\xint_firstofone\romannumeral-`0#1,^,0}% \def\xintiiGCDof:csv #1{\expandafter\XINT_oncsv:_a\expandafter\xintiigcd \expandafter\xint_firstofone\romannumeral-`0#1,^,1}% \def\xintiiLCMof:csv #1{\expandafter\XINT_oncsv:_a\expandafter\xintiilcm \expandafter\xint_firstofone\romannumeral-`0#1,^,0}% \def\XINTinFloatdigits {\XINTinFloat [\XINTdigits]}% \def\XINTinFloatSqrtdigits {\XINTinFloatSqrt [\XINTdigits]}% \def\XINTinFloatMaxof:csv #1{\expandafter\XINT_oncsv:_a\expandafter\xintmax \expandafter\XINTinFloatdigits\romannumeral-`0#1,^,{0[0]}}% \def\XINTinFloatMinof:csv #1{\expandafter\XINT_oncsv:_a\expandafter\xintmin \expandafter\XINTinFloatdigits\romannumeral-`0#1,^,{0[0]}}% \def\XINTinFloatSum:csv #1{\expandafter\XINT_oncsv:_a\expandafter\XINTinfloatadd \expandafter\XINTinFloatdigits\romannumeral-`0#1,^,{0[0]}}% \def\XINTinFloatPrd:csv #1{\expandafter\XINT_oncsv:_a\expandafter\XINTinfloatmul \expandafter\XINTinFloatdigits\romannumeral-`0#1,^,{1[0]}}% \def\XINT_expr_twoargs #1,#2,{{#1}{#2}}% \def\XINT_expr_argandopt #1,#2,#3.#4#5% {% \if\relax#3\relax\expandafter\xint_firstoftwo\else \expandafter\xint_secondoftwo\fi {#4}{#5[\xintNum {#2}]}{#1}% }% \def\XINT_expr_oneortwo #1#2#3,#4,#5.% {% \if\relax#5\relax\expandafter\xint_firstoftwo\else \expandafter\xint_secondoftwo\fi {#1{0}}{#2{\xintNum {#4}}}{#3}% }% \def\XINT_iiexpr_oneortwo #1#2,#3,#4.% {% \if\relax#4\relax\expandafter\xint_firstoftwo\else \expandafter\xint_secondoftwo\fi {#1{0}}{#1{#3}}{#2}% }% \def\XINT_expr_func_num #1#2#3% {\expandafter #1\expandafter #2\csname.=\xintNum {\XINT_expr_unlock #3}\endcsname }% \let\XINT_flexpr_func_num\XINT_expr_func_num \let\XINT_iiexpr_func_num\XINT_expr_func_num \def\XINT_expr_func_reduce #1#2#3% {\expandafter #1\expandafter #2\csname.=\xintIrr {\XINT_expr_unlock #3}[0]\endcsname }% \let\XINT_flexpr_func_reduce\XINT_expr_func_reduce \def\XINT_expr_func_abs #1#2#3% {\expandafter #1\expandafter #2\csname.=\xintAbs {\XINT_expr_unlock #3}\endcsname }% \let\XINT_flexpr_func_abs\XINT_expr_func_abs \def\XINT_iiexpr_func_abs #1#2#3% {\expandafter #1\expandafter #2\csname.=\xintiiAbs {\XINT_expr_unlock #3}\endcsname }% \def\XINT_expr_func_sgn #1#2#3% {\expandafter #1\expandafter #2\csname.=\xintSgn {\XINT_expr_unlock #3}\endcsname }% \let\XINT_flexpr_func_sgn\XINT_expr_func_sgn \def\XINT_iiexpr_func_sgn #1#2#3% {\expandafter #1\expandafter #2\csname.=\xintiiSgn {\XINT_expr_unlock #3}\endcsname }% \def\XINT_expr_func_frac #1#2#3% {\expandafter #1\expandafter #2\csname.=\xintTFrac {\XINT_expr_unlock #3}\endcsname }% \def\XINT_flexpr_func_frac #1#2#3{\expandafter #1\expandafter #2\csname .=\XINTinFloatFracdigits {\XINT_expr_unlock #3}\endcsname }% \def\XINT_expr_func_floor #1#2#3% {\expandafter #1\expandafter #2\csname .=\xintFloor {\XINT_expr_unlock #3}\endcsname }% \let\XINT_flexpr_func_floor\XINT_expr_func_floor \def\XINT_iiexpr_func_floor #1#2#3% {% mais absurde si on ne peut pas avoir quotient comme input \expandafter #1\expandafter #2\csname.=\xintiFloor {\XINT_expr_unlock #3}\endcsname }% \def\XINT_expr_func_ceil #1#2#3% {\expandafter #1\expandafter #2\csname .=\xintCeil {\XINT_expr_unlock #3}\endcsname }% \let\XINT_flexpr_func_ceil\XINT_expr_func_ceil \def\XINT_iiexpr_func_ceil #1#2#3% {% mais absurde si on ne peut pas avoir quotient comme input \expandafter #1\expandafter #2\csname.=\xintiCeil {\XINT_expr_unlock #3}\endcsname }% \def\XINT_expr_func_sqr #1#2#3% {\expandafter #1\expandafter #2\csname.=\xintSqr {\XINT_expr_unlock #3}\endcsname }% \def\XINT_flexpr_func_sqr #1#2#3% {% \expandafter #1\expandafter #2\csname .=\XINTinFloatMul{\XINT_expr_unlock #3}{\XINT_expr_unlock #3}\endcsname }% \def\XINT_iiexpr_func_sqr #1#2#3% {\expandafter #1\expandafter #2\csname.=\xintiiSqr {\XINT_expr_unlock #3}\endcsname }% \def\XINT_expr_func_sqrt #1#2#3% {% \expandafter #1\expandafter #2\csname .=% \expandafter\XINT_expr_argandopt \romannumeral-`0\XINT_expr_unlock#3,,.\XINTinFloatSqrtdigits\XINTinFloatSqrt \endcsname }% \let\XINT_flexpr_func_sqrt\XINT_expr_func_sqrt \def\XINT_iiexpr_func_sqrt #1#2#3% {\expandafter #1\expandafter #2\csname.=\xintiiSqrt {\XINT_expr_unlock #3}\endcsname }% \def\XINT_iiexpr_func_sqrtr #1#2#3% {\expandafter #1\expandafter #2\csname.=\xintiiSqrtR {\XINT_expr_unlock #3}\endcsname }% \def\XINT_expr_func_round #1#2#3% {% \expandafter #1\expandafter #2\csname .=% \expandafter\XINT_expr_oneortwo \expandafter\xintiRound\expandafter\xintRound \romannumeral-`0\XINT_expr_unlock #3,,.\endcsname }% \let\XINT_flexpr_func_round\XINT_expr_func_round \def\XINT_iiexpr_func_round #1#2#3% {% \expandafter #1\expandafter #2\csname .=% \expandafter\XINT_iiexpr_oneortwo\expandafter\xintiRound \romannumeral-`0\XINT_expr_unlock #3,,.\endcsname }% \def\XINT_expr_func_trunc #1#2#3% {% \expandafter #1\expandafter #2\csname .=% \expandafter\XINT_expr_oneortwo \expandafter\xintiTrunc\expandafter\xintTrunc \romannumeral-`0\XINT_expr_unlock #3,,.\endcsname }% \let\XINT_flexpr_func_trunc\XINT_expr_func_trunc \def\XINT_iiexpr_func_trunc #1#2#3% {% \expandafter #1\expandafter #2\csname .=% \expandafter\XINT_iiexpr_oneortwo\expandafter\xintiTrunc \romannumeral-`0\XINT_expr_unlock #3,,.\endcsname }% \def\XINT_expr_func_float #1#2#3% {% \expandafter #1\expandafter #2\csname .=% \expandafter\XINT_expr_argandopt \romannumeral-`0\XINT_expr_unlock #3,,.\XINTinFloatdigits\XINTinFloat \endcsname }% \let\XINT_flexpr_func_float\XINT_expr_func_float \def\XINT_expr_func_mod #1#2#3% {% \expandafter #1\expandafter #2\csname .=% \expandafter\expandafter\expandafter\xintMod \expandafter\XINT_expr_twoargs \romannumeral-`0\XINT_expr_unlock #3,\endcsname }% \def\XINT_flexpr_func_mod #1#2#3% {% \expandafter #1\expandafter #2\csname .=% \expandafter\XINTinFloatMod \romannumeral-`0\expandafter\XINT_expr_twoargs \romannumeral-`0\XINT_expr_unlock #3,\endcsname }% \def\XINT_iiexpr_func_mod #1#2#3% {% \expandafter #1\expandafter #2\csname .=% \expandafter\expandafter\expandafter\xintiiMod \expandafter\XINT_expr_twoargs \romannumeral-`0\XINT_expr_unlock #3,\endcsname }% \def\XINT_expr_func_quo #1#2#3% {% \expandafter #1\expandafter #2\csname .=% \expandafter\expandafter\expandafter\xintiQuo \expandafter\XINT_expr_twoargs \romannumeral-`0\XINT_expr_unlock #3,\endcsname }% \let\XINT_flexpr_func_quo\XINT_expr_func_quo \def\XINT_iiexpr_func_quo #1#2#3% {% \expandafter #1\expandafter #2\csname .=% \expandafter\expandafter\expandafter\xintiiQuo \expandafter\XINT_expr_twoargs \romannumeral-`0\XINT_expr_unlock #3,\endcsname }% \def\XINT_expr_func_rem #1#2#3% {% \expandafter #1\expandafter #2\csname .=% \expandafter\expandafter\expandafter\xintiRem \expandafter\XINT_expr_twoargs \romannumeral-`0\XINT_expr_unlock #3,\endcsname }% \let\XINT_flexpr_func_rem\XINT_expr_func_rem \def\XINT_iiexpr_func_rem #1#2#3% {% \expandafter #1\expandafter #2\csname .=% \expandafter\expandafter\expandafter\xintiiRem \expandafter\XINT_expr_twoargs \romannumeral-`0\XINT_expr_unlock #3,\endcsname }% \def\XINT_expr_func_gcd #1#2#3% {\expandafter #1\expandafter #2\csname .=\xintGCDof:csv{\XINT_expr_unlock #3}\endcsname }% \let\XINT_flexpr_func_gcd\XINT_expr_func_gcd \def\XINT_iiexpr_func_gcd #1#2#3% {\expandafter #1\expandafter #2\csname .=\xintiiGCDof:csv{\XINT_expr_unlock #3}\endcsname }% \def\XINT_expr_func_lcm #1#2#3% {\expandafter #1\expandafter #2\csname .=\xintLCMof:csv{\XINT_expr_unlock #3}\endcsname }% \let\XINT_flexpr_func_lcm\XINT_expr_func_lcm \def\XINT_iiexpr_func_lcm #1#2#3% {\expandafter #1\expandafter #2\csname .=\xintiiLCMof:csv{\XINT_expr_unlock #3}\endcsname }% \def\XINT_expr_func_max #1#2#3% {\expandafter #1\expandafter #2\csname .=\xintMaxof:csv{\XINT_expr_unlock #3}\endcsname }% \def\XINT_iiexpr_func_max #1#2#3% {\expandafter #1\expandafter #2\csname .=\xintiiMaxof:csv{\XINT_expr_unlock #3}\endcsname }% \def\XINT_flexpr_func_max #1#2#3% {\expandafter #1\expandafter #2\csname .=\XINTinFloatMaxof:csv{\XINT_expr_unlock #3}\endcsname }% \def\XINT_expr_func_min #1#2#3% {\expandafter #1\expandafter #2\csname .=\xintMinof:csv{\XINT_expr_unlock #3}\endcsname }% \def\XINT_iiexpr_func_min #1#2#3% {\expandafter #1\expandafter #2\csname .=\xintiiMinof:csv{\XINT_expr_unlock #3}\endcsname }% \def\XINT_flexpr_func_min #1#2#3% {\expandafter #1\expandafter #2\csname .=\XINTinFloatMinof:csv{\XINT_expr_unlock #3}\endcsname }% \expandafter\def\csname XINT_expr_func_+\endcsname #1#2#3% {\expandafter #1\expandafter #2\csname .=\xintSum:csv{\XINT_expr_unlock #3}\endcsname }% \expandafter\def\csname XINT_flexpr_func_+\endcsname #1#2#3% {\expandafter #1\expandafter #2\csname .=\XINTinFloatSum:csv{\XINT_expr_unlock #3}\endcsname }% \expandafter\def\csname XINT_iiexpr_func_+\endcsname #1#2#3% {\expandafter #1\expandafter #2\csname .=\xintiiSum:csv{\XINT_expr_unlock #3}\endcsname }% \expandafter\def\csname XINT_expr_func_*\endcsname #1#2#3% {\expandafter #1\expandafter #2\csname .=\xintPrd:csv{\XINT_expr_unlock #3}\endcsname }% \expandafter\def\csname XINT_flexpr_func_*\endcsname #1#2#3% {\expandafter #1\expandafter #2\csname .=\XINTinFloatPrd:csv{\XINT_expr_unlock #3}\endcsname }% \expandafter\def\csname XINT_iiexpr_func_*\endcsname #1#2#3% {\expandafter #1\expandafter #2\csname .=\xintiiPrd:csv{\XINT_expr_unlock #3}\endcsname }% \def\XINT_expr_func_? #1#2#3% {\expandafter #1\expandafter #2\csname .=\xintiiIsNotZero {\XINT_expr_unlock #3}\endcsname }% \let\XINT_flexpr_func_? \XINT_expr_func_? \let\XINT_iiexpr_func_? \XINT_expr_func_? \def\XINT_expr_func_! #1#2#3% {\expandafter #1\expandafter #2\csname.=\xintiiIsZero {\XINT_expr_unlock #3}\endcsname }% \let\XINT_flexpr_func_! \XINT_expr_func_! \let\XINT_iiexpr_func_! \XINT_expr_func_! \def\XINT_expr_func_not #1#2#3% {\expandafter #1\expandafter #2\csname.=\xintiiIsZero {\XINT_expr_unlock #3}\endcsname }% \let\XINT_flexpr_func_not \XINT_expr_func_not \let\XINT_iiexpr_func_not \XINT_expr_func_not \def\XINT_expr_func_all #1#2#3% {\expandafter #1\expandafter #2\csname .=\xintANDof:csv{\XINT_expr_unlock #3}\endcsname }% \let\XINT_flexpr_func_all\XINT_expr_func_all \let\XINT_iiexpr_func_all\XINT_expr_func_all \def\XINT_expr_func_any #1#2#3% {\expandafter #1\expandafter #2\csname .=\xintORof:csv{\XINT_expr_unlock #3}\endcsname }% \let\XINT_flexpr_func_any\XINT_expr_func_any \let\XINT_iiexpr_func_any\XINT_expr_func_any \def\XINT_expr_func_xor #1#2#3% {\expandafter #1\expandafter #2\csname .=\xintXORof:csv{\XINT_expr_unlock #3}\endcsname }% \let\XINT_flexpr_func_xor\XINT_expr_func_xor \let\XINT_iiexpr_func_xor\XINT_expr_func_xor \def\xintifNotZero: #1,#2,#3,{\xintiiifNotZero{#1}{#2}{#3}}% \def\XINT_expr_func_if #1#2#3% {\expandafter #1\expandafter #2\csname .=\expandafter\xintifNotZero:\romannumeral-`0\XINT_expr_unlock #3,\endcsname }% \let\XINT_flexpr_func_if\XINT_expr_func_if \let\XINT_iiexpr_func_if\XINT_expr_func_if \def\xintifSgn: #1,#2,#3,#4,{\xintiiifSgn{#1}{#2}{#3}{#4}}% \def\XINT_expr_func_ifsgn #1#2#3% {% \expandafter #1\expandafter #2\csname .=\expandafter\xintifSgn:\romannumeral-`0\XINT_expr_unlock #3,\endcsname }% \let\XINT_flexpr_func_ifsgn\XINT_expr_func_ifsgn \let\XINT_iiexpr_func_ifsgn\XINT_expr_func_ifsgn \def\XINT_expr_func_first #1#2#3% {\expandafter #1\expandafter #2\csname.=\expandafter\XINT_expr_func_firsta \romannumeral-`0\XINT_expr_unlock #3,^\endcsname }% \def\XINT_expr_func_firsta #1,#2^{#1}% \let\XINT_flexpr_func_first\XINT_expr_func_first \let\XINT_iiexpr_func_first\XINT_expr_func_first \def\XINT_expr_func_last #1#2#3% will not work in \xintNewExpr if macro param involved {\expandafter #1\expandafter #2\csname.=\expandafter\XINT_expr_func_lasta \romannumeral-`0\XINT_expr_unlock #3,^\endcsname }% \def\XINT_expr_func_lasta #1,#2% {\if ^#2 #1\expandafter\xint_gobble_ii\fi \XINT_expr_func_lasta #2}% \let\XINT_flexpr_func_last\XINT_expr_func_last \let\XINT_iiexpr_func_last\XINT_expr_func_last \def\XINT_expr_func_odd #1#2#3% {\expandafter #1\expandafter #2\csname.=\xintOdd{\XINT_expr_unlock #3}\endcsname}% \let\XINT_flexpr_func_odd\XINT_expr_func_odd \def\XINT_iiexpr_func_odd #1#2#3% {\expandafter #1\expandafter #2\csname.=\xintiiOdd{\XINT_expr_unlock #3}\endcsname}% \def\XINT_expr_func_even #1#2#3% {\expandafter #1\expandafter #2\csname.=\xintEven{\XINT_expr_unlock #3}\endcsname}% \let\XINT_flexpr_func_even\XINT_expr_func_even \def\XINT_iiexpr_func_even #1#2#3% {\expandafter #1\expandafter #2\csname.=\xintiiEven{\XINT_expr_unlock #3}\endcsname}% \def\XINT_expr_func_nuple #1#2#3% {\expandafter #1\expandafter #2\csname .=\XINT_expr_unlock #3\endcsname }% \let\XINT_flexpr_func_nuple\XINT_expr_func_nuple \let\XINT_iiexpr_func_nuple\XINT_expr_func_nuple \def\XINT_expr_func_reversed #1#2#3% {\expandafter #1\expandafter #2\csname .=\xintReversed::csv {\XINT_expr_unlock #3}\endcsname }% \let\XINT_flexpr_func_reversed\XINT_expr_func_reversed \let\XINT_iiexpr_func_reversed\XINT_expr_func_reversed \def\xintReversed::csv #1% should be done directly, of course {\xintListWithSep,{\xintRevWithBraces {\xintCSVtoListNonStripped{#1}}}}% \def\xintSeqB:f:csv #1#2% {\expandafter\XINT_seqb:f:csv \expandafter{\romannumeral0\xintraw{#2}}{#1}}% \def\XINT_seqb:f:csv #1#2{\expandafter\XINT_seqb:f:csv_a\romannumeral-`0#2#1!}% \def\XINT_seqb:f:csv_a #1#2;#3;#4!{% \expandafter\xint_gobble_i\romannumeral-`0% \xintifCmp {#3}{#4}\XINT_seqb:f:csv_bl\XINT_seqb:f:csv_be\XINT_seqb:f:csv_bg #1{#3}{#4}{}{#2}}% \def\XINT_seqb:f:csv_be #1#2#3#4#5{,#2}% \def\XINT_seqb:f:csv_bl #1{\if #1p\expandafter\XINT_seqb:f:csv_pa\else \xint_afterfi{\expandafter,\xint_gobble_iv}\fi }% \def\XINT_seqb:f:csv_pa #1#2#3#4{\expandafter\XINT_seqb:f:csv_p\expandafter {\romannumeral0\xintadd{#4}{#1}}{#2}{#3,#1}{#4}}% \def\XINT_seqb:f:csv_p #1#2% {% \xintifCmp {#1}{#2}\XINT_seqb:f:csv_pa\XINT_seqb:f:csv_pb\XINT_seqb:f:csv_pc {#1}{#2}% }% \def\XINT_seqb:f:csv_pb #1#2#3#4{#3,#1}% \def\XINT_seqb:f:csv_pc #1#2#3#4{#3}% \def\XINT_seqb:f:csv_bg #1{\if #1n\expandafter\XINT_seqb:f:csv_na\else \xint_afterfi{\expandafter,\xint_gobble_iv}\fi }% \def\XINT_seqb:f:csv_na #1#2#3#4{\expandafter\XINT_seqb:f:csv_n\expandafter {\romannumeral0\xintadd{#4}{#1}}{#2}{#3,#1}{#4}}% \def\XINT_seqb:f:csv_n #1#2% {% \xintifCmp {#1}{#2}\XINT_seqb:f:csv_nc\XINT_seqb:f:csv_nb\XINT_seqb:f:csv_na {#1}{#2}% }% \def\XINT_seqb:f:csv_nb #1#2#3#4{#3,#1}% \def\XINT_seqb:f:csv_nc #1#2#3#4{#3}% \def\xintiiSeqb:f:csv #1#2% {\expandafter\XINT_iiseqb:f:csv \expandafter{\romannumeral-`0#2}{#1}}% \def\XINT_iiseqb:f:csv #1#2{\expandafter\XINT_iiseqb:f:csv_a\romannumeral-`0#2#1!}% \def\XINT_iiseqb:f:csv_a #1#2;#3;#4!{% \expandafter\xint_gobble_i\romannumeral-`0% \xintSgnFork{\XINT_Cmp {#3}{#4}}% \XINT_iiseqb:f:csv_bl\XINT_seqb:f:csv_be\XINT_iiseqb:f:csv_bg #1{#3}{#4}{}{#2}}% \def\XINT_iiseqb:f:csv_bl #1{\if #1p\expandafter\XINT_iiseqb:f:csv_pa\else \xint_afterfi{\expandafter,\xint_gobble_iv}\fi }% \def\XINT_iiseqb:f:csv_pa #1#2#3#4{\expandafter\XINT_iiseqb:f:csv_p\expandafter {\romannumeral0\xintiiadd{#4}{#1}}{#2}{#3,#1}{#4}}% \def\XINT_iiseqb:f:csv_p #1#2% {% \xintSgnFork{\XINT_Cmp {#1}{#2}}% \XINT_iiseqb:f:csv_pa\XINT_iiseqb:f:csv_pb\XINT_iiseqb:f:csv_pc {#1}{#2}% }% \def\XINT_iiseqb:f:csv_pb #1#2#3#4{#3,#1}% \def\XINT_iiseqb:f:csv_pc #1#2#3#4{#3}% \def\XINT_iiseqb:f:csv_bg #1{\if #1n\expandafter\XINT_iiseqb:f:csv_na\else \xint_afterfi{\expandafter,\xint_gobble_iv}\fi }% \def\XINT_iiseqb:f:csv_na #1#2#3#4{\expandafter\XINT_iiseqb:f:csv_n\expandafter {\romannumeral0\xintiiadd{#4}{#1}}{#2}{#3,#1}{#4}}% \def\XINT_iiseqb:f:csv_n #1#2% {% \xintSgnFork{\XINT_Cmp {#1}{#2}}% \XINT_seqb:f:csv_nc\XINT_seqb:f:csv_nb\XINT_iiseqb:f:csv_na {#1}{#2}% }% \def\XINTinFloatSeqB:f:csv #1#2{\expandafter\XINT_flseqb:f:csv \expandafter {\romannumeral0\XINTinfloat [\XINTdigits]{#2}}{#1}}% \def\XINT_flseqb:f:csv #1#2{\expandafter\XINT_flseqb:f:csv_a\romannumeral-`0#2#1!}% \def\XINT_flseqb:f:csv_a #1#2;#3;#4!{% \expandafter\xint_gobble_i\romannumeral-`0% \xintifCmp {#3}{#4}\XINT_flseqb:f:csv_bl\XINT_seqb:f:csv_be\XINT_flseqb:f:csv_bg #1{#3}{#4}{}{#2}}% \def\XINT_flseqb:f:csv_bl #1{\if #1p\expandafter\XINT_flseqb:f:csv_pa\else \xint_afterfi{\expandafter,\xint_gobble_iv}\fi }% \def\XINT_flseqb:f:csv_pa #1#2#3#4{\expandafter\XINT_flseqb:f:csv_p\expandafter {\romannumeral0\XINTinfloatadd{#4}{#1}}{#2}{#3,#1}{#4}}% \def\XINT_flseqb:f:csv_p #1#2% {% \xintifCmp {#1}{#2}% \XINT_flseqb:f:csv_pa\XINT_flseqb:f:csv_pb\XINT_flseqb:f:csv_pc {#1}{#2}% }% \def\XINT_flseqb:f:csv_pb #1#2#3#4{#3,#1}% \def\XINT_flseqb:f:csv_pc #1#2#3#4{#3}% \def\XINT_flseqb:f:csv_bg #1{\if #1n\expandafter\XINT_flseqb:f:csv_na\else \xint_afterfi{\expandafter,\xint_gobble_iv}\fi }% \def\XINT_flseqb:f:csv_na #1#2#3#4{\expandafter\XINT_flseqb:f:csv_n\expandafter {\romannumeral0\XINTinfloatadd{#4}{#1}}{#2}{#3,#1}{#4}}% \def\XINT_flseqb:f:csv_n #1#2% {% \xintifCmp {#1}{#2}% \XINT_seqb:f:csv_nc\XINT_seqb:f:csv_nb\XINT_flseqb:f:csv_na {#1}{#2}% }% \def\xintApply::csv #1#2% {\expandafter\XINT_applyon::_a\expandafter {\romannumeral-`0#2}{#1}}% \def\XINT_applyon::_a #1#2{\XINT_applyon::_b {#2}{}#1,,}% \def\XINT_applyon::_b #1#2#3,{\expandafter\XINT_applyon::_c \romannumeral-`0#3,{#1}{#2}}% \def\XINT_applyon::_c #1{\if #1,\expandafter\XINT_applyon::_end \else\expandafter\XINT_applyon::_d\fi #1}% \def\XINT_applyon::_d #1,#2{\expandafter\XINT_applyon::_e\romannumeral-`0#2{#1},{#2}}% \def\XINT_applyon::_e #1,#2#3{\XINT_applyon::_b {#2}{#3, #1}}% \def\XINT_applyon::_end #1,#2#3{\xint_secondoftwo #3}% \def\xintApply:::csv #1#2#3% {\expandafter\XINT_applyon:::_a\expandafter{\romannumeral-`0#2}{#1}{#3}}% \def\XINT_applyon:::_a #1#2#3{\XINT_applyon:::_b {#2}{#3}{}#1,,}% \def\XINT_applyon:::_b #1#2#3#4,% {\expandafter\XINT_applyon:::_c \romannumeral-`0#4,{#1}{#2}{#3}}% \def\XINT_applyon:::_c #1{\if #1,\expandafter\XINT_applyon:::_end \else\expandafter\XINT_applyon:::_d\fi #1}% \def\XINT_applyon:::_d #1,#2#3% {\expandafter\XINT_applyon:::_e\expandafter {\romannumeral-`0\xintApply::csv {#2{#1}}{#3}},{#2}{#3}}% \def\XINT_applyon:::_e #1,#2#3#4{\XINT_applyon:::_b {#2}{#3}{#4, #1}}% \def\XINT_applyon:::_end #1,#2#3#4{\xint_secondoftwo #4}% \def\XINT_expr_RApply::csv #1#2#3#4% {~xintApply::csv{~expandafter#1~xint_exchangetwo_keepbraces{#4}}{#3}}% \def\XINT_expr_LApply::csv #1#2#3#4{~xintApply::csv{#1{#3}}{#4}}% \def\XINT_expr_RLApply:::csv #1#2{~xintApply:::csv{#1}}% \catcode`~ 12 % by the way, catcode is set to 3 in \XINTsetupcatcodes \catcode`$ 12 % $ \def\XINT_xptwo_getab_b #1#2!#3% {\expandafter\XINT_xptwo_getab_c\romannumeral-`0#3!#1{#1#2}}% \def\XINT_xptwo_getab_c #1#2!#3#4#5#6{#1#3{#5}{#6}{#1#2}{#4}}% \def\xint_ddfork #1$$#2#3\krof {#2}% $$ \def\XINT_NEfork #1#2{\xint_ddfork #1#2\XINT_expr_RLApply:::csv #1$\XINT_expr_RApply::csv% $ $#2\XINT_expr_LApply::csv% $ $${\XINT_NEfork_nn #1#2}% $$ \krof }% \def\XINT_NEfork_nn #1#2#3#4{% \if #1##\xint_dothis{#3}\fi \if #1~\xint_dothis{#3}\fi \if #2##\xint_dothis{#3}\fi \if #2~\xint_dothis{#3}\fi \xint_orthat {\csname #4NE\endcsname }% }% \def\XINT_NEfork_one #1#2!#3#4#5#6{% \if ###1\xint_dothis {#3}\fi \if ~#1\xint_dothis {#3}\fi \if $#1\xint_dothis {~xintApply::csv{#3#5}}\fi %$ \xint_orthat {\csname #4NE\endcsname #6}{#1#2}% }% \toks0 {}% \xintFor #1 in {DivTrunc,iiDivTrunc,iiDivRound,Mod,iiMod,iRound,Round,iTrunc,Trunc,% Lt,Gt,Eq,LtorEq,GtorEq,Neq,AND,OR,XOR,iQuo,iRem,Add,Sub,Mul,Div,Pow,E,% iiAdd,iiSub,iiMul,iiPow,iiQuo,iiRem,iiE,SeqA::csv,iiSeqA::csv}\do {\toks0 \expandafter{\the\toks0% no space! (makes shorter macro in the end) \expandafter\let\csname xint#1NE\expandafter\endcsname\csname xint#1\expandafter \endcsname\expandafter\def\csname xint#1\endcsname ####1####2{% \expandafter\XINT_NEfork \romannumeral-`0\expandafter\XINT_xptwo_getab_b \romannumeral-`0####2!{####1}{~xint#1}{xint#1}}% }% }% \xintFor #1 in {Num,Irr,Abs,iiAbs,Sgn,iiSgn,TFrac,Floor,iFloor,Ceil,iCeil,% Sqr,iiSqr,iiSqrt,iiSqrtR,iiIsZero,iiIsNotZero,iiifNotZero,iiifSgn,% Odd,Even,iiOdd,iiEven,Opp,iiOpp,iiifZero,Fac,iFac,Bool,Toggle}\do {\toks0 \expandafter{\the\toks0% \expandafter\let\csname xint#1NE\expandafter\endcsname\csname xint#1\expandafter \endcsname\expandafter\def\csname xint#1\endcsname ####1{% \expandafter\XINT_NEfork_one\romannumeral-`0####1!{~xint#1}{xint#1}{}{}}% }% }% \xintFor #1 in {Add,Sub,Mul,Div,Power,E,Mod,SeqA::csv}\do {\toks0 \expandafter{\the\toks0% \expandafter\let\csname XINTinFloat#1NE\expandafter\endcsname \csname XINTinFloat#1\expandafter\endcsname \expandafter\def\csname XINTinFloat#1\endcsname ####1####2{% \expandafter\XINT_NEfork \romannumeral-`0\expandafter\XINT_xptwo_getab_b \romannumeral-`0####2!{####1}{~XINTinFloat#1}{XINTinFloat#1}}% }% }% \xintFor #1 in {XINTinFloatdigits,XINTinFloatFracdigits,XINTinFloatSqrtdigits}\do {\toks0 \expandafter{\the\toks0% \expandafter\let\csname #1NE\expandafter\endcsname\csname #1\expandafter \endcsname\expandafter\def\csname #1\endcsname ####1{\expandafter \XINT_NEfork_one\romannumeral-`0####1!{~#1}{#1}{}{}}% }% }% \xintFor #1 in {xintSeq::csv,xintiiSeq::csv,XINTinFloatSeq::csv}\do {\toks0 \expandafter{\the\toks0% no space \expandafter\let\csname #1NE\expandafter\endcsname\csname #1\expandafter \endcsname\expandafter\def\csname #1\endcsname ####1####2{% \expandafter\XINT_NEfork \romannumeral-`0\expandafter\XINT_xptwo_getab_b \romannumeral-`0####2!{####1}{$noexpand$#1}{#1}}% }% }% \xintFor #1 in {xintSeqB,xintiiSeqB,XINTinFloatSeqB}\do {\toks0 \expandafter{\the\toks0% no space \expandafter\let\csname #1::csvNE\expandafter\endcsname\csname #1::csv\expandafter \endcsname\expandafter\def\csname #1::csv\endcsname ####1####2{% \expandafter\XINT_NEfork \romannumeral-`0\expandafter\XINT_xptwo_getab_b \romannumeral-`0####2!{####1}{$noexpand$#1:f:csv}{#1::csv}}% }% }% \toks0 \expandafter{\the\toks0 \let\XINTinFloatNE\XINTinFloat \def\XINTinFloat [##1]##2{% not ultimately general, but got tired \expandafter\XINT_NEfork_one \romannumeral-`0##2!{~XINTinFloat[##1]}{XINTinFloat}{}{[##1]}}% \let\XINTinFloatSqrtNE\XINTinFloatSqrt \def\XINTinFloatSqrt [##1]##2{% \expandafter\XINT_NEfork_one \romannumeral-`0##2!{~XINTinFloatSqrt[##1]}{XINTinFloatSqrt}{}{[##1]}}% }% \xintFor #1 in {ANDof,ORof,XORof,iiMaxof,iiMinof,iiSum,iiPrd, GCDof,LCMof,Sum,Prd,Maxof,Minof}\do {\toks0 \expandafter{\the\toks0\expandafter\def\csname xint#1:csv\endcsname {~xint#1:csv}}% }% \xintFor #1 in {XINTinFloatMaxof,XINTinFloatMinof,XINTinFloatSum,XINTinFloatPrd}\do {\toks0 \expandafter{\the\toks0\expandafter\def\csname #1:csv\endcsname {~#1:csv}}% }% \expandafter\def\expandafter\XINT_expr_redefinemacros\expandafter {\the\toks0 \def\XINT_flexpr_noopt {\expandafter\XINT_flexpr_withopt_b\expandafter-% \romannumeral0\xintbarefloateval }% \def\XINT_flexpr_withopt_b ##1##2% {\expandafter\XINT_flexpr_wrap\csname .;##1.=\XINT_expr_unlock ##2\endcsname }% \def\XINT_expr_unlock_sp ##1.;##2##3.=##4!{\if -##2\expandafter\xint_firstoftwo \else\expandafter\xint_secondoftwo\fi \XINTdigits{{##2##3}}{##4}}% \def\XINT_expr_print ##1{\expandafter\xintSPRaw::csv\expandafter {\romannumeral-`0\XINT_expr_unlock ##1}}% \def\XINT_iiexpr_print ##1{\expandafter\xintCSV::csv\expandafter {\romannumeral-`0\XINT_expr_unlock ##1}}% \def\XINT_boolexpr_print ##1{\expandafter\xintIsTrue::csv\expandafter {\romannumeral-`0\XINT_expr_unlock ##1}}% \def\xintCSV::csv {~xintCSV::csv }% spaces to separate from possible catcode 11 \def\xintSPRaw::csv {~xintSPRaw::csv }% stuff after \def\xintPFloat::csv {~xintPFloat::csv }% \def\xintIsTrue::csv {~xintIsTrue::csv }% \def\xintRound::csv {~xintRound::csv }% \def\xintReversed::csv {~xintReversed::csv }% \def\xintListSel:csv {~xintListSel:csv }% }% \toks0 {}% \def\xintNewExpr {\xint_NewExpr\xinttheexpr }% \def\xintNewFloatExpr {\xint_NewExpr\xintthefloatexpr }% \def\xintNewIExpr {\xint_NewExpr\xinttheiexpr }% \def\xintNewIIExpr {\xint_NewExpr\xinttheiiexpr }% \def\xintNewBoolExpr {\xint_NewExpr\xinttheboolexpr }% \def\XINT_newexpr_finish #1>{\noexpand\romannumeral-`0}% \def\xint_NewExpr #1#2[#3]% {% \begingroup \ifcase #3\relax \toks0 {\xdef #2}% \or \toks0 {\xdef #2##1}% \or \toks0 {\xdef #2##1##2}% \or \toks0 {\xdef #2##1##2##3}% \or \toks0 {\xdef #2##1##2##3##4}% \or \toks0 {\xdef #2##1##2##3##4##5}% \or \toks0 {\xdef #2##1##2##3##4##5##6}% \or \toks0 {\xdef #2##1##2##3##4##5##6##7}% \or \toks0 {\xdef #2##1##2##3##4##5##6##7##8}% \or \toks0 {\xdef #2##1##2##3##4##5##6##7##8##9}% \fi \xintexprSafeCatcodes \XINT_NewExpr #1% }% \catcode`~ 13 \catcode`@ 14 \catcode`\% 6 \catcode`# 12 \catcode`$ 11 @ $ \def\XINT_NewExpr %1%2@ {@ \def\XINT_tmpa %%1%%2%%3%%4%%5%%6%%7%%8%%9{%2}@ \XINT_expr_redefinemacros \def~{$noexpand$}@ \catcode`: 11 \catcode`_ 11 \catcode`# 12 \catcode`~ 13 \escapechar 126 \endlinechar -1 \everyeof {\noexpand }@ \edef\XINT_tmpb {\scantokens\expandafter {\romannumeral-`0\expandafter%1\XINT_tmpa {#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}{#9}\relax}@ }@ \escapechar 92 \catcode`# 6 \catcode`$ 0 @ $ \the\toks0 {\scantokens\expandafter{\expandafter\XINT_newexpr_finish\meaning\XINT_tmpb}}@ \endgroup }@ \catcode`% 14 \let\xintexprRestoreCatcodes\empty \def\xintexprSafeCatcodes {% \edef\xintexprRestoreCatcodes {% \catcode59=\the\catcode59 % ; \catcode34=\the\catcode34 % " \catcode63=\the\catcode63 % ? \catcode124=\the\catcode124 % | \catcode38=\the\catcode38 % & \catcode33=\the\catcode33 % ! \catcode93=\the\catcode93 % ] \catcode91=\the\catcode91 % [ \catcode94=\the\catcode94 % ^ \catcode95=\the\catcode95 % _ \catcode47=\the\catcode47 % / \catcode41=\the\catcode41 % ) \catcode40=\the\catcode40 % ( \catcode42=\the\catcode42 % * \catcode43=\the\catcode43 % + \catcode62=\the\catcode62 % > \catcode60=\the\catcode60 % < \catcode58=\the\catcode58 % : \catcode46=\the\catcode46 % . \catcode45=\the\catcode45 % - \catcode44=\the\catcode44 % , \catcode61=\the\catcode61 % = \catcode32=\the\catcode32\relax % space }% \catcode59=12 % ; \catcode34=12 % " \catcode63=12 % ? \catcode124=12 % | \catcode38=4 % & \catcode33=12 % ! \catcode93=12 % ] \catcode91=12 % [ \catcode94=7 % ^ \catcode95=8 % _ \catcode47=12 % / \catcode41=12 % ) \catcode40=12 % ( \catcode42=12 % * \catcode43=12 % + \catcode62=12 % > \catcode60=12 % < \catcode58=12 % : \catcode46=12 % . \catcode45=12 % - \catcode44=12 % , \catcode61=12 % = \catcode32=10 % space }% \let\XINT_tmpa\relax \let\XINT_tmpb\relax \let\XINT_tmpc\relax \XINT_restorecatcodes_endinput% \endinput %% %% End of file `xintexpr.sty'.