summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/xint/xintexpr.sty
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/generic/xint/xintexpr.sty')
-rw-r--r--Master/texmf-dist/tex/generic/xint/xintexpr.sty211
1 files changed, 132 insertions, 79 deletions
diff --git a/Master/texmf-dist/tex/generic/xint/xintexpr.sty b/Master/texmf-dist/tex/generic/xint/xintexpr.sty
index ab7896f4fe0..b2736c3398b 100644
--- a/Master/texmf-dist/tex/generic/xint/xintexpr.sty
+++ b/Master/texmf-dist/tex/generic/xint/xintexpr.sty
@@ -21,7 +21,7 @@
%% same distribution. (The sources need not necessarily be
%% in the same archive or directory.)
%% ---------------------------------------------------------------
-%% The xint bundle 1.2f 2016/03/12
+%% The xint bundle 1.2g 2016/03/19
%% Copyright (C) 2013-2016 by Jean-Francois Burnol
%% xintexpr: Expandable expression parser
%% ---------------------------------------------------------------
@@ -81,7 +81,7 @@
\XINTsetupcatcodes%
\XINT_providespackage
\ProvidesPackage{xintexpr}%
- [2016/03/12 1.2f Expandable expression parser (JFB)]%
+ [2016/03/19 1.2g Expandable expression parser (JFB)]%
\catcode`! 11
\def\xint_gob_til_! #1!{}% catcode 11 ! default in xintexpr.sty code.
\edef\XINT_expr_lockscan#1!% not used for decimal numbers in xintexpr 1.2
@@ -910,8 +910,9 @@
\else
\xint_afterfi
{\expandafter ##2\expandafter ##3\csname
- .=\expandafter\xintListSel::csv \romannumeral`&&@\XINT_expr_unlock ##4;%
- \XINT_expr_unlock ##1;\endcsname % unlock added for \xintNewExpr
+ .=\expandafter\xintListSel:f:csv
+ \romannumeral`&&@\XINT_expr_unlock ##4;%
+ \XINT_expr_unlock ##1;\endcsname % unlock for \xintNewExpr
}%
\fi
}%
@@ -972,7 +973,7 @@
\let\XINT_flexpr_op_][: \XINT_expr_op_][:
\let\XINT_iiexpr_op_][: \XINT_expr_op_][:
\catcode`[ 12 \catcode`] 12
-\def\xintListSel::csv #1{%
+\def\xintListSel:f:csv #1{%
\if ]\noexpand#1\xint_dothis{\expandafter\XINT_listsel:_s\romannumeral`&&@}\fi
\if :\noexpand#1\xint_dothis{\XINT_listsel:_:}\fi
\xint_orthat {\XINT_listsel:_nth #1}%
@@ -980,31 +981,22 @@
\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:_trim #1;#2;{\xintTrim:f:csv {\xintNum{#1}}{#2}}%
+\def\XINT_listsel:_keep #1;#2;{\xintKeep:f:csv {\xintNum{#1}}{#2}}%
+\def\XINT_listsel:_nth#1;#2;{\xintNthEltPy:f:csv {\xintNum{#1}}{#2}}%
\def\XINT_listsel:_PP #1;#2;#3;%
- {\xintListWithSep,%
- {\xintTrim {\xintNum{#1}}{\xintKeep {\xintNum{#2}}{\xintCSVtoListNonStripped{#3}}}}%
- }%
+ {\xintTrim:f:csv {\xintNum{#1}}{\xintKeep:f:csv {\xintNum{#2}}{#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;}%
+ {\xintTrim:f:csv {\xintNum{#2}}{\xintKeep:f:csv {\xintNum{#1}}{#3}}}%
+\def\XINT_listsel:_NP #1;#2;#3;{\expandafter\XINT_listsel:_NP_a
+ \the\numexpr #1+\xintLength:f:csv{#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:_PN #1;#2;#3;{\expandafter\XINT_listsel:_PN_a
+ \the\numexpr #2+\xintLength:f:csv{#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%
@@ -1602,6 +1594,64 @@
\csname.=\the\numexpr \XINT_expr_unlock#3+\xint_c_i\endcsname }%
\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_iter {\XINT_allexpr_iter \xintbareeval \xintthebareeval }%
+\def\XINT_flexpr_func_iter {\XINT_allexpr_iter \xintbarefloateval \xintthebarefloateval }%
+\def\XINT_iiexpr_func_iter {\XINT_allexpr_iter \xintbareiieval \xintthebareiieval }%
+\def\XINT_allexpr_iter #1#2#3%
+{%
+ \expandafter\XINT_expr_iterx\expandafter #1\expandafter#2\expandafter
+ #3\romannumeral`&&@\XINT_expr_onlitteral_seq_a {}%
+}%
+\def\XINT_expr_iterx #1#2#3#4#5%
+{%
+ \expandafter\XINT_expr_itery\romannumeral0#1(#5)\relax #3#4#2%
+}%
+\def\XINT_expr_itery #1#2#3#4#5%
+{%
+ \expandafter \XINT_expr_getop
+ \csname .=%
+ \expandafter\XINT_expr_iter:_aa
+ \romannumeral`&&@\XINT_expr_unlock #1!{#5#4\relax !#3}#2\endcsname
+}%
+\def\XINT_expr_iter:_aa #1{\if +#1\expandafter\XINT_expr_iter:_A\else
+ \expandafter\XINT_expr_iter:_a\fi #1}%
+\def\XINT_expr_iter:_a #1!#2#3{\XINT_expr_iter:_b {#3}{#2}#1,^,}%
+\def\XINT_expr_iter:_b #1#2#3#4,{%
+ \if ,#3\xint_dothis\XINT_expr_iter:_noop\fi
+ \if ^#3\xint_dothis\XINT_expr_iter:_end\fi
+ \xint_orthat{\expandafter\XINT_expr_iter:_c}%
+ \csname.=#3#4\endcsname {#1}{#2}%
+}%
+\def\XINT_expr_iter:_noop\csname.=,#1\endcsname #2#3{\XINT_expr_iter:_b {#2}{#3}#1,}%
+\def\XINT_expr_iter:_end \csname.=^\endcsname #1#2{\XINT_expr:_unlock #1}%
+\def\XINT_expr_iter:_c #1#2#3%
+ {\expandafter\XINT_expr_iter:_d\romannumeral`&&@#3#1~#2{#3}}%
+\def\XINT_expr_iter:_d #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_iter:_goon #1!#2#3~#4#5%
+ {\expandafter\XINT_expr_iter:_b\romannumeral0\XINT_expr_lockit {#1}{#5}}%
+\def\XINT_expr_iter:_omit #1!#2#3~{\XINT_expr_iter:_b }%
+\def\XINT_expr_iter:_abort #1!#2#3~#4#5#6^,{\XINT_expr_unlock #4}%
+\def\XINT_expr_iter:_break #1!#2#3~#4#5#6^,{#1}%
+\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`&&@#3#1~#2{#3}}%
+\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_iter:_Goon #1!#2#3~#4#5%
+ {\expandafter\XINT_expr_iter:_D
+ \csname.=\the\numexpr \XINT_expr_unlock#3+\xint_c_i\expandafter\endcsname
+ \romannumeral0\XINT_expr_lockit{#1}{#5}}%
+\def\XINT_expr_iter:_Omit #1!#2#3~%#4#5%
+ {\expandafter\XINT_expr_iter:_D
+ \csname.=\the\numexpr \XINT_expr_unlock#3+\xint_c_i\endcsname }%
+\def\XINT_expr_iter:_Abort #1!#2#3~#4#5{\XINT_expr:_unlock #4}%
+\def\XINT_expr_iter:_Break #1!#2#3~#4#5{#1}%
\def\XINT_expr_func_rrseq {\XINT_allexpr_rrseq \xintbareeval \xintthebareeval }%
\def\XINT_flexpr_func_rrseq {\XINT_allexpr_rrseq \xintbarefloateval \xintthebarefloateval }%
\def\XINT_iiexpr_func_rrseq {\XINT_allexpr_rrseq \xintbareiieval \xintthebareiieval }%
@@ -1665,79 +1715,79 @@
\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 \xintthebareeval }%
-\def\XINT_flexpr_func_iter {\XINT_allexpr_iter \xintbarefloateval \xintthebarefloateval }%
-\def\XINT_iiexpr_func_iter {\XINT_allexpr_iter \xintbareiieval \xintthebareiieval }%
-\def\XINT_allexpr_iter #1#2#3%
+\def\XINT_expr_func_iterr {\XINT_allexpr_iterr \xintbareeval \xintthebareeval }%
+\def\XINT_flexpr_func_iterr {\XINT_allexpr_iterr \xintbarefloateval \xintthebarefloateval }%
+\def\XINT_iiexpr_func_iterr {\XINT_allexpr_iterr \xintbareiieval \xintthebareiieval }%
+\def\XINT_allexpr_iterr #1#2#3%
{%
- \expandafter\XINT_expr_iterx\expandafter #1\expandafter #2\expandafter
+ \expandafter\XINT_expr_iterrx\expandafter #1\expandafter #2\expandafter
#3\romannumeral`&&@\XINT_expr_onlitteral_seq_a {}%
}%
-\def\XINT_expr_iterx #1#2#3#4#5%
+\def\XINT_expr_iterrx #1#2#3#4#5%
{%
- \expandafter\XINT_expr_itery\romannumeral0#1(#5)\expandafter\relax
+ \expandafter\XINT_expr_iterry\romannumeral0#1(#5)\expandafter\relax
\expandafter{\romannumeral0\xintapply \XINT_expr_lockit
{\xintRevWithBraces{\xintCSVtoListNonStripped{\XINT_expr_unlock #3}}}}%
#3#4#2%
}%
-\def\XINT_expr_itery #1#2#3#4#5#6%
+\def\XINT_expr_iterry #1#2#3#4#5#6%
{%
\expandafter \XINT_expr_getop
\csname .=%
- \expandafter\XINT_expr_iter:_aa
- \romannumeral`&&@\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}%
-\def\XINT_expr_iter:_a #1!#2#3{\XINT_expr_iter:_b {#3}{#2}#1,^,}%
-\def\XINT_expr_iter:_b #1#2#3#4,{%
- \if ,#3\xint_dothis\XINT_expr_iter:_noop\fi
- \if ^#3\xint_dothis\XINT_expr_iter:_end\fi
- \xint_orthat{\expandafter\XINT_expr_iter:_c}\csname.=#3#4\endcsname
- {#1}{#2}%
-}%
-\def\XINT_expr_iter:_noop\csname.=,#1\endcsname #2#3{\XINT_expr_iter:_b {#2}{#3}#1,}%
-\def\XINT_expr_iter:_end \csname.=^\endcsname #1#2%
+ \expandafter\XINT_expr_iterr:_aa
+ \romannumeral`&&@\XINT_expr_unlock #1!{#6#5\relax !#4}{#2}\endcsname
+}%
+\def\XINT_expr_iterr:_aa #1{\if +#1\expandafter\XINT_expr_iterr:_A\else
+ \expandafter\XINT_expr_iterr:_a\fi #1}%
+\def\XINT_expr_iterr:_a #1!#2#3{\XINT_expr_iterr:_b {#3}{#2}#1,^,}%
+\def\XINT_expr_iterr:_b #1#2#3#4,{%
+ \if ,#3\xint_dothis\XINT_expr_iterr:_noop\fi
+ \if ^#3\xint_dothis\XINT_expr_iterr:_end\fi
+ \xint_orthat{\expandafter\XINT_expr_iterr:_c}%
+ \csname.=#3#4\endcsname {#1}{#2}%
+}%
+\def\XINT_expr_iterr:_noop\csname.=,#1\endcsname #2#3{\XINT_expr_iterr:_b {#2}{#3}#1,}%
+\def\XINT_expr_iterr:_end \csname.=^\endcsname #1#2%
{\expandafter\xint_gobble_i\romannumeral0\xintapplyunbraced
{,\XINT_expr:_unlock}{\xintReverseOrder{#1\space}}}%
-\def\XINT_expr_iter:_c #1#2#3%
- {\expandafter\XINT_expr_iter:_d\romannumeral`&&@#3#1~#2?{#3}}%
-\def\XINT_expr_iter:_d #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_iter:_goon #1!#2#3~#4?#5{\expandafter\XINT_expr_iter:_b\expandafter
+\def\XINT_expr_iterr:_c #1#2#3%
+ {\expandafter\XINT_expr_iterr:_d\romannumeral`&&@#3#1~#2?{#3}}%
+\def\XINT_expr_iterr:_d #1{%
+ \if ^#1\xint_dothis\XINT_expr_iterr:_abort\fi
+ \if ?#1\xint_dothis\XINT_expr_iterr:_break\fi
+ \if !#1\xint_dothis\XINT_expr_iterr:_omit\fi
+ \xint_orthat{\XINT_expr_iterr:_goon #1}%
+}%
+\def\XINT_expr_iterr:_goon #1!#2#3~#4?#5{\expandafter\XINT_expr_iterr:_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^,%
+\def\XINT_expr_iterr:_omit #1!#2#3~{\XINT_expr_iterr:_b }%
+\def\XINT_expr_iterr:_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^,%
+\def\XINT_expr_iterr:_break #1!#2#3~#4?#5#6^,%
{\expandafter\xint_gobble_iv\romannumeral0\xintapplyunbraced
{,\XINT_expr:_unlock}{\xintReverseOrder{#4\space}},#1}%
\def\XINT_expr:_unlock #1{\XINT_expr_unlock #1}%
-\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`&&@#3#1~#2?{#3}}%
-\def\XINT_expr_iter:_Goon #1!#2#3~#4?#5%
- {\expandafter\XINT_expr_iter:_D
+\def\XINT_expr_iterr:_A +#1!#2#3{\XINT_expr_iterr:_D #1{#3}{#2}}%
+\def\XINT_expr_iterr:_D #1#2#3%
+ {\expandafter\XINT_expr_iterr:_E\romannumeral`&&@#3#1~#2?{#3}}%
+\def\XINT_expr_iterr:_Goon #1!#2#3~#4?#5%
+ {\expandafter\XINT_expr_iterr:_D
\csname.=\the\numexpr \XINT_expr_unlock#3+\xint_c_i\expandafter\endcsname
\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
+\def\XINT_expr_iterr:_Omit #1!#2#3~%#4?#5%
+ {\expandafter\XINT_expr_iterr:_D
\csname.=\the\numexpr \XINT_expr_unlock#3+\xint_c_i\endcsname}%
-\def\XINT_expr_iter:_Abort #1!#2#3~#4?#5%
+\def\XINT_expr_iterr:_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%
+\def\XINT_expr_iterr:_Break #1!#2#3~#4?#5%
{\expandafter\xint_gobble_iv\romannumeral0\xintapplyunbraced
{,\XINT_expr:_unlock}{\xintReverseOrder{#4\space}},#1}%
-\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_iterr:_E #1{\if #1^\xint_dothis\XINT_expr_iterr:_Abort\fi
+ \if #1?\xint_dothis\XINT_expr_iterr:_Break\fi
+ \if #1!\xint_dothis\XINT_expr_iterr:_Omit\fi
+ \xint_orthat{\XINT_expr_iterr:_Goon #1}}%
\catcode`? 11
\def\xintANDof:csv #1{\expandafter\XINT_andof:_a\romannumeral`&&@#1,,^}%
\def\XINT_andof:_a #1{\if ,#1\expandafter\XINT_andof:_e
@@ -2119,6 +2169,11 @@
}%
\let\XINT_flexpr_func_ifsgn\XINT_expr_func_ifsgn
\let\XINT_iiexpr_func_ifsgn\XINT_expr_func_ifsgn
+\def\XINT_expr_func_len #1#2#3%
+ {\expandafter#1\expandafter#2%
+ \csname.=\xintLength:f:csv {\XINT_expr_unlock#3}\endcsname }%
+\let\XINT_flexpr_func_len \XINT_expr_func_len
+\let\XINT_iiexpr_func_len \XINT_expr_func_len
\def\XINT_expr_func_first #1#2#3%
{\expandafter #1\expandafter #2\csname.=\expandafter\XINT_expr_func_firsta
\romannumeral`&&@\XINT_expr_unlock #3,^\endcsname }%
@@ -2148,11 +2203,9 @@
\let\XINT_iiexpr_func_nuple\XINT_expr_func_nuple
\def\XINT_expr_func_reversed #1#2#3%
{\expandafter #1\expandafter #2\csname .=%
- \xintReverse::csv {\XINT_expr_unlock #3}\endcsname }%
+ \xintReverse:f: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\xintReverse::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`&&@#2#1!}%
@@ -2425,8 +2478,8 @@
\expandafter{\the\toks0\expandafter\def\csname #1:csv\endcsname {~#1:csv}}%
}%
\toks0 \expandafter{\the\toks0
- \def\xintReverse::csv {~xintReverse::csv }%
- \def\xintListSel::csv {~xintListSel::csv }%
+ \def\xintReverse:f:csv {~xintReverse:f:csv }%
+ \def\xintListSel:f:csv {~xintListSel:f:csv }%
}%
\odef\XINT_expr_redefinemacros {\the\toks0}% Not \edef ! (subtle)
\def\XINT_expr_redefineprints