diff options
19 files changed, 834 insertions, 821 deletions
diff --git a/Master/texmf-dist/doc/generic/xint/CHANGES.html b/Master/texmf-dist/doc/generic/xint/CHANGES.html index 44d7e3e8594..b2e84391b82 100644 --- a/Master/texmf-dist/doc/generic/xint/CHANGES.html +++ b/Master/texmf-dist/doc/generic/xint/CHANGES.html @@ -4,7 +4,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Style-Type" content="text/css" /> <meta name="generator" content="pandoc" /> - <meta name="author" content="xint 1.3" /> + <meta name="author" content="xint 1.3a" /> <title>CHANGE LOG</title> <style type="text/css">code{white-space: pre;}</style> <style type="text/css"> @@ -17,102 +17,107 @@ <body> <div id="header"> <h1 class="title">CHANGE LOG</h1> -<h2 class="author">xint 1.3</h2> -<h3 class="date">2018/03/01</h3> +<h2 class="author">xint 1.3a</h2> +<h3 class="date">2018/03/07</h3> </div> <div id="TOC"> <ul> -<li><a href="#section"><code>1.3 (2018/03/01)</code></a><ul> +<li><a href="#a-20180307"><code>1.3a (2018/03/07)</code></a><ul> <li><a href="#incompatible-changes">Incompatible changes</a></li> +<li><a href="#bug-fixes">Bug fixes</a></li> <li><a href="#improvements-and-new-features">Improvements and new features</a></li> </ul></li> -<li><a href="#q-20180206"><code>1.2q (2018/02/06)</code></a><ul> +<li><a href="#section"><code>1.3 (2018/03/01)</code></a><ul> +<li><a href="#incompatible-changes-1">Incompatible changes</a></li> <li><a href="#improvements-and-new-features-1">Improvements and new features</a></li> -<li><a href="#bug-fixes">Bug fixes</a></li> </ul></li> -<li><a href="#p-20171205"><code>1.2p (2017/12/05)</code></a><ul> -<li><a href="#incompatible-changes-1">Incompatible changes</a></li> +<li><a href="#q-20180206"><code>1.2q (2018/02/06)</code></a><ul> <li><a href="#improvements-and-new-features-2">Improvements and new features</a></li> <li><a href="#bug-fixes-1">Bug fixes</a></li> </ul></li> -<li><a href="#o-20170829"><code>1.2o (2017/08/29)</code></a><ul> +<li><a href="#p-20171205"><code>1.2p (2017/12/05)</code></a><ul> <li><a href="#incompatible-changes-2">Incompatible changes</a></li> -<li><a href="#deprecated">Deprecated</a></li> +<li><a href="#improvements-and-new-features-3">Improvements and new features</a></li> +<li><a href="#bug-fixes-2">Bug fixes</a></li> </ul></li> -<li><a href="#n-20170806"><code>1.2n (2017/08/06)</code></a><ul> +<li><a href="#o-20170829"><code>1.2o (2017/08/29)</code></a><ul> <li><a href="#incompatible-changes-3">Incompatible changes</a></li> -<li><a href="#improvements-and-new-features-3">Improvements and new features</a></li> +<li><a href="#deprecated">Deprecated</a></li> </ul></li> -<li><a href="#m-20170731"><code>1.2m (2017/07/31)</code></a><ul> +<li><a href="#n-20170806"><code>1.2n (2017/08/06)</code></a><ul> <li><a href="#incompatible-changes-4">Incompatible changes</a></li> <li><a href="#improvements-and-new-features-4">Improvements and new features</a></li> -<li><a href="#bug-fixes-2">Bug fixes</a></li> </ul></li> -<li><a href="#l-20170726"><code>1.2l (2017/07/26)</code></a><ul> -<li><a href="#removed">Removed</a></li> +<li><a href="#m-20170731"><code>1.2m (2017/07/31)</code></a><ul> +<li><a href="#incompatible-changes-5">Incompatible changes</a></li> <li><a href="#improvements-and-new-features-5">Improvements and new features</a></li> <li><a href="#bug-fixes-3">Bug fixes</a></li> </ul></li> -<li><a href="#k-20170106"><code>1.2k (2017/01/06)</code></a><ul> -<li><a href="#incompatible-changes-5">Incompatible changes</a></li> +<li><a href="#l-20170726"><code>1.2l (2017/07/26)</code></a><ul> +<li><a href="#removed">Removed</a></li> <li><a href="#improvements-and-new-features-6">Improvements and new features</a></li> <li><a href="#bug-fixes-4">Bug fixes</a></li> </ul></li> -<li><a href="#j-20161222"><code>1.2j (2016/12/22)</code></a><ul> +<li><a href="#k-20170106"><code>1.2k (2017/01/06)</code></a><ul> +<li><a href="#incompatible-changes-6">Incompatible changes</a></li> <li><a href="#improvements-and-new-features-7">Improvements and new features</a></li> <li><a href="#bug-fixes-5">Bug fixes</a></li> </ul></li> -<li><a href="#i-20161213"><code>1.2i (2016/12/13)</code></a><ul> -<li><a href="#incompatible-changes-6">Incompatible changes</a></li> -<li><a href="#removed-1">Removed</a></li> +<li><a href="#j-20161222"><code>1.2j (2016/12/22)</code></a><ul> <li><a href="#improvements-and-new-features-8">Improvements and new features</a></li> <li><a href="#bug-fixes-6">Bug fixes</a></li> </ul></li> -<li><a href="#h-20161120"><code>1.2h (2016/11/20)</code></a><ul> +<li><a href="#i-20161213"><code>1.2i (2016/12/13)</code></a><ul> +<li><a href="#incompatible-changes-7">Incompatible changes</a></li> +<li><a href="#removed-1">Removed</a></li> <li><a href="#improvements-and-new-features-9">Improvements and new features</a></li> <li><a href="#bug-fixes-7">Bug fixes</a></li> </ul></li> -<li><a href="#g-20160319"><code>1.2g (2016/03/19)</code></a><ul> -<li><a href="#incompatible-changes-7">Incompatible changes</a></li> +<li><a href="#h-20161120"><code>1.2h (2016/11/20)</code></a><ul> <li><a href="#improvements-and-new-features-10">Improvements and new features</a></li> +<li><a href="#bug-fixes-8">Bug fixes</a></li> </ul></li> -<li><a href="#f-20160312"><code>1.2f (2016/03/12)</code></a><ul> +<li><a href="#g-20160319"><code>1.2g (2016/03/19)</code></a><ul> <li><a href="#incompatible-changes-8">Incompatible changes</a></li> <li><a href="#improvements-and-new-features-11">Improvements and new features</a></li> -<li><a href="#bug-fixes-8">Bug fixes</a></li> </ul></li> -<li><a href="#e-20151122"><code>1.2e (2015/11/22)</code></a><ul> +<li><a href="#f-20160312"><code>1.2f (2016/03/12)</code></a><ul> +<li><a href="#incompatible-changes-9">Incompatible changes</a></li> <li><a href="#improvements-and-new-features-12">Improvements and new features</a></li> <li><a href="#bug-fixes-9">Bug fixes</a></li> </ul></li> -<li><a href="#d-20151118"><code>1.2d (2015/11/18)</code></a><ul> +<li><a href="#e-20151122"><code>1.2e (2015/11/22)</code></a><ul> <li><a href="#improvements-and-new-features-13">Improvements and new features</a></li> <li><a href="#bug-fixes-10">Bug fixes</a></li> </ul></li> -<li><a href="#c-20151116"><code>1.2c (2015/11/16)</code></a><ul> +<li><a href="#d-20151118"><code>1.2d (2015/11/18)</code></a><ul> <li><a href="#improvements-and-new-features-14">Improvements and new features</a></li> <li><a href="#bug-fixes-11">Bug fixes</a></li> </ul></li> -<li><a href="#b-20151029"><code>1.2b (2015/10/29)</code></a><ul> +<li><a href="#c-20151116"><code>1.2c (2015/11/16)</code></a><ul> +<li><a href="#improvements-and-new-features-15">Improvements and new features</a></li> <li><a href="#bug-fixes-12">Bug fixes</a></li> </ul></li> -<li><a href="#a-20151019"><code>1.2a (2015/10/19)</code></a><ul> -<li><a href="#improvements-and-new-features-15">Improvements and new features</a></li> +<li><a href="#b-20151029"><code>1.2b (2015/10/29)</code></a><ul> <li><a href="#bug-fixes-13">Bug fixes</a></li> </ul></li> +<li><a href="#a-20151019"><code>1.2a (2015/10/19)</code></a><ul> +<li><a href="#improvements-and-new-features-16">Improvements and new features</a></li> +<li><a href="#bug-fixes-14">Bug fixes</a></li> +</ul></li> <li><a href="#section-1"><code>1.2 (2015/10/10)</code></a><ul> <li><a href="#removed-2">Removed</a></li> -<li><a href="#improvements-and-new-features-16">Improvements and new features</a></li> +<li><a href="#improvements-and-new-features-17">Improvements and new features</a></li> </ul></li> <li><a href="#c-20150912"><code>1.1c (2015/09/12)</code></a></li> <li><a href="#b-20150831"><code>1.1b (2015/08/31)</code></a></li> <li><a href="#a-20141107"><code>1.1a (2014/11/07)</code></a></li> <li><a href="#section-2"><code>1.1 (2014/10/28)</code></a><ul> -<li><a href="#incompatible-changes-9">Incompatible changes</a></li> +<li><a href="#incompatible-changes-10">Incompatible changes</a></li> <li><a href="#removed-3">Removed</a></li> <li><a href="#deprecated-1">Deprecated</a></li> -<li><a href="#improvements-and-new-features-17">Improvements and new features</a></li> -<li><a href="#bug-fixes-14">Bug fixes</a></li> +<li><a href="#improvements-and-new-features-18">Improvements and new features</a></li> +<li><a href="#bug-fixes-15">Bug fixes</a></li> </ul></li> <li><a href="#n-20140401"><code>1.09n (2014/04/01)</code></a></li> <li><a href="#m-20140226"><code>1.09m (2014/02/26)</code></a></li> @@ -140,35 +145,50 @@ <li><a href="#section-9"><code>1.0 (2013/03/28)</code></a></li> </ul> </div> -<pre><code>Source: xint.dtx 1.3 2018/03/01 (doc 2018/03/01) +<pre><code>Source: xint.dtx 1.3a 2018/03/07 (doc 2018/03/07) Author: Jean-Francois Burnol Info: Expandable operations on big integers, decimals, fractions License: LPPL 1.3c</code></pre> -<h2 id="section"><code>1.3 (2018/03/01)</code></h2> +<h2 id="a-20180307"><code>1.3a (2018/03/07)</code></h2> <h3 id="incompatible-changes">Incompatible changes</h3> <ul> +<li><strong>xintcore</strong>, <strong>xint</strong>, <strong>xintfrac</strong>: removal of the internal macros which were used at <code>1.2o</code> to add a deprecation mechanism; all deprecated macros have been removed at <code>1.3</code> so there was no reason to keep the code used for deprecating them.</li> +</ul> +<h3 id="bug-fixes">Bug fixes</h3> +<ul> +<li><strong>xintexpr</strong>: the mechanism for adjunction to the expression parsers of user defined functions was refactored and improved at previous release <code>1.3</code>: in particular recursive definitions became possible. But an oversight made these recursive functions quite inefficient (to remain polite.) This release fixes the problem.</li> +</ul> +<h3 id="improvements-and-new-features">Improvements and new features</h3> +<ul> +<li><p><strong>xintexpr</strong>: new conditionals <code>ifone()</code> and <code>ifint()</code>.</p></li> +<li><p><strong>xintfrac</strong>: <code>\xintREZ</code> is faster on inputs having one hundred digits or more.</p></li> +<li><p>Added to the user manual mention of macros such as <code>\xintDivFloor</code>, <code>\xintMod</code>, <code>\xintModTrunc</code>, which had been left out so far.</p></li> +</ul> +<h2 id="section"><code>1.3 (2018/03/01)</code></h2> +<h3 id="incompatible-changes-1">Incompatible changes</h3> +<ul> <li><p><strong>xintcore</strong>, <strong>xint</strong>, <strong>xintfrac</strong>: all macros deprecated at <code>1.2o</code> got removed.</p></li> -<li><p><strong>xintfrac</strong>: addition and subtraction of <code>a/b</code> and <code>c/d</code> now use the l.c.m. of the denominators. Similarly the macro supporting the modulo operator <code>/:</code> uses a l.c.m for the denominator of the result.</p></li> -<li><p><strong>xintexpr</strong>: the addition, subtraction, modulo <code>/:</code>, and the <code>mod()</code>and <code>divmod()</code> functions produce generally smaller denominators (see previous item).</p></li> +<li><p><strong>xintfrac</strong>: addition and subtraction of <code>a/b</code> and <code>c/d</code> now use the l.c.m. of the denominators. Similarly the macro supporting the modulo operator <code>/:</code> uses a l.c.m. for the denominator of the result.</p></li> +<li><p><strong>xintexpr</strong>: the addition, subtraction, modulo <code>/:</code>, and the <code>mod()</code> and <code>divmod()</code> functions produce generally smaller denominators (see previous item).</p></li> <li><p><strong>xintexpr</strong>: formerly, the internal macros which are internally associated to user-declared functions were using comma separated parameter texts. They now do not use such commas (their meanings, which may again change in future, are written for information to the log under <code>\xintverbosetrue</code>).</p></li> </ul> -<h3 id="improvements-and-new-features">Improvements and new features</h3> +<h3 id="improvements-and-new-features-1">Improvements and new features</h3> <ul> <li><p><strong>xintexpr</strong>: user-defined functions may now be of a recursive nature. This was made possible by a refactoring of the <code>\xintNewExpr</code> mechanism. It became both leaner and more extensive than formerly.</p></li> <li><p><strong>xintfrac</strong>: new macros <code>\xintPIrr</code> and <code>\xintDecToString</code>. The latter is a backport of a <code>polexpr 0.4</code> utility, and it is to be considered unstable.</p></li> <li><p><strong>xintexpr</strong>: new function <code>preduce()</code> associated with <code>\xintPIrr</code>.</p></li> </ul> <h2 id="q-20180206"><code>1.2q (2018/02/06)</code></h2> -<h3 id="improvements-and-new-features-1">Improvements and new features</h3> +<h3 id="improvements-and-new-features-2">Improvements and new features</h3> <ul> <li><strong>xintexpr</strong>: tacit multiplication extended to cases such as <code>3!4!5!</code> or <code>(1+2)3</code>.</li> </ul> -<h3 id="bug-fixes">Bug fixes</h3> +<h3 id="bug-fixes-1">Bug fixes</h3> <ul> <li><strong>xintcore</strong>: sadly, refactoring at <code>1.2l</code> of subtraction left an extra character in an inner macro causing breakage in some rare circumstances. This should not have escaped our test suite!</li> </ul> <h2 id="p-20171205"><code>1.2p (2017/12/05)</code></h2> -<h3 id="incompatible-changes-1">Incompatible changes</h3> +<h3 id="incompatible-changes-2">Incompatible changes</h3> <ul> <li><p><strong>xintgcd</strong>: <code>\xintBezout{a}{b}</code>'s output consists of <code>{u}{v}{d}</code> with <code>u*a+v*b==d</code>, with <code>d</code> the GCD. Formerly it was <code>{a}{b}{u}{v}{d}</code>, and with <code>u*a-v*b==d</code>.</p></li> <li><p><strong>xintgcd</strong>: <code>\xintBezout{0}{0}</code> expands to <code>{0}{0}{0}</code>. Formerly (since <code>1.2l</code>) it raised <code>InvalidOperation</code>.</p></li> @@ -176,13 +196,13 @@ License: LPPL 1.3c</code></pre> <li><p><strong>xintfrac</strong>: <code>\xintMod</code> is now associated with floored division. The former meaning is available as <code>\xintModTrunc</code>.</p></li> <li><p><strong>xintexpr</strong>: the <code>//</code> operator and its associated modulo <code>'mod'</code> (or <code>/:</code>) now correspond to floored division, like the Python language <code>//</code>, <code>%</code>, and <code>divmod(x, y)</code>. Formerly they had been associated to truncated division. This is breaking change for operands of opposite signs.</p></li> </ul> -<h3 id="improvements-and-new-features-2">Improvements and new features</h3> +<h3 id="improvements-and-new-features-3">Improvements and new features</h3> <ul> <li><p><strong>xinttools</strong>: <code>\xintListWithSep</code>, which had remained unchanged since its introduction at <code>1.04 (2013/04/25)</code>, was rewritten for increased speed.</p></li> <li><p><strong>xintexpr</strong>: <code>\xintdefvar</code>'s syntax is extended to allow simultaneous assignments. Examples: <code>\xintdefvar x1, x2, x3 := 1, 3**10, 3**20;</code> or <code>\xintdefiivar A, B := B, A 'mod' B;</code> for already defined variables <code>A</code> and <code>B</code>.</p></li> <li><p><strong>xintexpr</strong>: added <code>divmod()</code> to the built-in functions. It is associated with floored division, like the Python language <code>divmod()</code>. Related support macros added to <strong>xintcore</strong>, and <strong>xintfrac</strong>.</p></li> </ul> -<h3 id="bug-fixes-1">Bug fixes</h3> +<h3 id="bug-fixes-2">Bug fixes</h3> <ul> <li><p><strong>xintgcd</strong>: <code>\xintBezout{6}{3}</code> (for example) expanded to <code>{6}{3}{-0}{-1}{3}</code>, but the <code>-0</code> should have been <code>0</code>.</p></li> <li><p><strong>xintgcd</strong>: it still used macro <code>\xintiAbs</code> although the latter had been deprecated from <strong>xintcore</strong>.</p></li> @@ -190,7 +210,7 @@ License: LPPL 1.3c</code></pre> <li><p>various documentation fixes; in particular, the partial dependency of <strong>xintcfrac</strong> on <strong>xinttools</strong> had not been mentioned.</p></li> </ul> <h2 id="o-20170829"><code>1.2o (2017/08/29)</code></h2> -<h3 id="incompatible-changes-2">Incompatible changes</h3> +<h3 id="incompatible-changes-3">Incompatible changes</h3> <ul> <li><strong>xint</strong>: <code>\xintAND</code>, <code>\xintOR</code>, ... and similar Boolean logic macros do not apply anymore <code>\xintNum</code> (or <code>\xintRaw</code> if <strong>xintfrac</strong> is loaded), to their arguments (often, from internal usage of <code>\xintSgn</code>), but only f-expand them (using e.g. <code>\xintiiSgn</code>). This is kept un-modified even if loading <strong>xintfrac</strong>.</li> </ul> @@ -206,26 +226,26 @@ License: LPPL 1.3c</code></pre> <li><p><strong>xint</strong>: <code>\xintNot</code> was renamed to <code>\xintNOT</code>, former denomination is deprecated. See also item about Boolean logic macros in the <em>Incompatible Changes</em> section.</p></li> </ul> <h2 id="n-20170806"><code>1.2n (2017/08/06)</code></h2> -<h3 id="incompatible-changes-3">Incompatible changes</h3> +<h3 id="incompatible-changes-4">Incompatible changes</h3> <ul> <li><strong>xintbinhex</strong> does not load package <strong>xintcore</strong> anymore, but only <strong>xintkernel</strong>.</li> </ul> -<h3 id="improvements-and-new-features-3">Improvements and new features</h3> +<h3 id="improvements-and-new-features-4">Improvements and new features</h3> <ul> <li><p><strong>xintbinhex</strong> has only <strong>xintkernel</strong> as dependency.</p></li> <li><p>Macros of <strong>xintbinhex</strong> have been improved for speed and increased maximal sizes of allowable inputs.</p></li> </ul> <h2 id="m-20170731"><code>1.2m (2017/07/31)</code></h2> -<h3 id="incompatible-changes-4">Incompatible changes</h3> +<h3 id="incompatible-changes-5">Incompatible changes</h3> <ul> <li><p><strong>xintbinhex</strong>: the length of the input is now limited. The maximum size depends on the macro and ranges from about <code>4000</code> to about <code>19900</code> digits.</p></li> <li><p><strong>xintbinhex</strong>: <code>\xintCHexToBin</code> is now the variant of <code>\xintHexToBin</code> which does not remove leading binary zeroes: <code>N</code> hex-digits give on output exactly <code>4N</code> binary digits.</p></li> </ul> -<h3 id="improvements-and-new-features-4">Improvements and new features</h3> +<h3 id="improvements-and-new-features-5">Improvements and new features</h3> <ul> <li><strong>xintbinhex</strong>: all macros have been rewritten using techniques from the 1.2 release (they had remained unmodified since <code>1.08</code> of <code>2013/06/07</code>.) The new macros are faster but limited to a few thousand digits. The <code>1.08</code> routines could handle tens of thousands of digits, but not in a reasonable time.</li> </ul> -<h3 id="bug-fixes-2">Bug fixes</h3> +<h3 id="bug-fixes-3">Bug fixes</h3> <ul> <li><p>user manual: the <code>Changes</code> section wrongly stated at <code>1.2l</code> that the macros of <strong>xintbinhex</strong> had been made robust against non terminated input such as <code>\number\mathcode`\-</code>. Unfortunately the author fell into the trap of believing his own documentation and he forgot to actually implement the change. Now done.</p></li> <li><p>user manual: the PDF bookmarks were messed up.</p></li> @@ -237,7 +257,7 @@ License: LPPL 1.3c</code></pre> <li><p><code>\xintiiSumExpr</code>, <code>\xintiiPrdExpr</code> (<strong>xint</strong>) and <code>\xintSumExpr</code>, <code>\xintPrdExpr</code> (<strong>xintfrac</strong>). They had not been formally deprecated, but had been left un-documented since <code>1.09d (2013/10/22)</code>.</p></li> <li><p>internal macro <code>\xint_gob_til_xint_relax</code> removed.</p></li> </ul> -<h3 id="improvements-and-new-features-5">Improvements and new features</h3> +<h3 id="improvements-and-new-features-6">Improvements and new features</h3> <ul> <li><p>the underscore character <code>_</code> is accepted by the <strong>xintexpr</strong> parsers as a digit separator (the space character already could be used for improved readability of big numbers). It is not allowed as <em>first</em> character of a number, as it would then be mis-interpreted as the start of a possible variable name.</p></li> <li><p>some refactoring in <strong>xintcore</strong> auxiliary routines and in <code>\xintiiSub</code> and <code>\xintiiCmp</code> for some small efficiency gains.</p></li> @@ -246,33 +266,33 @@ License: LPPL 1.3c</code></pre> <p>The situation with expressions is unchanged: syntax such as <code>\xintexpr \numexpr1+2\relax</code> is illegal as the ending <code>\relax</code> token will get swallowed by the <code>\numexpr</code>; but it is needed by the <code>xintexpr</code>-ession parser, hence the parser will expand forward and presumably end with in an "illegal token" error, or provoke some low-level TeX error (N.B.: a closing brace <code>}</code> for example can not terminate an <code>xintexpr</code>-ession, the parser must find a <code>\relax</code> token at some point). Thus there must be in this example a second <code>\relax</code>.</p></li> <li><p>experimental code for error conditions; there is no complete user interface yet, it is done in preparation for next major release and is completely unstable and undocumented.</p></li> </ul> -<h3 id="bug-fixes-3">Bug fixes</h3> +<h3 id="bug-fixes-4">Bug fixes</h3> <ul> <li><p><strong>xintbinhex</strong>: since <code>1.2 (2015/10/10)</code>, <code>\xintHexToDec</code> was broken due to an undefined macro (it was in <code>xint.sty</code>, but the module by itself is supposedly dependent only upon <code>xintcore.sty</code>).</p></li> <li><p><strong>xintgcd</strong>: macro <code>\xintBezout</code> produced partially wrong output if one of its two arguments was zero.</p></li> <li><p><strong>xintfrac</strong>: the manual said one could use directly <code>\numexpr</code> compatible expressions in arithmetic macros (without even a <code>\numexpr</code> encapsulation) if they were expressed with up to 8 tokens. There was a bug if these 8 tokens evaluated to zero. The bug has been fixed, and up to 9 tokens are now accepted. But it is simpler to use <code>\the\numexpr</code> prefix and not to worry about the token count... The ending <code>\relax</code> is now un-needed.</p></li> </ul> <h2 id="k-20170106"><code>1.2k (2017/01/06)</code></h2> -<h3 id="incompatible-changes-5">Incompatible changes</h3> +<h3 id="incompatible-changes-6">Incompatible changes</h3> <ul> <li><p>macro <code>\xintFloat</code> which rounds its input to a floating point number does <em>not</em> print anymore <code>10.0...0eN</code> to signal an upwards rounding to the next power of ten. The mantissa has in all cases except the zero input exactly one digit before the decimal mark.</p></li> <li><p>some floating point computations may differ in the least significant digits, due to a change in the rounding algorithm applied to macro arguments expressed as fractions and to an improvement in precision regarding half-integer powers in expressions. See next.</p></li> </ul> -<h3 id="improvements-and-new-features-6">Improvements and new features</h3> +<h3 id="improvements-and-new-features-7">Improvements and new features</h3> <ul> <li><p>the initial rounding to the target precision <code>P</code> which is applied by the floating point macros from <strong>xintfrac</strong> to their arguments achieves the <em>exact (aka correct) rounding</em> even for inputs which are fractions with more than <code>P+2</code> digits in their numerators and denominators (<code>>1</code>.) Hence the computed values depend only on the arguments as rational numbers and not upon their representatives. This is not relevant to <em>expressions</em> (<strong>xintexpr</strong>), because the <code>\xintfloatexpr</code> parser sees there <code>/</code> as an operator and does not (apart from special constructs) get to manipulate fractions as such.</p></li> <li><p><code>\xintnewdummy</code> is public interface to a <code>1.2e</code> macro which serves to declare any given catcode 11 character as a dummy variable for expressions (<strong>xintexpr</strong>). This is useful for Unicode engines (the Latin letters being already all pre-declared as dummy variables.)</p></li> <li><p>added <code>\xintiSqrtR</code>, there was only <code>\xintiiSqrtR</code> alongside <code>\xintiSqrt</code> and <code>\xintiiSqrt</code> (<strong>xint</strong>).</p></li> <li><p>added non public <code>\xintLastItem:f:csv</code> to <strong>xinttools</strong> for faster <code>last()</code> function, and improved <code>\xintNewExpr</code> compatibility. Also <code>\xintFirstItem:f:csv</code>.</p></li> </ul> -<h3 id="bug-fixes-4">Bug fixes</h3> +<h3 id="bug-fixes-5">Bug fixes</h3> <ul> <li><p>the <code>1.2f</code> half-integer powers computed within <code>\xintfloatexpr</code> had a silly rounding to the target precision just <em>before</em> the final square-root extraction, thus possibly losing some precision. The <code>1.2k</code> implementation keeps guard digits for this final square root extraction. As for integer exponents, it is guaranteed that the computed value differs from the exact one by less than <code>0.52 ulp</code> (for inputs having at most <code>\xinttheDigits</code> digits.)</p></li> <li><p>more regressions from <code>1.2i</code> were fixed: <code>\xintLen</code> (<strong>xint</strong>, <strong>xintfrac</strong>) and <code>\xintDouble</code> (<strong>xintcore</strong>) had forgotten that their argument was allowed to be negative. A regression test suite is now in place and is being slowly expanded to cover more macros.</p></li> <li><p><code>\xintiiSquareRoot{0}</code> now produces <code>{1}{1}</code>, which fits better the general documented behaviour of this macro than <code>11</code>.</p></li> </ul> <h2 id="j-20161222"><code>1.2j (2016/12/22)</code></h2> -<h3 id="improvements-and-new-features-7">Improvements and new features</h3> +<h3 id="improvements-and-new-features-8">Improvements and new features</h3> <ul> <li><p><strong>xinttools</strong> and <strong>xintexpr</strong>:</p> <ol style="list-style-type: decimal"> @@ -281,12 +301,12 @@ License: LPPL 1.3c</code></pre> </ol></li> <li><p>significant documentations tweaks (inclusive of suppressing things!), and among them two beautiful hyperlinked tables with both horizontal and vertical rules which bring the documentation of the <strong>xintexpr</strong> syntax to a kind of awe-inspiring perfection... except that implementation of some math functions is still lacking.</p></li> </ul> -<h3 id="bug-fixes-5">Bug fixes</h3> +<h3 id="bug-fixes-6">Bug fixes</h3> <ul> <li>fix two <code>1.2i</code> regressions caused by undefined macros (<code>\xintNthElt</code> in certain branches and <code>[list][N]</code> item extraction in certain cases.) The test files existed but were not executed prior to release. Automation in progress.</li> </ul> <h2 id="i-20161213"><code>1.2i (2016/12/13)</code></h2> -<h3 id="incompatible-changes-6">Incompatible changes</h3> +<h3 id="incompatible-changes-7">Incompatible changes</h3> <ul> <li><code>\xintDecSplit</code> second argument must have no sign (former code replaced it with its absolute value, a sign now may cause an error.)</li> </ul> @@ -294,7 +314,7 @@ License: LPPL 1.3c</code></pre> <ul> <li>deprecated macros <code>\xintifTrue</code>, <code>\xintifTrueFalse</code>, <code>\xintQuo</code>, <code>\xintRem</code>, <code>\xintquo</code>, <code>\xintrem</code>.</li> </ul> -<h3 id="improvements-and-new-features-8">Improvements and new features</h3> +<h3 id="improvements-and-new-features-9">Improvements and new features</h3> <ul> <li><p><strong>xintkernel</strong>: <code>\xintLength</code> is faster. New macros:</p> <ul> @@ -313,17 +333,17 @@ License: LPPL 1.3c</code></pre> <li><p>the documentation has again been (slightly) re-organized; it has a new sub-section on the Miller-Rabin primality test, to illustrate some use of <code>\xintNewFunction</code> for recursive definitions.</p></li> <li><p>the documentation has dropped the LaTeX "command" terminology (which had been used initially in 2013 for some forgotten reasons and should have been removed long ago) and uses only the more apt "macro", as after all, all of <strong>xint</strong> is about expansion of macros (plus the use of <code>\numexpr</code>).</p></li> </ul> -<h3 id="bug-fixes-6">Bug fixes</h3> +<h3 id="bug-fixes-7">Bug fixes</h3> <ul> <li><code>\xintDecSplitL</code> and <code>\xintDecSplitR</code> from <strong>xint</strong> produced their output in a spurious brace pair (bug introduced in <code>1.2f</code>).</li> </ul> <h2 id="h-20161120"><code>1.2h (2016/11/20)</code></h2> -<h3 id="improvements-and-new-features-9">Improvements and new features</h3> +<h3 id="improvements-and-new-features-10">Improvements and new features</h3> <ul> <li><p>new macro <code>\xintNewFunction</code> in <strong>xintexpr</strong> which allows to extend the parser syntax with functions in situations where <code>\xintdeffunc</code> is not usable (typically, because dummy variables are used over a not yet determined range of values because it depends on the variables).</p></li> <li><p>after three years of strict obedience to <code>xint</code> prefix, now <code>\thexintexpr</code>, <code>\thexintiexpr</code>, <code>\thexintfloatexpr</code>, and <code>\thexintiiexpr</code> are provided as synonyms to <code>\xinttheexpr</code>, etc...</p></li> </ul> -<h3 id="bug-fixes-7">Bug fixes</h3> +<h3 id="bug-fixes-8">Bug fixes</h3> <ul> <li><p>the <code>(cond)?{foo}{bar}</code> operator from <strong>xintexpr</strong> mis-behaved in certain circumstances (such as an empty <code>foo</code>).</p></li> <li><p>the <strong>xintexpr</strong> <code>1.2f</code> <code>binomial</code> function (which uses <code>\xintiiBinomial</code> from <strong>xint.sty</strong> or <code>\xintFloatBinomial</code> from <strong>xintfrac.sty</strong>) deliberately raised an error for <code>binomial(x,y)</code> with <code>y<0</code> or <code>x<y</code>. This was unfortunate, and it now simply evaluates to zero in such cases.</p></li> @@ -331,12 +351,12 @@ License: LPPL 1.3c</code></pre> <li><p>the <code>add</code> and <code>mul</code> from <strong>xintexpr</strong>, which work with dummy variables since <code>1.1</code>, raised an error since <code>1.2c 2015/11/16</code> when the dummy variable was given an empty range (or list) of values, rather than producing respectively <code>0</code> and <code>1</code> as formerly.</p></li> </ul> <h2 id="g-20160319"><code>1.2g (2016/03/19)</code></h2> -<h3 id="incompatible-changes-7">Incompatible changes</h3> +<h3 id="incompatible-changes-8">Incompatible changes</h3> <ul> <li><p>inside expressions, list item selector <code>[L][n]</code> counts starting at zero, not at one. This is more coherent with <code>[L][a:b]</code> which was already exactly like in Python since its introduction. A function len(L) replaces earlier <code>[L][0]</code>.</p></li> <li><p>former <code>iter</code> keyword now called <code>iterr</code>. Indeed it matched with <code>rrseq</code>, the new <code>iter</code> (which was somehow missing from <code>1.1</code>) is the one matching <code>rseq</code>. Allows to iterate more easily with a "list" variable.</p></li> </ul> -<h3 id="improvements-and-new-features-10">Improvements and new features</h3> +<h3 id="improvements-and-new-features-11">Improvements and new features</h3> <ul> <li><p>in <strong>xintexpr.sty</strong>: list selectors <code>[L][n]</code> and <code>[L][a:b]</code> are more efficient: the earlier <code>1.1</code> routines did back and forth conversions from comma separated values to braced tokens, the <code>1.2g</code> routines use macros from <strong>xinttools.sty</strong> handling directly the encountered lists of comma separated values.</p></li> <li><p>in <strong>xinttools.sty</strong>: slight improvements in the efficiency of the <code>\xintNthElt</code>, <code>\xintKeep</code>, <code>\xintTrim</code> routines and new routines handling directly comma separated values. The latter are not included in the user manual (they are not <code>\long</code>, they don't make efforts to preserve some braces, do not worry about spaces, all those worries being irrelevant to the use in expressions for list selectors).</p></li> @@ -345,11 +365,11 @@ License: LPPL 1.3c</code></pre> <li><p>the syntax of expressions is described in a devoted chapter of the documentation; an example shows how to implement (expandably) the Brent-Salamin algorithm for computation of Pi using <code>iter</code> in a float expression.</p></li> </ul> <h2 id="f-20160312"><code>1.2f (2016/03/12)</code></h2> -<h3 id="incompatible-changes-8">Incompatible changes</h3> +<h3 id="incompatible-changes-9">Incompatible changes</h3> <ul> <li>no more <code>\xintFac</code> macro but <code>\xintiFac/\xintiiFac/\xintFloatFac</code>.</li> </ul> -<h3 id="improvements-and-new-features-11">Improvements and new features</h3> +<h3 id="improvements-and-new-features-12">Improvements and new features</h3> <ul> <li><p>functions <code>binomial</code>, <code>pfactorial</code> and <code>factorial</code> in both integer and float versions.</p></li> <li><p>macros <code>\xintiiBinomial</code>, <code>\xintiiPFactorial</code> (<strong>xint.sty</strong>) and <code>\xintFloatBinomial</code>, <code>\xintFloatPFactorial</code> (<strong>xintfrac.sty</strong>). Improvements to <code>\xintFloatFac</code>.</p></li> @@ -363,60 +383,60 @@ License: LPPL 1.3c</code></pre> <li><p>(TeXperts only) the macros defined (internally) from <code>\xintdeffunc</code> et al. constructs do not incorporate an initial <code>\romannumeral</code> anymore.</p></li> <li><p>renewed desperate efforts at improving the documentation by random shuffling of sections and well thought additions; cuts were considered and even performed.</p></li> </ul> -<h3 id="bug-fixes-8">Bug fixes</h3> +<h3 id="bug-fixes-9">Bug fixes</h3> <ul> <li><p>squaring macro <code>\xintSqr</code> from <strong>xintfrac.sty</strong> was broken due to a misspelled sub-macro name. Dates back to <code>1.1</code> release of <code>2014/10/28</code> <code>:-((</code>.</p></li> <li><p><code>1.2c</code>'s fix to the subtraction bug from <code>1.2</code> introduced another bug, which in some cases could create leading zeroes in the output, or even worse. This could invalidate other routines using subtractions, like <code>\xintiiSquareRoot</code>.</p></li> <li><p>the comparison operators were not recognized by <code>\xintNewIIExpr</code> and <code>\xintdefiifunc</code> constructs.</p></li> </ul> <h2 id="e-20151122"><code>1.2e (2015/11/22)</code></h2> -<h3 id="improvements-and-new-features-12">Improvements and new features</h3> +<h3 id="improvements-and-new-features-13">Improvements and new features</h3> <ul> <li><p>macro <code>\xintunassignvar</code>.</p></li> <li><p>slight modifications of the logged messages in case of <code>\xintverbosetrue</code>.</p></li> <li><p>a space in <code>\xintdeffunc f(x)<space>:= expression ;</code> is now accepted.</p></li> <li><p>documentation enhancements: the <em>Quick Sort</em> section with its included code samples has been entirely re-written; the <em>Commands of the xintexpr package</em> section has been extended and reviewed entirely.</p></li> </ul> -<h3 id="bug-fixes-9">Bug fixes</h3> +<h3 id="bug-fixes-10">Bug fixes</h3> <ul> <li><p>in <strong>xintfrac</strong>: the <code>\xintFloatFac</code> from release <code>1.2</code> parsed its argument only through <code>\numexpr</code> but it should have used <code>\xintNum</code>.</p></li> <li><p>in <strong>xintexpr</strong>: release <code>1.2d</code> had broken the recognition of sub-expressions immediately after variable names (with tacit multiplication).</p></li> <li><p>in <strong>xintexpr</strong>: contrarily to what <code>1.2d</code> documentation said, tacit multiplication was not yet always done with enhanced precedence. Now yes.</p></li> </ul> <h2 id="d-20151118"><code>1.2d (2015/11/18)</code></h2> -<h3 id="improvements-and-new-features-13">Improvements and new features</h3> +<h3 id="improvements-and-new-features-14">Improvements and new features</h3> <ul> <li><p>the function definitions done by <code>\xintdeffunc</code> et al., as well as the macro declarations by <code>\xintNewExpr</code> et al. now have only local scope.</p></li> <li><p>tacit multiplication applies to more cases, for example (x+y)z, and always ties more than standard * infix operator, e.g. x/2y is like x/(2*y).</p></li> <li><p>some documentation enhancements, particularly in the chapter on xintexpr.sty, and also in the code source comments.</p></li> </ul> -<h3 id="bug-fixes-10">Bug fixes</h3> +<h3 id="bug-fixes-11">Bug fixes</h3> <ul> <li>in <strong>xintcore</strong>: release <code>1.2c</code> had inadvertently broken the <code>\xintiiDivRound</code> macro.</li> </ul> <h2 id="c-20151116"><code>1.2c (2015/11/16)</code></h2> -<h3 id="improvements-and-new-features-14">Improvements and new features</h3> +<h3 id="improvements-and-new-features-15">Improvements and new features</h3> <ul> <li><p>macros <code>\xintdeffunc</code>, <code>\xintdefiifunc</code>, <code>\xintdeffloatfunc</code> and boolean <code>\ifxintverbose</code>.</p></li> <li><p>on-going code improvements and documentation enhancements, but stopped in order to issue this bugfix release.</p></li> </ul> -<h3 id="bug-fixes-11">Bug fixes</h3> +<h3 id="bug-fixes-12">Bug fixes</h3> <ul> <li>in <strong>xintcore</strong>: recent release <code>1.2</code> introduced a bug in the subtraction (happened when 00000001 was found under certain circumstances at certain mod 8 locations).</li> </ul> <h2 id="b-20151029"><code>1.2b (2015/10/29)</code></h2> -<h3 id="bug-fixes-12">Bug fixes</h3> +<h3 id="bug-fixes-13">Bug fixes</h3> <ul> <li>in <strong>xintcore</strong>: recent release <code>1.2</code> introduced a bug in the division macros, causing a crash when the divisor started with 99999999 (it was attempted to use with 1+99999999 a subroutine expecting only 8-digits numbers).</li> </ul> <h2 id="a-20151019"><code>1.2a (2015/10/19)</code></h2> -<h3 id="improvements-and-new-features-15">Improvements and new features</h3> +<h3 id="improvements-and-new-features-16">Improvements and new features</h3> <ul> <li><p>added <code>\xintKeepUnbraced</code>, <code>\xintTrimUnbraced</code> (<strong>xinttools</strong>) and fixed documentation of <code>\xintKeep</code> and <code>\xintTrim</code> regarding brace stripping.</p></li> <li><p>added <code>\xintiiMaxof/\xintiiMinof</code> (<strong>xint</strong>).</p></li> <li><p>TeX hackers only: replaced all code uses of <code>\romannumeral-`0</code> by the quicker <code>\romannumeral`&&@</code> (<code>^</code> being used as letter, had to find another character usable with catcode 7).</p></li> </ul> -<h3 id="bug-fixes-13">Bug fixes</h3> +<h3 id="bug-fixes-14">Bug fixes</h3> <ul> <li>in <strong>xintexpr</strong>: recent release <code>1.2</code> introduced a bad bug in the parsing of decimal numbers and as a result <code>\xinttheexpr 0.01\relax</code> expanded to <code>0</code> ! (sigh...)</li> </ul> @@ -425,7 +445,7 @@ License: LPPL 1.3c</code></pre> <ul> <li>the macros <code>\xintAdd</code>, <code>\xintSub</code>, <code>\xintMul</code>, <code>\xintMax</code>, <code>\xintMin</code>, <code>\xintMaxof</code>, <code>\xintMinof</code> are removed from package <strong>xint</strong>, and only exist in the versions from <strong>xintfrac</strong>. With only <strong>xintcore</strong> or <strong>xint</strong> loaded, one <em>must</em> use <code>\xintiiAdd</code>, <code>\xintiiSub</code>, ..., or <code>\xintiAdd</code>, <code>\xintiSub</code>, etc...</li> </ul> -<h3 id="improvements-and-new-features-16">Improvements and new features</h3> +<h3 id="improvements-and-new-features-17">Improvements and new features</h3> <ul> <li><p>the basic arithmetic implemented in <strong>xintcore</strong> has been entirely rewritten. The mathematics remains the elementary school one, but the <code>TeX</code> implementation achieves higher speed (except, regarding addition/subtraction, for numbers up to about thirty digits), the gains becoming quite significant for numbers with hundreds of digits.</p></li> <li><p>the inputs must have less than 19959 digits. But computations with thousands of digits take time.</p></li> @@ -459,7 +479,7 @@ License: LPPL 1.3c</code></pre> <li><p>various typographical fixes throughout the documentation, and a bit of clean up of the code comments. Improved <code>\Factors</code> example of nested <code>subs</code>, <code>rseq</code>, <code>iter</code> in <code>\xintiiexpr</code>.</p></li> </ul> <h2 id="section-2"><code>1.1 (2014/10/28)</code></h2> -<h3 id="incompatible-changes-9">Incompatible changes</h3> +<h3 id="incompatible-changes-10">Incompatible changes</h3> <ul> <li><p>in <code>\xintiiexpr</code>, <code>/</code> does <em>rounded</em> division, rather than the Euclidean division (for positive arguments, this is truncated division). The <code>//</code> operator does truncated division,</p></li> <li><p>the <code>:</code> operator for three-way branching is gone, replaced with <code>??</code>,</p></li> @@ -479,7 +499,7 @@ License: LPPL 1.3c</code></pre> <li><p><code>\xintMax</code>, <code>\xintMin</code>, <code>\xintAdd</code>, <code>\xintSub</code>, <code>\xintMul</code> (<strong>xint</strong>): their usage without <strong>xintfrac</strong> is deprecated; use <code>\xintiMax</code>, <code>\xintiMin</code>, <code>\xintiAdd</code>, <code>\xintiSub</code>, <code>\xintiMul</code>.</p></li> <li><p>the <code>&</code> and <code>|</code> as Boolean operators in <code>xintexpr</code>-essions are deprecated in favour of <code>&&</code> and <code>||</code>. The single letter operators might be assigned some other meaning in some later release (bitwise operations, perhaps). Do not use them.</p></li> </ul> -<h3 id="improvements-and-new-features-17">Improvements and new features</h3> +<h3 id="improvements-and-new-features-18">Improvements and new features</h3> <ul> <li><p>new package <strong>xintcore</strong> has been split off <strong>xint</strong>. It contains the core arithmetic macros (it is loaded by LaTeX package <strong>bnumexpr</strong>),</p></li> <li><p>neither <strong>xint</strong> nor <strong>xintfrac</strong> load <strong>xinttools</strong>. Only <strong>xintexpr</strong> does,</p></li> @@ -517,7 +537,7 @@ License: LPPL 1.3c</code></pre> <li><p><code>\xintthecoords</code> converts a comma separated list of an even number of items to the format expected by the <code>TikZ</code> <code>coordinates</code> syntax,</p></li> <li><p>completely new version <code>\xintNewExpr</code>, <code>protect</code> function to handle external macros. The dollar sign <code>$</code> for place holders is not accepted anymore, only the standard macro parameter <code>#</code>. Not all constructs are compatible with <code>\xintNewExpr</code>.</p></li> </ul> -<h3 id="bug-fixes-14">Bug fixes</h3> +<h3 id="bug-fixes-15">Bug fixes</h3> <ul> <li><p><code>\xintZapFirstSpaces</code> hence also <code>\xintZapSpaces</code> from package <strong>xinttools</strong> were buggy when used with an argument either empty or containing only space tokens.</p></li> <li><p><code>\xintiiexpr</code> did not strip leading zeroes, hence <code>\xinttheiiexpr 001+1\relax</code> did not obtain the expected result ...</p></li> diff --git a/Master/texmf-dist/doc/generic/xint/CHANGES.pdf b/Master/texmf-dist/doc/generic/xint/CHANGES.pdf Binary files differindex eab1fe3a6f3..3b43f853607 100644 --- a/Master/texmf-dist/doc/generic/xint/CHANGES.pdf +++ b/Master/texmf-dist/doc/generic/xint/CHANGES.pdf diff --git a/Master/texmf-dist/doc/generic/xint/README b/Master/texmf-dist/doc/generic/xint/README index 4e06f22b163..bf51b3871fb 100644 --- a/Master/texmf-dist/doc/generic/xint/README +++ b/Master/texmf-dist/doc/generic/xint/README @@ -1,4 +1,4 @@ - Source: xint.dtx 1.3 2018/03/01 (doc 2018/03/01) + Source: xint.dtx 1.3a 2018/03/07 (doc 2018/03/07) Author: Jean-Francois Burnol Info: Expandable operations on big integers, decimals, fractions License: LPPL 1.3c diff --git a/Master/texmf-dist/doc/generic/xint/README.html b/Master/texmf-dist/doc/generic/xint/README.html index 85699cbf6d5..c1181e203e1 100644 --- a/Master/texmf-dist/doc/generic/xint/README.html +++ b/Master/texmf-dist/doc/generic/xint/README.html @@ -4,7 +4,7 @@ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Style-Type" content="text/css" /> <meta name="generator" content="pandoc" /> - <meta name="author" content="xint 1.3" /> + <meta name="author" content="xint 1.3a" /> <title>README</title> <style type="text/css">code{white-space: pre;}</style> <style type="text/css"> @@ -17,8 +17,8 @@ <body> <div id="header"> <h1 class="title">README</h1> -<h2 class="author">xint 1.3</h2> -<h3 class="date">2018/03/01</h3> +<h2 class="author">xint 1.3a</h2> +<h3 class="date">2018/03/07</h3> </div> <div id="TOC"> <ul> @@ -36,7 +36,7 @@ <li><a href="#license">License</a></li> </ul> </div> -<pre><code>Source: xint.dtx 1.3 2018/03/01 (doc 2018/03/01) +<pre><code>Source: xint.dtx 1.3a 2018/03/07 (doc 2018/03/07) Author: Jean-Francois Burnol Info: Expandable operations on big integers, decimals, fractions License: LPPL 1.3c</code></pre> diff --git a/Master/texmf-dist/doc/generic/xint/README.pdf b/Master/texmf-dist/doc/generic/xint/README.pdf Binary files differindex 04740e5acac..b9aac3c055c 100644 --- a/Master/texmf-dist/doc/generic/xint/README.pdf +++ b/Master/texmf-dist/doc/generic/xint/README.pdf diff --git a/Master/texmf-dist/doc/generic/xint/sourcexint.pdf b/Master/texmf-dist/doc/generic/xint/sourcexint.pdf Binary files differindex eccb01bd279..a74ac432d59 100644 --- a/Master/texmf-dist/doc/generic/xint/sourcexint.pdf +++ b/Master/texmf-dist/doc/generic/xint/sourcexint.pdf diff --git a/Master/texmf-dist/doc/generic/xint/xint.pdf b/Master/texmf-dist/doc/generic/xint/xint.pdf Binary files differindex 25cf7858a6c..672f841bd6c 100644 --- a/Master/texmf-dist/doc/generic/xint/xint.pdf +++ b/Master/texmf-dist/doc/generic/xint/xint.pdf diff --git a/Master/texmf-dist/source/generic/xint/xint.dtx b/Master/texmf-dist/source/generic/xint/xint.dtx index fb30b1972e3..81e2427b474 100644 --- a/Master/texmf-dist/source/generic/xint/xint.dtx +++ b/Master/texmf-dist/source/generic/xint/xint.dtx @@ -3,27 +3,27 @@ % Extract all files via "etex xint.dtx" and do "make help" % or follow instructions from extracted README.md. %<*dtx> -\def\xintdtxtimestamp {Time-stamp: <01-03-2018 at 20:38:22 CET>} +\def\xintdtxtimestamp {Time-stamp: <07-03-2018 at 11:08:43 CET>} %</dtx> %<*drv> %% --------------------------------------------------------------- -\def\xintdocdate {2018/03/01} -\def\xintbndldate{2018/03/01} -\def\xintbndlversion {1.3} +\def\xintdocdate {2018/03/07} +\def\xintbndldate{2018/03/07} +\def\xintbndlversion {1.3a} %</drv> %<readme>% README %<changes>% CHANGE LOG -%<readme|changes>% xint 1.3 -%<readme|changes>% 2018/03/01 +%<readme|changes>% xint 1.3a +%<readme|changes>% 2018/03/07 %<readme|changes> -%<readme|changes> Source: xint.dtx 1.3 2018/03/01 (doc 2018/03/01) +%<readme|changes> Source: xint.dtx 1.3a 2018/03/07 (doc 2018/03/07) %<readme|changes> Author: Jean-Francois Burnol %<readme|changes> Info: Expandable operations on big integers, decimals, fractions %<readme|changes> License: LPPL 1.3c %<readme|changes> %<*!readme&!changes&!dohtmlsh&!dopdfsh&!makefile> %% --------------------------------------------------------------- -%% The xint bundle 1.3 2018/03/01 +%% The xint bundle 1.3a 2018/03/07 %% Copyright (C) 2013-2018 by Jean-Francois Burnol %<xintkernel>%% xintkernel: Paraphernalia for the xint packages %<xinttools>%% xinttools: Expandable and non-expandable utilities @@ -250,6 +250,35 @@ Makefile.mk.</div> %</readme>-------------------------------------------------------- %<*changes>------------------------------------------------------- +`1.3a (2018/03/07)` +---- + +### Incompatible changes + + - **xintcore**, **xint**, **xintfrac**: removal of the internal macros + which were used at `1.2o` to add a deprecation mechanism; all + deprecated macros have been removed at `1.3` so there was no reason + to keep the code used for deprecating them. + +### Bug fixes + + - **xintexpr**: the mechanism for adjunction to the expression parsers + of user defined functions was refactored and improved at previous + release `1.3`: in particular recursive definitions became possible. + But an oversight made these recursive functions quite inefficient (to + remain polite.) This release fixes the problem. + +### Improvements and new features + + - **xintexpr**: new conditionals `ifone()` and `ifint()`. + + - **xintfrac**: `\xintREZ` is faster on inputs having one hundred + digits or more. + + - Added to the user manual mention of macros such as `\xintDivFloor`, + `\xintMod`, `\xintModTrunc`, which had been left out so far. + + `1.3 (2018/03/01)` ---- @@ -260,10 +289,10 @@ Makefile.mk.</div> - **xintfrac**: addition and subtraction of `a/b` and `c/d` now use the l.c.m. of the denominators. Similarly the macro supporting the modulo - operator `/:` uses a l.c.m for the denominator of the result. + operator `/:` uses a l.c.m. for the denominator of the result. - **xintexpr**: the addition, subtraction, modulo `/:`, and the - `mod()`and `divmod()` functions produce generally smaller denominators + `mod()` and `divmod()` functions produce generally smaller denominators (see previous item). - **xintexpr**: formerly, the internal macros which are internally @@ -284,6 +313,7 @@ Makefile.mk.</div> - **xintexpr**: new function `preduce()` associated with `\xintPIrr`. + `1.2q (2018/02/06)` ---- @@ -3776,9 +3806,9 @@ Here is a (partial) list of the recognized symbols: \item |"| for hexadecimal input (uppercase only; package \xintbinhexname must be loaded additionally to \xintexprname), %\item |'| for octal input (\emph{not yet}), -\item functions \xintFor #1 in {num, reduce, abs, sgn, frac, floor, ceil, sqr, sqrt, +\item functions \xintFor #1 in {num, preduce, reduce, abs, sgn, frac, floor, ceil, sqr, sqrt, sqrtr, float, round, trunc, mod, quo, rem, - max, min, |`+`|, |`*`|, not, all, any, xor, if, ifsgn, even, odd, first, + max, min, |`+`|, |`*`|, not, all, any, xor, if, ifint, ifone, ifsgn, even, odd, first, last, reversed, bool, togl, factorial, binomial, pfactorial}\do {\func{#1}, } \item multi-arguments \func{gcd} and \func{lcm} are available if \xintgcdname is loaded, @@ -4087,7 +4117,7 @@ digits. This is not so many, let us print them here: \end{itemize} -\subsection {More examples, some quite elaborate, within this document} +\subsection {More examples within this document} \label{sec:awesome} \begin{itemize} @@ -4119,10 +4149,14 @@ digits. This is not so many, let us print them here: an \hyperlink{BrentSalamin}{expandable implementation of the Brent-Salamin algorithm} for evaluating $\pi$. +\item The \autoref{ssec:PrimesIV} implements expandably the Miller-Rabin + pseudo-primality test. + \item The functionalities of \xintexprname are illustrated with various - examples, found in locations such as in \autoref{xintdeffunc} and - \hyperlink{ssec:dummies}{functions with dummy variables} and \autoref{ssec:moredummies}. + other examples, in \autoref{xintdeffunc}, + \hyperlink{ssec:dummies}{Functions with dummy variables}, + \autoref{ssec:moredummies} or \hyperref[sssec:recursive]{Recursive definitions}. \end{itemize} Almost all of the computational results interspersed throughout the documentation are not hard-coded in the source file of this document but are @@ -4180,33 +4214,39 @@ file with name |README.md|. Further help and options will be found therein. This is release \expandafter|\xintbndlversion| of \expandafter|\xintbndldate|. -|1.3| brings one important main new feature: the possibility of -\hyperref[sssec:recursive]{recursive definitions} with \csbxint{deffunc} for +|1.3|'s added an important new feature: the possibility of +\hyperref[sssec:recursive]{recursive definitions} via \csbxint{deffunc} for user additions to the expression parsers. -Also, it adds macros \csbxint{PIrr} et \csbxint{DecToString} and function -\func{preduce}. +But an oversight caused such recursively defined functions to be very +inefficient. This is fixed at |1.3a|. + +|1.3a| adds \func{ifone} and \func{ifint} conditionals and has a faster +\csbxint{REZ}. It also documents some macros such as \csbxint{DivFloor} which, +although long existing, had somehow not made it into the user manual yet. -And it brings significant breaking changes: +|1.3| had added macros \csbxint{PIrr} et \csbxint{DecToString} and function +\func{preduce}. +And it came with some significant breaking changes: \begin{itemize}[nosep] \item Addition (\csbxint{Add}) and subtraction (\csbxint{Sub}) of fractions use the least common multiple of the denominators. -\item This of course modifies also addition and subtraction in |xintexpr|. +\item This modified also addition and subtraction as executed in |xintexpr|. Similarly the |/:| operator and the \func{mod} and \func{divmod} functions - also use a least common multiple for the denominator of the result. -\item The macros deprecated at |1.2o| have now been all removed. See + were changed to use a least common multiple for the denominator of the result. +\item The macros deprecated at |1.2o| were removed. See \autoref{ssec:coredeprecated}, \autoref{ssec:xintdeprecated}, and \autoref{ssec:xintdeprecatedNum} for details. \end{itemize} -|1.2q| fixes a bug introduced by |1.2l| in some cases of subtraction. It also -extends \hyperref[ssec:tacit multiplication]{Tacit multiplication} to cover +|1.2q| fixed a bug introduced by |1.2l| in some cases of subtraction. It also +extended \hyperref[ssec:tacit multiplication]{Tacit multiplication} to cover cases such as |10!20!30!|. -|1.2p| has some breaking changes and improvements (see |CHANGES.html| for bug +|1.2p| had some breaking changes and improvements (see |CHANGES.html| for bug fixes): \begin{itemize}[nosep] -\item \csbxint{Bezout}'s output is changed. +\item \csbxint{Bezout}'s output was changed. \item \csbxint{iiMod} macro, the |/:| (aka |'mod'|) operators as well as the \func{mod} function, and the |//| operator, are now associated with the \emph{floored}, not the \emph{truncated} division. @@ -4534,7 +4574,7 @@ corresponding definitions. \capstart \centering \xintAssignArray\xintCSVtoList{!, ?, |`*`|, |`+`|, abs, add, all, any, binomial, bool, ceil, -divmod, even, factorial, first, float, floor, frac, gcd, if, ifsgn, iter, +divmod, even, factorial, first, float, floor, frac, gcd, if, ifint, ifone, ifsgn, iter, iterr, last, lcm, len, max, min, mod, mul, not, num, odd, pfactorial, preduce, qfloat, qfrac, qint, quo, reduce, rem, reversed, round, rrseq, rseq, seq, sgn, sqr, @@ -4948,6 +4988,19 @@ for the behaviour if the arguments are negative. value is logical false. Both ``branches'' are evaluated (they are not really branches but just numbers). See also the |?| operator. + \funcdesc{ifint} (twofold-way conditional)\mbox{} + + \ctexttt{ifint}|(x,yes,no)| + checks if |x| is an integer and in that case chooses the ``yes'' branch.% + \NewWith{1.3a} + + \funcdesc{ifone} (twofold-way conditional)\mbox{} + + \ctexttt{if}|(x,yes,no)| + checks if |x| is equal to one and in that case chooses the ``yes'' branch.% + \NewWith{1.3a} + Slightly more efficient than |if(x==1,..,..)|. + \funcdesc{ifsgn} (threefold-way conditional)\mbox{} \ctexttt{ifsgn}|(cond,<0,=0,>0)| checks the sign of |cond| and @@ -5619,7 +5672,7 @@ and that |x/2y| is interpreted as |x/(2y)|.) % The names of the macros \csa{xintdeffunc}, \csa{xintdefiifunc}, % \csa{xintdeffloatfunc} (and those for variables) as well as their syntax % (with |:=| and an ending |;|) will be set definitely only in next release. - \footnotemark + % \footnotemark A function must be defined for a specific parser, using either |\xintdeffunc|, |\xintdefiifunc| or |\xintdeffloatfunc|. @@ -5629,9 +5682,13 @@ and that |x/2y| is interpreted as |x/(2y)|.) letter, because the parser will have made an attempt to use the letter as a dummy variable.) \end{framed} -\footnotetext{with the current syntax, the |;| as used for |iterr|, |rseq|, - |rrseq| must be hidden as |{;}| to not be confused with the |;| ending the - declaration.} +% \footnotetext{with the current syntax, the |;| as used for |iterr|, |rseq|, +% |rrseq| must be hidden as |{;}| to not be confused with the |;| ending the +% declaration.} + +Currently, it is not possible to define a function of a single variable, say +|L|, which would stand for a \emph{list} with an undetermined number of +elements (see \autoref{ssec:lists} for lists). This will perhaps be added in future. Let's try the famous \textsc{Rump} test: \begin{everbatim*} @@ -5744,19 +5801,16 @@ truncates its arguments to integers when used in |\xintexpr|). Our second example is modular exponentiation: \begin{everbatim*} -\xintdefiifunc powmod(x, m, n) := - if(m, - % m non zero (assume positive) - if(m=1, +\xintdefiifunc powmod_a(x, m, n) := + ifone(m, % m=1, return x modulo n x /: n, % m > 1 test if odd or even and do recursive call - if(odd(m), (x*sqr(powmod(x, m//2, n))) /: n, - sqr(powmod(x, m//2, n)) /: n + if(odd(m), (x*sqr(powmod_a(x, m//2, n))) /: n, + sqr(powmod_a(x, m//2, n)) /: n ) - ), - % m is zero, return 1 - 1); + ); +\xintdefiifunc powmod(x, m, n) := if(m, powmod_a(x, m, n), 1); \end{everbatim*} I have made the definition here for the |\xintiiexpr| parser; we could do the same for the |\xintexpr|-parser (but its usage with big powers would quickly @@ -5820,7 +5874,7 @@ will generate \begin{everbatim} Function f for \xintexpr parser associated to \XINT_expr_userfunc_f with me aning macro:#1->#1,\xintPow {#1}{2},\xintPow {#1}{3},\xintPow {#1}{#1} -Package xintexpr Info: (on line 2) + Function g for \xintexpr parser associated to \XINT_expr_userfunc_g with me aning macro:#1->\xintApply::csv {\xintPow {#1}}{\xintSeq::csv {0}{#1}} \end{everbatim} @@ -7951,13 +8005,16 @@ which is described later; none of this uses count registers. \label{ssec:PrimesIV} This section is based on my \url{http://tex.stackexchange.com/a/165008} post. -But I have modified it to use \csbxint{NewFunction} which is available since -|1.2i|. This is good opportunity to illustrate how \csbxint{NewFunction} can be -used to define a recursive function (here modular exponentiation.) -The modular exponentiation can be defined as a genuine |\xintiiexpr|-function -since |1.3|. The others still have the problem of using |iter|, or |break| -statements which are not compatible with \csbxint{deffunc}. +At the time of writing, the code at the link above is still the version from +April 2016 and it needed some hacks to get recursive (pseudo)-functions +defined. Since |1.2h| of |2016/11/20| there is \csbxint{NewFunction} which +allows us here to avoid such internal hacking. + +And since |1.3| of |2018/03/01|, it is possible to use \csbxint{defiifunc} +also for recursive definitions, so we use it here, but we can benefit from it +only for modular exponentiation as the rest of the code uses |iter| or |break| +statements which are not yet compatible with \csbxint{defiifunc}. The |isPseudoPrime(n)| is usable in \csbxint{iiexpr}-essions and establishes if its (positive) argument is a Miller-Rabin PseudoPrime to the bases $2, 3, @@ -7984,34 +8041,37 @@ then write a very fast expandable primality test for such numbers using only \begin{everbatim*} % I -------------------------------- Modular Exponentiation -% #1=x, #2=m, #3=N, compute x^m modulo N (with m non negative) -% We will always use it with 1< x < N hence we skip an initial reduction modulo N. +% Computes x^m modulo n (with m non negative). +% We will always use it with 1 < x < n -\xintdefiifunc powmod(x, m, n) := - if(m, - % m non zero (assume positive) - if(m=1, +\xintdefiifunc powmod_a(x, m, n) := + ifone(m, % m=1, return x modulo n x /: n, % m > 1 test if odd or even and do recursive call - if(odd(m), (x*sqr(powmod(x, m//2, n))) /: n, - sqr(powmod(x, m//2, n)) /: n + if(odd(m), (x*sqr(powmod_a(x, m//2, n))) /: n, + sqr(powmod_a(x, m//2, n)) /: n ) - ), - % m is zero, return 1 - 1); + ); +\xintdefiifunc powmod(x, m, n) := if(m, powmod_a(x, m, n), 1); -% See http://tex.stackexchange.com/a/165008 for a (perhaps slightly -% faster) macro-only approach not using \xintexpr. But since 1.3 the above -% is indeed associated with a single (!) f-expandable macro. Here is its -% (recursive) meaning (with end of lines added by TeX when writing to the log): +% See http://tex.stackexchange.com/a/165008 for macros written directly by a +% human. + +% For comparison here are the underlying support macros defined by +% \xintdefiifunc from the code above (since 1.3a): (with linebreaks added by +% TeX when writing to the log) + +% Function powmod_a for \xintiiexpr parser associated to \XINT_iiexpr_userfun +% c_powmod_a with meaning macro:#1#2#3->\xintiiifOne {#2}{\xintiiMod {#1}{#3}}{\x +% intiiifNotZero {\xintiiOdd {#2}}{\xintiiMod {\xintiiMul {#1}{\xintiiSqr {\xintE +% xpandArgs {XINT_iiexpr_userfunc_powmod_a}{{#1}{\xintiiDivFloor {#2}{2}}{#3}}}}} +% {#3}}{\xintiiMod {\xintiiSqr {\xintExpandArgs {XINT_iiexpr_userfunc_powmod_a}{{ +% #1}{\xintiiDivFloor {#2}{2}}{#3}}}}{#3}}} % Function powmod for \xintiiexpr parser associated to \XINT_iiexpr_userfunc_ -% powmod with meaning macro:#1#2#3->\xintifNotZero {#2}{\xintifNotZero {\xintiiEq -% {#2}{1}}{\xintiiMod {#1}{#3}}{\xintifNotZero {\xintiiOdd {#2}}{\xintiiMod {\xi -% ntiiMul {#1}{\xintiiSqr {\csname XINT_iiexpr_userfunc_powmod\endcsname {#1}{\xi -% ntiiDivFloor {#2}{2}}{#3}}}}{#3}}{\xintiiMod {\xintiiSqr {\csname XINT_iiexpr_u -% serfunc_powmod\endcsname {#1}{\xintiiDivFloor {#2}{2}}{#3}}}{#3}}}}{1} +% powmod with meaning macro:#1#2#3->\xintiiifNotZero {#2}{\xintExpandArgs {XINT_i +% iexpr_userfunc_powmod_a}{{#1}{#2}{#3}}}{1} % II ------------------------------ Miller-Rabin compositeness witness @@ -8045,6 +8105,10 @@ then write a very fast expandable primality test for such numbers using only {iter(y;(j=#4)?{break(!(@==#2-1))} {(@==#2-1)?{break(0)}{sqr(@)/:#2}},j=1++)} ,y=powmod(#1,#3,#2))} + +% added note (2018/03/07) it is possible in the above that m=#3 is never +% zero, so we should rather call powmod_a for a small gain, but I don't +% have time to re-read the code comments and settle this. % III ------------------------------------- Strong Pseudo Primes @@ -9879,6 +9943,12 @@ special, for example \csbxint{Trunc} produces decimal numbers, \csbxint{Irr} produces an |A/B| with no |[N]|, \csbxint{iTrunc} and \csbxint{iRound} produce integers without trailing |[N]| either, etc\dots +|1.3a| belatedly adds documentation for some macros such as +\csbxint{DivFloor} which had been defined long ago, but did not make it to the +user manual for various reasons, one being that it is thought few users will +use directly the \xintfracname macros, the \csbxint{expr} interface being more +convenient. For complete documentation refer to |sourcexint.pdf|. + \subsection{\csbh{xintNum}}\label{xintNumFrac} The original \csbxint{Num} \etype{\Ff} from \xintname is made a synonym to @@ -9953,6 +10023,9 @@ trailing zeroes of |A| and |B| are suppressed and |N| is accordingly adjusted. \xintREZ {178000/25600000[17]} \end{everbatim*} +This macro is used internally by various other constructs; its implementation +was redone entirely at |1.3a|, and it got faster on long inputs. + \subsection{\csbh{xintIrr}}\label{xintIrr} This puts the fraction\etype{\Ff} into its unique irreducible form: @@ -10531,26 +10604,78 @@ denominators.\CHANGED{1.3} Computes the product\etype{\Ff\Ff} of two fractions. -No reduction attempted. +Output is not reduced to smallest terms. \subsection{\csbh{xintDiv}}\label{xintDiv} Computes the quotient \etype{\Ff\Ff} of two fractions. (|\xintDiv{F}{G}| computes |F/G|). -No reduction attempted. +Output is not reduced to smallest terms. + +\subsection{\csbh{xintDivFloor}} +\label{xintDivFloor} + +Computes the quotient \etype{\Ff\Ff} of two arguments then apply floor +function to get an integer (in strict format). This macro was defined at |1.1| +(but was left not documented until |1.3a|...) and changed at |1.2p|, formerly +it appended |/1[0]| to output. +\begin{everbatim*} +\xintDivFloor{-170/3}{23/2} +\end{everbatim*} + +\subsection{\csbh{xintMod}} +\label{xintMod} + +Computes the remainder associated to the floored division\etype{\Ff\Ff} +\csbxint{DivFloor}. Prior to |1.2p| the meaning was the one of +\csbxint{ModTrunc}. Was left undocumented until |1.3a|. +\begin{everbatim*} +\xintMod{-170/3}{23/2} +\end{everbatim*} + +Modified at |1.3| to use a l.c.m. for the denominator of the result. +\CHANGED{1.3} + +\subsection{\csbh{xintDivMod}} +\label{xintDivMod} + +Computes both the floored division and the remainder\etype{\Ff\Ff} +\csbxint{DivFloor}. New at |1.2p| and documented at |1.3a|. +\begin{everbatim*} +\oodef\foo{\xintDivMod{-170/3}{23/2}}\meaning\foo +\end{everbatim*} \subsection{\csbh{xintDivTrunc}} \label{xintDivTrunc} Computes the quotient \etype{\Ff\Ff} of two arguments then -truncates to an integer. +truncates to an integer (in strict format). +\begin{everbatim*} +\xintDivTrunc{-170/3}{23/2} +\end{everbatim*} + +\subsection{\csbh{xintModTrunc}} +\label{xintModTrunc} + +Computes the remainder\etype{\Ff\Ff} associated with the truncated division of +two arguments. Prior to |1.2p| it was named \csbxint{Mod}, but the latter then +got associated with floored division. +\begin{everbatim*} +\xintModTrunc{-170/3}{23/2} +\end{everbatim*} + +Modified at |1.3| to use a l.c.m. for the denominator of the result. +\CHANGED{1.3} \subsection{\csbh{xintDivRound}} \label{xintDivRound} Computes the quotient \etype{\Ff\Ff} of the two arguments then rounds to an -integer. +integer (in strict format). +\begin{everbatim*} +\xintDivRound{-170/3}{23/2} +\end{everbatim*} \subsection{\csbh{xintSqr}}\label{xintSqr} @@ -11746,12 +11871,12 @@ ith meaning macro:#1#2#3#4#5#6#7#8#9->\xintSub {\xintSub {\xintSub {\xintAdd {\ xintAdd {\xintMul {\xintMul {#1}{#5}}{#9}}{\xintMul {\xintMul {#2}{#6}}{#7}}}{\ xintMul {\xintMul {#3}{#4}}{#8}}}{\xintMul {\xintMul {#2}{#4}}{#9}}}{\xintMul { \xintMul {#3}{#5}}{#7}}}{\xintMul {\xintMul {#1}{#6}}{#8}} -Package xintexpr Info: (on line 11) + Function det3bis for \xintexpr parser associated to \XINT_expr_userfunc_det 3bis with meaning macro:#1#2#3#4#5#6#7#8#9->\xintAdd {\xintSub {\xintMul {#1}{\ -csname XINT_expr_userfunc_det2\endcsname {#5}{#6}{#8}{#9}}}{\xintMul {#2}{\csna -me XINT_expr_userfunc_det2\endcsname {#4}{#6}{#7}{#9}}}}{\xintMul {#3}{\csname -XINT_expr_userfunc_det2\endcsname {#4}{#5}{#7}{#8}}} +xintExpandArgs {XINT_expr_userfunc_det2}{{#5}{#6}{#8}{#9}}}}{\xintMul {#2}{\xin +tExpandArgs {XINT_expr_userfunc_det2}{{#4}{#6}{#7}{#9}}}}}{\xintMul {#3}{\xintE +xpandArgs {XINT_expr_userfunc_det2}{{#4}{#5}{#7}{#8}}}} \end{everbatim} @@ -15890,6 +16015,20 @@ be treated as first item) number. % This is \expandafter|\xintbndlversion| of \expandafter|\xintbndldate|. % % \begin{itemize} +% \item Release |1.3a| of |2018/03/07|: +% \begin{itemize}[nosep] +% \item removes from \xintcorenameimp, \xintnameimp and \xintfracnameimp the +% whole deprecation mechanism, as there are no more currently any +% deprecated macro, +% \item adds |ifone()| and |ifint()| conditionals to the expression parsers, +% \item has a completely redone |\XINT_factortens|, in the style of |1.2| +% release (but about 100 digits at least are needed for noticeable speed +% gain), +% \item and last but not least fixes via addition of |\xintExpandArgs| the +% meaning of user defined functions, which in case of recursivity (as made +% possible at |1.3|) were badly inefficient for lack of expansion of their +% arguments. +% \end{itemize} % \item Release |1.3| of |2018/03/01|: % \begin{itemize}[nosep] % \item removed all macros previously deprecated at |1.2o|, @@ -16179,7 +16318,7 @@ be treated as first item) number. \fi \XINT_providespackage \ProvidesPackage {xintkernel}% - [2018/03/01 1.3 Paraphernalia for the xint packages (JFB)]% + [2018/03/07 1.3a Paraphernalia for the xint packages (JFB)]% % \end{macrocode} % \subsection{Constants} % \begin{macrocode} @@ -16346,9 +16485,13 @@ be treated as first item) number. % % Attention: removes brace pairs. % -% For digit tokens only a faster reverse macro is provided as +% For contents with only digit tokens a faster reverse macro is provided as % \xintReverseDigits from 1.2 xintcore.sty. % +% At 1.3a, \XINT_factortens from xintfrac.sty was redone in a faster +% \numexpr-expansion style, and it stopped using this. There remains only +% two calls from xintgcd.sty to \XINT_rord_main. +% % For comma separated items, 1.2g has (not user documented) \xintCSVReverse in % xinttools.sty.| % \begin{macrocode} @@ -16765,7 +16908,7 @@ be treated as first item) number. % \begin{macrocode} \XINT_providespackage \ProvidesPackage{xinttools}% - [2018/03/01 1.3 Expandable and non-expandable utilities (JFB)]% + [2018/03/07 1.3a Expandable and non-expandable utilities (JFB)]% % \end{macrocode} % \lverb|\XINT_toks is used in macros such as \xintFor. It is not used % elsewhere in the xint bundle.| @@ -18146,6 +18289,14 @@ be treated as first item) number. }% \let\xintDigitsOf\xintAssignArray % \end{macrocode} +% \subsection{\csh{xintExpandArgs}} +% \lverb|1.3a. Added for the needs of user defined functions for the +% expression parsers. Should I re-code it to gain a bit in argument grabbing? +% Must be f-expandable.| +% \begin{macrocode} +\def\xintExpandArgs#1#2{\csname #1\expandafter\endcsname + \romannumeral0\xintapply\xint_firstofone{#2}}% +% \end{macrocode} %\subsection{CSV (non user documented) variants of Length, Keep, Trim, NthElt, Reverse} % % These routines are for use by |\xintListSel:x:csv| and |\xintListSel:f:csv| @@ -18705,7 +18856,7 @@ be treated as first item) number. % \begin{macrocode} \XINT_providespackage \ProvidesPackage{xintcore}% - [2018/03/01 1.3 Expandable arithmetic on big integers (JFB)]% + [2018/03/07 1.3a Expandable arithmetic on big integers (JFB)]% % \end{macrocode} % \subsection{(WIP!) Error conditions and exceptions} % \lverb|As per the Mike Cowlishaw/IBM's General Decimal Arithmetic Specification @@ -21931,51 +22082,6 @@ be treated as first item) number. }% \def\XINT_fac_loop_exit #1!#2;!#3{#3#2;!}% % \end{macrocode} -% \subsection{\csh{XINT_signaldeprecated}} -% \lverb|1.2o| -% \begin{macrocode} -\def\XINT_signaldeprecated #1#2% -{% - \XINT_ifFlagRaised{#2}% - {}% already encountered (if not hidden in a group...) - {\XINT_RaiseFlag{Deprecated-#1}\XINT_RaiseFlag{#2}% - \expandafter\XINT_expandableerror\expandafter - {\csname#2\endcsname (#1) is deprecated! (RET to proceed)}}% -}% -% \end{macrocode} -% \subsection*{At End of \LaTeX\ Document deprecation message} -% \addcontentsline{toc}{subsection}{At End of \LaTeX\ Document deprecation message} -% \lverb|1.2o. Updated at 1.3 which actually removed all deprecated macros.| -% \begin{macrocode} -\ifdefined\documentclass\ifdefined\AtEndDocument - \AtEndDocument{% -\XINT_ifFlagRaised{Deprecated-xintcore}% - {\PackageError{xintcore} -{Usage of deprecated macros!} -{These deprecated macros from xintcore.sty have been detected:\MessageBreak -\XINT_useiimessage{xintSgn}% -\XINT_useiimessage{xintCmp}% -\XINT_ifFlagRaised{xintiOpp}{\string\xintiOpp\MessageBreak}{}% -\XINT_ifFlagRaised{xintiAbs}{\string\xintiAbs\MessageBreak}{}% -\XINT_ifFlagRaised{xintiiFDg}{\string\xintiiFDg\space(renamed to \string\xintFDg!)\MessageBreak}{}% -\XINT_ifFlagRaised{xintiiLDg}{\string\xintiiLDg\space(renamed to \string\xintLDg!)\MessageBreak}{}% -\XINT_ifFlagRaised{xintiAdd}{\string\xintiAdd\MessageBreak}{}% -\XINT_ifFlagRaised{xintiSub}{\string\xintiSub\MessageBreak}{}% -\XINT_ifFlagRaised{xintiMul}{\string\xintiMul\MessageBreak}{}% -\XINT_ifFlagRaised{xintiDivision}{\string\xintiDivision\MessageBreak}{}% -\XINT_ifFlagRaised{xintiQuo}{\string\xintiQuo\MessageBreak}{}% -\XINT_ifFlagRaised{xintiRem}{\string\xintiRem\MessageBreak}{}% -\XINT_ifFlagRaised{xintiDivRound}{\string\xintiDivRound\MessageBreak}{}% -\XINT_ifFlagRaised{xintiDivTrunc}{\string\xintiDivTrunc\MessageBreak}{}% -\XINT_ifFlagRaised{xintiMod}{\string\xintiMod\MessageBreak}{}% -\XINT_ifFlagRaised{xintiSqr}{\string\xintiSqr\MessageBreak}{}% -\XINT_ifFlagRaised{xintiPow}{\string\xintiPow\MessageBreak}{}% -\XINT_ifFlagRaised{xintiFac}{\string\xintiFac\MessageBreak}{}% -This is not possible because they all got removed from xintcore at 1.3!}}% - {% no deprecated macro used (at top level...) - }% -}\fi\fi -% \end{macrocode} % \subsection{\csh{XINT_useiimessage}} % \lverb|1.2o| % \begin{macrocode} @@ -22057,7 +22163,7 @@ This is not possible because they all got removed from xintcore at 1.3!}}% % \begin{macrocode} \XINT_providespackage \ProvidesPackage{xint}% - [2018/03/01 1.3 Expandable operations on big integers (JFB)]% + [2018/03/07 1.3a Expandable operations on big integers (JFB)]% % \end{macrocode} % \subsection{More token management} % \begin{macrocode} @@ -24107,56 +24213,6 @@ This is not possible because they all got removed from xintcore at 1.3!}}% \def\xintBool #1{\romannumeral`&&@% \csname if#1\endcsname\expandafter1\else\expandafter0\fi }% \def\xintToggle #1{\romannumeral`&&@\iftoggle{#1}{1}{0}}% -% \end{macrocode} -% \subsection*{At End of \LaTeX\ Document deprecation message} -% \addcontentsline{toc}{subsection}{At End of \LaTeX\ Document deprecation message} -% \lverb|1.2o| -% \begin{macrocode} -\ifdefined\documentclass\ifdefined\AtEndDocument - \AtEndDocument{% -\XINT_ifFlagRaised{Deprecated-xint}% - {\PackageError{xint} -{Usage of deprecated macros!} -{These deprecated macros from xint.sty have been detected:\MessageBreak -\XINT_useiimessage{xintEq}% -\XINT_useiimessage{xintGeq}% -\XINT_useiimessage{xintGt}% -\XINT_useiimessage{xintLt}% -\XINT_useiimessage{xintGtorEq}% -\XINT_useiimessage{xintLtorEq}% -\XINT_useiimessage{xintIsZero}% -\XINT_useiimessage{xintIsNotZero}% -\XINT_useiimessage{xintIsOne}% -\XINT_useiimessage{xintOdd}% -\XINT_useiimessage{xintEven}% -\XINT_useiimessage{xintifSgn}% -\XINT_useiimessage{xintifCmp}% -\XINT_useiimessage{xintifEq}% -\XINT_useiimessage{xintifGt}% -\XINT_useiimessage{xintifLt}% -\XINT_useiimessage{xintifZero}% -\XINT_useiimessage{xintifNotZero}% -\XINT_useiimessage{xintifOne}% -\XINT_useiimessage{xintifOdd}% -\XINT_ifFlagRaised{xintNeq}% - {\string\xintNeq\space(use \string\xintiiNotEq\space or \string\xintNotEq\space from xintfrac!)\MessageBreak}{}% -\XINT_ifFlagRaised{xintNot}% - {\string\xintNot\space(renamed to \string\xintNOT!)\MessageBreak}{}% -\XINT_ifFlagRaised{xintMON}{\string\xintMON\MessageBreak}{}% -\XINT_ifFlagRaised{xintMMON}{\string\xintMMON\MessageBreak}{}% -\XINT_ifFlagRaised{xintiMax}{\string\xintiMax\MessageBreak}{}% -\XINT_ifFlagRaised{xintiMin}{\string\xintiMin\MessageBreak}{}% -\XINT_ifFlagRaised{xintiMaxof}{\string\xintiMaxof\MessageBreak}{}% -\XINT_ifFlagRaised{xintiMinof}{\string\xintiMinof\MessageBreak}{}% -\XINT_ifFlagRaised{xintiSquareRoot}{\string\xintiSquareRoot\MessageBreak}{}% -\XINT_ifFlagRaised{xintiSqrt}{\string\xintiSqrt\MessageBreak}{}% -\XINT_ifFlagRaised{xintiSqrtR}{\string\xintiSqrtR\MessageBreak}{}% -\XINT_ifFlagRaised{xintiBinomial}{\string\xintiBinomial\MessageBreak}{}% -\XINT_ifFlagRaised{xintiPFactorial}{\string\xintiPFactorial\MessageBreak}{}% -This is not possible because they all got removed at 1.3!}}% - {% no deprecated macro used (at top level...) - }% -}\fi\fi \XINT_restorecatcodes_endinput% % \end{macrocode} % @@ -24243,7 +24299,7 @@ This is not possible because they all got removed at 1.3!}}% % \begin{macrocode} \XINT_providespackage \ProvidesPackage{xintbinhex}% - [2018/03/01 1.3 Expandable binary and hexadecimal conversions (JFB)]% + [2018/03/07 1.3a Expandable binary and hexadecimal conversions (JFB)]% % \end{macrocode} % \subsection{Constants, etc...} % \lverb|1.2n switches to \csname-governed expansion at various places.| @@ -24895,7 +24951,7 @@ This is not possible because they all got removed at 1.3!}}% % \begin{macrocode} \XINT_providespackage \ProvidesPackage{xintgcd}% - [2018/03/01 1.3 Euclide algorithm with xint package (JFB)]% + [2018/03/07 1.3a Euclide algorithm with xint package (JFB)]% % \end{macrocode} % \subsection{\csh{xintGCD}, \csh{xintiiGCD}} % \lverb|1.09a added \xintnum filtering from \xintiabs. This is a bit overhead @@ -25605,124 +25661,7 @@ This is not possible because they all got removed at 1.3!}}% % \begin{macrocode} \XINT_providespackage \ProvidesPackage{xintfrac}% - [2018/03/01 1.3 Expandable operations on fractions (JFB)]% -% \end{macrocode} -% \subsection{Macros now removed from \xintcorenameimp and \xintnameimp} -% \lverb|Moved here at 1.3| -% \begin{macrocode} -\def\xintEq {\romannumeral0\xinteq }% -\def\xinteq #1#2{\xintifeq{#1}{#2}{1}{0}}% -\def\xintNotEq#1#2{\romannumeral0\xintifeq {#1}{#2}{0}{1}}% -%\def\xintGeq {\romannumeral0\xintgeq }% further down -\def\xintGt {\romannumeral0\xintgt }% -\def\xintgt #1#2{\xintifgt{#1}{#2}{1}{0}}% -\def\xintLt {\romannumeral0\xintlt }% -\def\xintlt #1#2{\xintiflt{#1}{#2}{1}{0}}% -\def\xintGtorEq #1#2{\romannumeral0\xintiflt {#1}{#2}{0}{1}}% -\def\xintLtorEq #1#2{\romannumeral0\xintifgt {#1}{#2}{0}{1}}% -\def\xintIsZero {\romannumeral0\xintiszero }% -\def\xintiszero #1{\if0\xintSgn{#1}\xint_afterfi{ 1}\else\xint_afterfi{ 0}\fi}% -\def\xintIsNotZero{\romannumeral0\xintisnotzero }% -\def\xintisnotzero - #1{\if0\xintSgn{#1}\xint_afterfi{ 0}\else\xint_afterfi{ 1}\fi}% -\def\xintIsOne {\romannumeral0\xintisone }% -\def\xintisone #1{\expandafter\XINT_isone\romannumeral0\xintnum{#1}XY}% -\def\xintOdd {\romannumeral0\xintodd }% -\def\xintodd #1% -{% - \ifodd\xintLDg{\xintNum{#1}} %<- intentional space - \xint_afterfi{ 1}% - \else - \xint_afterfi{ 0}% - \fi -}% -\def\xintEven {\romannumeral0\xinteven }% -\def\xinteven #1% -{% - \ifodd\xintLDg{\xintNum{#1}} %<- intentional space - \xint_afterfi{ 0}% - \else - \xint_afterfi{ 1}% - \fi -}% -\def\xintifSgn{\romannumeral0\xintifsgn }% -\def\xintifsgn #1% -{% - \ifcase \xintSgn{#1} - \expandafter\xint_secondofthree_thenstop - \or\expandafter\xint_thirdofthree_thenstop - \else\expandafter\xint_firstofthree_thenstop - \fi -}% -\def\xintifCmp{\romannumeral0\xintifcmp }% -\def\xintifcmp #1#2% -{% - \ifcase\xintCmp {#1}{#2} - \expandafter\xint_secondofthree_thenstop - \or\expandafter\xint_thirdofthree_thenstop - \else\expandafter\xint_firstofthree_thenstop - \fi -}% -\def\xintifEq {\romannumeral0\xintifeq }% -\def\xintifeq #1#2% -{% - \if0\xintCmp{#1}{#2}% - \expandafter\xint_firstoftwo_thenstop - \else\expandafter\xint_secondoftwo_thenstop - \fi -}% -\def\xintifGt {\romannumeral0\xintifgt }% -\def\xintifgt #1#2% -{% - \if1\xintCmp{#1}{#2}% - \expandafter\xint_firstoftwo_thenstop - \else\expandafter\xint_secondoftwo_thenstop - \fi -}% -\def\xintifLt {\romannumeral0\xintiflt }% -\def\xintiflt #1#2% -{% - \ifnum\xintCmp{#1}{#2}<\xint_c_ - \expandafter\xint_firstoftwo_thenstop - \else \expandafter\xint_secondoftwo_thenstop - \fi -}% -\def\xintifZero {\romannumeral0\xintifzero }% -\def\xintifzero #1% -{% - \if0\xintSgn{#1}% - \expandafter\xint_firstoftwo_thenstop - \else - \expandafter\xint_secondoftwo_thenstop - \fi -}% -\def\xintifNotZero{\romannumeral0\xintifnotzero }% -\def\xintifnotzero #1% -{% - \if0\xintSgn{#1}% - \expandafter\xint_secondoftwo_thenstop - \else - \expandafter\xint_firstoftwo_thenstop - \fi -}% -\def\xintifOne {\romannumeral0\xintifone }% -\def\xintifone #1% -{% - \if1\xintIsOne{#1}% - \expandafter\xint_firstoftwo_thenstop - \else - \expandafter\xint_secondoftwo_thenstop - \fi -}% -\def\xintifOdd {\romannumeral0\xintifodd }% -\def\xintifodd #1% -{% - \if\xintOdd{#1}1% - \expandafter\xint_firstoftwo_thenstop - \else - \expandafter\xint_secondoftwo_thenstop - \fi -}% + [2018/03/07 1.3a Expandable operations on fractions (JFB)]% % \end{macrocode} % \subsection{\csh{XINT_cntSgnFork}} % \lverb|1.09i. Used internally, #1 must expand to \m@ne, \z@, or \@ne or @@ -26036,101 +25975,171 @@ This is not possible because they all got removed at 1.3!}}% }% \def\XINT_frac_gen_zero 0#1#2#3{{0}{0}{1}}% % \end{macrocode} -% \subsection{\csh{XINT_factortens}, \csh{XINT_cuz_cnt}} -% \lverb|Old routines.| +% \subsection{\csh{XINT_factortens}} +% \lverb|This is the core macro for \xintREZ. To be used as +% \romannumeral0\XINT_factortens{...}. Output is A.N. (formerly {A}{N}) where +% A is the integer stripped from trailing zeroes and N is the number of +% removed zeroes. Only for positive strict integers! +% +% Completely rewritten at 1.3a to replace a double \xintReverseOrder by a +% direct \numexpr governed expansion to the end and back, Ã la 1.2. I should +% comment more... and perhaps improve again in future. +% +% Testing shows significant gain at 100 digits or more.| +% \begin{macrocode} +\def\XINT_factortens #1{\expandafter\XINT_factortens_z + \romannumeral0\XINT_factortens_a#1% + \XINT_factortens_b123456789.}% +\def\XINT_factortens_z.\XINT_factortens_y{ }% +\def\XINT_factortens_a #1#2#3#4#5#6#7#8#9% + {\expandafter\XINT_factortens_x + \the\numexpr 1#1#2#3#4#5#6#7#8#9\XINT_factortens_a}% +\def\XINT_factortens_b#1\XINT_factortens_a#2#3.% + {.\XINT_factortens_cc 000000000-#2.}% +\def\XINT_factortens_x1#1.#2{#2#1}% +\def\XINT_factortens_y{.\XINT_factortens_y}% +\def\XINT_factortens_cc #1#2#3#4#5#6#7#8#9% + {\if#90\xint_dothis + {\expandafter\XINT_factortens_d\the\numexpr #8#7#6#5#4#3#2#1\relax + \xint_c_i 2345678.}\fi + \xint_orthat{\XINT_factortens_yy{#1#2#3#4#5#6#7#8#9}}}% +\def\XINT_factortens_yy #1#2.{.\XINT_factortens_y#1.0.}% +\def\XINT_factortens_c #1#2#3#4#5#6#7#8#9% + {\if#90\xint_dothis + {\expandafter\XINT_factortens_d\the\numexpr #8#7#6#5#4#3#2#1\relax + \xint_c_i 2345678.}\fi + \xint_orthat{.\XINT_factortens_y #1#2#3#4#5#6#7#8#9.}}% +\def\XINT_factortens_d #1#2#3#4#5#6#7#8#9% + {\if#10\expandafter\XINT_factortens_e\fi + \XINT_factortens_f #9#9#8#7#6#5#4#3#2#1.}% +\def\XINT_factortens_f #1#2\xint_c_i#3.#4.#5.% + {\expandafter\XINT_factortens_g\the\numexpr#1+#5.#3.}% +\def\XINT_factortens_g #1.#2.{.\XINT_factortens_y#2.#1.}% +\def\XINT_factortens_e #1..#2.% + {\expandafter.\expandafter\XINT_factortens_c + \the\numexpr\xint_c_ix+#2.}% +% \end{macrocode} +% \subsection{\xintListWithSep{, } +% {\xintApply{ \csh}{{xintEq}{xintNotEq}{xintGt}{xintLt}{xintGtorEq} +% {xintLtorEq}{xintIsZero}{xintIsNotZero}{xintIsOne}{xintOdd} +% {xintEven}{xintifSgn}{xintifCmp}{xintifEq}{xintifGt}{xintifLt} +% {xintifZero}{xintifNotZero}{xintifOne}{xintifOdd}}}} +% +% \lverb|Moved here at 1.3. Formerly these macros were already defined in +% xint.sty or even xintcore.sty. They are slim wrappers of macros defined +% elsewhere in xintfrac.| % \begin{macrocode} -\def\XINT_factortens #1% -{% - \expandafter\XINT_cuz_cnt_loop\expandafter - {\expandafter}\romannumeral0\XINT_rord_main {}#1% - \xint: - \xint_bye\xint_bye\xint_bye\xint_bye - \xint_bye\xint_bye\xint_bye\xint_bye - \xint: - \R\R\R\R\R\R\R\R\Z -}% -\def\XINT_cuz_cnt #1% -{% - \XINT_cuz_cnt_loop {}#1\R\R\R\R\R\R\R\R\Z -}% -\def\XINT_cuz_cnt_loop #1#2#3#4#5#6#7#8#9% +\def\xintEq {\romannumeral0\xinteq }% +\def\xinteq #1#2{\xintifeq{#1}{#2}{1}{0}}% +\def\xintNotEq#1#2{\romannumeral0\xintifeq {#1}{#2}{0}{1}}% +\def\xintGt {\romannumeral0\xintgt }% +\def\xintgt #1#2{\xintifgt{#1}{#2}{1}{0}}% +\def\xintLt {\romannumeral0\xintlt }% +\def\xintlt #1#2{\xintiflt{#1}{#2}{1}{0}}% +\def\xintGtorEq #1#2{\romannumeral0\xintiflt {#1}{#2}{0}{1}}% +\def\xintLtorEq #1#2{\romannumeral0\xintifgt {#1}{#2}{0}{1}}% +\def\xintIsZero {\romannumeral0\xintiszero }% +\def\xintiszero #1{\if0\xintSgn{#1}\xint_afterfi{ 1}\else\xint_afterfi{ 0}\fi}% +\def\xintIsNotZero{\romannumeral0\xintisnotzero }% +\def\xintisnotzero + #1{\if0\xintSgn{#1}\xint_afterfi{ 0}\else\xint_afterfi{ 1}\fi}% +\def\xintIsOne {\romannumeral0\xintisone }% +\def\xintisone #1{\expandafter\XINT_isone\romannumeral0\xintnum{#1}XY}% +\def\xintOdd {\romannumeral0\xintodd }% +\def\xintodd #1% {% - \xint_gob_til_R #9\XINT_cuz_cnt_toofara \R - \expandafter\XINT_cuz_cnt_checka\expandafter - {\the\numexpr #1+8\relax}{#2#3#4#5#6#7#8#9}% + \ifodd\xintLDg{\xintNum{#1}} %<- intentional space + \xint_afterfi{ 1}% + \else + \xint_afterfi{ 0}% + \fi }% -\def\XINT_cuz_cnt_toofara\R - \expandafter\XINT_cuz_cnt_checka\expandafter #1#2% +\def\xintEven {\romannumeral0\xinteven }% +\def\xinteven #1% {% - \XINT_cuz_cnt_toofarb {#1}#2% + \ifodd\xintLDg{\xintNum{#1}} %<- intentional space + \xint_afterfi{ 0}% + \else + \xint_afterfi{ 1}% + \fi }% -\def\XINT_cuz_cnt_toofarb #1#2\Z {\XINT_cuz_cnt_toofarc #2\Z {#1}}% -\def\XINT_cuz_cnt_toofarc #1#2#3#4#5#6#7#8% +\def\xintifSgn{\romannumeral0\xintifsgn }% +\def\xintifsgn #1% {% - \xint_gob_til_R #2\XINT_cuz_cnt_toofard 7% - #3\XINT_cuz_cnt_toofard 6% - #4\XINT_cuz_cnt_toofard 5% - #5\XINT_cuz_cnt_toofard 4% - #6\XINT_cuz_cnt_toofard 3% - #7\XINT_cuz_cnt_toofard 2% - #8\XINT_cuz_cnt_toofard 1% - \Z #1#2#3#4#5#6#7#8% + \ifcase \xintSgn{#1} + \expandafter\xint_secondofthree_thenstop + \or\expandafter\xint_thirdofthree_thenstop + \else\expandafter\xint_firstofthree_thenstop + \fi }% -\def\XINT_cuz_cnt_toofard #1#2\Z #3\R #4\Z #5% +\def\xintifCmp{\romannumeral0\xintifcmp }% +\def\xintifcmp #1#2% {% - \expandafter\XINT_cuz_cnt_toofare - \the\numexpr #3\relax \R\R\R\R\R\R\R\R\Z - {\the\numexpr #5-#1\relax}\R\Z + \ifcase\xintCmp {#1}{#2} + \expandafter\xint_secondofthree_thenstop + \or\expandafter\xint_thirdofthree_thenstop + \else\expandafter\xint_firstofthree_thenstop + \fi }% -\def\XINT_cuz_cnt_toofare #1#2#3#4#5#6#7#8% +\def\xintifEq {\romannumeral0\xintifeq }% +\def\xintifeq #1#2% {% - \xint_gob_til_R #2\XINT_cuz_cnt_stopc 1% - #3\XINT_cuz_cnt_stopc 2% - #4\XINT_cuz_cnt_stopc 3% - #5\XINT_cuz_cnt_stopc 4% - #6\XINT_cuz_cnt_stopc 5% - #7\XINT_cuz_cnt_stopc 6% - #8\XINT_cuz_cnt_stopc 7% - \Z #1#2#3#4#5#6#7#8% + \if0\xintCmp{#1}{#2}% + \expandafter\xint_firstoftwo_thenstop + \else\expandafter\xint_secondoftwo_thenstop + \fi }% -\def\XINT_cuz_cnt_checka #1#2% +\def\xintifGt {\romannumeral0\xintifgt }% +\def\xintifgt #1#2% {% - \expandafter\XINT_cuz_cnt_checkb\the\numexpr #2\relax \Z {#1}% + \if1\xintCmp{#1}{#2}% + \expandafter\xint_firstoftwo_thenstop + \else\expandafter\xint_secondoftwo_thenstop + \fi }% -\def\XINT_cuz_cnt_checkb #1% +\def\xintifLt {\romannumeral0\xintiflt }% +\def\xintiflt #1#2% {% - \xint_gob_til_zero #1\expandafter\XINT_cuz_cnt_loop\xint_gob_til_Z - 0\XINT_cuz_cnt_stopa #1% + \ifnum\xintCmp{#1}{#2}<\xint_c_ + \expandafter\xint_firstoftwo_thenstop + \else \expandafter\xint_secondoftwo_thenstop + \fi }% -\def\XINT_cuz_cnt_stopa #1\Z +\def\xintifZero {\romannumeral0\xintifzero }% +\def\xintifzero #1% {% - \XINT_cuz_cnt_stopb #1\R\R\R\R\R\R\R\R\Z % + \if0\xintSgn{#1}% + \expandafter\xint_firstoftwo_thenstop + \else + \expandafter\xint_secondoftwo_thenstop + \fi }% -\def\XINT_cuz_cnt_stopb #1#2#3#4#5#6#7#8#9% +\def\xintifNotZero{\romannumeral0\xintifnotzero }% +\def\xintifnotzero #1% {% - \xint_gob_til_R #2\XINT_cuz_cnt_stopc 1% - #3\XINT_cuz_cnt_stopc 2% - #4\XINT_cuz_cnt_stopc 3% - #5\XINT_cuz_cnt_stopc 4% - #6\XINT_cuz_cnt_stopc 5% - #7\XINT_cuz_cnt_stopc 6% - #8\XINT_cuz_cnt_stopc 7% - #9\XINT_cuz_cnt_stopc 8% - \Z #1#2#3#4#5#6#7#8#9% + \if0\xintSgn{#1}% + \expandafter\xint_secondoftwo_thenstop + \else + \expandafter\xint_firstoftwo_thenstop + \fi }% -\def\XINT_cuz_cnt_stopc #1#2\Z #3\R #4\Z #5% +\def\xintifOne {\romannumeral0\xintifone }% +\def\xintifone #1% {% - \expandafter\XINT_cuz_cnt_stopd\expandafter - {\the\numexpr #5-#1}#3% + \if1\xintIsOne{#1}% + \expandafter\xint_firstoftwo_thenstop + \else + \expandafter\xint_secondoftwo_thenstop + \fi }% -\def\XINT_cuz_cnt_stopd #1#2\R #3\Z +\def\xintifOdd {\romannumeral0\xintifodd }% +\def\xintifodd #1% {% - \expandafter\space\expandafter - {\romannumeral0\XINT_rord_main {}#2% - \xint: - \xint_bye\xint_bye\xint_bye\xint_bye - \xint_bye\xint_bye\xint_bye\xint_bye - \xint:}{#1}% + \if\xintOdd{#1}1% + \expandafter\xint_firstoftwo_thenstop + \else + \expandafter\xint_secondoftwo_thenstop + \fi }% % \end{macrocode} % \subsection{\csh{xintRaw}} @@ -26397,7 +26406,10 @@ This is not possible because they all got removed at 1.3!}}% }% % \end{macrocode} % \subsection{\csh{xintREZ}} -% \lverb|Removes trailing zeros from A and B and adjust the N in A/B[N].| +% \lverb|Removes trailing zeros from A and B and adjust the N in A/B[N]. +% +% The macro really doing the job \XINT_factortens was redone at 1.3a. But +% speed gain really noticeable only beyond about 100 digits.| % \begin{macrocode} \def\xintREZ {\romannumeral0\xintrez }% \def\xintrez @@ -26422,16 +26434,15 @@ This is not possible because they all got removed at 1.3!}}% {% \expandafter\XINT_rez_C\romannumeral0\XINT_factortens {#1}% }% -\def\XINT_rez_C #1#2#3#4% +\def\XINT_rez_C #1.#2.#3#4% {% - \expandafter\XINT_rez_D\romannumeral0\XINT_factortens {#4}{#3}{#2}{#1}% + \expandafter\XINT_rez_D\romannumeral0\XINT_factortens {#4}#3+#2.#1.% }% -\def\XINT_rez_D #1#2#3#4#5% +\def\XINT_rez_D #1.#2.#3.% {% - \expandafter\XINT_rez_E\expandafter - {\the\numexpr #3+#4-#2}{#1}{#5}% + \expandafter\XINT_rez_E\the\numexpr #3-#2.#1.% }% -\def\XINT_rez_E #1#2#3{ #3/#2[#1]}% +\def\XINT_rez_E #1.#2.#3.{ #3/#2[#1]}% % \end{macrocode} % \subsection{\csh{xintE}} % \lverb|1.07: The fraction is the first argument contrarily to \xintTrunc and @@ -30178,23 +30189,17 @@ This is not possible because they all got removed at 1.3!}}% }% \def\XINT_infloatdivmod #1#2#3{ #1,\XINTinFloat[#3]{#2}}% % \end{macrocode} -% \subsection*{At End of \LaTeX\ Document deprecation message} -% \addcontentsline{toc}{subsection}{At End of \LaTeX\ Document deprecation message} -% \lverb|1.2o. Updated at 1.3 which actually removed the macros.| -% \begin{macrocode} -\ifdefined\documentclass\ifdefined\AtEndDocument - \AtEndDocument{% -\XINT_ifFlagRaised{Deprecated-xintfrac}% - {\PackageError{xintfrac} -{Usage of deprecated macros!} -{This deprecated macro from xintfrac.sty has been detected:\MessageBreak -%\XINT_ifFlagRaised{xintNeq}{% -\string\xintNeq\space(use \string\xintNotEq\space or xint's \string\xintiiNotEq!)\MessageBreak -%}{}% -This is impossible as it has been removed at 1.3!}}% - {% no deprecated macro used (at top level...) - }% -}\fi\fi +% \subsection{\csh{xintifFloatInt}} +% \begin{macrocode} +\def\xintifFloatInt {\romannumeral0\xintiffloatint}% +\def\xintiffloatint #1{\expandafter\XINT_iffloatint + \romannumeral0\xintrez{\XINTinFloat[\XINTdigits]{#1}}}% +\def\XINT_iffloatint #1#2/1[#3]% +{% + \if 0#1\xint_dothis\xint_firstoftwo_thenstop\fi + \ifnum#3<\xint_c_\xint_dothis\xint_secondoftwo_thenstop\fi + \xint_orthat\xint_firstoftwo_thenstop +}% \XINT_restorecatcodes_endinput% % \end{macrocode} % @@ -30270,7 +30275,7 @@ This is impossible as it has been removed at 1.3!}}% % \begin{macrocode} \XINT_providespackage \ProvidesPackage{xintseries}% - [2018/03/01 1.3 Expandable partial sums with xint package (JFB)]% + [2018/03/07 1.3a Expandable partial sums with xint package (JFB)]% % \end{macrocode} % \subsection{\csh{xintSeries}} % \begin{macrocode} @@ -30771,7 +30776,7 @@ This is impossible as it has been removed at 1.3!}}% % \begin{macrocode} \XINT_providespackage \ProvidesPackage{xintcfrac}% - [2018/03/01 1.3 Expandable continued fractions with xint package (JFB)]% + [2018/03/07 1.3a Expandable continued fractions with xint package (JFB)]% % \end{macrocode} % \subsection{\csh{xintCFrac}} % \begin{macrocode} @@ -32022,7 +32027,7 @@ This is impossible as it has been removed at 1.3!}}% % \begin{macrocode} \XINT_providespackage \ProvidesPackage{xintexpr}% - [2018/03/01 1.3 Expandable expression parser (JFB)]% + [2018/03/07 1.3a Expandable expression parser (JFB)]% \catcode`! 11 \let\XINT_Cmp \xintiiCmp % \end{macrocode} @@ -35598,20 +35603,50 @@ This is impossible as it has been removed at 1.3!}}% }% \let\XINT_flexpr_func_reversed\XINT_expr_func_reversed \let\XINT_iiexpr_func_reversed\XINT_expr_func_reversed -\def\xintifNotZero: #1,#2,#3,{\xintiiifNotZero{#1}{#2}{#3}}% +\def\xintiiifNotZero: #1,#2,#3,{\xintiiifNotZero{#1}{#2}{#3}}% \def\XINT_expr_func_if #1#2#3% {% \expandafter #1\expandafter #2\csname.=% - \expandafter\xintifNotZero:% + \expandafter\xintiiifNotZero:% \romannumeral`&&@\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\xintifInt: #1,#2,#3,{\xintifInt{#1}{#2}{#3}}% +\def\XINT_expr_func_ifint #1#2#3% +{% + \expandafter #1\expandafter #2\csname.=% + \expandafter\xintifInt:% + \romannumeral`&&@\XINT_expr_unlock #3,\endcsname +}% +\let\XINT_iiexpr_func_ifint\XINT_expr_func_ifint +\def\xintifFloatInt: #1,#2,#3,{\xintifFloatInt{#1}{#2}{#3}}% +\def\XINT_flexpr_func_ifint #1#2#3% +{% + \expandafter #1\expandafter #2\csname.=% + \expandafter\xintifFloatInt:% + \romannumeral`&&@\XINT_expr_unlock #3,\endcsname +}% +\def\xintifOne: #1,#2,#3,{\xintifOne{#1}{#2}{#3}}% +\def\XINT_expr_func_ifone #1#2#3% +{% + \expandafter #1\expandafter #2\csname.=% + \expandafter\xintifOne:% + \romannumeral`&&@\XINT_expr_unlock #3,\endcsname +}% +\let\XINT_flexpr_func_ifone\XINT_expr_func_ifone +\def\xintiiifOne: #1,#2,#3,{\xintiiifOne{#1}{#2}{#3}}% +\def\XINT_iiexpr_func_ifone #1#2#3% +{% + \expandafter #1\expandafter #2\csname.=% + \expandafter\xintiiifOne:% + \romannumeral`&&@\XINT_expr_unlock #3,\endcsname +}% +\def\xintiiifSgn: #1,#2,#3,#4,{\xintiiifSgn{#1}{#2}{#3}{#4}}% \def\XINT_expr_func_ifsgn #1#2#3% {% \expandafter #1\expandafter #2\csname.=% - \expandafter\xintifSgn:% + \expandafter\xintiiifSgn:% \romannumeral`&&@\XINT_expr_unlock #3,\endcsname }% \let\XINT_flexpr_func_ifsgn\XINT_expr_func_ifsgn @@ -35789,7 +35824,7 @@ This is impossible as it has been removed at 1.3!}}% {\csname XINT_#1_userfunc_#2\expandafter\endcsname \romannumeral0\xintcsvtolistnonstripped{#3}}% \def\XINT:newexpr:userfunc #1#2#3% - {~csname XINT_#1_userfunc_#2~endcsname\xintCSVtoListNonStripped{#3}}% + {~xintExpandArgs{XINT_#1_userfunc_#2}{\xintCSVtoListNonStripped{#3}}}% % \end{macrocode} % \subsection{\csh{xintNewFunction}} % \lverb|1.2h (2016/11/20). Syntax is \xintNewFunction{<name>}[nb of @@ -36068,20 +36103,52 @@ This is impossible as it has been removed at 1.3!}}% \XINT:NE:two#3{#1}{#2}% }% \let\XINT:newflexpr:two:to:one\XINT:newexpr:two:to:one -\def\xintifNotZeroNE:#1#2,#3,#4,% +\def\xintiiifNotZeroNE:#1#2,#3,#4,% +{% + \if1\if###11\else\if~#11\else\if$#11\else0%$ + \fi\fi\fi + \xint_dothis{~xintiiifNotZero}\fi + \xint_orthat\xintiiifNotZero + {#1#2}{#3}{#4}% +}% +\def\xintifIntNE:#1#2,#3,#4,% +{% + \if1\if###11\else\if~#11\else\if$#11\else0%$ + \fi\fi\fi + \xint_dothis{~xintifInt}\fi + \xint_orthat\xintifInt + {#1#2}{#3}{#4}% +}% +\def\xintifFloatIntNE:#1#2,#3,#4,% +{% + \if1\if###11\else\if~#11\else\if$#11\else0%$ + \fi\fi\fi + \xint_dothis{~xintifFloatInt}\fi + \xint_orthat\xintifFloatInt + {#1#2}{#3}{#4}% +}% +\def\xintiiifOneNE:#1#2,#3,#4,% +{% + \if1\if###11\else\if~#11\else\if$#11\else0%$ + \fi\fi\fi + \xint_dothis{~xintiiifOne}\fi + \xint_orthat\xintiiifOne + {#1#2}{#3}{#4}% +}% +\def\xintifOneNE:#1#2,#3,#4,% {% \if1\if###11\else\if~#11\else\if$#11\else0%$ \fi\fi\fi - \xint_dothis{~xintifNotZero}\fi - \xint_orthat\xintifNotZero + \xint_dothis{~xintifOne}\fi + \xint_orthat\xintifOne {#1#2}{#3}{#4}% }% -\def\xintifSgnNE:#1#2,#3,#4,#5,% +\def\xintiiifSgnNE:#1#2,#3,#4,#5,% {% \if1\if###11\else\if~#11\else\if$#11\else0%$ \fi\fi\fi - \xint_dothis{~xintifSgn}\fi - \xint_orthat\xintifSgn + \xint_dothis{~xintiiifSgn}\fi + \xint_orthat\xintiiifSgn {#1#2}{#3}{#4}{#5}% }% % \end{macrocode} @@ -36101,8 +36168,12 @@ This is impossible as it has been removed at 1.3!}}% \let\XINT:expr:two:to:one \XINT:newexpr:two:to:one \let\XINT:flexpr:two:to:two \XINT:newflexpr:two:to:two \let\XINT:flexpr:two:to:one \XINT:newflexpr:two:to:one - \let\xintifNotZero: \xintifNotZeroNE: - \let\xintifSgn: \xintifSgnNE: + \let\xintiiifNotZero: \xintiiifNotZeroNE: + \let\xintifInt: \xintifIntNE: + \let\xintifFloatInt: \xintifFloatIntNE: + \let\xintiiifOne: \xintiiifOneNE: + \let\xintifOne: \xintifOneNE: + \let\xintiiifSgn: \xintiiifSgnNE: \let\xintSeqNumeric::csv \xintSeq::csv \let\xintiiSeqNumeric::csv \xintiiSeq::csv \let\XINTinFloatSeqNumeric::csv \XINTinFloatSeq::csv @@ -36309,31 +36380,31 @@ This is impossible as it has been removed at 1.3!}}% xint.sty:161 xintbinhex.sty:53 xintcfrac.sty:183 -xintcore.sty:275 -xintexpr.sty:235 -xintfrac.sty:467 +xintcore.sty:274 +xintexpr.sty:243 +xintfrac.sty:455 xintgcd.sty:49 xintkernel.sty:13 xintseries.sty:48 xinttools.sty:140 \fi % grep -o "^{%" xint*sty | wc -l -\def\totala{ 1624} +\def\totala{ 1619} \iffalse % grep -c -e "^}%" xint*sty xint.sty:160 xintbinhex.sty:52 xintcfrac.sty:183 -xintcore.sty:272 -xintexpr.sty:260 -xintfrac.sty:468 +xintcore.sty:271 +xintexpr.sty:268 +xintfrac.sty:456 xintgcd.sty:51 xintkernel.sty:14 xintseries.sty:48 xinttools.sty:139 \fi % grep -o "^}%" xint*sty | wc -l -\def\totalb{ 1647} +\def\totalb{ 1642} \DeleteShortVerb{\|} \def\mymacro #1{\mymacroaux #1} \def\mymacroaux #1#2{\strut \csname #1nameimp\endcsname:& \dtt{ #2.}\tabularnewline } @@ -36370,7 +36441,7 @@ xinttools.sty:139 Right bracket \] Circumflex \^ Underscore \_ Grave accent \` Left brace \{ Vertical bar \| Right brace \} Tilde \~} -\CheckSum {30621}% 30988 pour 1.2q, 30982 pour 1.2p +\CheckSum {30482}% 30621 pour 1.3, 30988 pour 1.2q, 30982 pour 1.2p % 30524 pour 1.2o, 30303 pour 1.2h, 30403 pour 1.2i, 30750 pour 1.2j, % 30677 pour 1.2k, 30931 pour 1.2l, 30439 pour 1.2m, 30253 pour 1.2n \makeatletter\check@checksum\makeatother diff --git a/Master/texmf-dist/source/generic/xint/xint.ins b/Master/texmf-dist/source/generic/xint/xint.ins index 98288e16bb7..c579a7112bb 100644 --- a/Master/texmf-dist/source/generic/xint/xint.ins +++ b/Master/texmf-dist/source/generic/xint/xint.ins @@ -21,7 +21,7 @@ %% same distribution. (The sources need not necessarily be %% in the same archive or directory.) %% --------------------------------------------------------------- -%% The xint bundle 1.3 2018/03/01 +%% The xint bundle 1.3a 2018/03/07 %% Copyright (C) 2013-2018 by Jean-Francois Burnol %% --------------------------------------------------------------- %% diff --git a/Master/texmf-dist/tex/generic/xint/xint.sty b/Master/texmf-dist/tex/generic/xint/xint.sty index 4cebabc2f3f..80548342812 100644 --- a/Master/texmf-dist/tex/generic/xint/xint.sty +++ b/Master/texmf-dist/tex/generic/xint/xint.sty @@ -21,7 +21,7 @@ %% same distribution. (The sources need not necessarily be %% in the same archive or directory.) %% --------------------------------------------------------------- -%% The xint bundle 1.3 2018/03/01 +%% The xint bundle 1.3a 2018/03/07 %% Copyright (C) 2013-2018 by Jean-Francois Burnol %% xint: Expandable operations on big integers %% --------------------------------------------------------------- @@ -70,7 +70,7 @@ \XINTsetupcatcodes% defined in xintkernel.sty (loaded by xintcore.sty) \XINT_providespackage \ProvidesPackage{xint}% - [2018/03/01 1.3 Expandable operations on big integers (JFB)]% + [2018/03/07 1.3a Expandable operations on big integers (JFB)]% \long\def\xint_firstofthree #1#2#3{#1}% \long\def\xint_secondofthree #1#2#3{#2}% \long\def\xint_thirdofthree #1#2#3{#3}% @@ -1372,51 +1372,6 @@ \def\xintBool #1{\romannumeral`&&@% \csname if#1\endcsname\expandafter1\else\expandafter0\fi }% \def\xintToggle #1{\romannumeral`&&@\iftoggle{#1}{1}{0}}% -\ifdefined\documentclass\ifdefined\AtEndDocument - \AtEndDocument{% -\XINT_ifFlagRaised{Deprecated-xint}% - {\PackageError{xint} -{Usage of deprecated macros!} -{These deprecated macros from xint.sty have been detected:\MessageBreak -\XINT_useiimessage{xintEq}% -\XINT_useiimessage{xintGeq}% -\XINT_useiimessage{xintGt}% -\XINT_useiimessage{xintLt}% -\XINT_useiimessage{xintGtorEq}% -\XINT_useiimessage{xintLtorEq}% -\XINT_useiimessage{xintIsZero}% -\XINT_useiimessage{xintIsNotZero}% -\XINT_useiimessage{xintIsOne}% -\XINT_useiimessage{xintOdd}% -\XINT_useiimessage{xintEven}% -\XINT_useiimessage{xintifSgn}% -\XINT_useiimessage{xintifCmp}% -\XINT_useiimessage{xintifEq}% -\XINT_useiimessage{xintifGt}% -\XINT_useiimessage{xintifLt}% -\XINT_useiimessage{xintifZero}% -\XINT_useiimessage{xintifNotZero}% -\XINT_useiimessage{xintifOne}% -\XINT_useiimessage{xintifOdd}% -\XINT_ifFlagRaised{xintNeq}% - {\string\xintNeq\space(use \string\xintiiNotEq\space or \string\xintNotEq\space from xintfrac!)\MessageBreak}{}% -\XINT_ifFlagRaised{xintNot}% - {\string\xintNot\space(renamed to \string\xintNOT!)\MessageBreak}{}% -\XINT_ifFlagRaised{xintMON}{\string\xintMON\MessageBreak}{}% -\XINT_ifFlagRaised{xintMMON}{\string\xintMMON\MessageBreak}{}% -\XINT_ifFlagRaised{xintiMax}{\string\xintiMax\MessageBreak}{}% -\XINT_ifFlagRaised{xintiMin}{\string\xintiMin\MessageBreak}{}% -\XINT_ifFlagRaised{xintiMaxof}{\string\xintiMaxof\MessageBreak}{}% -\XINT_ifFlagRaised{xintiMinof}{\string\xintiMinof\MessageBreak}{}% -\XINT_ifFlagRaised{xintiSquareRoot}{\string\xintiSquareRoot\MessageBreak}{}% -\XINT_ifFlagRaised{xintiSqrt}{\string\xintiSqrt\MessageBreak}{}% -\XINT_ifFlagRaised{xintiSqrtR}{\string\xintiSqrtR\MessageBreak}{}% -\XINT_ifFlagRaised{xintiBinomial}{\string\xintiBinomial\MessageBreak}{}% -\XINT_ifFlagRaised{xintiPFactorial}{\string\xintiPFactorial\MessageBreak}{}% -This is not possible because they all got removed at 1.3!}}% - {% no deprecated macro used (at top level...) - }% -}\fi\fi \XINT_restorecatcodes_endinput% \endinput %% diff --git a/Master/texmf-dist/tex/generic/xint/xintbinhex.sty b/Master/texmf-dist/tex/generic/xint/xintbinhex.sty index 1391e129f79..78c9566ce06 100644 --- a/Master/texmf-dist/tex/generic/xint/xintbinhex.sty +++ b/Master/texmf-dist/tex/generic/xint/xintbinhex.sty @@ -21,7 +21,7 @@ %% same distribution. (The sources need not necessarily be %% in the same archive or directory.) %% --------------------------------------------------------------- -%% The xint bundle 1.3 2018/03/01 +%% The xint bundle 1.3a 2018/03/07 %% Copyright (C) 2013-2018 by Jean-Francois Burnol %% xintbinhex: Expandable binary and hexadecimal conversions %% --------------------------------------------------------------- @@ -70,7 +70,7 @@ \XINTsetupcatcodes% defined in xintkernel.sty \XINT_providespackage \ProvidesPackage{xintbinhex}% - [2018/03/01 1.3 Expandable binary and hexadecimal conversions (JFB)]% + [2018/03/07 1.3a Expandable binary and hexadecimal conversions (JFB)]% \newcount\xint_c_ii^xv \xint_c_ii^xv 32768 \newcount\xint_c_ii^xvi \xint_c_ii^xvi 65536 \def\XINT_tmpa #1{\ifx\relax#1\else diff --git a/Master/texmf-dist/tex/generic/xint/xintcfrac.sty b/Master/texmf-dist/tex/generic/xint/xintcfrac.sty index 6eea46114c3..e402cc59e6a 100644 --- a/Master/texmf-dist/tex/generic/xint/xintcfrac.sty +++ b/Master/texmf-dist/tex/generic/xint/xintcfrac.sty @@ -21,7 +21,7 @@ %% same distribution. (The sources need not necessarily be %% in the same archive or directory.) %% --------------------------------------------------------------- -%% The xint bundle 1.3 2018/03/01 +%% The xint bundle 1.3a 2018/03/07 %% Copyright (C) 2013-2018 by Jean-Francois Burnol %% xintcfrac: Expandable continued fractions with xint package %% --------------------------------------------------------------- @@ -70,7 +70,7 @@ \XINTsetupcatcodes% defined in xintkernel.sty \XINT_providespackage \ProvidesPackage{xintcfrac}% - [2018/03/01 1.3 Expandable continued fractions with xint package (JFB)]% + [2018/03/07 1.3a Expandable continued fractions with xint package (JFB)]% \def\xintCFrac {\romannumeral0\xintcfrac }% \def\xintcfrac #1% {% diff --git a/Master/texmf-dist/tex/generic/xint/xintcore.sty b/Master/texmf-dist/tex/generic/xint/xintcore.sty index d947fbc48fe..e33963a9c30 100644 --- a/Master/texmf-dist/tex/generic/xint/xintcore.sty +++ b/Master/texmf-dist/tex/generic/xint/xintcore.sty @@ -21,7 +21,7 @@ %% same distribution. (The sources need not necessarily be %% in the same archive or directory.) %% --------------------------------------------------------------- -%% The xint bundle 1.3 2018/03/01 +%% The xint bundle 1.3a 2018/03/07 %% Copyright (C) 2013-2018 by Jean-Francois Burnol %% xintcore: Expandable arithmetic on big integers %% --------------------------------------------------------------- @@ -70,7 +70,7 @@ \XINTsetupcatcodes% defined in xintkernel.sty \XINT_providespackage \ProvidesPackage{xintcore}% - [2018/03/01 1.3 Expandable arithmetic on big integers (JFB)]% + [2018/03/07 1.3a Expandable arithmetic on big integers (JFB)]% \csname XINT_Clamped_istrapped\endcsname \csname XINT_ConversionSyntax_istrapped\endcsname \csname XINT_DivisionByZero_istrapped\endcsname @@ -2196,42 +2196,6 @@ \xint_c_x^viii+#1*(#1+\xint_c_i)*(#1+\xint_c_ii)*(#1+\xint_c_iii)!% }% \def\XINT_fac_loop_exit #1!#2;!#3{#3#2;!}% -\def\XINT_signaldeprecated #1#2% -{% - \XINT_ifFlagRaised{#2}% - {}% already encountered (if not hidden in a group...) - {\XINT_RaiseFlag{Deprecated-#1}\XINT_RaiseFlag{#2}% - \expandafter\XINT_expandableerror\expandafter - {\csname#2\endcsname (#1) is deprecated! (RET to proceed)}}% -}% -\ifdefined\documentclass\ifdefined\AtEndDocument - \AtEndDocument{% -\XINT_ifFlagRaised{Deprecated-xintcore}% - {\PackageError{xintcore} -{Usage of deprecated macros!} -{These deprecated macros from xintcore.sty have been detected:\MessageBreak -\XINT_useiimessage{xintSgn}% -\XINT_useiimessage{xintCmp}% -\XINT_ifFlagRaised{xintiOpp}{\string\xintiOpp\MessageBreak}{}% -\XINT_ifFlagRaised{xintiAbs}{\string\xintiAbs\MessageBreak}{}% -\XINT_ifFlagRaised{xintiiFDg}{\string\xintiiFDg\space(renamed to \string\xintFDg!)\MessageBreak}{}% -\XINT_ifFlagRaised{xintiiLDg}{\string\xintiiLDg\space(renamed to \string\xintLDg!)\MessageBreak}{}% -\XINT_ifFlagRaised{xintiAdd}{\string\xintiAdd\MessageBreak}{}% -\XINT_ifFlagRaised{xintiSub}{\string\xintiSub\MessageBreak}{}% -\XINT_ifFlagRaised{xintiMul}{\string\xintiMul\MessageBreak}{}% -\XINT_ifFlagRaised{xintiDivision}{\string\xintiDivision\MessageBreak}{}% -\XINT_ifFlagRaised{xintiQuo}{\string\xintiQuo\MessageBreak}{}% -\XINT_ifFlagRaised{xintiRem}{\string\xintiRem\MessageBreak}{}% -\XINT_ifFlagRaised{xintiDivRound}{\string\xintiDivRound\MessageBreak}{}% -\XINT_ifFlagRaised{xintiDivTrunc}{\string\xintiDivTrunc\MessageBreak}{}% -\XINT_ifFlagRaised{xintiMod}{\string\xintiMod\MessageBreak}{}% -\XINT_ifFlagRaised{xintiSqr}{\string\xintiSqr\MessageBreak}{}% -\XINT_ifFlagRaised{xintiPow}{\string\xintiPow\MessageBreak}{}% -\XINT_ifFlagRaised{xintiFac}{\string\xintiFac\MessageBreak}{}% -This is not possible because they all got removed from xintcore at 1.3!}}% - {% no deprecated macro used (at top level...) - }% -}\fi\fi \def\XINT_useiimessage #1% used in LaTeX only {% \XINT_ifFlagRaised {#1}% diff --git a/Master/texmf-dist/tex/generic/xint/xintexpr.sty b/Master/texmf-dist/tex/generic/xint/xintexpr.sty index 979511d5410..68fa92e62d3 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.3 2018/03/01 +%% The xint bundle 1.3a 2018/03/07 %% Copyright (C) 2013-2018 by Jean-Francois Burnol %% xintexpr: Expandable expression parser %% --------------------------------------------------------------- @@ -81,7 +81,7 @@ \XINTsetupcatcodes% \XINT_providespackage \ProvidesPackage{xintexpr}% - [2018/03/01 1.3 Expandable expression parser (JFB)]% + [2018/03/07 1.3a Expandable expression parser (JFB)]% \catcode`! 11 \let\XINT_Cmp \xintiiCmp \def\xint_gob_til_! #1!{}% ! with catcode 11 @@ -2543,20 +2543,50 @@ }% \let\XINT_flexpr_func_reversed\XINT_expr_func_reversed \let\XINT_iiexpr_func_reversed\XINT_expr_func_reversed -\def\xintifNotZero: #1,#2,#3,{\xintiiifNotZero{#1}{#2}{#3}}% +\def\xintiiifNotZero: #1,#2,#3,{\xintiiifNotZero{#1}{#2}{#3}}% \def\XINT_expr_func_if #1#2#3% {% \expandafter #1\expandafter #2\csname.=% - \expandafter\xintifNotZero:% + \expandafter\xintiiifNotZero:% \romannumeral`&&@\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\xintifInt: #1,#2,#3,{\xintifInt{#1}{#2}{#3}}% +\def\XINT_expr_func_ifint #1#2#3% +{% + \expandafter #1\expandafter #2\csname.=% + \expandafter\xintifInt:% + \romannumeral`&&@\XINT_expr_unlock #3,\endcsname +}% +\let\XINT_iiexpr_func_ifint\XINT_expr_func_ifint +\def\xintifFloatInt: #1,#2,#3,{\xintifFloatInt{#1}{#2}{#3}}% +\def\XINT_flexpr_func_ifint #1#2#3% +{% + \expandafter #1\expandafter #2\csname.=% + \expandafter\xintifFloatInt:% + \romannumeral`&&@\XINT_expr_unlock #3,\endcsname +}% +\def\xintifOne: #1,#2,#3,{\xintifOne{#1}{#2}{#3}}% +\def\XINT_expr_func_ifone #1#2#3% +{% + \expandafter #1\expandafter #2\csname.=% + \expandafter\xintifOne:% + \romannumeral`&&@\XINT_expr_unlock #3,\endcsname +}% +\let\XINT_flexpr_func_ifone\XINT_expr_func_ifone +\def\xintiiifOne: #1,#2,#3,{\xintiiifOne{#1}{#2}{#3}}% +\def\XINT_iiexpr_func_ifone #1#2#3% +{% + \expandafter #1\expandafter #2\csname.=% + \expandafter\xintiiifOne:% + \romannumeral`&&@\XINT_expr_unlock #3,\endcsname +}% +\def\xintiiifSgn: #1,#2,#3,#4,{\xintiiifSgn{#1}{#2}{#3}{#4}}% \def\XINT_expr_func_ifsgn #1#2#3% {% \expandafter #1\expandafter #2\csname.=% - \expandafter\xintifSgn:% + \expandafter\xintiiifSgn:% \romannumeral`&&@\XINT_expr_unlock #3,\endcsname }% \let\XINT_flexpr_func_ifsgn\XINT_expr_func_ifsgn @@ -2687,7 +2717,7 @@ {\csname XINT_#1_userfunc_#2\expandafter\endcsname \romannumeral0\xintcsvtolistnonstripped{#3}}% \def\XINT:newexpr:userfunc #1#2#3% - {~csname XINT_#1_userfunc_#2~endcsname\xintCSVtoListNonStripped{#3}}% + {~xintExpandArgs{XINT_#1_userfunc_#2}{\xintCSVtoListNonStripped{#3}}}% \def\XINT_expr_wrapit #1{\expandafter\XINT_expr_wrap\csname.=#1\endcsname}% \def\xintNewFunction #1#2[#3]#4% {% @@ -2861,20 +2891,52 @@ \XINT:NE:two#3{#1}{#2}% }% \let\XINT:newflexpr:two:to:one\XINT:newexpr:two:to:one -\def\xintifNotZeroNE:#1#2,#3,#4,% +\def\xintiiifNotZeroNE:#1#2,#3,#4,% +{% + \if1\if###11\else\if~#11\else\if$#11\else0%$ + \fi\fi\fi + \xint_dothis{~xintiiifNotZero}\fi + \xint_orthat\xintiiifNotZero + {#1#2}{#3}{#4}% +}% +\def\xintifIntNE:#1#2,#3,#4,% +{% + \if1\if###11\else\if~#11\else\if$#11\else0%$ + \fi\fi\fi + \xint_dothis{~xintifInt}\fi + \xint_orthat\xintifInt + {#1#2}{#3}{#4}% +}% +\def\xintifFloatIntNE:#1#2,#3,#4,% +{% + \if1\if###11\else\if~#11\else\if$#11\else0%$ + \fi\fi\fi + \xint_dothis{~xintifFloatInt}\fi + \xint_orthat\xintifFloatInt + {#1#2}{#3}{#4}% +}% +\def\xintiiifOneNE:#1#2,#3,#4,% +{% + \if1\if###11\else\if~#11\else\if$#11\else0%$ + \fi\fi\fi + \xint_dothis{~xintiiifOne}\fi + \xint_orthat\xintiiifOne + {#1#2}{#3}{#4}% +}% +\def\xintifOneNE:#1#2,#3,#4,% {% \if1\if###11\else\if~#11\else\if$#11\else0%$ \fi\fi\fi - \xint_dothis{~xintifNotZero}\fi - \xint_orthat\xintifNotZero + \xint_dothis{~xintifOne}\fi + \xint_orthat\xintifOne {#1#2}{#3}{#4}% }% -\def\xintifSgnNE:#1#2,#3,#4,#5,% +\def\xintiiifSgnNE:#1#2,#3,#4,#5,% {% \if1\if###11\else\if~#11\else\if$#11\else0%$ \fi\fi\fi - \xint_dothis{~xintifSgn}\fi - \xint_orthat\xintifSgn + \xint_dothis{~xintiiifSgn}\fi + \xint_orthat\xintiiifSgn {#1#2}{#3}{#4}{#5}% }% \def\XINT_expr_redefinemacros {% @@ -2890,8 +2952,12 @@ \let\XINT:expr:two:to:one \XINT:newexpr:two:to:one \let\XINT:flexpr:two:to:two \XINT:newflexpr:two:to:two \let\XINT:flexpr:two:to:one \XINT:newflexpr:two:to:one - \let\xintifNotZero: \xintifNotZeroNE: - \let\xintifSgn: \xintifSgnNE: + \let\xintiiifNotZero: \xintiiifNotZeroNE: + \let\xintifInt: \xintifIntNE: + \let\xintifFloatInt: \xintifFloatIntNE: + \let\xintiiifOne: \xintiiifOneNE: + \let\xintifOne: \xintifOneNE: + \let\xintiiifSgn: \xintiiifSgnNE: \let\xintSeqNumeric::csv \xintSeq::csv \let\xintiiSeqNumeric::csv \xintiiSeq::csv \let\XINTinFloatSeqNumeric::csv \XINTinFloatSeq::csv diff --git a/Master/texmf-dist/tex/generic/xint/xintfrac.sty b/Master/texmf-dist/tex/generic/xint/xintfrac.sty index 8a5fec10550..4c727e3f522 100644 --- a/Master/texmf-dist/tex/generic/xint/xintfrac.sty +++ b/Master/texmf-dist/tex/generic/xint/xintfrac.sty @@ -21,7 +21,7 @@ %% same distribution. (The sources need not necessarily be %% in the same archive or directory.) %% --------------------------------------------------------------- -%% The xint bundle 1.3 2018/03/01 +%% The xint bundle 1.3a 2018/03/07 %% Copyright (C) 2013-2018 by Jean-Francois Burnol %% xintfrac: Expandable operations on fractions %% --------------------------------------------------------------- @@ -75,119 +75,7 @@ \XINTsetupcatcodes% defined in xintkernel.sty \XINT_providespackage \ProvidesPackage{xintfrac}% - [2018/03/01 1.3 Expandable operations on fractions (JFB)]% -\def\xintEq {\romannumeral0\xinteq }% -\def\xinteq #1#2{\xintifeq{#1}{#2}{1}{0}}% -\def\xintNotEq#1#2{\romannumeral0\xintifeq {#1}{#2}{0}{1}}% -\def\xintGt {\romannumeral0\xintgt }% -\def\xintgt #1#2{\xintifgt{#1}{#2}{1}{0}}% -\def\xintLt {\romannumeral0\xintlt }% -\def\xintlt #1#2{\xintiflt{#1}{#2}{1}{0}}% -\def\xintGtorEq #1#2{\romannumeral0\xintiflt {#1}{#2}{0}{1}}% -\def\xintLtorEq #1#2{\romannumeral0\xintifgt {#1}{#2}{0}{1}}% -\def\xintIsZero {\romannumeral0\xintiszero }% -\def\xintiszero #1{\if0\xintSgn{#1}\xint_afterfi{ 1}\else\xint_afterfi{ 0}\fi}% -\def\xintIsNotZero{\romannumeral0\xintisnotzero }% -\def\xintisnotzero - #1{\if0\xintSgn{#1}\xint_afterfi{ 0}\else\xint_afterfi{ 1}\fi}% -\def\xintIsOne {\romannumeral0\xintisone }% -\def\xintisone #1{\expandafter\XINT_isone\romannumeral0\xintnum{#1}XY}% -\def\xintOdd {\romannumeral0\xintodd }% -\def\xintodd #1% -{% - \ifodd\xintLDg{\xintNum{#1}} %<- intentional space - \xint_afterfi{ 1}% - \else - \xint_afterfi{ 0}% - \fi -}% -\def\xintEven {\romannumeral0\xinteven }% -\def\xinteven #1% -{% - \ifodd\xintLDg{\xintNum{#1}} %<- intentional space - \xint_afterfi{ 0}% - \else - \xint_afterfi{ 1}% - \fi -}% -\def\xintifSgn{\romannumeral0\xintifsgn }% -\def\xintifsgn #1% -{% - \ifcase \xintSgn{#1} - \expandafter\xint_secondofthree_thenstop - \or\expandafter\xint_thirdofthree_thenstop - \else\expandafter\xint_firstofthree_thenstop - \fi -}% -\def\xintifCmp{\romannumeral0\xintifcmp }% -\def\xintifcmp #1#2% -{% - \ifcase\xintCmp {#1}{#2} - \expandafter\xint_secondofthree_thenstop - \or\expandafter\xint_thirdofthree_thenstop - \else\expandafter\xint_firstofthree_thenstop - \fi -}% -\def\xintifEq {\romannumeral0\xintifeq }% -\def\xintifeq #1#2% -{% - \if0\xintCmp{#1}{#2}% - \expandafter\xint_firstoftwo_thenstop - \else\expandafter\xint_secondoftwo_thenstop - \fi -}% -\def\xintifGt {\romannumeral0\xintifgt }% -\def\xintifgt #1#2% -{% - \if1\xintCmp{#1}{#2}% - \expandafter\xint_firstoftwo_thenstop - \else\expandafter\xint_secondoftwo_thenstop - \fi -}% -\def\xintifLt {\romannumeral0\xintiflt }% -\def\xintiflt #1#2% -{% - \ifnum\xintCmp{#1}{#2}<\xint_c_ - \expandafter\xint_firstoftwo_thenstop - \else \expandafter\xint_secondoftwo_thenstop - \fi -}% -\def\xintifZero {\romannumeral0\xintifzero }% -\def\xintifzero #1% -{% - \if0\xintSgn{#1}% - \expandafter\xint_firstoftwo_thenstop - \else - \expandafter\xint_secondoftwo_thenstop - \fi -}% -\def\xintifNotZero{\romannumeral0\xintifnotzero }% -\def\xintifnotzero #1% -{% - \if0\xintSgn{#1}% - \expandafter\xint_secondoftwo_thenstop - \else - \expandafter\xint_firstoftwo_thenstop - \fi -}% -\def\xintifOne {\romannumeral0\xintifone }% -\def\xintifone #1% -{% - \if1\xintIsOne{#1}% - \expandafter\xint_firstoftwo_thenstop - \else - \expandafter\xint_secondoftwo_thenstop - \fi -}% -\def\xintifOdd {\romannumeral0\xintifodd }% -\def\xintifodd #1% -{% - \if\xintOdd{#1}1% - \expandafter\xint_firstoftwo_thenstop - \else - \expandafter\xint_secondoftwo_thenstop - \fi -}% + [2018/03/07 1.3a Expandable operations on fractions (JFB)]% \def\XINT_cntSgnFork #1% {% \ifcase #1\expandafter\xint_secondofthree @@ -367,98 +255,148 @@ {#3}{#1#2}% }% \def\XINT_frac_gen_zero 0#1#2#3{{0}{0}{1}}% -\def\XINT_factortens #1% -{% - \expandafter\XINT_cuz_cnt_loop\expandafter - {\expandafter}\romannumeral0\XINT_rord_main {}#1% - \xint: - \xint_bye\xint_bye\xint_bye\xint_bye - \xint_bye\xint_bye\xint_bye\xint_bye - \xint: - \R\R\R\R\R\R\R\R\Z -}% -\def\XINT_cuz_cnt #1% -{% - \XINT_cuz_cnt_loop {}#1\R\R\R\R\R\R\R\R\Z -}% -\def\XINT_cuz_cnt_loop #1#2#3#4#5#6#7#8#9% +\def\XINT_factortens #1{\expandafter\XINT_factortens_z + \romannumeral0\XINT_factortens_a#1% + \XINT_factortens_b123456789.}% +\def\XINT_factortens_z.\XINT_factortens_y{ }% +\def\XINT_factortens_a #1#2#3#4#5#6#7#8#9% + {\expandafter\XINT_factortens_x + \the\numexpr 1#1#2#3#4#5#6#7#8#9\XINT_factortens_a}% +\def\XINT_factortens_b#1\XINT_factortens_a#2#3.% + {.\XINT_factortens_cc 000000000-#2.}% +\def\XINT_factortens_x1#1.#2{#2#1}% +\def\XINT_factortens_y{.\XINT_factortens_y}% +\def\XINT_factortens_cc #1#2#3#4#5#6#7#8#9% + {\if#90\xint_dothis + {\expandafter\XINT_factortens_d\the\numexpr #8#7#6#5#4#3#2#1\relax + \xint_c_i 2345678.}\fi + \xint_orthat{\XINT_factortens_yy{#1#2#3#4#5#6#7#8#9}}}% +\def\XINT_factortens_yy #1#2.{.\XINT_factortens_y#1.0.}% +\def\XINT_factortens_c #1#2#3#4#5#6#7#8#9% + {\if#90\xint_dothis + {\expandafter\XINT_factortens_d\the\numexpr #8#7#6#5#4#3#2#1\relax + \xint_c_i 2345678.}\fi + \xint_orthat{.\XINT_factortens_y #1#2#3#4#5#6#7#8#9.}}% +\def\XINT_factortens_d #1#2#3#4#5#6#7#8#9% + {\if#10\expandafter\XINT_factortens_e\fi + \XINT_factortens_f #9#9#8#7#6#5#4#3#2#1.}% +\def\XINT_factortens_f #1#2\xint_c_i#3.#4.#5.% + {\expandafter\XINT_factortens_g\the\numexpr#1+#5.#3.}% +\def\XINT_factortens_g #1.#2.{.\XINT_factortens_y#2.#1.}% +\def\XINT_factortens_e #1..#2.% + {\expandafter.\expandafter\XINT_factortens_c + \the\numexpr\xint_c_ix+#2.}% +\def\xintEq {\romannumeral0\xinteq }% +\def\xinteq #1#2{\xintifeq{#1}{#2}{1}{0}}% +\def\xintNotEq#1#2{\romannumeral0\xintifeq {#1}{#2}{0}{1}}% +\def\xintGt {\romannumeral0\xintgt }% +\def\xintgt #1#2{\xintifgt{#1}{#2}{1}{0}}% +\def\xintLt {\romannumeral0\xintlt }% +\def\xintlt #1#2{\xintiflt{#1}{#2}{1}{0}}% +\def\xintGtorEq #1#2{\romannumeral0\xintiflt {#1}{#2}{0}{1}}% +\def\xintLtorEq #1#2{\romannumeral0\xintifgt {#1}{#2}{0}{1}}% +\def\xintIsZero {\romannumeral0\xintiszero }% +\def\xintiszero #1{\if0\xintSgn{#1}\xint_afterfi{ 1}\else\xint_afterfi{ 0}\fi}% +\def\xintIsNotZero{\romannumeral0\xintisnotzero }% +\def\xintisnotzero + #1{\if0\xintSgn{#1}\xint_afterfi{ 0}\else\xint_afterfi{ 1}\fi}% +\def\xintIsOne {\romannumeral0\xintisone }% +\def\xintisone #1{\expandafter\XINT_isone\romannumeral0\xintnum{#1}XY}% +\def\xintOdd {\romannumeral0\xintodd }% +\def\xintodd #1% {% - \xint_gob_til_R #9\XINT_cuz_cnt_toofara \R - \expandafter\XINT_cuz_cnt_checka\expandafter - {\the\numexpr #1+8\relax}{#2#3#4#5#6#7#8#9}% + \ifodd\xintLDg{\xintNum{#1}} %<- intentional space + \xint_afterfi{ 1}% + \else + \xint_afterfi{ 0}% + \fi }% -\def\XINT_cuz_cnt_toofara\R - \expandafter\XINT_cuz_cnt_checka\expandafter #1#2% +\def\xintEven {\romannumeral0\xinteven }% +\def\xinteven #1% {% - \XINT_cuz_cnt_toofarb {#1}#2% + \ifodd\xintLDg{\xintNum{#1}} %<- intentional space + \xint_afterfi{ 0}% + \else + \xint_afterfi{ 1}% + \fi }% -\def\XINT_cuz_cnt_toofarb #1#2\Z {\XINT_cuz_cnt_toofarc #2\Z {#1}}% -\def\XINT_cuz_cnt_toofarc #1#2#3#4#5#6#7#8% +\def\xintifSgn{\romannumeral0\xintifsgn }% +\def\xintifsgn #1% {% - \xint_gob_til_R #2\XINT_cuz_cnt_toofard 7% - #3\XINT_cuz_cnt_toofard 6% - #4\XINT_cuz_cnt_toofard 5% - #5\XINT_cuz_cnt_toofard 4% - #6\XINT_cuz_cnt_toofard 3% - #7\XINT_cuz_cnt_toofard 2% - #8\XINT_cuz_cnt_toofard 1% - \Z #1#2#3#4#5#6#7#8% + \ifcase \xintSgn{#1} + \expandafter\xint_secondofthree_thenstop + \or\expandafter\xint_thirdofthree_thenstop + \else\expandafter\xint_firstofthree_thenstop + \fi }% -\def\XINT_cuz_cnt_toofard #1#2\Z #3\R #4\Z #5% +\def\xintifCmp{\romannumeral0\xintifcmp }% +\def\xintifcmp #1#2% {% - \expandafter\XINT_cuz_cnt_toofare - \the\numexpr #3\relax \R\R\R\R\R\R\R\R\Z - {\the\numexpr #5-#1\relax}\R\Z + \ifcase\xintCmp {#1}{#2} + \expandafter\xint_secondofthree_thenstop + \or\expandafter\xint_thirdofthree_thenstop + \else\expandafter\xint_firstofthree_thenstop + \fi }% -\def\XINT_cuz_cnt_toofare #1#2#3#4#5#6#7#8% +\def\xintifEq {\romannumeral0\xintifeq }% +\def\xintifeq #1#2% {% - \xint_gob_til_R #2\XINT_cuz_cnt_stopc 1% - #3\XINT_cuz_cnt_stopc 2% - #4\XINT_cuz_cnt_stopc 3% - #5\XINT_cuz_cnt_stopc 4% - #6\XINT_cuz_cnt_stopc 5% - #7\XINT_cuz_cnt_stopc 6% - #8\XINT_cuz_cnt_stopc 7% - \Z #1#2#3#4#5#6#7#8% + \if0\xintCmp{#1}{#2}% + \expandafter\xint_firstoftwo_thenstop + \else\expandafter\xint_secondoftwo_thenstop + \fi }% -\def\XINT_cuz_cnt_checka #1#2% +\def\xintifGt {\romannumeral0\xintifgt }% +\def\xintifgt #1#2% {% - \expandafter\XINT_cuz_cnt_checkb\the\numexpr #2\relax \Z {#1}% + \if1\xintCmp{#1}{#2}% + \expandafter\xint_firstoftwo_thenstop + \else\expandafter\xint_secondoftwo_thenstop + \fi }% -\def\XINT_cuz_cnt_checkb #1% +\def\xintifLt {\romannumeral0\xintiflt }% +\def\xintiflt #1#2% {% - \xint_gob_til_zero #1\expandafter\XINT_cuz_cnt_loop\xint_gob_til_Z - 0\XINT_cuz_cnt_stopa #1% + \ifnum\xintCmp{#1}{#2}<\xint_c_ + \expandafter\xint_firstoftwo_thenstop + \else \expandafter\xint_secondoftwo_thenstop + \fi }% -\def\XINT_cuz_cnt_stopa #1\Z +\def\xintifZero {\romannumeral0\xintifzero }% +\def\xintifzero #1% {% - \XINT_cuz_cnt_stopb #1\R\R\R\R\R\R\R\R\Z % + \if0\xintSgn{#1}% + \expandafter\xint_firstoftwo_thenstop + \else + \expandafter\xint_secondoftwo_thenstop + \fi }% -\def\XINT_cuz_cnt_stopb #1#2#3#4#5#6#7#8#9% +\def\xintifNotZero{\romannumeral0\xintifnotzero }% +\def\xintifnotzero #1% {% - \xint_gob_til_R #2\XINT_cuz_cnt_stopc 1% - #3\XINT_cuz_cnt_stopc 2% - #4\XINT_cuz_cnt_stopc 3% - #5\XINT_cuz_cnt_stopc 4% - #6\XINT_cuz_cnt_stopc 5% - #7\XINT_cuz_cnt_stopc 6% - #8\XINT_cuz_cnt_stopc 7% - #9\XINT_cuz_cnt_stopc 8% - \Z #1#2#3#4#5#6#7#8#9% + \if0\xintSgn{#1}% + \expandafter\xint_secondoftwo_thenstop + \else + \expandafter\xint_firstoftwo_thenstop + \fi }% -\def\XINT_cuz_cnt_stopc #1#2\Z #3\R #4\Z #5% +\def\xintifOne {\romannumeral0\xintifone }% +\def\xintifone #1% {% - \expandafter\XINT_cuz_cnt_stopd\expandafter - {\the\numexpr #5-#1}#3% + \if1\xintIsOne{#1}% + \expandafter\xint_firstoftwo_thenstop + \else + \expandafter\xint_secondoftwo_thenstop + \fi }% -\def\XINT_cuz_cnt_stopd #1#2\R #3\Z +\def\xintifOdd {\romannumeral0\xintifodd }% +\def\xintifodd #1% {% - \expandafter\space\expandafter - {\romannumeral0\XINT_rord_main {}#2% - \xint: - \xint_bye\xint_bye\xint_bye\xint_bye - \xint_bye\xint_bye\xint_bye\xint_bye - \xint:}{#1}% + \if\xintOdd{#1}1% + \expandafter\xint_firstoftwo_thenstop + \else + \expandafter\xint_secondoftwo_thenstop + \fi }% \def\xintRaw {\romannumeral0\xintraw }% \def\xintraw @@ -689,16 +627,15 @@ {% \expandafter\XINT_rez_C\romannumeral0\XINT_factortens {#1}% }% -\def\XINT_rez_C #1#2#3#4% +\def\XINT_rez_C #1.#2.#3#4% {% - \expandafter\XINT_rez_D\romannumeral0\XINT_factortens {#4}{#3}{#2}{#1}% + \expandafter\XINT_rez_D\romannumeral0\XINT_factortens {#4}#3+#2.#1.% }% -\def\XINT_rez_D #1#2#3#4#5% +\def\XINT_rez_D #1.#2.#3.% {% - \expandafter\XINT_rez_E\expandafter - {\the\numexpr #3+#4-#2}{#1}{#5}% + \expandafter\XINT_rez_E\the\numexpr #3-#2.#1.% }% -\def\XINT_rez_E #1#2#3{ #3/#2[#1]}% +\def\XINT_rez_E #1.#2.#3.{ #3/#2[#1]}% \def\xintE {\romannumeral0\xinte }% \def\xinte #1% {% @@ -3276,17 +3213,15 @@ {#1}% }% \def\XINT_infloatdivmod #1#2#3{ #1,\XINTinFloat[#3]{#2}}% -\ifdefined\documentclass\ifdefined\AtEndDocument - \AtEndDocument{% -\XINT_ifFlagRaised{Deprecated-xintfrac}% - {\PackageError{xintfrac} -{Usage of deprecated macros!} -{This deprecated macro from xintfrac.sty has been detected:\MessageBreak -\string\xintNeq\space(use \string\xintNotEq\space or xint's \string\xintiiNotEq!)\MessageBreak -This is impossible as it has been removed at 1.3!}}% - {% no deprecated macro used (at top level...) - }% -}\fi\fi +\def\xintifFloatInt {\romannumeral0\xintiffloatint}% +\def\xintiffloatint #1{\expandafter\XINT_iffloatint + \romannumeral0\xintrez{\XINTinFloat[\XINTdigits]{#1}}}% +\def\XINT_iffloatint #1#2/1[#3]% +{% + \if 0#1\xint_dothis\xint_firstoftwo_thenstop\fi + \ifnum#3<\xint_c_\xint_dothis\xint_secondoftwo_thenstop\fi + \xint_orthat\xint_firstoftwo_thenstop +}% \XINT_restorecatcodes_endinput% \endinput %% diff --git a/Master/texmf-dist/tex/generic/xint/xintgcd.sty b/Master/texmf-dist/tex/generic/xint/xintgcd.sty index d9afbfbdaff..43a1c1c3ee8 100644 --- a/Master/texmf-dist/tex/generic/xint/xintgcd.sty +++ b/Master/texmf-dist/tex/generic/xint/xintgcd.sty @@ -21,7 +21,7 @@ %% same distribution. (The sources need not necessarily be %% in the same archive or directory.) %% --------------------------------------------------------------- -%% The xint bundle 1.3 2018/03/01 +%% The xint bundle 1.3a 2018/03/07 %% Copyright (C) 2013-2018 by Jean-Francois Burnol %% xintgcd: Euclidean algorithm with xint package %% --------------------------------------------------------------- @@ -70,7 +70,7 @@ \XINTsetupcatcodes% defined in xintkernel.sty \XINT_providespackage \ProvidesPackage{xintgcd}% - [2018/03/01 1.3 Euclide algorithm with xint package (JFB)]% + [2018/03/07 1.3a Euclide algorithm with xint package (JFB)]% \def\xintGCD {\romannumeral0\xintgcd }% \def\xintgcd #1#2{\xintiigcd {\xintNum{#1}}{\xintNum{#2}}}% \def\xintiiGCD {\romannumeral0\xintiigcd }% diff --git a/Master/texmf-dist/tex/generic/xint/xintkernel.sty b/Master/texmf-dist/tex/generic/xint/xintkernel.sty index 480de731557..56066d5fabe 100644 --- a/Master/texmf-dist/tex/generic/xint/xintkernel.sty +++ b/Master/texmf-dist/tex/generic/xint/xintkernel.sty @@ -21,7 +21,7 @@ %% same distribution. (The sources need not necessarily be %% in the same archive or directory.) %% --------------------------------------------------------------- -%% The xint bundle 1.3 2018/03/01 +%% The xint bundle 1.3a 2018/03/07 %% Copyright (C) 2013-2018 by Jean-Francois Burnol %% xintkernel: Paraphernalia for the xint packages %% --------------------------------------------------------------- @@ -156,7 +156,7 @@ \fi \XINT_providespackage \ProvidesPackage {xintkernel}% - [2018/03/01 1.3 Paraphernalia for the xint packages (JFB)]% + [2018/03/07 1.3a Paraphernalia for the xint packages (JFB)]% \chardef\xint_c_ 0 \chardef\xint_c_i 1 \chardef\xint_c_ii 2 diff --git a/Master/texmf-dist/tex/generic/xint/xintseries.sty b/Master/texmf-dist/tex/generic/xint/xintseries.sty index f6b41030087..df418b8d4ab 100644 --- a/Master/texmf-dist/tex/generic/xint/xintseries.sty +++ b/Master/texmf-dist/tex/generic/xint/xintseries.sty @@ -21,7 +21,7 @@ %% same distribution. (The sources need not necessarily be %% in the same archive or directory.) %% --------------------------------------------------------------- -%% The xint bundle 1.3 2018/03/01 +%% The xint bundle 1.3a 2018/03/07 %% Copyright (C) 2013-2018 by Jean-Francois Burnol %% xintseries: Expandable partial sums with xint package %% --------------------------------------------------------------- @@ -70,7 +70,7 @@ \XINTsetupcatcodes% defined in xintkernel.sty \XINT_providespackage \ProvidesPackage{xintseries}% - [2018/03/01 1.3 Expandable partial sums with xint package (JFB)]% + [2018/03/07 1.3a Expandable partial sums with xint package (JFB)]% \def\xintSeries {\romannumeral0\xintseries }% \def\xintseries #1#2% {% diff --git a/Master/texmf-dist/tex/generic/xint/xinttools.sty b/Master/texmf-dist/tex/generic/xint/xinttools.sty index 3909f0a056a..6143680afb8 100644 --- a/Master/texmf-dist/tex/generic/xint/xinttools.sty +++ b/Master/texmf-dist/tex/generic/xint/xinttools.sty @@ -21,7 +21,7 @@ %% same distribution. (The sources need not necessarily be %% in the same archive or directory.) %% --------------------------------------------------------------- -%% The xint bundle 1.3 2018/03/01 +%% The xint bundle 1.3a 2018/03/07 %% Copyright (C) 2013-2018 by Jean-Francois Burnol %% xinttools: Expandable and non-expandable utilities %% --------------------------------------------------------------- @@ -70,7 +70,7 @@ \XINTsetupcatcodes% defined in xintkernel.sty \XINT_providespackage \ProvidesPackage{xinttools}% - [2018/03/01 1.3 Expandable and non-expandable utilities (JFB)]% + [2018/03/07 1.3a Expandable and non-expandable utilities (JFB)]% \newtoks\XINT_toks \xint_firstofone{\let\XINT_sptoken= } %<- space here! \def\xintgodef {\global\xintodef }% @@ -1143,6 +1143,8 @@ }% }% \let\xintDigitsOf\xintAssignArray +\def\xintExpandArgs#1#2{\csname #1\expandafter\endcsname + \romannumeral0\xintapply\xint_firstofone{#2}}% \def\xintLength:f:csv {\romannumeral0\xintlength:f:csv}% \def\xintlength:f:csv #1% {\long\def\xintlength:f:csv ##1{% |