diff options
author | Karl Berry <karl@freefriends.org> | 2016-03-19 22:13:18 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2016-03-19 22:13:18 +0000 |
commit | ff3c0e83bcf8933daf4eebaf87613022ca946b6a (patch) | |
tree | c004090697462976dff59f90084c8012f970a0c6 /Master/texmf-dist/tex/generic/xint/xintexpr.sty | |
parent | 4f476d8d94c0d15e98b145f8674621c8b309fe39 (diff) |
xint (19mar16)
git-svn-id: svn://tug.org/texlive/trunk@40077 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/generic/xint/xintexpr.sty')
-rw-r--r-- | Master/texmf-dist/tex/generic/xint/xintexpr.sty | 211 |
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 |