summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/xint/xintfrac.sty
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/generic/xint/xintfrac.sty')
-rw-r--r--Master/texmf-dist/tex/generic/xint/xintfrac.sty228
1 files changed, 150 insertions, 78 deletions
diff --git a/Master/texmf-dist/tex/generic/xint/xintfrac.sty b/Master/texmf-dist/tex/generic/xint/xintfrac.sty
index d5bb34ac647..00de2592152 100644
--- a/Master/texmf-dist/tex/generic/xint/xintfrac.sty
+++ b/Master/texmf-dist/tex/generic/xint/xintfrac.sty
@@ -21,8 +21,8 @@
%% same distribution. (The sources need not necessarily be
%% in the same archive or directory.)
%% ---------------------------------------------------------------
-%% The xint bundle 1.4j 2021/07/13
-%% Copyright (C) 2013-2021 by Jean-Francois Burnol
+%% The xint bundle 1.4k 2022/05/18
+%% Copyright (C) 2013-2022 by Jean-Francois Burnol
%% xintfrac: Expandable operations on fractions
%% ---------------------------------------------------------------
\begingroup\catcode61\catcode48\catcode32=10\relax%
@@ -70,7 +70,7 @@
\XINTsetupcatcodes% defined in xintkernel.sty
\XINT_providespackage
\ProvidesPackage{xintfrac}%
- [2021/07/13 v1.4j Expandable operations on fractions (JFB)]%
+ [2022/05/18 v1.4k Expandable operations on fractions (JFB)]%
\def\XINT_cntSgnFork #1%
{%
\ifcase #1\expandafter\xint_secondofthree
@@ -458,37 +458,6 @@
\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\xintFracToSci #1{\expandafter\XINT_FracToSci\romannumeral`&&@#1/\W[\R}%
-\def\XINT_FracToSci #1/#2#3[#4%
-{%
- \xint_gob_til_W #2\XINT_FracToSci_noslash\W
- \xint_gob_til_R #4\XINT_FracToSci_slash_noN\R
- \XINT_FracToSci_slash_N #1/#2#3[#4%
-}%
-\def\XINT_FracToSci_noslash#1\XINT_FracToSci_slash_N #2[#3%
-{%
- \xint_gob_til_R #3\XINT_FracToSci_noslash_noN\R
- \XINT_FracToSci_noslash_N #2[#3%
-}%
-\def\XINT_FracToSci_noslash_noN\R\XINT_FracToSci_noslash_N #1/\W[\R{#1}%
-\def\XINT_FracToSci_noslash_N #1[#2]/\W[\R%
-{%
- \ifnum#2=\xint_c_ #1\else
- \romannumeral0\expandafter\XINT_pfloat_fork\romannumeral0\xintrez{#1[#2]}%
- \fi
-}%
-\def\XINT_FracToSci_slash_noN\R\XINT_FracToSci_slash_N #1#2/#3/\W[\R%
-{%
- #1\xint_gob_til_zero#1\expandafter\iffalse\xint_gobble_ii0\iftrue
- #2\if\XINT_isOne{#3}1\else/#3\fi\fi
-}%
-\def\XINT_FracToSci_slash_N #1#2/#3[#4]/\W[\R%
-{%
- \ifnum#4=\xint_c_ #1#2\else
- \romannumeral0\expandafter\XINT_pfloat_fork\romannumeral0\xintrez{#1#2[#4]}%
- \fi
- \if\XINT_isOne{#3}1\else\if#10\else/#3\fi\fi
-}%
\def\xintRawWithZeros {\romannumeral0\xintrawwithzeros }%
\def\xintrawwithzeros
{%
@@ -2127,6 +2096,7 @@ on input line \noexpand\the\inputlineno.&&J}}#2%
\mathchardef\XINT_digits=\numexpr#1\relax
\let\XINTdigits=\XINT_digits
}%
+\def\xintFloatZero{0.0e0}% 1.4k breaking change. Replaces hard-coded 0.e0
\def\xintFloat {\romannumeral0\xintfloat }%
\def\xintfloat #1{\XINT_float_chkopt #1\xint:}%
\def\XINT_float_chkopt #1%
@@ -2157,7 +2127,7 @@ on input line \noexpand\the\inputlineno.&&J}}#2%
0-\XINT_float_pos
\krof #1%
}%[
-\def\XINT_float_zero #1]#2.{ 0.e0}%
+\def\XINT_float_zero #1]#2.{\expanded{ \xintFloatZero}}%
\def\XINT_float_neg-{\expandafter-\romannumeral0\XINT_float_pos}%
\def\XINT_float_pos #1#2[#3]#4.%
{%
@@ -2182,18 +2152,6 @@ on input line \noexpand\the\inputlineno.&&J}}#2%
\def\XINT_infloatS_clean #1%
{\if #1!\xint_dothis\XINT_infloatS_clean_a\fi\xint_orthat{ }#1}%
\def\XINT_infloatS_clean_a !#1.{ }%
-\def\XINTFloatiLogTen {\the\numexpr\XINTfloatilogten}%
-\def\XINTfloatilogten [#1]#2%
- {\expandafter\XINT_floatilogten\romannumeral0\XINT_infloat[#1]{#2}#1.}%
-\def\XINTFloatiLogTendigits{\the\numexpr\XINTfloatilogten[\XINTdigits]}%
-\def\XINT_floatilogten #1{%
- \if #10\xint_dothis\XINT_floatilogten_z\fi
- \if #1!\xint_dothis\XINT_floatilogten_a\fi
- \xint_orthat\XINT_floatilogten_b #1%
-}%
-\def\XINT_floatilogten_z 0[0]#1.{-"7FFF8000\relax}%
-\def\XINT_floatilogten_a !#1.#2[#3]#4.{#3-#1+#4-1\relax}%
-\def\XINT_floatilogten_b #1[#2]#3.{#2+#3-1\relax}%
\def\XINT_infloat [#1]#2%
{%
\expandafter\XINT_infloat_a\the\numexpr #1\expandafter.%
@@ -2377,11 +2335,89 @@ on input line \noexpand\the\inputlineno.&&J}}#2%
\expandafter\XINT_infloat_ZZ\the\numexpr#4+\xint_c_i.#3.%
}%
\def\XINT_infloat_ZZ #1.#2.{ 1#2[#1]}%
+\def\XINTFloatiLogTen {\the\numexpr\XINTfloatilogten}%
+\def\XINTfloatilogten [#1]#2%
+ {\expandafter\XINT_floatilogten\romannumeral0\XINT_infloat[#1]{#2}#1.}%
+\def\XINTFloatiLogTendigits{\the\numexpr\XINTfloatilogten[\XINTdigits]}%
+\def\XINT_floatilogten #1{%
+ \if #10\xint_dothis\XINT_floatilogten_z\fi
+ \if #1!\xint_dothis\XINT_floatilogten_a\fi
+ \xint_orthat\XINT_floatilogten_b #1%
+}%
+\def\XINT_floatilogten_z 0[0]#1.{-"7FFF8000\relax}%
+\def\XINT_floatilogten_a !#1.#2[#3]#4.{#3-#1+#4-1\relax}%
+\def\XINT_floatilogten_b #1[#2]#3.{#2+#3-1\relax}%
+\def\xintFloatSciExp {\the\numexpr\xintfloatsciexp }%
+\def\xintpfloatsciexp #1{\XINT_floatsciexp_chkopt #1\xint:}%
+\def\XINT_floatsciexp_chkopt #1%
+{%
+ \ifx [#1\expandafter\XINT_floatsciexp_opt
+ \else\expandafter\XINT_floatsciexp_noopt
+ \fi #1%
+}%
+\def\XINT_floatsciexp_noopt #1\xint:%
+{%
+ \expandafter\XINT_floatsciexp\romannumeral0\XINT_infloat[\XINTdigits]{#1}%
+ \XINTdigits.%
+}%
+\def\XINT_floatsciexp_opt [\xint:#1]#2%
+{%
+ \expandafter\XINT_floatsciexp\romannumeral0\XINT_infloat[#1]{#2}#1.%
+}%
+\def\XINT_floatsciexp #1{%
+ \if #10\xint_dothis\XINT_floatsciexp_z\fi
+ \if #1!\xint_dothis\XINT_floatsciexp_a\fi
+ \xint_orthat\XINT_floatsciexp_b #1%
+}%
+\def\XINT_floatsciexp_z 0[0]#1.{0\relax}%
+\def\XINT_floatsciexp_a !#1.#2[#3]#4.{#3-#1+#4-1\relax}%
+\def\XINT_floatsciexp_b #1[#2]#3.{#2+#3-1\relax}%
+\def\xintFloatSignificand {\romannumeral0\xintfloatsignificand}%
+\def\xintfloatsignificand #1{\XINT_floatsgf_chkopt #1\xint:}%
+\def\XINT_floatsgf_chkopt #1%
+{%
+ \ifx [#1\expandafter\XINT_floatsgf_opt
+ \else\expandafter\XINT_floatsgf_noopt
+ \fi #1%
+}%
+\def\XINT_floatsgf_noopt #1\xint:%
+{%
+ \expandafter\XINT_floatsgf_post
+ \romannumeral0\XINTinfloat[\XINTdigits]{#1}\XINTdigits.%
+}%
+\def\XINT_floatsgf_opt [\xint:#1]%
+{%
+ \expandafter\XINT_floatsgf_opt_a\the\numexpr #1.%
+}%
+\def\XINT_floatsgf_opt_a #1.#2%
+{%
+ \expandafter\XINT_floatsgf_post
+ \romannumeral0\XINTinfloat[#1]{#2}#1.%
+}%
+\def\XINT_floatsgf_post #1%
+{%
+ \xint_UDzerominusfork
+ #1-\XINT_floatsgf_zero
+ 0#1\XINT_floatsgf_neg
+ 0-\XINT_floatsgf_pos
+ \krof #1%
+}%[
+\def\XINT_floatsgf_zero #1]#2.{\XINT_dsx_addzeros{#2};}%
+\def\XINT_floatsgf_neg-{\XINT_floatsgf_pos}%
+\def\XINT_floatsgf_pos #1[#2]#3.{ #1}%
+\def\xintPFloatE{e}%
+\def\xintPFloatNoSciEmax{\xint_c_v}% 1e6 uses sci.not.
+\def\xintPFloatNoSciEmin{-\xint_c_iv}% 1e-5 uses sci.not.
+\def\xintPFloatIntSuffix{}%
+\def\xintPFloatLengthOneSuffix{}%
+\def\xintPFloatZero{0}%
+\def\xintPFloatMinTrimmed{\xint_c_iv}%
\def\xintPFloat {\romannumeral0\xintpfloat }%
\def\xintpfloat #1{\XINT_pfloat_chkopt #1\xint:}%
-\def\xintPFloat_wopt
+\def\xintPFloat_wopt[#1]#2%
{%
- \romannumeral0\expandafter\XINT_pfloat\romannumeral0\XINTinfloatS
+ \romannumeral0\expandafter\XINT_pfloat
+ \romannumeral0\XINTinfloatS[#1]{#2}#1.%
}%
\def\XINT_pfloat_chkopt #1%
{%
@@ -2392,10 +2428,12 @@ on input line \noexpand\the\inputlineno.&&J}}#2%
\def\XINT_pfloat_noopt #1\xint:%
{%
\expandafter\XINT_pfloat\romannumeral0\XINTinfloatS[\XINTdigits]{#1}%
+ \XINTdigits.%
}%
-\def\XINT_pfloat_opt [\xint:#1]%
+\def\XINT_pfloat_opt [\xint:#1]#2%
{%
- \expandafter\XINT_pfloat\romannumeral0\XINTinfloatS[#1]%
+ \expandafter\XINT_pfloat\romannumeral0\XINTinfloatS[#1]{#2}%
+ #1.%
}%
\def\XINT_pfloat#1]%
{%
@@ -2409,13 +2447,41 @@ on input line \noexpand\the\inputlineno.&&J}}#2%
0-\XINT_pfloat_pos
\krof #1%
}%
-\def\XINT_pfloat_zero#1]{ 0.0}%
+\def\XINT_pfloat_zero#1]#2.{\expanded{ \xintPFloatZero}}%
\def\XINT_pfloat_neg-{\expandafter-\romannumeral0\XINT_pfloat_pos}%
-\def\XINT_pfloat_pos#1/1[#2]%
+\def\XINT_pfloat_pos#1/1[#2]#3.%
{%
- \expandafter\XINT_pfloat_a\the\numexpr\xintLength{#1}.%
- #2.#1.%
+ \expandafter\XINT_pfloat_aa\the\numexpr\xintLength{#1}.%
+ #3.#2.#1.%
}%
+\def\XINT_pfloat_keeptrimmed_fork#1%
+{%
+ \xint_UDzerominusfork
+ #1-\XINT_pfloat_keeptrimmed_zero
+ 0#1\XINT_pfloat_keeptrimmed_neg
+ 0-\XINT_pfloat_keeptrimmed_pos
+ \krof #1%
+}%
+\def\XINT_pfloat_keeptrimmed_zero#1]{\expanded{ \xintPFloatZero}}%
+\def\XINT_pfloat_keeptrimmed_neg-{\expandafter-\romannumeral0\XINT_pfloat_keeptrimmed_pos}%
+\def\XINT_pfloat_keeptrimmed_pos#1/1[#2]%
+{%
+ \expandafter\XINT_pfloat_a\the\numexpr\xintLength{#1}.#2.#1.%
+}%
+\def\XINT_pfloat_aa #1.#2.%
+{%
+ \unless\ifnum\xintPFloatMinTrimmed>\numexpr#2-#1\relax
+ \xint_dothis\XINT_pfloat_a\fi
+ \ifnum#2>#1 \xint_dothis{\XINT_pfloat_i #2.}\fi
+ \xint_orthat\XINT_pfloat_a #1.%
+}%
+\def\XINT_pfloat_i #1.#2.#3.#4.%
+{%
+ \expandafter\XINT_pfloat_j
+ \the\numexpr#3+#2-#1\expandafter.%
+ \romannumeral0\XINT_dsx_addzerosnofuss{#1-#2}#4;.#1.%
+}%
+\def\XINT_pfloat_j #1.#2.#3.{\XINT_pfloat_a#3.#1.#2.}%
\def\XINT_pfloat_a #1.#2#3.%
{%
\expandafter\XINT_pfloat_b\the\numexpr#1+#2#3-\xint_c_i.%
@@ -2423,8 +2489,8 @@ on input line \noexpand\the\inputlineno.&&J}}#2%
}%
\def\XINT_pfloat_b #1.#2%
{%
- \ifnum #1>\xint_c_v \xint_dothis\XINT_pfloat_sci\fi
- \ifnum #1<-\xint_c_iv \xint_dothis\XINT_pfloat_sci\fi
+ \ifnum \xintPFloatNoSciEmax<#1 \xint_dothis\XINT_pfloat_sci\fi
+ \ifnum \xintPFloatNoSciEmin>#1 \xint_dothis\XINT_pfloat_sci\fi
\ifnum #1<\xint_c_ \xint_dothis\XINT_pfloat_N\fi
\if-#2\xint_dothis\XINT_pfloat_P\fi
\xint_orthat\XINT_pfloat_Ps
@@ -2436,36 +2502,42 @@ on input line \noexpand\the\inputlineno.&&J}}#2%
\expandafter\XINT_pfloat_sci_a\romannumeral`&&@\xintPFloatE #1.%
}%
\def\XINT_pfloat_sci_a #1.#2#3.{ #2.#3#1}%
-\edef\XINT_pfloat_sci_i #1#2#3.#4.{#1\space#4.0#3}%
-\def\xintPFloatE{e}%
+\def\XINT_pfloat_sci_i #1#2#3.#4.{\expanded{#1 #4\xintPFloatLengthOneSuffix}#3}%
\def\XINT_pfloat_N#1.#2.#3.%
{%
- \csname XINT_pfloat_N_\romannumeral-#1\endcsname #3%
+ \expandafter\XINT_pfloat_N_e\romannumeral\xintreplicate{-#1}{0}#3%
}%
-\def\XINT_pfloat_N_i { 0.}%
-\def\XINT_pfloat_N_ii { 0.0}%
-\def\XINT_pfloat_N_iii{ 0.00}%
-\def\XINT_pfloat_N_iv { 0.000}%
+\def\XINT_pfloat_N_e 0{ 0.}%
\def\XINT_pfloat_P #1.#2.#3.%
{%
- \csname XINT_pfloat_P_\romannumeral#1\endcsname #3%
+ \expandafter\XINT_split_fromleft_a
+ \the\numexpr\xint_c_vii-#1.#3\xint_bye2345678\xint_bye.%
}%
-\def\XINT_pfloat_P_ #1{ #1.}%
-\def\XINT_pfloat_P_i #1#2{ #1#2.}%
-\def\XINT_pfloat_P_ii #1#2#3{ #1#2#3.}%
-\def\XINT_pfloat_P_iii#1#2#3#4{ #1#2#3#4.}%
-\def\XINT_pfloat_P_iv #1#2#3#4#5{ #1#2#3#4#5.}%
-\def\XINT_pfloat_P_v #1#2#3#4#5#6{ #1#2#3#4#5#6.}%
\def\XINT_pfloat_Ps #1.#2.#3.%
{%
- \csname XINT_pfloat_Ps_\romannumeral#1\endcsname #300000.%
+ \expanded{ #3%
+ \romannumeral\xintreplicate{#1+\xint_c_i-#2}{0}\xintPFloatIntSuffix}%
+}%
+\def\xintFloatToDecimal {\romannumeral0\xintfloattodecimal }%
+\def\xintfloattodecimal #1{\XINT_floattodec_chkopt #1\xint:}%
+\def\XINT_floattodec_chkopt #1%
+{%
+ \ifx [#1\expandafter\XINT_floattodec_opt
+ \else\expandafter\XINT_floattodec_noopt
+ \fi #1%
+}%
+\def\XINT_floattodec_noopt #1\xint:%
+{%
+ \expandafter\XINT_floattodec\romannumeral0\XINTinfloatS[\XINTdigits]{#1}%
+}%
+\def\XINT_floattodec_opt [\xint:#1]%
+{%
+ \expandafter\XINT_floattodec\romannumeral0\XINTinfloatS[#1]%
+}%
+\def\XINT_floattodec#1]%
+{%
+ \expandafter\XINT_dectostr\romannumeral0\xintrez{#1]}%
}%
-\def\XINT_pfloat_Ps_ #1#2.{ #1.0}%
-\def\XINT_pfloat_Ps_i #1#2#3.{ #1#2.0}%
-\def\XINT_pfloat_Ps_ii #1#2#3#4.{ #1#2#3.0}%
-\def\XINT_pfloat_Ps_iii#1#2#3#4#5.{ #1#2#3#4.0}%
-\def\XINT_pfloat_Ps_iv #1#2#3#4#5#6.{ #1#2#3#4#5.0}%
-\def\XINT_pfloat_Ps_v #1#2#3#4#5#6#7.{ #1#2#3#4#5#6.0}%
\def\XINTinFloatFrac {\romannumeral0\XINTinfloatfrac}%
\def\XINTinfloatfrac #1%
{%