texlive[63436] Master/texmf-dist: xint (29may22)

commits+karl at tug.org commits+karl at tug.org
Sun May 29 22:36:02 CEST 2022


Revision: 63436
          http://tug.org/svn/texlive?view=revision&revision=63436
Author:   karl
Date:     2022-05-29 22:36:02 +0200 (Sun, 29 May 2022)
Log Message:
-----------
xint (29may22)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/generic/xint/CHANGES.html
    trunk/Master/texmf-dist/doc/generic/xint/README.md
    trunk/Master/texmf-dist/doc/generic/xint/sourcexint.pdf
    trunk/Master/texmf-dist/doc/generic/xint/xint.pdf
    trunk/Master/texmf-dist/source/generic/xint/Makefile
    trunk/Master/texmf-dist/source/generic/xint/xint.dtx
    trunk/Master/texmf-dist/tex/generic/xint/xint.sty
    trunk/Master/texmf-dist/tex/generic/xint/xintbinhex.sty
    trunk/Master/texmf-dist/tex/generic/xint/xintcfrac.sty
    trunk/Master/texmf-dist/tex/generic/xint/xintcore.sty
    trunk/Master/texmf-dist/tex/generic/xint/xintexpr.sty
    trunk/Master/texmf-dist/tex/generic/xint/xintfrac.sty
    trunk/Master/texmf-dist/tex/generic/xint/xintgcd.sty
    trunk/Master/texmf-dist/tex/generic/xint/xintkernel.sty
    trunk/Master/texmf-dist/tex/generic/xint/xintlog.sty
    trunk/Master/texmf-dist/tex/generic/xint/xintseries.sty
    trunk/Master/texmf-dist/tex/generic/xint/xinttools.sty
    trunk/Master/texmf-dist/tex/generic/xint/xinttrig.sty

Modified: trunk/Master/texmf-dist/doc/generic/xint/CHANGES.html
===================================================================
--- trunk/Master/texmf-dist/doc/generic/xint/CHANGES.html	2022-05-29 10:40:23 UTC (rev 63435)
+++ trunk/Master/texmf-dist/doc/generic/xint/CHANGES.html	2022-05-29 20:36:02 UTC (rev 63436)
@@ -4,7 +4,7 @@
   <meta charset="utf-8" />
   <meta name="generator" content="pandoc" />
   <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
-  <meta name="author" content="xint 1.4k" />
+  <meta name="author" content="xint 1.4l" />
   <title>CHANGE LOG</title>
   <style>
     html {
@@ -170,35 +170,44 @@
 <body>
 <header id="title-block-header">
 <h1 class="title">CHANGE LOG</h1>
-<p class="author">xint 1.4k</p>
-<p class="date">2022/05/18</p>
+<p class="author">xint 1.4l</p>
+<p class="date">2022/05/29</p>
 </header>
 <nav id="TOC" role="doc-toc">
 <ul>
+<li><a href="#l-20220529"
+id="toc-l-20220529"><code>1.4l (2022/05/29)</code></a>
+<ul>
+<li><a href="#bug-fixes" id="toc-bug-fixes">Bug fixes</a></li>
+<li><a href="#new-features" id="toc-new-features">New features</a></li>
+<li><a href="#documentation"
+id="toc-documentation">Documentation</a></li>
+</ul></li>
 <li><a href="#k-20220518"
 id="toc-k-20220518"><code>1.4k (2022/05/18)</code></a>
 <ul>
 <li><a href="#breaking-changes" id="toc-breaking-changes">Breaking
 changes</a></li>
-<li><a href="#bug-fixes" id="toc-bug-fixes">Bug fixes</a></li>
-<li><a href="#new-features" id="toc-new-features">New features</a></li>
+<li><a href="#bug-fixes-1" id="toc-bug-fixes-1">Bug fixes</a></li>
+<li><a href="#new-features-1" id="toc-new-features-1">New
+features</a></li>
 </ul></li>
 <li><a href="#j-20210713"
 id="toc-j-20210713"><code>1.4j (2021/07/13)</code></a>
 <ul>
-<li><a href="#bug-fixes-1" id="toc-bug-fixes-1">Bug fixes</a></li>
+<li><a href="#bug-fixes-2" id="toc-bug-fixes-2">Bug fixes</a></li>
 </ul></li>
 <li><a href="#i-20210611"
 id="toc-i-20210611"><code>1.4i (2021/06/11)</code></a>
 <ul>
-<li><a href="#new-features-1" id="toc-new-features-1">New
+<li><a href="#new-features-2" id="toc-new-features-2">New
 features</a></li>
-<li><a href="#bug-fixes-2" id="toc-bug-fixes-2">Bug fixes</a></li>
+<li><a href="#bug-fixes-3" id="toc-bug-fixes-3">Bug fixes</a></li>
 </ul></li>
 <li><a href="#h-20210527"
 id="toc-h-20210527"><code>1.4h (2021/05/27)</code></a>
 <ul>
-<li><a href="#bug-fixes-3" id="toc-bug-fixes-3">Bug fixes</a></li>
+<li><a href="#bug-fixes-4" id="toc-bug-fixes-4">Bug fixes</a></li>
 </ul></li>
 <li><a href="#g-20210525"
 id="toc-g-20210525"><code>1.4g (2021/05/25)</code></a>
@@ -206,9 +215,9 @@
 <li><a href="#breaking-changes-1" id="toc-breaking-changes-1">Breaking
 changes</a></li>
 <li><a href="#deprecated" id="toc-deprecated">Deprecated</a></li>
-<li><a href="#new-features-2" id="toc-new-features-2">New
+<li><a href="#new-features-3" id="toc-new-features-3">New
 features</a></li>
-<li><a href="#bug-fixes-4" id="toc-bug-fixes-4">Bug fixes</a></li>
+<li><a href="#bug-fixes-5" id="toc-bug-fixes-5">Bug fixes</a></li>
 </ul></li>
 <li><a href="#f-20210510"
 id="toc-f-20210510"><code>1.4f (2021/05/10)</code></a>
@@ -215,7 +224,7 @@
 <ul>
 <li><a href="#breaking-changes-2" id="toc-breaking-changes-2">Breaking
 changes</a></li>
-<li><a href="#bug-fixes-5" id="toc-bug-fixes-5">Bug fixes</a></li>
+<li><a href="#bug-fixes-6" id="toc-bug-fixes-6">Bug fixes</a></li>
 </ul></li>
 <li><a href="#e-20210505"
 id="toc-e-20210505"><code>1.4e (2021/05/05)</code></a>
@@ -222,9 +231,9 @@
 <ul>
 <li><a href="#breaking-changes-3" id="toc-breaking-changes-3">Breaking
 changes</a></li>
-<li><a href="#new-features-3" id="toc-new-features-3">New
+<li><a href="#new-features-4" id="toc-new-features-4">New
 features</a></li>
-<li><a href="#bug-fixes-6" id="toc-bug-fixes-6">Bug fixes</a></li>
+<li><a href="#bug-fixes-7" id="toc-bug-fixes-7">Bug fixes</a></li>
 </ul></li>
 <li><a href="#d-20210329"
 id="toc-d-20210329"><code>1.4d (2021/03/29)</code></a>
@@ -231,20 +240,20 @@
 <ul>
 <li><a href="#breaking-changes-4" id="toc-breaking-changes-4">Breaking
 changes</a></li>
-<li><a href="#bug-fixes-7" id="toc-bug-fixes-7">Bug fixes</a></li>
+<li><a href="#bug-fixes-8" id="toc-bug-fixes-8">Bug fixes</a></li>
 </ul></li>
 <li><a href="#c-20210220"
 id="toc-c-20210220"><code>1.4c (2021/02/20)</code></a>
 <ul>
-<li><a href="#bug-fixes-8" id="toc-bug-fixes-8">Bug fixes</a></li>
+<li><a href="#bug-fixes-9" id="toc-bug-fixes-9">Bug fixes</a></li>
 </ul></li>
 <li><a href="#b-20200225"
 id="toc-b-20200225"><code>1.4b (2020/02/25)</code></a>
 <ul>
 <li><a href="#future" id="toc-future">Future</a></li>
-<li><a href="#new-features-4" id="toc-new-features-4">New
+<li><a href="#new-features-5" id="toc-new-features-5">New
 features</a></li>
-<li><a href="#bug-fixes-9" id="toc-bug-fixes-9">Bug fixes</a></li>
+<li><a href="#bug-fixes-10" id="toc-bug-fixes-10">Bug fixes</a></li>
 </ul></li>
 <li><a href="#a-20200219"
 id="toc-a-20200219"><code>1.4a (2020/02/19)</code></a>
@@ -251,9 +260,9 @@
 <ul>
 <li><a href="#breaking-changes-5" id="toc-breaking-changes-5">Breaking
 changes</a></li>
-<li><a href="#new-features-5" id="toc-new-features-5">New
+<li><a href="#new-features-6" id="toc-new-features-6">New
 features</a></li>
-<li><a href="#bug-fixes-10" id="toc-bug-fixes-10">Bug fixes</a></li>
+<li><a href="#bug-fixes-11" id="toc-bug-fixes-11">Bug fixes</a></li>
 </ul></li>
 <li><a href="#section"
 id="toc-section"><code>1.4 (2020/01/31)</code></a>
@@ -263,7 +272,7 @@
 <li><a href="#improvements-and-new-features"
 id="toc-improvements-and-new-features">Improvements and new
 features</a></li>
-<li><a href="#bug-fixes-11" id="toc-bug-fixes-11">Bug fixes</a></li>
+<li><a href="#bug-fixes-12" id="toc-bug-fixes-12">Bug fixes</a></li>
 <li><a href="#todo" id="toc-todo">TODO</a></li>
 </ul></li>
 <li><a href="#f-20190910"
@@ -272,7 +281,7 @@
 <li><a href="#improvements-and-new-features-1"
 id="toc-improvements-and-new-features-1">Improvements and new
 features</a></li>
-<li><a href="#bug-fixes-12" id="toc-bug-fixes-12">Bug fixes</a></li>
+<li><a href="#bug-fixes-13" id="toc-bug-fixes-13">Bug fixes</a></li>
 </ul></li>
 <li><a href="#e-20190405"
 id="toc-e-20190405"><code>1.3e (2019/04/05)</code></a>
@@ -282,7 +291,7 @@
 <li><a href="#improvements-and-new-features-2"
 id="toc-improvements-and-new-features-2">Improvements and new
 features</a></li>
-<li><a href="#bug-fixes-13" id="toc-bug-fixes-13">Bug fixes</a></li>
+<li><a href="#bug-fixes-14" id="toc-bug-fixes-14">Bug fixes</a></li>
 </ul></li>
 <li><a href="#d-20190106"
 id="toc-d-20190106"><code>1.3d (2019/01/06)</code></a>
@@ -292,7 +301,7 @@
 <li><a href="#improvements-and-new-features-3"
 id="toc-improvements-and-new-features-3">Improvements and new
 features</a></li>
-<li><a href="#bug-fixes-14" id="toc-bug-fixes-14">Bug fixes</a></li>
+<li><a href="#bug-fixes-15" id="toc-bug-fixes-15">Bug fixes</a></li>
 </ul></li>
 <li><a href="#c-20180617"
 id="toc-c-20180617"><code>1.3c (2018/06/17)</code></a>
@@ -300,7 +309,7 @@
 <li><a href="#improvements-and-new-features-4"
 id="toc-improvements-and-new-features-4">Improvements and new
 features</a></li>
-<li><a href="#bug-fixes-15" id="toc-bug-fixes-15">Bug fixes</a></li>
+<li><a href="#bug-fixes-16" id="toc-bug-fixes-16">Bug fixes</a></li>
 </ul></li>
 <li><a href="#b-20180518"
 id="toc-b-20180518"><code>1.3b (2018/05/18)</code></a>
@@ -316,7 +325,7 @@
 <li><a href="#improvements-and-new-features-6"
 id="toc-improvements-and-new-features-6">Improvements and new
 features</a></li>
-<li><a href="#bug-fixes-16" id="toc-bug-fixes-16">Bug fixes</a></li>
+<li><a href="#bug-fixes-17" id="toc-bug-fixes-17">Bug fixes</a></li>
 </ul></li>
 <li><a href="#section-1"
 id="toc-section-1"><code>1.3 (2018/03/01)</code></a>
@@ -333,7 +342,7 @@
 <li><a href="#improvements-and-new-features-8"
 id="toc-improvements-and-new-features-8">Improvements and new
 features</a></li>
-<li><a href="#bug-fixes-17" id="toc-bug-fixes-17">Bug fixes</a></li>
+<li><a href="#bug-fixes-18" id="toc-bug-fixes-18">Bug fixes</a></li>
 </ul></li>
 <li><a href="#p-20171205"
 id="toc-p-20171205"><code>1.2p (2017/12/05)</code></a>
@@ -343,7 +352,7 @@
 <li><a href="#improvements-and-new-features-9"
 id="toc-improvements-and-new-features-9">Improvements and new
 features</a></li>
-<li><a href="#bug-fixes-18" id="toc-bug-fixes-18">Bug fixes</a></li>
+<li><a href="#bug-fixes-19" id="toc-bug-fixes-19">Bug fixes</a></li>
 </ul></li>
 <li><a href="#o-20170829"
 id="toc-o-20170829"><code>1.2o (2017/08/29)</code></a>
@@ -369,7 +378,7 @@
 <li><a href="#improvements-and-new-features-11"
 id="toc-improvements-and-new-features-11">Improvements and new
 features</a></li>
-<li><a href="#bug-fixes-19" id="toc-bug-fixes-19">Bug fixes</a></li>
+<li><a href="#bug-fixes-20" id="toc-bug-fixes-20">Bug fixes</a></li>
 </ul></li>
 <li><a href="#l-20170726"
 id="toc-l-20170726"><code>1.2l (2017/07/26)</code></a>
@@ -378,7 +387,7 @@
 <li><a href="#improvements-and-new-features-12"
 id="toc-improvements-and-new-features-12">Improvements and new
 features</a></li>
-<li><a href="#bug-fixes-20" id="toc-bug-fixes-20">Bug fixes</a></li>
+<li><a href="#bug-fixes-21" id="toc-bug-fixes-21">Bug fixes</a></li>
 </ul></li>
 <li><a href="#k-20170106"
 id="toc-k-20170106"><code>1.2k (2017/01/06)</code></a>
@@ -388,7 +397,7 @@
 <li><a href="#improvements-and-new-features-13"
 id="toc-improvements-and-new-features-13">Improvements and new
 features</a></li>
-<li><a href="#bug-fixes-21" id="toc-bug-fixes-21">Bug fixes</a></li>
+<li><a href="#bug-fixes-22" id="toc-bug-fixes-22">Bug fixes</a></li>
 </ul></li>
 <li><a href="#j-20161222"
 id="toc-j-20161222"><code>1.2j (2016/12/22)</code></a>
@@ -396,7 +405,7 @@
 <li><a href="#improvements-and-new-features-14"
 id="toc-improvements-and-new-features-14">Improvements and new
 features</a></li>
-<li><a href="#bug-fixes-22" id="toc-bug-fixes-22">Bug fixes</a></li>
+<li><a href="#bug-fixes-23" id="toc-bug-fixes-23">Bug fixes</a></li>
 </ul></li>
 <li><a href="#i-20161213"
 id="toc-i-20161213"><code>1.2i (2016/12/13)</code></a>
@@ -407,7 +416,7 @@
 <li><a href="#improvements-and-new-features-15"
 id="toc-improvements-and-new-features-15">Improvements and new
 features</a></li>
-<li><a href="#bug-fixes-23" id="toc-bug-fixes-23">Bug fixes</a></li>
+<li><a href="#bug-fixes-24" id="toc-bug-fixes-24">Bug fixes</a></li>
 </ul></li>
 <li><a href="#h-20161120"
 id="toc-h-20161120"><code>1.2h (2016/11/20)</code></a>
@@ -415,7 +424,7 @@
 <li><a href="#improvements-and-new-features-16"
 id="toc-improvements-and-new-features-16">Improvements and new
 features</a></li>
-<li><a href="#bug-fixes-24" id="toc-bug-fixes-24">Bug fixes</a></li>
+<li><a href="#bug-fixes-25" id="toc-bug-fixes-25">Bug fixes</a></li>
 </ul></li>
 <li><a href="#g-20160319"
 id="toc-g-20160319"><code>1.2g (2016/03/19)</code></a>
@@ -434,7 +443,7 @@
 <li><a href="#improvements-and-new-features-18"
 id="toc-improvements-and-new-features-18">Improvements and new
 features</a></li>
-<li><a href="#bug-fixes-25" id="toc-bug-fixes-25">Bug fixes</a></li>
+<li><a href="#bug-fixes-26" id="toc-bug-fixes-26">Bug fixes</a></li>
 </ul></li>
 <li><a href="#e-20151122"
 id="toc-e-20151122"><code>1.2e (2015/11/22)</code></a>
@@ -442,7 +451,7 @@
 <li><a href="#improvements-and-new-features-19"
 id="toc-improvements-and-new-features-19">Improvements and new
 features</a></li>
-<li><a href="#bug-fixes-26" id="toc-bug-fixes-26">Bug fixes</a></li>
+<li><a href="#bug-fixes-27" id="toc-bug-fixes-27">Bug fixes</a></li>
 </ul></li>
 <li><a href="#d-20151118"
 id="toc-d-20151118"><code>1.2d (2015/11/18)</code></a>
@@ -450,7 +459,7 @@
 <li><a href="#improvements-and-new-features-20"
 id="toc-improvements-and-new-features-20">Improvements and new
 features</a></li>
-<li><a href="#bug-fixes-27" id="toc-bug-fixes-27">Bug fixes</a></li>
+<li><a href="#bug-fixes-28" id="toc-bug-fixes-28">Bug fixes</a></li>
 </ul></li>
 <li><a href="#c-20151116"
 id="toc-c-20151116"><code>1.2c (2015/11/16)</code></a>
@@ -458,12 +467,12 @@
 <li><a href="#improvements-and-new-features-21"
 id="toc-improvements-and-new-features-21">Improvements and new
 features</a></li>
-<li><a href="#bug-fixes-28" id="toc-bug-fixes-28">Bug fixes</a></li>
+<li><a href="#bug-fixes-29" id="toc-bug-fixes-29">Bug fixes</a></li>
 </ul></li>
 <li><a href="#b-20151029"
 id="toc-b-20151029"><code>1.2b (2015/10/29)</code></a>
 <ul>
-<li><a href="#bug-fixes-29" id="toc-bug-fixes-29">Bug fixes</a></li>
+<li><a href="#bug-fixes-30" id="toc-bug-fixes-30">Bug fixes</a></li>
 </ul></li>
 <li><a href="#a-20151019"
 id="toc-a-20151019"><code>1.2a (2015/10/19)</code></a>
@@ -471,7 +480,7 @@
 <li><a href="#improvements-and-new-features-22"
 id="toc-improvements-and-new-features-22">Improvements and new
 features</a></li>
-<li><a href="#bug-fixes-30" id="toc-bug-fixes-30">Bug fixes</a></li>
+<li><a href="#bug-fixes-31" id="toc-bug-fixes-31">Bug fixes</a></li>
 </ul></li>
 <li><a href="#section-2"
 id="toc-section-2"><code>1.2 (2015/10/10)</code></a>
@@ -497,7 +506,7 @@
 <li><a href="#improvements-and-new-features-24"
 id="toc-improvements-and-new-features-24">Improvements and new
 features</a></li>
-<li><a href="#bug-fixes-31" id="toc-bug-fixes-31">Bug fixes</a></li>
+<li><a href="#bug-fixes-32" id="toc-bug-fixes-32">Bug fixes</a></li>
 </ul></li>
 <li><a href="#n-20140401"
 id="toc-n-20140401"><code>1.09n (2014/04/01)</code></a></li>
@@ -549,10 +558,61 @@
 id="toc-section-10"><code>1.0 (2013/03/28)</code></a></li>
 </ul>
 </nav>
-<pre><code>Source:  xint.dtx 1.4k 2022/05/18 (doc 2022/05/18)
+<pre><code>Source:  xint.dtx 1.4l 2022/05/29 (doc 2022/05/29)
 Author:  Jean-Francois Burnol
 Info:    Expandable operations on big integers, decimals, fractions
 License: LPPL 1.3c</code></pre>
+<h2 id="l-20220529"><code>1.4l (2022/05/29)</code></h2>
+<h3 id="bug-fixes">Bug fixes</h3>
+<ul>
+<li><p><strong>xintkernel</strong>: ever since <code>1.4</code>, loading
+anyone of the <code>xint*sty</code> packages left the catcode of the
+character of ascii code <code>1</code> to the internal custom value
+<code>3</code>.</p></li>
+<li><p><strong>xintfrac</strong>: the <code>\xintPFloat</code> checks
+for an output being an integer in decimal notation or a number with a
+one-digit trimmed mantissa could fail if
+<code>\xintPFloatMinTrimmed</code> (added at <code>1.4k</code>) was
+large enough, e.g. equal to the target precision. Then, the outputs
+always kept trailing zeros, as expected in general but not for those
+special cases.</p></li>
+<li><p><strong>xintlog</strong>, <strong>xinttrig</strong>: since
+<code>1.4e</code> the message emitted if
+<code>\usepackage{xintlog}</code> or <code>\usepackage{xinttrig}</code>
+was encountered in place of the correct
+<code>\usepackage{xintexpr}</code> was wrong. It advised to use
+<code>\input xintexpr.sty\relax</code>, which would have failed with
+LaTeX. The warning is corrected and now the macro file in place of
+aborting will (be it with or without LaTeX) trigger the loading of
+<code>xintexpr</code> (hence of itself after it).</p></li>
+<li><p>The possibility to run <code>latex</code> directly on
+<code>xint.dtx</code> had been broken since <code>1.4i</code>.</p></li>
+</ul>
+<h3 id="new-features">New features</h3>
+<ul>
+<li><p><strong>xintfrac</strong>: <code>\xintRawBraced</code> as a
+public alias to an <strong>xintfrac</strong> entry point to its core
+input handler. Experimental additions <code>\xintSignBit</code> and
+<code>\xintFloatBraced</code>. Deprecate <code>\xintTeXfromSci</code> in
+favor of new name <code>\xintTeXFromSci</code>, and remove its
+<code>\expanded</code> wrapper (so it is not f-expandable anymore). Add
+<code>\xintTeXFromScifracmacro</code>.</p></li>
+<li><p><strong>xintfrac</strong>, <strong>xintexpr</strong>:
+<code>\xintFracToSci</code> and <code>\xintFracToDecimal</code> now
+behave like all other <strong>xintfrac</strong> macros in terms of
+allowed arguments and f-expandability and have been moved back to
+<strong>xintfrac</strong>.</p></li>
+</ul>
+<h3 id="documentation">Documentation</h3>
+<ul>
+<li><p>Renewed random shuffling of large parts of the documentation has
+greatly improved it.</p></li>
+<li><p>Simpler build flow to produce a <code>pdf</code> containing both
+user manual and source code. Removal of dependency on <code>grep</code>
+binary for such builds or the one of <code>sourcexint.pdf</code>. Fix of
+various obsoleted comments in extracted files involved in the
+documentation build process.</p></li>
+</ul>
 <h2 id="k-20220518"><code>1.4k (2022/05/18)</code></h2>
 <h3 id="breaking-changes">Breaking changes</h3>
 <ul>
@@ -559,7 +619,7 @@
 <li><p><strong>xintfrac</strong>: the longstanding (but documented as
 undecided and unstable) way of <code>\xintFloat</code> to output the
 zero value was <code>0.e0</code> and it has now been modified into
-<code>0.0e0</code>. Customizable via
+<code>0.0e0</code>. Now customizable via
 <code>\xintFloatZero</code>.</p></li>
 <li><p><strong>xintfrac</strong>/<strong>xintexpr</strong>: the
 behaviour of <code>\xintPFloat</code> (hence of
@@ -572,17 +632,17 @@
 <code>\xintPFloatLengthOneSuffix</code>, and
 <code>\xintPFloatZero</code>.</p>
 <p>Also, <code>\xintPFloat</code> trims trailing zeros from the full
-significand only if there are at least <code>4</code> of them, see
-<code>\xintPFloatMinTrimmed</code>.</p></li>
-<li><p><strong>xintfrac</strong>/<strong>xintexpr</strong>: definition
-of <code>\xintFracToSci</code> migrated from the former to the
-latter.</p></li>
+significand only if there are, by default, at least <code>4</code> of
+them, see <code>\xintPFloatMinTrimmed</code>.</p></li>
+<li><p><strong>xintfrac</strong>/<strong>xintexpr</strong>: macro
+definition of <code>\xintFracToSci</code> migrated from the former to
+the latter (see <code>1.4l</code> for update).</p></li>
 <li><p><strong>xintexpr</strong>:
 <code>\xintexpr{Safe,Restore}Catcodes</code> pairs now behave like a
 “last in first out” stack. Check the <code>pdf</code> documentation for
 details.</p></li>
 </ul>
-<h3 id="bug-fixes">Bug fixes</h3>
+<h3 id="bug-fixes-1">Bug fixes</h3>
 <ul>
 <li><p><strong>xintexpr</strong>: the
 <code>\xintexpr{Safe,Restore}Catcodes</code> were documented at user
@@ -596,7 +656,7 @@
 reset the catcodes to their status prior to the sanitization done by the
 macro at the start of its execution.</p></li>
 </ul>
-<h3 id="new-features">New features</h3>
+<h3 id="new-features-1">New features</h3>
 <ul>
 <li><p><strong>xintfrac</strong>: <code>\xintPFloatZero</code>,
 <code>\xintPFloatIntSuffix</code>,
@@ -609,7 +669,7 @@
 <li><p><strong>xintfrac</strong>:
 <code>\xintFloatToDecimal</code>.</p></li>
 <li><p><strong>xintexpr</strong>: <code>\xintFracToDecimal</code>, an
-alternative to <code>\xintFracToSci</code> for the configuration of
+alternative to the default <code>\xintFracToSci</code> configuration of
 <code>\xintexprPrintOne</code>.</p></li>
 <li><p><strong>xintexpr</strong>: long awaited syntax
 <code>\xintieval[D]{...}</code> and <code>\xintfloateval[Q]{...}</code>
@@ -618,7 +678,7 @@
 compatibility.</p></li>
 </ul>
 <h2 id="j-20210713"><code>1.4j (2021/07/13)</code></h2>
-<h3 id="bug-fixes-1">Bug fixes</h3>
+<h3 id="bug-fixes-2">Bug fixes</h3>
 <ul>
 <li><strong>xinttools</strong>: a brace removal bug affected the
 venerable <code>\xintSeq</code> if producing a single number
@@ -626,7 +686,7 @@
 <code>{10}</code>). Thanks to Christophe Poulain for report.</li>
 </ul>
 <h2 id="i-20210611"><code>1.4i (2021/06/11)</code></h2>
-<h3 id="new-features-1">New features</h3>
+<h3 id="new-features-2">New features</h3>
 <ul>
 <li><p><strong>xintexpr</strong>: the concept of simultaneous
 assignments is extended: in case of more variables than values the
@@ -641,7 +701,7 @@
 be a <code>nutple</code> (which was automatically unpacked). It can now
 again be a number.</p></li>
 </ul>
-<h3 id="bug-fixes-2">Bug fixes</h3>
+<h3 id="bug-fixes-3">Bug fixes</h3>
 <ul>
 <li><p><strong>xintexpr</strong>: simultaneous assignments via
 <code>\xintdefvar</code> to 10 or more variables was broken if the right
@@ -662,7 +722,7 @@
 <code>seq</code>.</p></li>
 </ul>
 <h2 id="h-20210527"><code>1.4h (2021/05/27)</code></h2>
-<h3 id="bug-fixes-3">Bug fixes</h3>
+<h3 id="bug-fixes-4">Bug fixes</h3>
 <ul>
 <li><p><strong>xintexpr</strong>: the recent <code>1.4g</code>
 introduced a bug breaking input of the type
@@ -697,7 +757,7 @@
 <code>\xintTeXOver</code>, <code>\xintTeXsignedOver</code>. The old
 names will emit warnings.</li>
 </ul>
-<h3 id="new-features-2">New features</h3>
+<h3 id="new-features-3">New features</h3>
 <ul>
 <li><p>Messages written to the terminal and log file during the handling
 of recovery from exceptions use a new mechanism; when in interactive
@@ -709,7 +769,7 @@
 <code>\xintfloateval</code> in a more useful way than
 <code>\xintTeXFrac</code> (formerly <code>\xintFrac</code>).</p></li>
 </ul>
-<h3 id="bug-fixes-4">Bug fixes</h3>
+<h3 id="bug-fixes-5">Bug fixes</h3>
 <ul>
 <li><p><strong>xintexpr</strong>: with <strong>xintbinhex</strong>
 loaded, <code>"</code> is recognized as prefix for hexadecimal input;
@@ -777,7 +837,7 @@
 <li><p><strong>xintexpr</strong>: the <code>float_()</code> function got
 renamed into <code>float_dgt()</code>.</p></li>
 </ul>
-<h3 id="bug-fixes-5">Bug fixes</h3>
+<h3 id="bug-fixes-6">Bug fixes</h3>
 <ul>
 <li><p><strong>xintexpr</strong>: the documentation said
 <code>float_()</code> function had been renamed <code>float_dgt()</code>
@@ -863,7 +923,7 @@
 over the process to <code>\xintPFloat</code> (without the rounding to
 Digits, of course).</p></li>
 </ul>
-<h3 id="new-features-3">New features</h3>
+<h3 id="new-features-4">New features</h3>
 <ul>
 <li><p><strong>xintlog</strong>: now working up to <code>62</code>
 digits. The legacy faster <code>poormanlog</code>-based macros are kept
@@ -888,7 +948,7 @@
 like <code>\xintDecToString</code> but starts by removing trailing
 zeroes.</p></li>
 </ul>
-<h3 id="bug-fixes-6">Bug fixes</h3>
+<h3 id="bug-fixes-7">Bug fixes</h3>
 <ul>
 <li><strong>xintfrac</strong>, <strong>xintexpr</strong>: it was not
 possible to use <code>\xinttheDigits</code> in the right hand side of an
@@ -910,7 +970,7 @@
 around the name. By the way, quotes were never used for function
 names.</p></li>
 </ul>
-<h3 id="bug-fixes-7">Bug fixes</h3>
+<h3 id="bug-fixes-8">Bug fixes</h3>
 <ul>
 <li><p>Ever since <code>1.3</code> the <code>quo()</code> and
 <code>rem()</code> functions in <code>\xintexpr</code> (not the ones in
@@ -935,7 +995,7 @@
 broken.</p></li>
 </ul>
 <h2 id="c-20210220"><code>1.4c (2021/02/20)</code></h2>
-<h3 id="bug-fixes-8">Bug fixes</h3>
+<h3 id="bug-fixes-9">Bug fixes</h3>
 <ul>
 <li>Fix <code>1.4</code> regression which broke syntax
 <code>varname(...)</code> which supposedly is allowed and inserts a
@@ -960,7 +1020,7 @@
 <code>\xintexpr</code> can be used directly in typesetting
 flow.</p></li>
 </ul>
-<h3 id="new-features-4">New features</h3>
+<h3 id="new-features-5">New features</h3>
 <ul>
 <li><p>Function <code>zip()</code> is modeled on Python’s function of
 the same name.</p></li>
@@ -977,7 +1037,7 @@
 <code>\xintfloateval</code>. The added <code>\xintPFloatE</code> fixes
 this.</p></li>
 </ul>
-<h3 id="bug-fixes-9">Bug fixes</h3>
+<h3 id="bug-fixes-10">Bug fixes</h3>
 <ul>
 <li><code>\xintieval{[D]...}</code> with a negative <code>D</code> (a
 feature added at <code>1.4a</code>) used erroneously a catcode 12
@@ -991,7 +1051,7 @@
 <li>The macros implementing customization of <code>\xintthealign</code>
 have modified meanings and names.</li>
 </ul>
-<h3 id="new-features-5">New features</h3>
+<h3 id="new-features-6">New features</h3>
 <ul>
 <li><p><code>\xintthespaceseparated</code> (serves to provide suitable
 input to PS-Tricks <code>\listplot</code>).</p></li>
@@ -1004,7 +1064,7 @@
 <code>\xintRound</code>, <code>\xintiTrunc</code>, and
 <code>\xintiRound</code> macros of <strong>xintfrac</strong>.</p></li>
 </ul>
-<h3 id="bug-fixes-10">Bug fixes</h3>
+<h3 id="bug-fixes-11">Bug fixes</h3>
 <ul>
 <li><p>Usage of <code>round()</code> and <code>trunc()</code> within
 <code>\xintdeffunc</code> got broken at <code>1.4</code>.</p></li>
@@ -1234,7 +1294,7 @@
 recognized one. But don’t expect miracles when trying to intervene in
 the midst of a purely expandable expansion…</p></li>
 </ul>
-<h3 id="bug-fixes-11">Bug fixes</h3>
+<h3 id="bug-fixes-12">Bug fixes</h3>
 <p>Bugs? Those identified in <code>1.3f</code> were almost features. As
 per <code>1.4</code> the code base of <strong>xintexpr</strong> received
 multiple successive core refactorings and added numerous new features,
@@ -1271,7 +1331,7 @@
 expressions by <code>\xintdeffunc</code>. And make them usable also
 inside macro definitions via <code>\xintNewExpr</code>.</p></li>
 </ul>
-<h3 id="bug-fixes-12">Bug fixes</h3>
+<h3 id="bug-fixes-13">Bug fixes</h3>
 <ul>
 <li><p><strong>xintexpr</strong>: fix bug preventing usage of
 <code>\xintdefefunc</code> to define a function without variables.</p>
@@ -1318,7 +1378,7 @@
 be negative; it then means to trim (and round) from the output at float
 precision that many least significant digits.</p></li>
 </ul>
-<h3 id="bug-fixes-13">Bug fixes</h3>
+<h3 id="bug-fixes-14">Bug fixes</h3>
 <ul>
 <li>Some bugfixes related to user functions with no variables at all;
 they were dysfunctional.</li>
@@ -1361,7 +1421,7 @@
 <code>\xinttheexpr...\relax</code> etc…, but with the (comma-separated)
 expression as a usual braced macro argument.</p></li>
 </ul>
-<h3 id="bug-fixes-14">Bug fixes</h3>
+<h3 id="bug-fixes-15">Bug fixes</h3>
 <ul>
 <li><strong>xintcore</strong>, <strong>xintexpr</strong> : division in
 <code>\xintiiexpr</code> was broken for a zero dividend and a one-digit
@@ -1393,7 +1453,7 @@
 <code>sourcexint.pdf</code> is better hyperlinked and includes indices
 for the macros defined by each package.</p></li>
 </ul>
-<h3 id="bug-fixes-15">Bug fixes</h3>
+<h3 id="bug-fixes-16">Bug fixes</h3>
 <ul>
 <li><strong>xintfrac</strong>: since <code>1.3</code> release, it loaded
 <strong>xintgcd</strong> in contradiction to what the documentation says
@@ -1444,7 +1504,7 @@
 <code>\xintDivFloor</code>, <code>\xintMod</code>,
 <code>\xintModTrunc</code>, which had been left out so far.</p></li>
 </ul>
-<h3 id="bug-fixes-16">Bug fixes</h3>
+<h3 id="bug-fixes-17">Bug fixes</h3>
 <ul>
 <li><strong>xintexpr</strong>: the mechanism for adjunction to the
 expression parsers of user defined functions was refactored and improved
@@ -1495,7 +1555,7 @@
 <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-17">Bug fixes</h3>
+<h3 id="bug-fixes-18">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
@@ -1543,7 +1603,7 @@
 Python language <code>divmod()</code>. Related support macros added to
 <strong>xintcore</strong>, and <strong>xintfrac</strong>.</p></li>
 </ul>
-<h3 id="bug-fixes-18">Bug fixes</h3>
+<h3 id="bug-fixes-19">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
@@ -1656,7 +1716,7 @@
 could handle tens of thousands of digits, but not in a reasonable
 time.</li>
 </ul>
-<h3 id="bug-fixes-19">Bug fixes</h3>
+<h3 id="bug-fixes-20">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
@@ -1725,7 +1785,7 @@
 interface yet, it is done in preparation for next major release and is
 completely unstable and undocumented.</p></li>
 </ul>
-<h3 id="bug-fixes-20">Bug fixes</h3>
+<h3 id="bug-fixes-21">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
@@ -1784,7 +1844,7 @@
 improved <code>\xintNewExpr</code> compatibility. Also
 <code>\xintFirstItem:f:csv</code>.</p></li>
 </ul>
-<h3 id="bug-fixes-21">Bug fixes</h3>
+<h3 id="bug-fixes-22">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
@@ -1823,7 +1883,7 @@
 except that implementation of some math functions is still
 lacking.</p></li>
 </ul>
-<h3 id="bug-fixes-22">Bug fixes</h3>
+<h3 id="bug-fixes-23">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>
@@ -1893,7 +1953,7 @@
 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-23">Bug fixes</h3>
+<h3 id="bug-fixes-24">Bug fixes</h3>
 <ul>
 <li><code>\xintDecSplitL</code> and <code>\xintDecSplitR</code> from
 <strong>xint</strong> produced their output in a spurious brace pair
@@ -1913,7 +1973,7 @@
 <code>\thexintfloatexpr</code>, and <code>\thexintiiexpr</code> are
 provided as synonyms to <code>\xinttheexpr</code>, etc…</p></li>
 </ul>
-<h3 id="bug-fixes-24">Bug fixes</h3>
+<h3 id="bug-fixes-25">Bug fixes</h3>
 <ul>
 <li><p>the <code>(cond)?{foo}{bar}</code> operator from
 <strong>xintexpr</strong> mis-behaved in certain circumstances (such as
@@ -2026,7 +2086,7 @@
 random shuffling of sections and well thought additions; cuts were
 considered and even performed.</p></li>
 </ul>
-<h3 id="bug-fixes-25">Bug fixes</h3>
+<h3 id="bug-fixes-26">Bug fixes</h3>
 <ul>
 <li><p>squaring macro <code>\xintSqr</code> from
 <strong>xintfrac.sty</strong> was broken due to a misspelled sub-macro
@@ -2056,7 +2116,7 @@
 of the xintexpr package</em> section has been extended and reviewed
 entirely.</p></li>
 </ul>
-<h3 id="bug-fixes-26">Bug fixes</h3>
+<h3 id="bug-fixes-27">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
@@ -2082,7 +2142,7 @@
 <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-27">Bug fixes</h3>
+<h3 id="bug-fixes-28">Bug fixes</h3>
 <ul>
 <li>in <strong>xintcore</strong>: release <code>1.2c</code> had
 inadvertently broken the <code>\xintiiDivRound</code> macro.</li>
@@ -2097,7 +2157,7 @@
 <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-28">Bug fixes</h3>
+<h3 id="bug-fixes-29">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
@@ -2104,7 +2164,7 @@
 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-29">Bug fixes</h3>
+<h3 id="bug-fixes-30">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
@@ -2126,7 +2186,7 @@
 <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-30">Bug fixes</h3>
+<h3 id="bug-fixes-31">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
@@ -2409,7 +2469,7 @@
 standard macro parameter <code>#</code>. Not all constructs are
 compatible with <code>\xintNewExpr</code>.</p></li>
 </ul>
-<h3 id="bug-fixes-31">Bug fixes</h3>
+<h3 id="bug-fixes-32">Bug fixes</h3>
 <ul>
 <li><p><code>\xintZapFirstSpaces</code> hence also
 <code>\xintZapSpaces</code> from package <strong>xinttools</strong> were

Modified: trunk/Master/texmf-dist/doc/generic/xint/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/generic/xint/README.md	2022-05-29 10:40:23 UTC (rev 63435)
+++ trunk/Master/texmf-dist/doc/generic/xint/README.md	2022-05-29 20:36:02 UTC (rev 63436)
@@ -1,8 +1,8 @@
 % README
-% xint 1.4k
-% 2022/05/18
+% xint 1.4l
+% 2022/05/29
 
-    Source:  xint.dtx 1.4k 2022/05/18 (doc 2022/05/18)
+    Source:  xint.dtx 1.4l 2022/05/29 (doc 2022/05/29)
     Author:  Jean-Francois Burnol
     Info:    Expandable operations on big integers, decimals, fractions
     License: LPPL 1.3c
@@ -24,6 +24,14 @@
 variables (to generate sequences of values) and nested structures.
 Support for user-declared functions and variables is implemented.
 
+Here is an example of everyday typical calculation by `xintexpr` users:
+
+    \xinteval{reduce(add(1/i^3, i=1..25))}
+
+It expands to:
+
+    2560976152652211536408111110189/2131858131361319942957376000000
+
 Usage on the command line
 =========================
 
@@ -55,21 +63,50 @@
 [MikTeX](http://www.miktex.org/). Thus, use the package manager to
 update your distribution.
 
-Alternatives:
+The simplest alternative is to download
+[`xint.tds.zip`](http://mirror.ctan.org/install/macros/generic/xint.tds.zip)
+and install the `xint` package files and documentation in a suitable
+TDS-compliant repertory via `unzip`.  For example, on a macOS system,
+installation in user repertory:
 
-- download
-   [`xint.tds.zip`](http://mirror.ctan.org/install/macros/generic/xint.tds.zip)
-   and install in a suitable TDS-compliant repertory via `unzip`. "admin"
-   privilges might be needed, as well as a file database rebuild (`texhash`).
-   For example, on macos x, installation into user home folder (no `sudo`,
-   and no `texhash` as it is recommended to not have a ls-R file there)
+    unzip xint.tds.zip -d  ~/Library/texmf
 
-        unzip xint.tds.zip -d  ~/Library/texmf
+Admin privileges may be needed when moving the files into the TeX
+installation.
 
-- all files can be extracted using `etex xint.dtx`, or `make` if the
-  `Makefile` included in the CTAN upload is present; see the file `INSTALL`,
-  if present, else read the help in extracted file `Makefile.mk`.
+Else, one can download `xint.dtx` and optionally `Makefile` from
+https://www.ctan.org/tex-archive/macros/generic/xint and proceed from
+there.  The package files are extracted automatically from
+`etex xint.dtx`.  So if one does not need to build the documentation,
+one only has to move the files with extension `.sty` to one's working
+repertory and start using them.
 
+Here are various options to build the documentation, from the more
+automated to the more manual:
+
+- (with `Makefile`) run `make help` or `make helpless` (on Unix-like
+  systems) for extracting package files and receiving further
+  instructions, or directly `make xint.pdf` to both extract package
+  files and build the user documentation in the current repertory.
+  The commented source code will be obtained from `make sourcexint.pdf`.
+  This process requires `latexmk`.  The `CHANGES.html` target requires
+  `pandoc`.
+
+- (without `Makefile`) run `etex xint.dtx` then rename the extracted
+  `Makefile.mk` to `Makefile` and proceed as in the previous item.
+
+- (with no `make`) run `latexmk` on `xint.dtx`.  This will both extract
+  package files and build a `dvi` combining the user documentation and
+  the commented source code.  Finish with `dvipdfmx xint.dvi`.
+
+- (with no `make`) execute `etex xint.dtx` to extract files then run
+  `latexmk` on `xint.tex` and `sourcexint.tex`, or perhaps on
+  `xint-all.tex` to combine user manual and source code in one `pdf`.
+
+- (with no `make` and no `latexmk`) proceed as in one of the previous
+  two items but with `latex` sufficiently many times in place of
+  `latexmk`.  Finish with `dvipdfmx`, or use `pdflatex` initially.
+
 Documentation
 =============
 
@@ -83,12 +120,6 @@
 `sourcexint.pdf`: commented source code
    (`texdoc --list xint` or `texdoc sourcexint`)
 
-Requirements
-============
-
-Since release `1.4`, `xintexpr` requires the `\expanded` primitive. This
-is a functionality of all major TeX engines since TeXLive 2019.
-
 License
 =======
 
@@ -107,9 +138,10 @@
 
 The Author of this Work is `Jean-Francois Burnol`.
 
-This Work consists of the files `Makefile`, `INSTALL`, and `xint.dtx`
-and its extracted and derived files inclusive of the documentation
-files `xint.pdf`, `sourcexint.pdf` and `CHANGES.html`.
+This Work consists of the files `xint.dtx` and `Makefile` and
+extracted files inclusive of the macro files `xint*sty` as
+well as derived documentation files such as `xint.pdf`,
+`sourcexint.pdf` and `CHANGES.html`
 
 See `xint.pdf` for contact information.
 

Modified: trunk/Master/texmf-dist/doc/generic/xint/sourcexint.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/generic/xint/xint.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/source/generic/xint/Makefile
===================================================================
--- trunk/Master/texmf-dist/source/generic/xint/Makefile	2022-05-29 10:40:23 UTC (rev 63435)
+++ trunk/Master/texmf-dist/source/generic/xint/Makefile	2022-05-29 20:36:02 UTC (rev 63436)
@@ -1,5 +1,5 @@
 # Makefile for building and installing xint
-# (C) 2014-2021 Jean-Francois Burnol
+# (C) 2014-2022 Jean-Francois Burnol
 # distributed under LPPL 1.3c.
 
 # Tested with GNU Make 3.81 on Mac OS X Mavericks,

Modified: trunk/Master/texmf-dist/source/generic/xint/xint.dtx
===================================================================
--- trunk/Master/texmf-dist/source/generic/xint/xint.dtx	2022-05-29 10:40:23 UTC (rev 63435)
+++ trunk/Master/texmf-dist/source/generic/xint/xint.dtx	2022-05-29 20:36:02 UTC (rev 63436)
@@ -3,20 +3,20 @@
 % Extract all files via "etex xint.dtx" and do "make help"
 % or follow instructions from extracted README.md.
 %<*dtx>
-\def\xintdtxtimestamp {Time-stamp: <18-05-2022 at 20:55:23 CEST>}
+\def\xintdtxtimestamp {Time-stamp: <29-05-2022 at 11:55:32 CEST>}
 %</dtx>
-%<*drv>
+%<*xintdrv|sourcedrv|alldrv>
 %% ---------------------------------------------------------------
-\def\xintdocdate {2022/05/18}
-\def\xintbndldate{2022/05/18}
-\def\xintbndlversion {1.4k}
-%</drv>
+\def\xintdocdate {2022/05/29}
+\def\xintbndldate{2022/05/29}
+\def\xintbndlversion {1.4l}
+%</xintdrv|sourcedrv|alldrv>
 %<readme>% README
 %<changes>% CHANGE LOG
-%<readme|changes>% xint 1.4k
-%<readme|changes>% 2022/05/18
+%<readme|changes>% xint 1.4l
+%<readme|changes>% 2022/05/29
 %<readme|changes>
-%<readme|changes>    Source:  xint.dtx 1.4k 2022/05/18 (doc 2022/05/18)
+%<readme|changes>    Source:  xint.dtx 1.4l 2022/05/29 (doc 2022/05/29)
 %<readme|changes>    Author:  Jean-Francois Burnol
 %<readme|changes>    Info:    Expandable operations on big integers, decimals, fractions
 %<readme|changes>    License: LPPL 1.3c
@@ -23,7 +23,7 @@
 %<readme|changes>
 %<*!readme&!changes&!dohtmlsh&!makefile>
 %% ---------------------------------------------------------------
-%% The xint bundle 1.4k 2022/05/18
+%% The xint bundle 1.4l 2022/05/29
 %% Copyright (C) 2013-2022 by Jean-Francois Burnol
 %<xintkernel>%% xintkernel: Paraphernalia for the xint packages
 %<xinttools>%% xinttools: Expandable and non-expandable utilities
@@ -60,6 +60,14 @@
 variables (to generate sequences of values) and nested structures.
 Support for user-declared functions and variables is implemented.
 
+Here is an example of everyday typical calculation by `xintexpr` users:
+
+    \xinteval{reduce(add(1/i^3, i=1..25))}
+
+It expands to:
+
+    2560976152652211536408111110189/2131858131361319942957376000000
+
 Usage on the command line
 =========================
 
@@ -91,21 +99,51 @@
 [MikTeX](http://www.miktex.org/). Thus, use the package manager to
 update your distribution.
 
-Alternatives:
+The simplest alternative is to download
+[`xint.tds.zip`](http://mirror.ctan.org/install/macros/generic/xint.tds.zip)
+and install the `xint` package files and documentation in a suitable
+TDS-compliant repertory via `unzip`.  For example, on a macOS system,
+installation in user repertory:
 
-- download
-   [`xint.tds.zip`](http://mirror.ctan.org/install/macros/generic/xint.tds.zip)
-   and install in a suitable TDS-compliant repertory via `unzip`. "admin"
-   privilges might be needed, as well as a file database rebuild (`texhash`).
-   For example, on macos x, installation into user home folder (no `sudo`,
-   and no `texhash` as it is recommended to not have a ls-R file there)
+    unzip xint.tds.zip -d  ~/Library/texmf
 
-        unzip xint.tds.zip -d  ~/Library/texmf
+Admin privileges may be needed when moving the files into the TeX
+installation.
 
-- all files can be extracted using `etex xint.dtx`, or `make` if the
-  `Makefile` included in the CTAN upload is present; see the file `INSTALL`,
-  if present, else read the help in extracted file `Makefile.mk`.
+Else, one can download `xint.dtx` and optionally `Makefile` from
+https://www.ctan.org/tex-archive/macros/generic/xint and proceed from
+there.  The package files are extracted automatically from
+`etex xint.dtx`.  So if one does not need to build the documentation,
+one only has to move the files with extension `.sty` to one's working
+repertory and start using them.
 
+Here are various options to build the documentation, from the more
+automated to the more manual:
+
+- (with `Makefile`) run `make help` or `make helpless` (on Unix-like
+  systems) for extracting package files and receiving further
+  instructions, or directly `make xint.pdf` to both extract package
+  files and build the user documentation in the current repertory.
+  The commented source code will be obtained from `make sourcexint.pdf`.
+  This process requires `latexmk`.  The `CHANGES.html` target requires
+  `pandoc`.
+
+- (without `Makefile`) run `etex xint.dtx` then rename the extracted
+  `Makefile.mk` to `Makefile` and proceed as in the previous item.
+
+- (with no `make`) run `latexmk` on `xint.dtx`.  This will both extract
+  package files and build a `dvi` combining the user documentation and
+  the commented source code.  Finish with `dvipdfmx xint.dvi`.
+
+- (with no `make`) execute `etex xint.dtx` to extract files then run
+  `latexmk` on `xint.tex` and `sourcexint.tex`, or perhaps on
+  `xint-all.tex` to combine user manual and source code in one `pdf`.
+
+- (with no `make` and no `latexmk`) proceed as in one of the previous
+  two items but with `latex` sufficiently many times in place of
+  `latexmk`.  Finish with `dvipdfmx`, or use `pdflatex` initially.
+
+
 Documentation
 =============
 
@@ -119,12 +157,6 @@
 `sourcexint.pdf`: commented source code
    (`texdoc --list xint` or `texdoc sourcexint`)
 
-Requirements
-============
-
-Since release `1.4`, `xintexpr` requires the `\expanded` primitive. This
-is a functionality of all major TeX engines since TeXLive 2019.
-
 License
 =======
 
@@ -143,9 +175,10 @@
 
 The Author of this Work is `Jean-Francois Burnol`.
 
-This Work consists of the files `Makefile`, `INSTALL`, and `xint.dtx`
-and its extracted and derived files inclusive of the documentation
-files `xint.pdf`, `sourcexint.pdf` and `CHANGES.html`.
+This Work consists of the files `xint.dtx` and `Makefile` and
+extracted files inclusive of the macro files `xint*sty` as
+well as derived documentation files such as `xint.pdf`,
+`sourcexint.pdf` and `CHANGES.html`
 
 See `xint.pdf` for contact information.
 
@@ -152,6 +185,58 @@
 %</readme>--------------------------------------------------------
 %<*changes>-------------------------------------------------------
 
+`1.4l (2022/05/29)`
+----
+
+### Bug fixes
+
+ - **xintkernel**: ever since `1.4`, loading anyone of the `xint*sty`
+   packages left the catcode of the character of ascii code `1` to
+   the internal custom value `3`.
+
+ - **xintfrac**: the `\xintPFloat` checks for an output being an integer
+   in decimal notation or a number with a one-digit trimmed mantissa
+   could fail if `\xintPFloatMinTrimmed` (added at `1.4k`) was large
+   enough, e.g. equal to the target precision.  Then, the outputs always
+   kept trailing zeros, as expected in general but not for those special
+   cases.
+
+ - **xintlog**, **xinttrig**: since `1.4e` the message emitted if
+   `\usepackage{xintlog}` or `\usepackage{xinttrig}` was encountered in
+   place of the correct `\usepackage{xintexpr}` was wrong.  It advised
+   to use `\input xintexpr.sty\relax`, which would have failed with
+   LaTeX.  The warning is corrected and now the macro file in place of
+   aborting will (be it with or without LaTeX) trigger the loading of
+   `xintexpr` (hence of itself after it).
+
+
+ - The possibility to run `latex` directly on `xint.dtx` had been broken
+   since `1.4i`.
+
+### New features
+
+ - **xintfrac**: `\xintRawBraced` as a public alias to an **xintfrac**
+   entry point to its core input handler.  Experimental additions
+   `\xintSignBit` and `\xintFloatBraced`.  Deprecate `\xintTeXfromSci`
+   in favor of new name `\xintTeXFromSci`, and remove its `\expanded`
+   wrapper (so it is not f-expandable anymore).  Add
+   `\xintTeXFromScifracmacro`.
+
+ - **xintfrac**, **xintexpr**: `\xintFracToSci` and `\xintFracToDecimal`
+   now behave like all other **xintfrac** macros in terms of allowed
+   arguments and f-expandability and have been moved back to
+   **xintfrac**. 
+
+### Documentation
+
+ - Renewed random shuffling of large parts of the documentation has
+   greatly improved it.
+
+ - Simpler build flow to produce a `pdf` containing both user manual and
+   source code.  Removal of dependency on `grep` binary for such builds or
+   the one of `sourcexint.pdf`.  Fix of various obsoleted comments in
+   extracted files involved in the documentation build process.
+
 `1.4k (2022/05/18)`
 ----
 
@@ -159,7 +244,7 @@
 
  - **xintfrac**: the longstanding (but documented as undecided and
    unstable) way of `\xintFloat` to output the zero value was `0.e0` and
-   it has now been modified into `0.0e0`.  Customizable via
+   it has now been modified into `0.0e0`.  Now customizable via
    `\xintFloatZero`.
    
  - **xintfrac**/**xintexpr**: the behaviour of `\xintPFloat` (hence of
@@ -173,12 +258,12 @@
    `\xintPFloatIntSuffix`, `\xintPFloatLengthOneSuffix`, and
    `\xintPFloatZero`.
 
-   Also, `\xintPFloat` trims trailing zeros from the
-   full significand only if there are at least `4` of them, see
+   Also, `\xintPFloat` trims trailing zeros from the full significand
+   only if there are, by default, at least `4` of them, see
    `\xintPFloatMinTrimmed`.
    
- - **xintfrac**/**xintexpr**: definition of `\xintFracToSci` migrated
-   from the former to the latter.
+ - **xintfrac**/**xintexpr**: macro definition of `\xintFracToSci`
+   migrated from the former to the latter (see `1.4l` for update).
    
  - **xintexpr**: `\xintexpr{Safe,Restore}Catcodes` pairs now behave like
    a "last in first out" stack.  Check the `pdf` documentation for
@@ -207,8 +292,8 @@
  
  - **xintfrac**: `\xintFloatToDecimal`.
 
- - **xintexpr**: `\xintFracToDecimal`, an alternative to
-   `\xintFracToSci` for the configuration of `\xintexprPrintOne`.
+ - **xintexpr**: `\xintFracToDecimal`, an alternative to the default
+   `\xintFracToSci` configuration of `\xintexprPrintOne`.
  
  - **xintexpr**: long awaited syntax `\xintieval[D]{...}` and
    `\xintfloateval[Q]{...}` now implemented.  The legacy syntax with
@@ -1720,7 +1805,6 @@
    attempted to use with 1+99999999 a subroutine expecting only 8-digits
    numbers).
 
-
 `1.2a (2015/10/19)`
 ----
 
@@ -2574,6 +2658,74 @@
 >  The packages may be used with Plain and with LaTeX.
 
 %</changes>------------------------------------------------------
+%<*dates>-------------------------------------------------------
+`1.4l (2022/05/29)`
+`1.4k (2022/05/18)`
+`1.4j (2021/07/13)`
+`1.4i (2021/06/11)`
+`1.4h (2021/05/27)`
+`1.4g (2021/05/25)`
+`1.4f (2021/05/10)`
+`1.4e (2021/05/05)`
+`1.4d (2021/03/29)`
+`1.4c (2021/02/20)`
+`1.4b (2020/02/25)`
+`1.4a (2020/02/19)`
+`1.4 (2020/01/31)`
+`1.3f (2019/09/10)`
+`1.3e (2019/04/05)`
+`1.3d (2019/01/06)`
+`1.3c (2018/06/17)`
+`1.3b (2018/05/18)`
+`1.3a (2018/03/07)`
+`1.3 (2018/03/01)`
+`1.2q (2018/02/06)`
+`1.2p (2017/12/05)`
+`1.2o (2017/08/29)`
+`1.2n (2017/08/06)`
+`1.2m (2017/07/31)`
+`1.2l (2017/07/26)`
+`1.2k (2017/01/06)`
+`1.2j (2016/12/22)`
+`1.2i (2016/12/13)`
+`1.2h (2016/11/20)`
+`1.2g (2016/03/19)`
+`1.2f (2016/03/12)`
+`1.2e (2015/11/22)`
+`1.2d (2015/11/18)`
+`1.2c (2015/11/16)`
+`1.2b (2015/10/29)`
+`1.2a (2015/10/19)`
+`1.2 (2015/10/10)`
+`1.1c (2015/09/12)`
+`1.1b (2015/08/31)`
+`1.1a (2014/11/07)`
+`1.1 (2014/10/28)`
+`1.09n (2014/04/01)`
+`1.09m (2014/02/26)`
+`1.09kb (2014/02/13)`
+`1.09k (2014/01/21)`
+`1.09j (2014/01/09)`
+`1.09i (2013/12/18)`
+`1.09h (2013/11/28)`
+`1.09g (2013/11/22)`
+`1.09f (2013/11/04)`
+`1.09e (2013/10/29)`
+`1.09d (2013/10/22)`
+`1.09c (2013/10/09)`
+`1.09b (2013/10/03)`
+`1.09a (2013/09/24)`
+`1.08b (2013/06/14)`
+`1.08a (2013/06/11)`
+`1.08 (2013/06/07)`
+`1.07 (2013/05/25)`
+`1.06b (2013/05/14)`
+`1.06 (2013/05/07)`
+`1.05 (2013/05/01)`
+`1.04 (2013/04/25)`
+`1.03 (2013/04/14)`
+`1.0 (2013/03/28)`
+%</dates>------------------------------------------------------
 %<*makefile>------------------------------------------------------
 # This file: Makefile.mk (generated from xint.dtx)
 # "make --file=Makefile.mk help"
@@ -2611,8 +2763,7 @@
     displays this help using the less pager.
 
 make doc
-    produces all documentation, requires Latexmk and Pandoc,
-    (as well as grep and file output redirection ">")
+    produces all documentation, requires Latexmk and Pandoc.
 
 make all
     produces all documentation, then creates xint.tds.zip.
@@ -2621,13 +2772,17 @@
     same as "make all"
 
 make xint.pdf
-    extracts files and produces xint.pdf, using latex and dvipdfmx.
-    Requires Latexmk.
+    extracts files and produces xint.pdf (user manual),
+    using latex and dvipdfmx.  Requires Latexmk.
 
 make sourcexint.pdf
-    extracts files and produces sourcexint.pdf, using latex, makeindex
-    and dvipdfmx. Requires Latexmk (as well as grep and file ">" redirection).
+    extracts files and produces sourcexint.pdf (source code),
+    using latex and dvipdfmx.  Requires Latexmk.
 
+make xint-all.pdf
+    extracts files and produces xint-all.pdf (manual + code),
+    using latex and dvipdfmx.  Requires Latexmk.
+
 make CHANGES.html
     requires Pandoc.
 
@@ -2692,15 +2847,14 @@
 # specified.  Notice that if "make -f Makefile.mk" is executed, this will
 # actually extract again Makefile.mk which will be overwritten but this
 # does not seem to be problematic.
-extracted  = $(packages) xint.tex xint.ins README.md CHANGES.md doHTMLs.sh
+extracted  = $(packages) xint.tex sourcexint.tex xint-all.tex\
+             README.md CHANGES.md xint-dates.txt doHTMLs.sh
 filesfortex    = $(packages)
 filesforsource = xint.dtx Makefile
 filesfordoc    = xint.pdf sourcexint.pdf README.md CHANGES.html
 auxiliaryfiles = xint.dvi xint.aux xint.toc xint.log\
-     sourcexint.dvi sourcexint.aux sourcexint.toc sourcexint.log
-xint_cmd       = latexmk xint
-sourcexint_cmd = latexmk -jobname=sourcexint\
-     -latex='latex %O "\chardef\dosourcexint=1 \input{%S}"' xint.tex
+     sourcexint.dvi sourcexint.aux sourcexint.toc sourcexint.log\
+     xint-all.dvi xint-all.aux xint-all.toc xint-all.log
 
 all: $(extracted) doc xint.tds.zip
 	@echo 'make all done.'
@@ -2708,21 +2862,21 @@
 $(extracted): xint.dtx
 	etex xint.dtx
 
-xint-dates.txt: CHANGES.md
-	grep '^`[1-9].* (.*/.*/.*)`$$' CHANGES.md > xint-dates.txt
-	rm -f sourcexint.dvi
-
 doc: xint.pdf sourcexint.pdf CHANGES.html
 	@echo 'make doc done.'
 
 xint.pdf: xint.dtx xint.tex
-	$(xint_cmd)
+	latexmk xint.tex
 	dvipdfmx xint.dvi
 
-sourcexint.pdf: xint.dtx xint.tex xint-dates.txt
-	$(sourcexint_cmd)
+sourcexint.pdf: xint.dtx sourcexint.tex
+	latexmk sourcexint.tex
 	dvipdfmx sourcexint.dvi
 
+xint-all.pdf: xint.dtx xint-all.tex
+	latexmk xint-all.tex
+	dvipdfmx xint-all.dvi
+
 CHANGES.html: CHANGES.md doHTMLs.sh
 	chmod u+x doHTMLs.sh && ./doHTMLs.sh
 
@@ -2776,12 +2930,13 @@
 clean:
 	rm -fr auto/ TEMP*/
 	rm -f $(auxiliaryfiles)\
+	  xint-all.fls xint-all.fdb_latexmk\
 	  sourcexint.fls sourcexint.fdb_latexmk\
 	  xint.fls xint.fdb_latexmk
 
 cleanall: clean
 	rm -f $(extracted) CHANGES.html xint-dates.txt \
-          xint.pdf sourcexint.pdf xint.tds.zip xint.zip Makefile.mk
+          xint.pdf sourcexint.pdf xint-all.pdf xint.tds.zip xint.zip Makefile.mk
 %</makefile>$-----------------------------------------------------
 %<*dohtmlsh>------------------------------------------------------
 #! /bin/sh
@@ -2804,42 +2959,94 @@
     #TOC {float: right; position: relative; top: 100px; margin-bottom: 100px; margin-left: 20px;}' CHANGES.md
 
 %</dohtmlsh>------------------------------------------------------
-%<*drv>-----------------------------------------------------------
-%% Extracting files (but you have done that already probably):
-%% - etex xint.dtx
+%<*xintdrv>-----------------------------------------------------------
+%% To extract files:
+%% (but this is probably already done as you read this one)
+%%   etex xint.dtx
 %%
-%% To produce manually xint.pdf from extracted xint.tex (and other files):
-%% - latex xint.tex (thrice)
-%% - dvipdfmx xint.dvi
-%% Or xelatex thrice on xint.tex, or pdflatex thrice (produces bigger sized
-%% pdf).
+%% Then execute:
+%%   make --file=Makefile.mk xint.pdf
 %%
-%% To produce manually sourcexint.pdf from extracted xint.tex (and other files):
-%% - grep '^`[1-9].* (.*/.*/.*)`$' CHANGES.md > xint-dates.txt
-%% - latexmk -jobname=sourcexint\
-%%           -latex="latex %O \\\\chardef\\\\dosourcexint=1 \\\\input{%S}"\
-%%   xint.tex
-%% - dvipdfmx sourcexint.dvi
-%%
+%% Alternative for build without `make':
+%%   latexmk xint.tex
+%%   dvipdfmx xint.dvi
 %% (quoting in the above may need shell-dependant changes)
 %%
-%% To get xint.pdf to include also the source code:
-%% - replace 1 by 0 in \chardef\NoSourceCode line below,
-%% - make clean then make xint.pdf
+%% One can also tell latexmk to use xelatex or pdflatex.
+%% Or use one of them directly enough times on xint.tex.
 %%
-%% This will use latexmk.  Without it execute latex thrice on xint.tex then
-%% dvipdfmx.  Don't forget producing xint-dates.txt via the grep command.
+%% To produce the documented source code sourcexint.pdf:
+%%   make --file=Makefile.mk sourcexint.pdf
+%% (check sourcexint.tex for alternatives to `make')
+%%
+%% To produce xint-all.pdf with both user doc and source code:
+%%   make --file=Makefile.mk xint-all.pdf
+%% (check xint-all.tex for alternatives to `make')
 \NeedsTeXFormat{LaTeX2e}
 \ProvidesFile{xint.tex}%
-[\xintbndldate\space v\xintbndlversion\space driver file for xint documentation (JFB)]%
-\PassOptionsToClass{a4paper,fontsize=10pt}{scrdoc}
-\chardef\NoSourceCode 1 % set it to 0 if source code inclusion desired
+[\xintbndldate\space v\xintbndlversion\space xint documentation (JFB)]%
+\PassOptionsToClass{a4paper,fontsize=10pt}{scrartcl}
+\chardef\NoSourceCode 1
 \input xint.dtx
 %%% Local Variables:
 %%% mode: latex
 %%% TeX-PDF-from-DVI: "Dvipdfmx"
 %%% End:
-%</drv>-----------------------------------------------------------
+%</xintdrv>-----------------------------------------------------------
+%<*sourcedrv>-----------------------------------------------------------
+%% To extract files:
+%% (but this is probably already done as you read this one)
+%%   etex xint.dtx
+%%
+%% Then execute:
+%%   make --file=Makefile.mk sourcexint.pdf
+%%
+%% Alternative for build without `make':
+%%   latexmk sourcexint.tex
+%%   dvipdfmx sourcexint.dvi
+%%
+%% One can intruct latexmk (see its documentation) to use xelatex
+%% or pdflatex, or use them directly on sourcexint.tex.
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesFile{sourcexint.tex}%
+[\xintbndldate\space v\xintbndlversion\space xint commented code (JFB)]%
+\PassOptionsToClass{a4paper,fontsize=10pt}{scrartcl}
+\chardef\NoSourceCode=0\chardef\dosourcexint=1
+\input xint.dtx
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-PDF-from-DVI: "Dvipdfmx"
+%%% End:
+%</sourcedrv>-----------------------------------------------------------
+%<*alldrv>-----------------------------------------------------------
+%% To extract files:
+%% (but this is probably already done as you read this one)
+%%   etex xint.dtx
+%%
+%% Then execute:
+%%   make --file=Makefile.mk xint-all.pdf
+%%
+%% Alternative for build without `make':
+%%   latexmk xint-all.tex
+%%   dvipdfmx xint-all.dvi
+%%
+%% One can intruct latexmk (see its documentation) to use xelatex
+%% or pdflatex, or use them directly on xint-all.tex.
+%%
+%% Another way is to run latex (enough times, then dvipdfmx) or
+%% pdflatex directly on source file xint.dtx.  The produced xint.pdf
+%% will then combine user manual and commented source code.
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesFile{xint-all.tex}%
+[\xintbndldate\space v\xintbndlversion\space xint user plus source doc (JFB)]%
+\PassOptionsToClass{a4paper,fontsize=10pt}{scrartcl}
+\chardef\NoSourceCode=0
+\input xint.dtx
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-PDF-from-DVI: "Dvipdfmx"
+%%% End:
+%</alldrv>-----------------------------------------------------------
 %<*dtx>-----------------------------------------------------------
 ^^Bfi^^Begroup
 \chardef\noetex 0
@@ -2855,11 +3062,10 @@
         \chardef\extractfiles 1 % 1 = extract and typeset, 2 = only typeset
         \chardef\NoSourceCode 0 % 0 = include source code, 1 = do not
         \NeedsTeXFormat{LaTeX2e}%
-        \PassOptionsToClass{a4paper,fontsize=10pt}{scrdoc}%
+        \PassOptionsToClass{a4paper,fontsize=10pt}{scrartcl}%
       \else
-        % latex/pdflatex/xelatex on xint.tex
+        % latex/pdflatex/xelatex on xint.tex or sourcexint.tex or xint-all.tex
         \chardef\extractfiles 2 % no extractions, but typeset
-        %  \NoSourceCode is set-up in xint.tex
       \fi
     \ProvidesFile{xint.dtx}[bundle source (\xintbndlversion, \xintbndldate) %
                              and documentation (\xintdocdate)]%
@@ -2887,15 +3093,16 @@
 \Msg{* \space\space\space\space xintlog.sty^^J}%
 \Msg{*^^J}%
 \Msg{* Rename Makefile.mk to Makefile if the latter is absent^^J}%
-\Msg{* (or use --file=Makefile.mk option to "make") then "make help"^^J}%
-\Msg{* provides information on targets. In particular:^^J}%
-\Msg{* - the "doc" target builds all documentation,^^J}%
+\Msg{*     (or use --file=Makefile.mk option of "make")^^J}%
+\Msg{* then "make help" will provide information.^^J}%
+\Msg{* In particular:^^J}%
+\Msg{* - the "doc" target builds xint.pdf and sourcexint.pdf,^^J}%
 \Msg{* - the "xint.tds.zip" target additionally prepares a TDS-compliant^^J}%
 \Msg{*\space\space\space archive.^^J}%
-\Msg{* This requires Latexmk (for xint.pdf and sourcexint.pdf) and Pandoc^^J}%
-\Msg{* (for CHANGES.html).^^J}%
+\Msg{* Building with "make" requires "Latexmk".^^J}%
+\Msg{* The target "CHANGES.html" requires "Pandoc".^^J}%
 \Msg{*^^J}%
-\Msg{* Or check instructions in xint.tex for manual compilation.^^J}%
+\Msg{* Instructions for builds without "make" are in file xint.tex.^^J}%
 \Msg{*^^J}%
 \Msg{* Happy TeXing!^^J}%
 \Msg{*^^J}%
@@ -2915,6 +3122,7 @@
     \generate{\nopreamble\nopostamble
     \file{README.md}{\from{xint.dtx}{readme}}
     \file{CHANGES.md}{\from{xint.dtx}{changes}}
+    \file{xint-dates.txt}{\from{xint.dtx}{dates}}
     % pure tex will use ^^I notation for TAB character, don't want that.
     % anyway, since 2021/05/30, tex xint.dtx has been made a no-op.
     % there is a problem with xelatex, it generates ^^I if not with -8bit
@@ -2922,7 +3130,9 @@
     \file{doHTMLs.sh}{\from{xint.dtx}{dohtmlsh}}
     \usepreamble\defaultpreamble
     \usepostamble\defaultpostamble
-    \file{xint.tex}{\from{xint.dtx}{drv}}
+    \file{xint.tex}{\from{xint.dtx}{xintdrv}}
+    \file{sourcexint.tex}{\from{xint.dtx}{sourcedrv}}
+    \file{xint-all.tex}{\from{xint.dtx}{alldrv}}
     \file{xintkernel.sty}{\from{xint.dtx}{xintkernel}}
     \file{xinttools.sty}{\from{xint.dtx}{xinttools}}
     \file{xintcore.sty}{\from{xint.dtx}{xintcore}}
@@ -2940,6 +3150,12 @@
 \ifnum\extractfiles=0 % no LaTeX, files now extracted. Stop.
   \MessageDeFin\expandafter\end
 \fi
+\ifnum\extractfiles=1 % direct run on xint.dtx
+  \expandafter\def\expandafter\MessageDeFin\expandafter{\MessageDeFin
+\Msg{* Direct latex run on xint.dtx: please repeat at least 3 times.^^J}%
+\Msg{********************************************************************^^J}%
+}%
+\fi
 \ifnum\extractfiles=3 %
   \newlinechar10
 \errhelp{Extraction must be done via an engine with e-TeX extensions.^^J%
@@ -2954,11 +3170,26 @@
 %-----------------------------------------------------------------
 % -*- coding: utf-8; mode: latex, fill-column: 78; -*-
 %
-\ifdefined\dosourcexint % this toggle is set from make sourcexint.pdf rule
+\makeatletter
+% counts used in particular in the samples from the documentation of the
+% xintseries.sty package
+\newcount\cnta
+\newcount\cntb
+\newcount\cntc
+
+\ifdefined\dosourcexint
     \chardef\NoSourceCode 0
 \else
     \chardef\dosourcexint 0
 \fi
+% \dosourcexint=1 means producing only source code.
+%                 It is set in sourcexint.tex.  Prior to 1.4l it was
+%                 set in the call with latexmk + \input syntax.
+%
+% \dosourcexint=0 and \NoSourceCode=1 : include only user doc
+% \dosourcexint=0 and \NoSourceCode=0 : combine user doc and source code
+% \dosourcexint=1 and \NoSourceCode=1 : never happens but would mean to do
+% nothing!
 
 % default is to assume latex + dvipdfmx
 \chardef\Withdvipdfmx 1
@@ -2976,58 +3207,144 @@
 \fi
 
 % Get rid of HARASSMENT by KOMA-Script
-\makeatletter
 \def\class at shoulddisablepackagewarning@list{tocloft.}
-\makeatother
 \ifnum\Withdvipdfmx=1
 \def\pgfsysdriver{pgfsys-dvipdfm.def}
-\documentclass [dvipdfm, dvipdfmx, dvipdfmx-outline-open]{scrdoc}
+\documentclass [dvipdfm, dvipdfmx, dvipdfmx-outline-open]{scrartcl}
 \else
-\documentclass {scrdoc}
+\documentclass {scrartcl}
 \fi
 
+%%% START OF CUSTOM doc.sty LOADING (May 21, 2022)
+%
+% For some legacy reason (because I started like this and it
+% worked to my satisfaction) I had used scrdoc.cls all those
+% years, without in fact needing most of its features.
+%
+% It loads ltxdoc class, from which again I need very little.  On
+% testing May 20, 2022 the upcoming LaTeX 2022-06-01 I had some
+% problems with ltxdoc not having suitable interface for rolling
+% back to doc=V2.
+%
+% I did experiment with indices for sourcexint.pdf from 2018 to
+% 2019 but it made the build process significantly lengthier,
+% created heavy-sized PDF, had various issues in my context
+% (possibly the kind of issues doc V3 addresses about indexing
+% non-macro things, hyperlinks,...), and these indices basically
+% had not any real use as PDF search proves efficient enough,
+% and the structures of local tables of contents makes for
+% agreeable enough navigation via the input mark-up using
+% sectioning commands.
+%
+% Thus it turns out I need very little of doc.sty, and almost
+% nothing of ltxdoc.cls and scrdoc.cls.
+%
+% Let's load the doc=V2 version to avoid having to work around
+% hypdoc loading interfering with my use of hyperref and as said
+% above I don't need the hyperlinked cross-referencing as I have
+% it via my own mark-up to a sufficiently good enough extent,
+% and this holds for many many years. And I will not now change
+% my mark-up.
+\ifdefined\IfFormatAtLeastTF
+  \IfFormatAtLeastTF{2022/06/01}%
+  {%
+    \IfFileExists{doc-2021-06-01.sty}%
+     {\usepackage{doc}[=v2]}%
+% Why on earth do I lose my time doing this?
+     {\GenericError
+          {(xint build doc)\@spaces}%
+          {xint build error: %
+      Your LaTeX installation seems to be broken, format is\MessageBreak
+      2022-06-01 or later but `doc' package in its `v2' version\MessageBreak
+      seems to not be available. \space Will try with `doc' but if\MessageBreak
+      its `v3' is used there will be an option clash error\MessageBreak
+      regarding hyperref.}%
+          {}%
+          {Please make sure `doc' package matches your LaTeX format.}%
+      \usepackage{doc}%
+     }%
+  }%
+  {\usepackage{doc}}%
+\else
+\usepackage{doc}
+\fi
+
+% And let's keep from ltxdoc only some minimal stuff
+% Page geometry is set by geometry package and a4paper option from
+% xint.tex file.
+\AtBeginDocument{\MakeShortVerb{\|}}
+\DeclareFontShape{OT1}{cmtt}{bx}{n}{<-> ssub * cmtt/m/n}{}
+\DeclareFontFamily{OMS}{cmtt}{\skewchar\font 48}  % '60
+\DeclareFontShape{OMS}{cmtt}{m}{n}{<-> ssub * cmsy/m/n}{}
+\DeclareFontShape{OMS}{cmtt}{bx}{n}{<-> ssub * cmsy/b/n}{}
+\DeclareFontShape{OT1}{cmss}{m}{it}{<->ssub*cmss/m/sl}{}
+\CodelineNumbered
+\DisableCrossrefs
+\setcounter{StandardModuleDepth}{1}
+\def\cmd#1{\cs{\expandafter\cmd at to@cs\string#1}}
+\def\cmd at to@cs#1#2{\char\number`#2\relax}
+\DeclareRobustCommand\cs[1]{\texttt{\bslash#1}}% was \char`\\
+\providecommand\marg[1]{%
+  {\ttfamily\char`\{}\meta{#1}{\ttfamily\char`\}}}
+\providecommand\oarg[1]{%
+  {\ttfamily[}\meta{#1}{\ttfamily]}}
+\providecommand\parg[1]{%
+  {\ttfamily(}\meta{#1}{\ttfamily)}}
+\@addtoreset{CodelineNo}{part}
+% \def\partname{File}% j'utilise Part défini plus bas
+% Je n'utilise pas d'index en fait
+\gdef\codeline at wrindex#1{\if at filesw
+      \begingroup
+        \let\protect\noexpand
+        \immediate\write\@indexfile
+            {\string\indexentry{#1}%
+            {\filesep\number\c at CodelineNo}}%
+      \endgroup\fi}
+\let\filesep\@empty
+
+% There is very little we seem to need from the scrdoc extras:
+% Page geometry is set by geometry package and a4paper option from
+% xint.tex file.  So it seems I only need (perhaps) this hologo thing:
+\usepackage{hologo}
+\DeclareRobustCommand*{\eTeX}{\hologo{eTeX}}%
+%
+%%% END OF CUSTOM LOADING OF PACKAGE doc.sty V2
+
 % Remove from sectioning commands insertion of marks, because we
 % will do it ourself.
 \usepackage{etoolbox}
-\makeatletter
 \patchcmd{\@sect}%
     {\expandafter\csname#1mark\expandafter\endcsname\expandafter{\@currentheadentry}}%
-    {}{}{}
+    {}{}{\Error at CouldNotApplyFirstPatch@sect}
 \patchcmd{\@sect}%
     {\expandafter\csname#1mark\expandafter\endcsname\expandafter{\@currentheadentry}}%
-    {}{}{}
+    {}{}{\Error at CouldNotApplySecondPatch@sect}
 % This one now needed too, Jeudi 30 janvier 2020 
 % \expandafter \ifx \csname #1mark\endcsname \@gobble \@mkboth {}{}\else
 % \csname #1mark\expandafter \endcsname \expandafter {\@currentheadentry }\fi
 % \@gobble est long donc simplement
 \def\partmark #1{}%
-\makeatother
-
-
-\makeatletter
   
-\PassOptionsToPackage{bookmarks=true}{hyperref}
-
 \ifnum\NoSourceCode=1
   \OnlyDescription
 \fi
 
 
-% counts used in particular in the samples from the documentation of the
-% xintseries.sty package
-\newcount\cnta
-\newcount\cntb
-\newcount\cntc
-
 \pagestyle{headings}
 
 \ifxetex
 \else
   \usepackage[T1]{fontenc}
+% je suis passé à utf8 le 28 février 2016
   \usepackage[utf8]{inputenc}
+% (2016/12/08): utilisé où ?
+% (2018/05/22): utilisé dans les commentaires de la division de xint.sty
   \DeclareUnicodeCharacter{03B4}{\ensuremath{\delta}}%δ
+% pour exemple de \xintnewdummy
   \DeclareUnicodeCharacter{03BE}{\ensuremath{\xi}}%ξ
+% (2019/03/31): utilisé dans mes commentaires de xinttrig.sty
   \DeclareUnicodeCharacter{03C0}{\ensuremath{\pi}}%π
+% (2019/04/24): utilisé dans un commentaire de xintlog.sty
   \DeclareUnicodeCharacter{2260}{\ensuremath{\neq}}%≠
 \fi
 
@@ -3048,6 +3365,7 @@
 \fi
 \usepackage{pifont}% for \ding{73} (hollow star)
 
+% needed also for build of sourcexint.pdf
 \usepackage{xinttools}
 
 \usepackage{enumitem}
@@ -3058,9 +3376,15 @@
 \usepackage{graphicx}
 
 \usepackage[english]{babel}
-\usepackage[autolanguage,np]{numprint}
-\AtBeginDocument{\npthousandsep{,\hskip .5pt plus .1pt minus .1pt}}
 
+% 2022/05/24: appears to not be used anywhere anymore in the doc
+% \usepackage[autolanguage,np]{numprint}
+% \AtBeginDocument{\npthousandsep{,\hskip .5pt plus .1pt minus .1pt}}
+
+% But surprisingly it is via numprint that I was loading array package
+% whose extended syntax for tabular preambles is used...
+\usepackage{array}
+
 \usepackage[dvipsnames,svgnames]{xcolor}
 \definecolor{xintnamecolor}{RGB}{228,57,0}
 \colorlet{XINTNAMECOLOR}{xintnamecolor}
@@ -3133,7 +3457,6 @@
 % SNUGFRAMED
 % ==========
 
-\makeatletter
 \newenvironment{snugframed}{%
   \fboxsep \dimexpr2\fontcharwd\font`X\relax
   \advance\linewidth-2\fboxsep
@@ -3146,12 +3469,11 @@
     \MakeFramed {\advance\hsize-\width \@totalleftmargin\z@ \linewidth\hsize
     \@setminipage}%
  }{\par\unskip\@minipagefalse\endMakeFramed}
-\makeatother
 
 % HYPERREF
 % ========
 
-\usepackage[pdfencoding=unicode]{hyperref}
+\usepackage{hyperref}
 
 \hypersetup{%
 linktoc=all,%
@@ -3168,9 +3490,11 @@
 }
 
 \usepackage{hypcap}
+
 \ifnum\dosourcexint=1
-\hypersetup{pdftitle={The xint packages source code}}
+\hypersetup{pdftitle={The xintexpr and allied packages source code}}
 \fi
+
 \usepackage{bookmark}
 
 % FONTS
@@ -3179,16 +3503,13 @@
 \usepackage[zerostyle=a,straightquotes,scaled=0.95]{newtxtt}
 \usepackage{newtxmath}
 
-\makeatletter
 
 
 
-\makeatother
-
 \ifnum\dosourcexint=1
 \else
-\renewcommand\familydefault\ttdefault
-\usepackage[noendash]{mathastext}% pas de endash dans newtxtt
+  \renewcommand\familydefault\ttdefault
+  \usepackage[noendash]{mathastext}% pas de endash dans newtxtt
 \fi
 \frenchspacing
 % sans-serif in footnotes, TOC, titles, etc...
@@ -3230,7 +3551,6 @@
 
 \newdimen\margegauchetoc
 \AtBeginDocument{\margegauchetoc \dimexpr 5\fontcharwd\font`X\relax}
-\makeatletter
 \etocsetstyle{subsection}
     {\begingroup\normalfont
      \setlength{\premulticols}{0pt}%
@@ -3280,8 +3600,6 @@
 \let\HOOKLOCALTOC\empty% quick hack to get style I want in User defined functions
 \etocsetlevel{table}{6}
 
-\makeatother
-
 \addtocontents{toc}{\protect\hypersetup{hidelinks}}
 
 % =====================
@@ -3294,27 +3612,27 @@
 
 % \fexpan 22 octobre 2013
 \newcommand\fexpan {\hyperref[ssec:expansions]{\textit{f}-expan}}
+% \xexpan ajouté 28 mai 2022
+\newcommand\xexpan {\hyperref[ssec:expansions]{\textit{x}-expan}}
 % Septembre 2015
 % Address updated to github repo's one, May 2018
+% They did s/master/main/ already a few years back, May 2022
 \def\liiibigint
-   {\href{https://github.com/latex3/latex3/tree/master/l3trial/l3bigint}{l3bigint}}
+   {\href{https://github.com/latex3/latex3/tree/main/l3trial/l3bigint}{l3bigint}}
 
-% \fixmeaning
-\makeatletter
-% \def\fixmeaning {\expandafter\fix at meaning\meaning}
-% \expandafter\edef\expandafter\fix at meaning
-%             \expandafter #\expandafter1\string\romannumeral#2#3%
-%             {#1\string\romannumeral`\string^\string^@}
-% Pour 1.4
-\let\fixmeaning\meaning
-\makeatother
+% May 2022
+\def\liiistrformat
+%   {\href{https://github.com/latex3/latex3/tree/main/l3experimental/l3str}{l3str}}
+   {\href{https://ctan.org/pkg/l3experimental}{l3str-format}}
+%\def\liiistrformatnew
+%   {\href{https://github.com/latex3/latex3/tree/main/l3trial/l3str-format-new}{l3str-format-new}}
 
+
 % Margin Notes
 % ============
 
 % Nothing here can be used in vertical mode directly.
 
-\makeatletter
 \def\MyMarginNote {\@ifnextchar[\@MyMarginNote{\@MyMarginNote[]}}%
 \let\inmarg\MyMarginNote
 % \smash needs \hbox here since LaTeX 2018/12/01
@@ -3435,7 +3753,6 @@
               \kern\dimexpr\FrameSep+\FrameRule\relax}}}%
              \vskip\dp\strutbox }\strut\@esphack}
 
-\makeatother
 
 % \centeredline: OUR OWN LITTLE MACRO FOR CENTERING LINES
 % =======================================================
@@ -3452,7 +3769,6 @@
 % Note (2020): somewhat obsoleted for many years by my usage of
 % everbatim and everbatim* environments.
 
-\makeatletter
 \newif\ifinlefted
 
 \newcommand*\leftedline {%
@@ -3469,8 +3785,6 @@
                          \bgroup
                          \aftergroup\leftedline@ }
 
-\makeatother
-
 % verbatim macros and environments
 % ================================
 %
@@ -3477,7 +3791,6 @@
 % June 2013, then October 2014.
 % -----------------------------
 %
-\makeatletter
 \catcode`_ 11
 
 % some of my verbatim environments do not make the space active (\lverb e.g.). Then
@@ -3596,7 +3909,6 @@
 \AtBeginDocument {\SetSoftWrapIcon }% ok car ttzfamily déjà fait
 
 \catcode`_ 8
-\makeatother
 
 % everbatim environment
 % =====================
@@ -3613,7 +3925,6 @@
 % Verbatim with an \everypar hook, mainly to have background color, followed by
 % execution of the contents (not limited by a group-scope)
 
-\makeatletter
 \catcode`_ 11
 
 \def\everbatim {\s at everbatim\@everbatim}
@@ -3649,7 +3960,8 @@
        }%
        \obeylines \@vobeyspaces
 }
-\def\everbatimtop {\MacroFont \small}%
+% 27 mai 2022, plus de \small
+\def\everbatimtop {\MacroFont }%
 \let\everbatimhook\empty
 \def\everbatimeverypar{\strut
                    {\color{everbatimbgcolor}\vrule\@width\linewidth }%
@@ -3762,6 +4074,8 @@
 % source, this can be changed by \everbhook.
 
 % " comme caractère d'échappement. Par exemple pour colorier des parties.
+% Le "" redonne à { et } leurs catcodes normaux mais attention c'est
+% alors à utiliser avec un terminateur ;! pour la partie concernée
 \def\restoreeverbhook{\def\everbhook{%
      \def\"{\begingroup\catcode123 1 \catcode 125 2 \everbescape }%
      \catcode`\" 0 \catcode`\@ 14
@@ -3786,7 +4100,6 @@
               }%
 
 \catcode`_8
-\makeatother
 
 
 % \printnumber
@@ -3793,7 +4106,6 @@
 % ============
 
 \catcode`_ 11
-\makeatletter
 \catcode`& 3
 \def\allowsplits_a {\futurelet\printnumber_token\allowsplits_b }%
 \def\allowsplits_b{\ifx\printnumber_token\@sptoken\space\fi\allowsplits_c }
@@ -3808,7 +4120,6 @@
 \hyphenpenalty \z@
 
 \catcode`& 4
-\makeatother
 \catcode`_ 8
 
 % Parameters for lists
@@ -3882,6 +4193,10 @@
 \newcommand\prec[1]{\hyperlink{\detokenize{prec-#1}}{#1}}
 \newcommand\precdesc[1]{\item[\texttt{#1}]\hypertarget{\detokenize{prec-#1}}{}\leavevmode}%
 
+%\let\var\relax % défini par koma-script-source-doc que scrdoc
+                % utilise avec LaTeX 2022/06/01
+                % mais finalement je n'utilise plus scrdoc/ltxdoc
+                % mais doc directement.
 \newcommand\var[1]{\hyperlink{\detokenize{var-#1}}{#1}}
 \newcommand\vardesc[1]{\item[#1]\hypertarget{\detokenize{var-#1}}{}}%
 
@@ -3922,7 +4237,6 @@
                   {TOC}%
     \xspace }%
 
-\makeatletter
 \protected\def\MakeNameUp#1{%
   \ifcsname #1nameUp\endcsname
     \expandafter\@firstoftwo\else
@@ -3932,7 +4246,6 @@
   {\ifinheader\fbox{\textup{#1}}\else#1\fi}%
   {#1}%
 }
-\makeatother
 \newif\ifinheader
 % doit être protégé
 \protected\def\inheadertrue{\let\ifinheader\iftrue}
@@ -3957,8 +4270,9 @@
 % ===============
 % \ttzfamily done at begin document
 
-\newcommand\ctanpackage[1]{\href{https://ctan.org/pkg/#1}{#1}}
+\DeclareRobustCommand\ctanpackage[1]{\href{https://ctan.org/pkg/#1}{#1}}
 
+\makeatother
 \begin{document}\thispagestyle{empty}
 \pdfbookmark[1]{Title page}{TOP}
 \def\partname{Part}
@@ -3965,10 +4279,10 @@
 \addto\captionsenglish{\def\partname{Part}}
 
 {%
-\normalfont\Large\parindent0pt \parfillskip 0pt\relax
- \leftskip 2cm plus 1fil \rightskip 2cm plus 1fil
+\normalfont\Huge\parindent0pt \parfillskip 0pt\relax
+ \leftskip 0cm plus 1fil \rightskip 0cm plus 1fil
 \ifnum\dosourcexint=1
- The \xintnameimp packages source code\par
+ The \xintexprnameimp and allied packages source code\par
  \gdef\DOCxintfrontpage
    {\texorpdfstring
                   {\hyperref[frontpage]{\relax{\color{xintnameimpcolor}TOC}}}%
@@ -4001,8 +4315,9 @@
 
  \def\DOCxintexprmacros
    {\texorpdfstring
-                  {\hyperref[sec:oldxintexpr]{\relax{\color{xintnamecolor}\MakeNameUp{xintexpr}}}}%
-                  {xintexpr}%
+                  {\hyperref[sec:oldxintexpr]{\relax{\color{xintnamecolor}\MakeNameUp{xintexpr
+                        (old doc)}}}}%
+                  {xintexpr (old doc)}%
     \xspace }%
 
  \def\DOCexamples
@@ -4024,11 +4339,18 @@
           \DOCxintfrontpage,
           \DOCxintexprintro,
           \xintexprname,
+          \DOCxintexprmacros,
           \xinttrigname,
           \xintlogname,
+          \xinttoolsname,
+          \DOCexamples,
           \csname xint bundlename\endcsname}}
 \markboth{\makebox[0pt]{\xintRunningHeader}}{\makebox[0pt]{\xintRunningHeader}}
 
+% 18 mai 2019, turned into an environment 27 mai 2022
+\newenvironment{TeXnote}{\par\small\medskip\noindent\textbf{\TeX hackers note:
+  }}{\par\medskip}
+
 % Skips safely.
 \ifnum\dosourcexint=1
 \catcode`+ 0 \catcode0 9 % n'importe quoi sauf 15 (car ^^@)
@@ -4036,9 +4358,8 @@
 +expandafter+iffalse+fi
 \fi
 %
+\makeatletter
 
-\newcommand\TeXnote{\par\smallskip\textbf{\TeX hackers note: }}
-
 \etocsetlevel{toctobookmark}{6}
 
 
@@ -4061,15 +4382,97 @@
 \etocsettagdepth {implementation}{none}
 
 \etocsettocdepth{subsection}
+%% Legacy etoc style for part, we add an improvement to get "Part" hyperlinked
+%% `part':
+\etocsetstyle{part}
+  {\addpenalty\@M\etocskipfirstprefix}
+  {\addpenalty\@secpenalty}
+  {\begingroup
+   \etocfontminusone
+   \addvspace{\etocsepminusone}%
+   \parindent \z@
+   \leftskip  \etocminusoneleftmargin
+   \rightskip \etocminusonerightmargin
+   \parfillskip \@flushglue
+   % original from etoc :
+   %\vbox{\etocifnumbered{\etocpartname\enspace\etocnumber.\quad}{}...}
+   \vbox{\etocifnumbered{\etoclink{\etocpartname\enspace\etocthenumber.}\quad}{}%
+         \etocname
+         \baselineskip\etocbaselinespreadminusone\baselineskip
+         \par}%
+   \addpenalty\@M\addvspace{\etocsepzero}%
+   \endgroup}
+  {}%
+
+% THIS IS THE FIRST HALF OF THE TOC ON PAGE 1
 \tableofcontents
 
+
+% May 23 2022, some hack to replace the \etocmulticolstyle and
+% have same output except that Part line will use full line width
+%
+% Formerly I used this but the Part was then folded...
+% \etocmulticolstyle [2]{\parskip\z at skip%\raggedcolumns
+%     \setlength{\columnsep}{\leftmarginii}%
+%     \setlength{\columnseprule}{0pt}%
+% }%
+%
+\etocsetstyle{part}% @minusone in etoc.sty
+  {\addpenalty\@M\etocskipfirstprefix}
+% May 23, 2022
+% Small hack to configure to our taste the TOC for the pdf combining
+% the user manual and the source code.  We want a Part III in the TOC,
+% and the sections of Part II with a multicols.  We can not open the
+% multicols in the `part' style and have it closed in the 4th argument
+% of \etocsettyle, as it needs to be closed when Part III will be
+% typeset.  Thanks to \etocskipfirstprefix we can simply close it
+% in the "EtocPrefix", this \end{multicols} will be skipped for the
+% first one.
+%
+% However, as this closes a group we will use \etocglobaldefs for this
+% toc else \etocname, etc... would not have the good meanings.  I think
+% there must be some hack like this in etoc manual.
+  {\end{multicols}%
+   \addpenalty\@secpenalty\addvspace{\etocbelowtocskip}%
+   }
+  {\begingroup     % from etoc.sty default Part style
+   \etocfontminusone
+   \addvspace{\etocsepminusone}%
+   \parindent \z@
+   \leftskip  \etocminusoneleftmargin
+   \rightskip \etocminusonerightmargin
+   \parfillskip \@flushglue
+   % \etoclink is handy else only the number get hyperlinked
+   \vbox{\etocifnumbered{\etoclink{\etocpartname\enspace\etocthenumber.\quad}}{}\etocname
+         \baselineskip\etocbaselinespreadminusone\baselineskip
+         \par}%
+   \addpenalty\@M\addvspace{\etocsepzero}%
+   \endgroup
+   % now emulate what \etocmulticolstyle would have set-up
+     \let\etocoldpar\par% surely fishy by now but I am copying from
+                        % how \etocsettocstyle is used by \etocmulticolstyle
+     \addvspace{\etocabovetocskip}% configured below
+     \multicolpretolerance\etocmulticolpretolerance
+     \multicoltolerance\etocmulticoltolerance
+     \setlength{\columnsep}{\etoccolumnsep}%
+     \setlength{\multicolsep}{\etocmulticolsep}%
+     \begin{multicols}{2}[\parskip\z at skip%\raggedcolumns
+                          \setlength{\columnsep}{\leftmarginii}%
+                          \setlength{\columnseprule}{0pt}%
+                          \etocoldpar
+                          %\addvspace{\etocinnertopsep}
+                          \addvspace{\etocabovetocskip}]%
+     }%
+     {\end{multicols}\addvspace{\etocbelowtocskip}}%
+
+% this macro is defined by etoc for use in its own display styles
+% like the one from \etocmulticolstyle. We use it manually above.
 \renewcommand*\etocabovetocskip{\bigskipamount}
-\makeatletter
-\etocmulticolstyle [2]{\parskip\z at skip%\raggedcolumns
-    \setlength{\columnsep}{\leftmarginii}%
-    \setlength{\columnseprule}{0pt}%
-}%
+
 \makeatother
+
+\etocsettocstyle{}{}
+
    \etocsettagdepth {part1A}{none}
    \etocsettagdepth {part1B}{none}
    \etocsettagdepth {macros}     {section}
@@ -4076,11 +4479,19 @@
 \ifnum\NoSourceCode=1
    \etocsettagdepth {implementation}{none}
 \else
-   \etocsettagdepth {implementation}{section}
+   \ifnum\dosourcexint=1
+     \etocsettagdepth {implementation}{section}
+   \else
+     \etocsettagdepth {implementation}{part}
+   \fi
 \fi
 
-\vspace*{2\baselineskip}
+% seems unneeded now
+%\vspace*{2\baselineskip}
+% THIS IS THE SECOND HALF OF THE TOC ON PAGE 1, WITH PARTS II AND III
+\etocglobaldefs
 \tableofcontents
+\etoclocaldefs
 
 
 \etocignoredepthtags
@@ -4258,7 +4669,7 @@
     precision. It works both with Plain \TeX\ and with \LaTeX.
 
     \xinttrigname and \xintlogname are loaded automatically by \xintexprname;
-    they can not be loaded directly via a separate |\usepackage| (in \LaTeX).
+    they should not be loaded directly via a separate |\usepackage| (in \LaTeX).
 
     \ctanpackage{poormanlog} is a \TeX{} and
     \LaTeX{} package by the author which is loaded automatically by \xintlogname.
@@ -4272,7 +4683,6 @@
 \vfill
 
 \clearpage
-
 \etocdepthtag.toc {part1A}
 
 \csname Start herenameUp\endcsname
@@ -4282,49 +4692,102 @@
 \etocsetnexttocdepth{section}
 \localtableofcontents
 
-\section {Introduction and changes}
+\section {Introduction}
 
+\localtableofcontents
+
+\begin{framed}
+  \emph{\emph{\textsc{Jürgen Gilg}}'s interest into what he called
+    \emph{|"XINT"|} was instrumental in keeping the author motivated
+    over the years.
+% \emph pas compatible avec plusieurs paragraphes !
+    We exchanged on many topics extending beyond \TeX{} and often reacted
+    similarly to private and public events.  I knew he was a very kind
+    and devoted person, who took care of the needs of others prior to
+    his own, although he never mentioned it.
+%
+    Jürgen suffered a sudden, unexpected, and deadly stroke in
+    May 2022.  I will miss his friendship profundly.}
+\end{framed}
+
+\subsection{Basic usage and purpose}
+
 \begin{itemize}
 \item To use with |etex|, |pdftex|, ..., i.e.\@ with \TeX{} engines activating
   the e\TeX{} extensions:
 \begin{everbatim}
 \input xintexpr.sty
-\xintfloateval{sqrt(13), cos(1), exp(13.3)}% uses 16 digits per default
-\xintDigits*:=32;% reload log and trig libraries
-\xintfloateval{sqrt(13), cos(1), exp(13.3)}% now with 32 digits
-\xinteval{2^1000}% exact computations
-\xinteval{reduce(add(1/i, i=1..50))}% dummy variables
 \end{everbatim}
 \item To use with the \LaTeX{} macro layer (|latex|, |pdflatex|, ...):
 \begin{everbatim}
 \usepackage{xintexpr}
-% and here you have to wait for \begin{document}...
-% or rather you can start playing immediately:
-\typeout{\xinteval{sqrt(13, 60)}}
 \end{everbatim}
 \end{itemize}
 
-\xintexprname is a package to do expandable computations, either exactly with
-arbitrarily big inputs (fractions, arbitrarily long decimal expansions, ...),
-or in the sense of floating point numbers (logarithm, exponential, sine,
-cosine, ...).  The math functions are implemented up to \dtt{62} digits of
-precision.  The square root (as well of course as the four operations) achieve
-correct rounding in arbitrary precision.
+Some random examples:
+\begin{everbatim*}
+$\sqrt{13}, \cos(1), \exp(13.3) = \xintfloateval{sqrt(13), cos(1), exp(13.3)}$\par
+\end{everbatim*}
+\begin{everbatim*}
+\begin{center}
+  \xintDigits*:=32;% this sets the precision to 32 digits for the math functions
+  \begin{minipage}{34\fontcharwd\font`0}
+  \xintfloateval{sqrt(13), cos(1), exp(13.3)}\par
+  \end{minipage}%
+\end{center}
+\end{everbatim*}
+\begin{everbatim*}
+$2^{1000}=\printnumber{\xinteval{2^1000}}$\par% exact computations
+\end{everbatim*}
+\begin{everbatim*}
+% dummy variables
+\[\sum_{i=1}^{50}\frac1i=\xintTeXFrac{\xinteval{reduce(add(1/i, i=1..50))}}\]
+\end{everbatim*}
+\begin{everbatim*}
+\[\sum_{i=1}^{50}\frac1{i^2}=\xintTeXFrac{\xinteval{reduce(add(1/i^2, i=1..50))}}\]
+\end{everbatim*}
+Computations are done expandably.  This means that for example
+\begin{everbatim}
+\typeout{\xinteval{sqrt(13, 70)}}
+\end{everbatim}
+will compute on the fly while writing out to the log file (|\typeout| is
+the \LaTeX\ idiom), here the square root of \dtt{13} correctly rounded
+to \dtt{70} significant digits.
 
+Indeed, \xintexprname is a package to do expandable computations, either
+exactly with arbitrarily big inputs (fractions, arbitrarily long decimal
+expansions, ...), or in the sense of floating point numbers (logarithm,
+exponential, sine, cosine, ...).  The math functions are implemented up
+to \dtt{62} digits of precision.  The square root (as well of course as
+the four operations) achieve correct rounding in arbitrary precision
+(i.e.\@ even with more than \dtt{62} digits, and may even handle
+thousands of digits but reasonable range is not beyond a few hundreds).
+
 The syntax to modify the precision used for floating point evaluations is
 \begin{everbatim}
 \xintDigits*:= <Number>;
-\end{everbatim}
-Use the |*| (\csbxint{Digits*}), else the scientific libraries will not be
-reloaded.  The current precision is available as \csbxint{theDigits},
+\end{everbatim}\smallskip
+\begin{footnotesize}
+  For reasons of the history of the package, one usually will want to
+  use indeed the |*| (see \csbxint{Digits}), as the more lightweight
+  variant without it does let the four operations and the square root
+  obey the new setting but it does not recalibrate the \xinttrigname and
+  \xintlogname libraries and their built-in constants.\par
+\end{footnotesize}
+The current precision is available as \csbxint{theDigits}, and defaults
+to \dtt{16},
 but in this documentation I might be using simply |Digits| to refer to it.
 
-The tables of the built-in
-\hyperref[tab:precedences]{operators} and  \hyperref[tab:functions]{functions}
+The table of \hyperref[tab:precedences]{built-in operators}
+and the one of \hyperref[tab:functions]{built-in functions}
 will give a quick overview of the available syntax.
-The simplest way\footnote{I am assuming here Mac OS or Linux,
-adapt to your environment} to test the syntax is to work interactively on the command line
-(this feature is available since April 2021, the version of
+
+\subsection{\ctanpackage{xintsession}}
+
+The simplest way\footnote{I am assuming here in the displayed example a
+  Unixen system, i.e. Mac OS or Linux, adapt to your environment.} to
+test the syntax is to work interactively on the command line (this
+feature is available since April 2021, the version of
 \ctanpackage{xintsession} used here is |1.3a|):
 \begin{everbatim}
 rlwrap etex xintsession
@@ -4366,385 +4829,37 @@
 Transcript written on xintsession.log.
 \end{everbatim}
 
-\medskip
+\subsection{\ctanpackage{polexpr}}
 
-Warning: I don't have the time to maintain perfectly such large documentation.
-In preparing the |1.4| release I may have missed updating some bits
-which got randomly shuffled to new places (at least I did delete large
-sections, which was a hard decision to take, almost breaking the palimpsest
-quality of the document).  Reports welcome.%
-%
-\footnote{Thanks to Jürgen Gilg for keeping the author motivated and helping
-  proof-read the 1.4 documentation.  Sadly, Jürgen passed away unexpectedly in
-  2022.  His enthusiasm, kindness, and friendship will be profundly missed.}
+The package \ctanpackage{polexpr} enriches the \csbxint{eval} syntax
+(but not the one of \csbxint{floateval}) with a polynomial type with
+associated constructor |pol([c0,c1,...])|, and polynomial specific
+functions such as |polgcd(pol1, pol2, ...)|.
 
-\subsection{Breaking changes since the \texttt{1.4} release}
+Full usage of polynomials (and algebraic notations |c_0 + c_1 x + c_2
+x^2 + ...| for input and also output) goes through a dedicated |\poldef|
+parser which is based upon \csbxint{defvar}/\csbxint{deffunc} and is a
+necessary step to then access via a dedicated macro interface operations
+such as identifying all rational roots and isolating all real roots to
+arbitrary precision.
 
-\subsubsection{Breaking changes at the \texttt{1.4k} release}
+The simplest manner to experiment with \ctanpackage{polexpr} is via the
+|&pol| mode of \ctanpackage{xintsession}.
 
-\begin{enumerate}[noitemsep]
- \item Changed behaviour for nested
-   \csbxint{exprSafeCatcodes}/\csbxint{exprRestoreCatcodes}.
- \item The output format of \csbxint{floateval}, which by default is produced
-   by \csbxint{PFloat}, has changed once more (!): integers (without
-   scientific exponent) get now printed without a trailing "\dtt{.0}".
-   Furthermore trailing zeros in the significand are removed only if there are
-   at least \dtt{4} of them.  This changed behaviour is reversible
-   via customizing macros.
- \item \csbxint{Float} now outputs the zero value as
-   "\dtt{\xintFloat{0}}". Customizable via \csbxint{FloatZero}.
-\end{enumerate}
+\subsection{\ctanpackage{bnumexpr}}
 
-\subsubsection{Breaking changes at the \texttt{1.4g} release}
+This small package loads \xintcorename and provides the functionality of
+the integer-only \csbxint{iiexpr}/\csbxint{iieval} parser, but dropping
+support for nested structures, functions, variables, boolean branching,
+etc...\@ It includes by default support for hexadecimal input (with |"|
+prefix) and output based upon \xintbinhexname.  Compared to
+|\the\numexpr| it adds support for arbitrarily large integers, powers
+with |**| and |^|, factorials via |!| postfix operator, floored division
+and associated modulo, and comma separated multi-item expressions.
 
-\begin{enumerate}[noitemsep]
- \item Power operators |**| and |^| are now parsed
-   in a right associative way:%
-%
-   \footnote{Don't try |2^3^4^5| at home. This is BIG.}
-\begin{everbatim*}
-$${({(5^4)}^3)}^2=5^{4\cdot3\cdot2}=\xinteval{((5^4)^3)^2}=\xinteval{5^24}$$
-$$5^{4^{3^2}} = 5^{262144}\approx \xintTeXfromSci{\xintfloateval{5^4^3^2}}$$
-\end{everbatim*}
+It also offers a user-level interface to add extra infix or postfix
+operators.
 
- \item Single character operators |&|, \verb=|=, and |=| (which were
-   deprecated since |1.1|) have been removed.  Use |&&|, \verb=||= and |==|
-   respectively.
-\end{enumerate}
-
-\subsubsection{Breaking changes at the \texttt{1.4f} release}
-
-\begin{enumerate}[noitemsep]
-\item \csbxint{ieval}|{[-D]...}|\IMPORTANT{}
-  which quantizes to a multiple of |1eD| when
-  |D| is positive now does \emph{NOT append the |D| trailing zeroes anymore}!
-\item \func{float\string_dgt} is the new name of |float_()|, as already
-  documented but
-  not yet done at |1.4e|.
-\item Powers in \csbxint{floateval} with big exponents are computed with more
-  accuracy.
-\item For |Digits| at most \dtt{8}, powers in \csbxint{floateval} with integer
-  or half-integer exponents do not use \func{log10}/\func{pow10} method but
-  (as for |Digits| at least \dtt{9}) the \csbxint{FloatPower} based approach,
-  allowing very big integer of half-integer exponents while keeping accuracy.
-\item Computations with math functions in \csbxint{floateval} at a setting of
-  |Digits| higher than \dtt{62} will produce an output limited to the smallest
-  of |Digits| and \dtt{64} digits.
-\end{enumerate}
-
-\subsubsection{Breaking changes at the \texttt{1.4e} release}
-
-In principle, I try for breaking changes regarding output to happen only at
-major releases.  But it is not as if I had a gigantic user base, and sometimes
-it is needed to move forward; and as the \TeX\ world does not have a
-``pinning'' mechanism like Python's world, the distinction between minor and
-major releases is a bit rhetorical. So |1.4e| behaves like a major release.
-It is not one because a complete rework of the foundations of floating point
-support is needed...
-
-|1.4e| changes the output format used by \csbxint{eval}, \csbxint{ieval}, and
-\csbxint{floateval} (in short all is modified!).
-
-\begin{itemize}
-\item \csbxint{floateval} output macro \csbxint{PFloat} has been modified. In
-  particular mantissas are trimmed of trailing zeros.
-  {\setbox8\hbox{Integers are printed with a zero after the decimal mark.}%
-   \rule[0.5ex]{\wd8}{1pt}\kern-\wd8\box8}\CHANGED{1.4k again}
-\item \csbxint{eval} output macro \csbxint{FracToSci} has been modified,
-  regarding the handling of numbers involving a decimal exponent; rather than
-  printing out an integer mantissa, it uses scientific notation,
-  i.e.\@ more specifically it uses the same conventions as
-  \csbxint{PFloat}, but of course without pre-rounding to the |Digits| precision.
-  The \csa{xintFracToSciE} macro was removed because \csbxint{PFloatE}
-  is used in its place.
-
-  Notice though that fractions are still not automatically reduced to lowest
-  terms even on output. I hesitated about this, but when for example the
-  computation is a large power of an already known to be irreducible fraction,
-  it would be a very costly operation to apply \csbxint{Irr} or \csbxint{PIrr}
-  to it.
-\item \csbxint{ieval} was modified to use on output
-  \csbxint{DecToString}, not \csbxint{FracToSci}.
-
-  This means than in case of usage of the |[D]| optional argument with a
-  negative |D| (i.e.\@ rounding the output to a multiple of a positive power
-  of ten) the output does not use scientific notation but is an integer ending
-  with explicit zeros.
-
-  Update: at |1.4f| this was changed again.\IMPORTANT{} Now no trailing zeroes
-  are added at all!
-
-  Nothing was changed to output for the case of a positive |[D]| (i.e.\@
-  rounding to |D| figures after decimal point).  One now only needs to
-  configure the new \csbxint{iexprPrintOne} to be \csbxint{DecToStringREZ} in
-  order for trailing zeros in decimal expansions to get trimmed rather than
-  there being always exactly |D| figures after decimal point.
-\item Fractional powers are now allowed in \csbxint{eval}; powers with integer
-  exponents are still computed exactly of course, except that if the integer
-  exponent is \dtt{10000} or more, or if it is is
-  evaluated that the output will contain more than (about) \dtt{10000} digits
-  (separately for the numerator and denominator),
-  then the floating-point branch is taken forcedly. More details on fractional
-  powers are available in \xintlogname.
-\item \csa{poormanloghack} is now a no-op; to use the logarithm,
-  exponential, and powers based on \ctanpackage{poormanlog}, set Digits to at
-  most \dtt{8}. Don't forget the |*| in the |\xintDigits*:=8;| syntax.
-  \item The \csbxint{floatexprPrintOne} macro interface has changed, it is now
-    to be used with (an expandable) macro either allowing or requiring the
-    rounding precision to be present as |[P]|, not |{P}|. Its default 
-    is the user level \csbxint{PFloat} whose behaviour has changed.
-\end{itemize}
-
-\begin{framed}
-  STARTING FROM HERE THE DOCUMENTATION MAY NOT BE UP-TO-DATE AT |1.4e|
-  RELEASE, IT MAY CONTAIN OBSOLETE INFORMATION
-\end{framed}
-
-\subsection{Features added since the \texttt{1.4} release}
-
-For bugfixes and possibly more details check |CHANGES.html|:
-\centeredline{|texdoc --list xint|}
-
-
-\begin{itemize}
-\item The most important has been the improved support for logarithm, exponential,
-sine, etc...\@ added at the \texttt{1.4e} release of \texttt{2021/05/05}:
-
-They\NewWith{1.4e !!} are now supported up to \dtt{62} digits and achieve «correct rounding»%
-%
-\footnote{This means that the produced value is the rounding to |Digits|
-  significant digits of the theoretical exact mathematical value.  The
-  rounding mode is currently not customizable and is «rounding to nearest,
-  ties go to infinity of same sign».}
-%
-at least
-in \dtt{99\%} of cases%
-%
-\footnote{It is even better than that, but depends a bit on how |Digits| is
-  located relative to some thresholds governing Taylor series
-  or other approximation means.}
-%
-for |Digits| being at least \dtt{9}.
-
-For Digits up to \dtt{8}, a special more approximate implementation is used,
-and the functions achieve the correct rounding (particularly at |Digits|
-equal to \dtt{8} or \dtt{7}) less often, but are significantly faster
-(especially logarithm, exponential, powers) than working with \dtt{9} digits
-or more.  The achieved precision is largely enough for plots.
-
-See \xintlogname and \xinttrigname for some additional information.
-
-\item The long awaited\NewWith{1.4k} syntax \csbxint{ieval}|[D]{...}| and
-  \csbxint{floateval}|[Q]{...}| has been implemented.  The legacy
-  \csbxint{ieval}|{[D]...}| and \csbxint{floateval}|{[Q]...}| syntax is kept
-  for backwards compatibility.
-
-\item \csbxint{FloatToDecimal}, \csbxint{FracToDecimal}.\NewWith{1.4k}
-
-\item \csbxint{PFloat}\NewWith{1.4k} is customizable via \csbxint{PFloatZero},
-  \csbxint{PFloatIntSuffix}, \csbxint{PFloatLengthOneSuffix},
-  \csbxint{PFloatNoSciEmax}, \csbxint{PFloatNoSciEmin} and
-  \csbxint{PFloatMinTrimmed}.
-
-\item \csbxint{FloatZero}.\NewWith{1.4k}
-
-\item The concept of simultaneous assignments is extended:\NewWith{1.4i} in
-  case of more variables than values the extraneous variables do not cause an
-  error message but are simply set to the |nil| value; in case of more values
-  than variables, the last variable is defined to be the ople concatenating
-  all the extra values. See \csbxint{defvar}.
-
-\item Built-in\NewWith{1.4i} functions usable with arbitrarily many arguments
-  such as \func{max}, \func{gcd}, or \func{len} are now again usable with a
-  single numeric argument: since |1.4| a lone argument had to be a |nutple|
-  (which was automatically unpacked).  It can now again be a number.
-
-  \item \csbxint{TeXfromSci}\NewWith{1.4g}
-
-  \item The constraints for the replacement macro to be used for
-    \csbxint{exprPrintOne} have been much simplified. See the
-    documentation of \csbxint{FracToSci} which is the package default.
-    %\NewWith{1.4e}
-
-  \item \csbxint{iexprPrintOne} was added, with default
-    \csbxint{DecToString}.%\NewWith{1.4e}
-
-  \item \csbxint{DecToStringREZ} was added.%\NewWith{1.4e}
-
-  \item The function \func{zip}.
-
-  \item The function \func{flat}.
-
-  \item Chaining of \hyperlink{\detokenize{prec-10}}{comparison operators} à la
-  Python (no short-circuit, though) and |l3fp|.
-
-  \item \csbxint{PFloatE} to specify like \csa{xintFracToSciE} (now defunct at
-    |1.4e|) does for
-    \csbxint{eval} since |1.4| the separator to use between mantissa and
-    exponent in the output of \csbxint{floateval} output.
-
-  \item \csbxint{thespaceseparated} (serves to provide suitable input
-    to PS-Tricks |\listplot|).
-
-  \item The optional argument |[D]| to \csbxint{iexpr} (or \csbxint{ieval})
-    can be negative, with about the same meaning as the non-negative case, i.e.
-    rounding to an integer multiple of |1e-D|.  But attention that at |1.4f|,
-    for |D<0|, this is now interpreted as the rounded quotient by |1e-D| (no
-    trailing zeros appended, no scientific exponent either).
-
-  \item Also the second argument of \func{trunc} and \func{round} can be
-    negative (but then it enacts quantization, e.g |trunc(1234,-2)| produces
-    \dtt{\xinteval{trunc(1234,-2)}}).  Matching updates to the support
-      macros \csbxint{Trunc}, \csbxint{Round}, \csbxint{iTrunc}, and
-      \csbxint{iRound}.
-
-  \item Support by \func{add} and \func{mul} for \keyword{omit}, \keyword{abort}
-    and \func{break}.%
-%
-
-\end{itemize}
-
-\subsection{The \texttt{1.4} release of \texttt{2020/01/31}}
-
-|1.4| brought some new features (involving significant evolution of the
-\xintexprname.sty source code) and a few (but important) breaking changes.
-See |CHANGES.html| which contains information which may not yet have been
-included into this PDF documentation.
-
-The main new feature was (initial) support for nested structures.  For a quick
-idea of already available related abilities check for example \func{ndseq} or
-\csbxint{defufunc}.  See also \csbxint{thealign}.  However, please grant the
-author a few decades to finish absorbing Python/NumPy.
-
-\begin{framed}
-  The main breaking changes were:
-  \begin{itemize}
-  \item \xintexprname |1.4| requires the |\expanded| primitive, which is
-    provided by all major \TeX{} engines since \TeX Live 2019.  The macro
-    packages \xintname, \xintfracname, \xinttoolsname et al.\@ do not (yet)
-    require |\expanded|.
-
-    It is probable also |\pdfstrcmp| (|\strcmp|) will be required at some point
-    but it has been provided by major \TeX{} engines for a long time already.
-
-  \item \csbxint{eval} (and \csbxint{expr}) output does not use anymore the
-    \xintfracname ``raw'' format |A/B[N]|, rather it uses scientific notation
-    |AeN/B|, dropping the exponent and/or denominator if they are
-    respectively \dtt{0} and/or \dtt{1}.  This means that output can now be
-    copied pasted directly to competing software on the market, such as Python
-    or Maple.  The output format of \csbxint{floatexpr} (which uses macro
-    \csbxint{PFloat}) was left un-modified although the prettifying done by it
-    is not necessarily the best choice when displaying a nested structure via
-    \csbxint{thealign} (perhaps next major release will reconsider that
-    choice); and the way the zero value is output by \csbxint{floateval},
-    currently \dtt{\xintfloateval{0}} is yet to be chosen definitely.  The
-    used (\emph{expandable}) macro for output can be specified by user.
-
-  \item Syntax such as |x*[a, b, c]| or |[a, b, c]+x| for itemwise operation
-    on «lists» has been (provisorily) dropped. Indeed, the brackets |[...]|
-    are now genuine constructors of nestable structures, and implementing the
-    feature (analogous to NumPy's concepts) will require overloading all
-    scalar infix operators.  Alternative already exist in the syntax for
-    example |seq(x*y, y = a,b,c)|.  Actually in future |x*[a, b, c]| will be
-    as |[x*a, x*b, x*c]| i.e.\@ will keep the brackets, which prior to |1.4|
-    on their own were no different from parentheses.
-  \end{itemize}
-\end{framed}
-
-\subsection{Known bugs/features (last updated at \texttt{1.4j})}
-
-\begin{description}
-\item[if(100>0,(100,125),(100,128)) breaks my code:]
-%
-  This is a feature. This is a syntax error, as the comma serves to contatenate
-  "oples" (see \autoref{oples}), and parentheses do not create analogs of
-  "tuples", so this input is parsed the same as
-\begin{everbatim}
-    if(100>0,100,125,100,128) 
-\end{everbatim}
-  which is an error as \func{if} requires exactly three arguments, not
-  five. Use:
-\begin{everbatim}
-    if(100>0,[100,125],[100,128]) 
-\end{everbatim}
-  which will expand to the "tuple" |[100,125]|.
-\item[{\detokenize{\xintdeffunc foo(x):= gcd((x>0)?{[x,125]}{[x,128]});}
-    creates a broken function:}]
-%
-  Bug. Normally \func{gcd} (and other
-  multi-arguments functions) work both with open lists of arguments or
-  bracketed lists ("nutples") and the above syntax would work perfectly fine
-  in numerical context.  But the presence of the \oper{?} breaks in
-  \csbxint{deffunc} context the flexibility of \func{gcd}. 
-
-   Currently working alternatives:
-\begin{everbatim}
-\xintdeffunc foo(x) := gcd(if(x>0, [x,125], [x,128]));
-\xintdeffunc foo(x) := if(x>0, gcd(x,125), gcd(x,128));
-\xintdeffunc foo(x) := if(x>0, gcd([x,125]), gcd([x,128]));
-\xintdeffunc foo(x) := gcd((x>0)?{x,125}{x,128});
-\xintdeffunc foo(x) := (x>0)?{gcd(x,125)}{gcd(x,128)};
-\xintdeffunc foo(x) := (x>0)?{gcd([x,125])}{gcd([x,128])};
-\end{everbatim}
-   The same problem will arise with an \oper{??} nested inside \func{gcd} or
-   similar functions, in an \csbxint{deffunc}.
-
- \item[{\detokenize{\xinteval{0^-.5}} says "0 raised to power -1"}]
-%
-  Feature. Half integer exponents are handled via a square-root extraction, so
-  here \xintexprname wanted to first raise \dtt{0} to power \dtt{-1}, as
-  reported.
-
- \item[{Comparison operator \detokenize{==} crashes with nutples}]
-%
-   Not yet implemented...
-
- \item[{I liked the ``broadcasting'' \detokenize{[1..10]^10} syntax, but it
-     was removed at 1.4}]
-%
-   Patience...\@ |seq(x^10,x=1..10)| is alternative (add external |[..]| to get
-   a nutple).
- \item[{\detokenize{1e\numexpr5+2\relax} crashes}]
-%
-   Not clear yet if bug or feature.
-   The syntax accepted in the scientific part is limited, and failure
-   is expected: hitting a |\numexpr|
-   when parsing a number triggers insertion of a tacit multiplication and then
-   |1e| is missing the scientific exponent. The same happens with |1e(2+3)|.
-   Use syntax such as |1e\the\numexpr5+2\relax|, or |1e\xinteval{5+2}|
-   (although here this relies on output format of |\xinteval| using integer
-   notation with no decoration in this case).
-
- \item[{seq(1e-i,i=1..5) crashes}]
-%
-   Not clear if bug or feature. Use |seq(1e\xinteval{-i},i=1..5)| or, as a
-   possibly faster way |seq(1e\xintiieval{-i},i=\xintiiexpr1..5\relax)|.
-
- \item[{omit/abort if nested and not last in the sub-expression cause a crash}]
-%
-   For example |seq(subs((i)?{i}{abort},t=i)+10, i=-2, -1, 0, 1)| crashes, due
-   to the presence of the |+10|.  This is a longstanding limitation, applying
-   ever since |omit/abort| were added to the syntax at |1.1|.  Even without
-   the |+10| the nested case was broken by a |1.4| regression and got fixed
-   only at |1.4h|.  The non-nested case |seq((i)?{i}{abort}+10, i=-2, -1, 0,
-   1)| works and the «must be last in expression if nested» limitation is
-   currently considered a feature.
-
-\item[{seq([i,i\string^2], i=1..10) crashes with Ooops, looks like we are missing a
-    ]. Aborting!}]
-%
-   The cause is that the square brackets do not hide the comma from |seq()|
-   parsing.  This will probably remain ``wont-fix''.  Work-arounds: either use
-   an extra pair of parentheses |seq(([i,i^2]), ...)| or hide the inner
-   comma within braces |seq([i{,}i^2], ...)|.
-\end{description}
-
-The list stops here, but there are certainly other pending bugs in my bug-log,
-and many more I am not yet aware of. In particular it is already mentioned in
-the \csbxint{deffunc} documentation that it can not parse currently the
-entirety of the available purely numerical syntax, some (documented or not,
-known or not) limitations apply.
-
 \subsection{License and installation instructions}
 
 \label{ssec:install}
@@ -4759,50 +4874,72 @@
 which has all source code and documentation in a TDS-compliant archive, only
 waiting to be |unzip -d <DIR>| into some suitable hierarchical structure.
 
-Else, |etex xint.dtx| extracts all source code. A |Makefile| is also provided
-with targets such as |xint.pdf| or |sourcexint.pdf|. Even if your system does
-not allow executing |make|, the rules it contains can be imitated manually
-(if possible using |Latexmk|).
+Check |README.md| for more possibilities.
 
-With \TeX\ distributions providing a |"texdoc"| or similar utility,
-\centeredline{|texdoc --list xint|}
-gives the choice to display one of:
-\begin{itemize}[nosep]
-\item |xint.pdf| (this file),
-\item |sourcexint.pdf| (source code),
-\item |README.md|,
-\item |CHANGES.html|.
-\end{itemize}
+% Else, |etex xint.dtx| extracts all source code. A |Makefile| is also provided
+% with targets such as |xint.pdf| or |sourcexint.pdf|. Even if your system does
+% not allow executing |make|, the rules it contains can be imitated manually
+% (if possible using |Latexmk|).
 
 \subsection{Printing big numbers on the page}\label{ssec:printnumber}
+
 When producing very long numbers there is the question of printing them on
   the page, without going beyond the page limits. In this document, I have most
-  of the time made use of these macros (not provided by the package:)
-
-%
+  of the time made use of a ``|\printnumber|'' macros, not provided by
+  the package, and which is coded like this (with some extra decorations):
 \everb|@
 \def\allowsplits #1{\ifx #1\relax \else #1\hskip 0pt plus 1pt\relax
                     \expandafter\allowsplits\fi}%
 \def\printnumber #1{\expandafter\allowsplits \romannumeral-`0#1\relax }%
-% \printnumber thus first ``fully'' expands its argument.
 |
 
-It may be used like this:
+This macro triggers ``\fexpan sion'' of its argument (and indeed
+\csbxint{eval} and friends expand completely under such triggering),
+then it goes through the computation result character by character
+inserting \TeX\ potential break points in-between them.
 %
 \begin{everbatim*}
 \printnumber{\xintiieval{100!^3}}\newline
 \end{everbatim*}%
-The rendering here uses extra decoration.
 
+\subsection{The package documentation}
+
+With \TeX\ distributions providing a |"texdoc"| or similar utility,
+\centeredline{|texdoc --list xint|}
+will offer the choice to visualize one of those files:
+\begin{enumerate}[nosep]
+\item |xint.pdf| (this file)
+\item |sourcexint.pdf| (commented (hmm...) source code)
+\item |CHANGES.html|
+\item |README.md|
+\end{enumerate}
+
+Warning: I don't have the time to maintain perfectly such large
+documentation.  It currently combines old documentation which never
+really got updated and may be locally obsolete with more recent stuff
+mostly written on occasion of the |1.4| release of January 2020 and the
+|1.4e| one of May 2021, and the intervening changes might also have made
+some of it not completely accurate, despite my best efforts.  Bug
+reports and feature requests are most welcome.
+
+The section formerly included with this documentation and documenting
+the changes since the |1.4| release has been removed as it was too
+time-consuming to maintain it here.  Please refer to |CHANGES.html| for
+the detailed listing: \centeredline{|texdoc CHANGES.html|} On the
+internet:
+\centeredline{\url{http://mirrors.ctan.org/macros/generic/xint/CHANGES.html}}
+%
+A one-page condensed ``timeline'' is to be found at the start of
+|sourcexint.pdf|.
+
 \clearpage
 \expandafter\let\csname Start herenameUp\endcsname\undefined
 \csname xintexprnameUp\endcsname
-\section{\xintexprname syntax reference and user guide}
+\section{Syntax reference and user guide}
 \RaisedLabel{sec:expr}
 
 \localtableofcontents
 
-
 \subsection{The three parsers}
 
 \xintexprname provides three numerical expression parsers corresponding to
@@ -4893,7 +5030,8 @@
   would be a bit cumbersome in a \TeX{} workflow, if only for matters of
   syntax highlighting in \TeX-aware text editors).
 \begin{everbatim*}
-\xintiieval{add((i/:7)?{omit}{i^5}, i=1000..1020)}% only add fifth powers of multiples of 7
+% add the i^5 only if i is a multiple of 7
+\xintiieval{add((i/:7)?{omit}{i^5}, i=1000..1020)}
 \end{everbatim*}
 
 \item \csbxint{floateval}\oarg{Q}\marg{expression} does floating point
@@ -4912,6 +5050,8 @@
   last, this is not required anymore.\NewWith{1.4k} The legacy syntax is
   and will keep being allowed.
 
+
+
   The infix operator \oper{/} will compute the correct rounding of the exact
   fraction. The operator \oper{//} is floored division and \oper{/:} is its
   associated modulo (see also \func{divmod}).
@@ -5001,32 +5141,108 @@
 \label{xintfloatexprPrintOne}
 \label{xintboolexprPrintOne}
 
-The package provides only minimal facilities for formatting the numeric
-output.  A possibly not up-to-date list is (the first two use math
-mode mark-up): \csbxint{TeXfromSci}, \csbxint{TeXFrac}, \csbxint{DecToString},
-\csbxint{PRaw}, \csbxint{FracToSci}, \csbxint{FracToDecimal},
-\csbxint{PFloat} and
-\csbxint{FloatToDecimal}.  More advanced formatting is left for the user to
-provide by own macros or possibly using third-party packages.
+The package provides only minimal facilities for formatting the output
+from \csbxint{eval} or \csbxint{floateval} or\dots.  And this output may
+well consist of comma separated values, even nested ones with, by
+default, square brackets. See the section about \csbxint{thealign} and
+its customization possibilities.
 
-It is indeed possible to configure the parsers to use custom macros for output.
-Here are the default package definitions:
+Rather to condemn the user customization to have to employ macros able
+to handle such comma separated lists, possibly nested, the package
+provides an interface to customize the handling of individual numerical
+leaves.  Here are the default definitions to this effect:
 \begin{everbatim}
-\def\xintexprEmptyItem{[]}
-\def\xintexprPrintOne{\xintFracToSci}
-\def\xintiexprPrintOne{\xintDecToString}
-\def\xintiiexprPrintOne #1{#1}
-\def\xintfloatexprPrintOne{\xintPFloat}
+\def\xintexprEmptyItem{[]}                               % (all parsers)
+\def\xintexprPrintOne  #1{\xintFracToSci{#1}}            % \xinteval
+\def\xintiexprPrintOne #1{\xintDecToString{#1}}          % \xintieval
+\def\xintiiexprPrintOne#1{#1}                            % \xintiieval
+\def\xintfloatexprPrintOne [#1]#2{\xintPFloat[#1]{#2}}   % \xintfloateval
 \def\xintboolexprPrintOne#1{\xintiiifNotZero{#1}{True}{False}}
 \end{everbatim}
-The typesetter for \csa{xintiiexpr} simply prints ``as is'', but this
-may change in future, if some internal format is used requiring a
-conversion step.  Users can copy the above (\LaTeX\ users may want to
-use |\renewcommand|) and modify the chosen macros.
+They can be re-defined to one's wishes.  \LaTeX\ users will want to use
+|\renewcommand| for this.
+\begin{TeXnote}
+  \begin{itemize}
+  \item Actually, the defaults are more done in the style
+\begin{everbatim}
+\let\xintexprPrintOne\xintFracToSci
+\end{everbatim}
+    thus sparing grabbing the argument |#1|. And one can do
+\begin{everbatim}
+\def\xintexprPrintOne{\xintFracToSci}
+\end{everbatim}
+    too.
+  \item |\xintexprPrintOne| defaults in truth to some private variant of
+    \csbxint{FracToSci} with exactly the same output but able to understand
+    only certain limited types of inputs as used internally.  This private
+    variant is not \fexpan dable.
+  \item |\xintfloatexprPrintOne| defaults in fact to a private variant of
+    \csbxint{PFloat} which assumes the optional argument |[P]| is present as
+    it will be the case always in this context.  This optional argument
+    |[P]| is the optional argument |[Q]| of \csbxint{floateval} (or
+    |Digis+Q| if |Q<0|).
+  \item The typesetter for \csbxint{iiexpr} simply prints ``as is'', but this
+    may change in future, if some internal format is used requiring a
+    conversion step.
+  \end{itemize}
+\end{TeXnote}
 
-Regarding the current behaviour of \csbxint{floateval}, here is the
-default configuration of \csbxint{PFloat}:
+Here is a possibly not up-to-date list of macros of interest, whose
+documentations you might consider reading (the first two require math
+mode):
+\begin{itemize}[nosep]
+\item \csbxint{TeXFromSci},
+\item \csbxint{TeXFrac},
+\item \csbxint{DecToString},
+\item \csbxint{PRaw},
+\item \csbxint{FracToSci},
+\item \csbxint{FracToDecimal},
+\item \csbxint{PFloat},
+\item and \csbxint{FloatToDecimal}.
+\end{itemize}
+Naming scheme, as one can see, has been pretty much incoherent, apologies.
+
+Among packages providing macros formatting numeric values, there are
+\ctanpackage{numprint} and its macro |\np| (or |\numprint| without the
+option |np|), and \ctanpackage{siunitx}
+and its |\num|, and possibly more packages not known to the author.%
+%
+\footnote{There does not seems to be yet a \LaTeX\ user level interface to the
+  \liiistrformat\ package, part of |l3experimental|, which provides an
+  implementation of the Python |format| function.}
+%
+These macros are suitable in combination with \csbxint{Float} as in the
+example below to customize the \csbxint{floateval} output.
+% 27 mai 2022, en effet \num{1/7} ne marche pas et \numprint{1/7} non plus
+Numerical output from \csbxint{eval} is more challenging as
+individual values may naturally contain the |/| character for fractions which the
+above mentioned packages will not know how to handle, as far as I know.
+
+
+Example, with \LaTeX\ and |\num| from \ctanpackage{siunitx}:
 \begin{everbatim}
+\def\printwithnum[#1]#2{\num{\xintFloat[#1]{#2}}}
+\renewcommand\xintfloatexprPrintOne{\printwithnum}
+\end{everbatim}
+We used |\def| with delimited parameters to define |\printwithnum|
+because the optional argument will always be present at time of use, and
+further the macro will be submitted to |\expanded|, but \LaTeX2e
+commands with optional arguments defined via |\newcommand| are not
+compatible with being submitted to |\expanded|.
+\begin{TeXnote}
+  |\num| is a |\protected| macro, hence it will remain intact in the
+  |\expanded| phase.  The argument |\xintFloat[#1]{#2}| will thus expand
+  before |\num| itself.  In the case at hand |\num| is a macro which would
+  anyhow have triggered expansion of its argument before further processing.
+\end{TeXnote}
+
+
+The current behaviour of \csbxint{floateval} corresponds to this set-up:
+\begin{everbatim}
+\def\xintfloatexprPrintOne [#1]#2{\xintPFloat[#1]{#2}}
+\end{everbatim}
+and to this default configuration of \csbxint{PFloat}:
+\begin{everbatim}
 \def\xintPFloatE{e}
 \def\xintPFloatZero{0}
 \def\xintPFloatIntSuffix{}
@@ -5035,39 +5251,35 @@
 \def\xintPFloatNoSciEmin{-4}
 \def\xintPFloatMinTrimmed{4}
 \end{everbatim}
-With the custom
+
+With the custom replacement
 \begin{everbatim}
 \def\xintfloatexprPrintOne{\xintFloatToDecimal}
 \end{everbatim}
-the \csbxint{floateval} output wil use decimal fixed point notation,
+the \csbxint{floateval} output will use decimal fixed point notation,
 i.e.\@ no scientific exponents, and as many zeros as are needed (but no
 more, as trailing zeros will be removed from the significant digits).
-Here is an example with the
-default configuration and then when using \csbxint{FloatToDecimal}:
+Here is an example comparing outputs from the
+default configuration and custom ones:
 \begingroup % DÉBUT DU GROUPE POUR DES EXEMPLES
 \begin{everbatim*}
-\xintfloateval{exp(-32.456)/2000}\newline
+\xintfloateval{exp(-32.456)/2000} (default, i.e. PFloat)\newline
 \def\xintfloatexprPrintOne{\xintFloatToDecimal}%
-\xintfloateval{exp(-32.456)/2000}\par
+\xintfloateval{exp(-32.456)/2000} (FloatToDecimal)\newline
+\def\xintfloatexprPrintOne[#1]#2{\xintTeXFromSci{\xintFloat[#1]{#2}}}%
+$\xintfloateval{exp(-32.456)/2000}$ (TeXFromSci on Float)\par % math mode required
 \end{everbatim*}
 
-Similarly, with
-\begin{everbatim}
-\def\xintexprPrintOne{\xintFracToDecimal}
-\end{everbatim}
-the \csbxint{eval} output will use decimal fixed point notation (for the
-numerators; the denominators are simply post-fixed with a |/|
-delimiter).  See \csbxint{FracToDecimal}, which like \csbxint{FracToSci}
-however is not really a user level macro, it is restricted on its input
-format, it understands only what is needed for the internal structure
-currently used by \csbxint{eval}.  Here is with the same input as above:
+Some examples showing now the effect of sensible customizations on \csbxint{eval}:
 \begin{everbatim*}
-\xinteval{exp(-32.456)/2000}\newline
+\xinteval{exp(-32.456)/2000} (default, i.e. FracToSci)\newline
 \def\xintexprPrintOne{\xintFracToDecimal}%
-\xinteval{exp(-32.456)/2000}\par
+\xinteval{exp(-32.456)/2000} (FracToDecimal)\newline
+\def\xintexprPrintOne#1{\xintTeXFromSci{\xintFracToSci{#1}}}%
+$\xinteval{exp(-32.456)/2000}$ (TexFromSci on FracToSci)\par  % math mode required
 \end{everbatim*}
 Notice that the |/2000| denominator remains ``as is'' in the
-output in both cases, in conformity with the documented behaviour of
+output, in conformity with the documented behaviour of
 \csbxint{FracToSci} in the first example and of \csbxint{FracToDecimal}
 for the second example.  This has not changed since |1.4| (the handling
 of the numerator part has changed at |1.4e| and again slightly at
@@ -5075,15 +5287,22 @@
 \dtt{0} or \dtt{0.0} depending on the input) but is to be considered
 unstable and undecided so far.
 
-A more costly typesetter could be for example:
+A slightly more costly typesetter could be for example:
 \begin{everbatim}
 \def\xintexprPrintOne#1{\xintDecToStringREZ{\xintIrr{#1}}}
 \end{everbatim}
-Then the fraction (inclusive of its power of ten part) will be reduced
-to lowest terms (see \csbxint{Irr}), next the trailing zeros will be
-moved as an exponent (positive or negative) to the numerator, and
-finally this numerator with a power of ten part will be printed in
-decimal fixed point notation, with as few zeros as are needed. With the
+Then
+\begin{itemize}[nosep]
+\item the fraction (inclusive of its power of ten part) will be reduced
+  to lowest terms (see \csbxint{Irr}),
+\item next the trailing zeros will be moved as an exponent (positive or
+  negative) to the numerator,
+\item this numerator with a power of ten part will be printed in decimal
+  fixed point notation, with as few zeros as are needed,
+\item and finally the denominator |B|, which has been trimmed of trailing
+  zeros, will be printed as |/B| or not at all if |B=1|.
+\end{itemize}
+With the
 use case above:
 \begin{everbatim*}
 \def\xintexprPrintOne#1{\xintDecToStringREZ{\xintIrr{#1}}}
@@ -5098,14 +5317,23 @@
 \end{everbatim}
 which with the used example produces the same output.
 
+One can also consider this for math mode:
+\begin{everbatim*}
+\def\xintexprPrintOne#1{\xintTeXFromSci{\xintDecToStringREZ{\xintIrr{#1}}}}
+$\xinteval{exp(-32.456)/2000}$\par
+\end{everbatim*}
+See our hesitations about what \csbxint{TeXFromSci} should do with
+denominators.
+
+\begin{TeXnote}
+  One can hope that in future \csbxint{DecToString} will identify
+  denominators being products of only two's and five's, but even then of
+  course \csbxint{TeXFromSci} will have to decide how to handle other
+  denominators.
+\end{TeXnote}
+
 \endgroup % FIN DU GROUPE POUR LES EXEMPLES
  
-\medskip
-Nested structures (for full internal details, see \autoref{oples})
-are rendered by default using left and right brackets,
-commas and spaces in a non-customizable way, except via
-\csa{xintexprEmptyItem}.  For full customizability, use
-\csbxint{thealign}, which is described in the next section.
 
 % The \csbxint{PFloatE} is now allowed to a be macro with an argument delimited
 % by a dot, this argument will be the exponent.\NewWith{1.4e} The output must be produced
@@ -5112,69 +5340,77 @@
 % \fexpan dably and again be delimited by a dot. The default does not grab the
 % exponent and simply inserts the letter |e|.
 
-\paragraph{\TeX hackers note:}
-Attention! The macros used in place of \csbxint{FracToSci} and
-\csbxint{PFloat} must currently understand the raw \xintfracname format
-|A/B[N]|, with the |/B| and |[N]| parts being optional.  These requirements
-may change at any release.
+\begin{TeXnote}
+  The macro used as customization of \csbxint{exprPrintOne} (whose default is
+  a private variant of \csbxint{FracToSci} with exactly same output) must
+  understand the internal \xintfracname format |A/B[N]|, but with the |/B| and
+  |[N]| parts being only optional.  This is not a problem when using for this
+  task (nested) macros of \xintfracname, as they of course accept such
+  inputs as argument and in fact much more general ones.
 
-Currently the interface for the macro used by
-\csbxint{floatexprPrintOne} % changed at |1.4e|.\CHANGED{1.4e}
-must be the same as
-\csbxint{PFloat}. %, i.e. the target precision is |[P]| not a
-%braced argument.
-But it will always be employed with the |[P|] present hence does not
-have to consider it to be optional.
+  In particular one can benefit from \csbxint{Raw}, or \csbxint{RawBraced}, to
+  convert the argument into a well defined shape (|A/B[N]| for the former and
+  |{N}{A}{B}| for the latter) and then work from there.
 
-The replacement macros must be compatible with expansion-only context, but do not
-have to be \fexpan dable.
+  The macro used by \csbxint{floatexprPrintOne} has the guarantee that the
+  |[P]| will be always present at expansion time.
 
-% % pour mémoire
-% \footnote{The constraints on any replacement to \csbxint{FracToSci} are much
-%   simplified at |1.4e|. Previously it had to be able to accept also input in
-%   fixed point notation, and in scientific notation with a catcode 12 |e|.}
-% %
+  The customization should be compatible with being exposed to |\expanded|
+  (which is like expansion in an |\edef|), either from being completely
+  expandable or at the opposite from being |\protected|. \LaTeX2e commands
+  defined via |\newcommand| as macros with one optional parameter are not
+  compatible with this requirement.
 
-\subsubsection{\csh{xintthealign} for multiple items outputs}
+  Attention! The interface requirements described above for the macros
+  customizing the behaviours of \csbxint{exprPrintOne} and
+  \csbxint{floatexprPrintOne} may change at any release... as they
+  depend on some internal structures and it is not certain backwards
+  compatiblity will be maintained systematically in case of evolution.
+\end{TeXnote}
+
+
+\subsubsection{\csh{xintthealign} for general oples and nutples}
 \label{xintthealign}
 
 With \csbxint{thealign} one can get nested data use a \TeX{} alignment in the
-output. Attention, this must be followed by \csbxint{expr} et al., never by
-\csbxint{theexpr} or \csbxint{eval}.
-Here is an example :
+output.  Here is an example :
 \begin{everbatim*}
 \xintthealign\xintexpr ndseq(1/(i+j), i = 1..10; j=1..10)\relax
 \end{everbatim*}
+Attention, this \csa{xintthealign} must be a prefix to \csbxint{expr},
+or \csbxint{floatexpr} etc..., but there will be low-level \TeX\ errors
+if it is used to prefix \csbxint{eval} et al. or \csbxint{theexpr} et al.
 
-It is possible to customize the behaviour of |\xintthealign|.\CHANGED{1.4a}
-The helper macros, apart from |\xintexpralignbegin| and |\xintexpralignend|
-will be subjected to a complete (|\expanded|) expansion (once).%
-%
-\footnote{\csa{xintexpralignend} is expanded once, after the body has been
-  submitted to exhaustive expansion, and prior to the expansion of
-  \csa{xintexpralignbegin}.}
-%
-The package
-uses here |\protected| with no strong reason, as the replacement tokens are
-not expanding anyhow, but the idea is that this allows to define a macro in an
-|\edef| and later change the meaning of the auxiliary macros depending on what
-one wants to do with the expansion result. See also further down the \LaTeX{}
-example with a matrix environment, where |\noexpand| rather than |\protected|
-is used.
+It is possible to customize the behaviour of |\xintthealign|.  For example:\CHANGED{1.4a}
 \begin{everbatim}
 \protected\def\xintexpralignbegin       {\halign\bgroup\tabskip2ex\hfil##&&##\hfil\cr}%
 \def\xintexpralignend                   {\crcr\egroup}% removed \protected at 1.4c
 \protected\def\xintexpralignlinesep     {,\cr}% separates "lines"
-\protected\def\xintexpralignleftsep     {&}% at left of first item in a "line" (after brackets)
+\protected\def\xintexpralignleftsep     {&}% at left of first item in a "line"
+                                           % (after "left bracket")
 \protected\def\xintexpraligninnersep    {,&}% at the left of non-first items
-\protected\def\xintexpralignrightsep    {&}% at right of last item in a "line" (before brackets)
+\protected\def\xintexpralignrightsep    {&}% at right of last item in a "line"
+                                           % (before "right bracket")
 \protected\def\xintexpralignleftbracket {[}%
 \protected\def\xintexpralignrightbracket{]}%
 \end{everbatim}
-Although we will try to keep stable the way «regular arrays» are
-rendered,\UNSTABLE{} the |\xintthealign| macro (and its associated customizability) is
-considered work-in-progress and may experience breaking changes.
+The above definitions use |\protected| with no strong reason, as the
+replacement tokens are not expanding anyhow, but the idea is that this
+allows to execute a computation via an |\edef| and later one can change
+the meaning of the auxiliary macros depending on what one wants to do
+with the expansion result.
 
+\begin{TeXnote}
+  \csa{xintexpralignend} is expanded once, after the body has been submitted
+  to exhaustive expansion (|\expanded| induced), and prior to the expansion of
+  \csa{xintexpralignbegin}.
+\end{TeXnote}
+
+Although we will try to keep stable the way «regular arrays» as in the
+above example are rendered by default,\UNSTABLE{} the |\xintthealign|
+macro (and its associated customizability) is to be considered
+work-in-progress and may experience breaking changes.
+
 Use for example this for outputting to a file or a terminal:
 \begin{everbatim}
 % Better here without \protected.
@@ -5189,12 +5425,10 @@
 \def\xintexpralignrightbracket{]}%
 \end{everbatim}
 
-\medskip
-
-And here is an example using a |pmatrix| environment.  But it will not break
+In the \LaTeX{} example next using a |pmatrix| environment, |\noexpand|
+rather than |\protected| is used.  This environment will not break
 across pages, contrarily to the display produced by the default
 \csbxint{thealign} configuration which uses \TeX{}'s |\halign|.
-
 %\kern10\baselineskip
 %\hbox{Big empty space here}
 %\kern-11\baselineskip
@@ -5545,7 +5779,8 @@
   remaining conditionals will still be evaluated.
 
 \begin{everbatim*}
-\xintifboolexpr{1<=2!=3<4>1}{true}{\error}, \xintifboolexpr{1<=2>=3<4>1}{\error}{false},
+\xintifboolexpr{1<=2!=3<4>1}{true}{\error},
+\xintifboolexpr{1<=2>=3<4>1}{\error}{false},
 \xintifboolexpr{3 != 3! == 6 != 4! == 24}{true}{\error}
 \end{everbatim*}
 
@@ -6692,7 +6927,8 @@
   implementation of the Brent-Salamin algorithm for the computation of $\pi$:
 \begin{everbatim*}
 \xintDigits:= 87\relax % we target 84 digits, and use 3 guard digits
-\xintdeffloatfunc BS(a, b, t, p):= 0.5*(a+b), sqrt(a*b), t-p*sqr(a-b), \xintiiexpr 2p\relax;
+\xintdeffloatfunc BS(a, b, t, p):= 0.5*(a+b), sqrt(a*b), t-p*sqr(a-b),
+                                                        \xintiiexpr 2p\relax;
 \xinteval
 {trunc(% I feel truncation is better than rounding to display decimals of π
   \xintfloatexpr
@@ -6802,7 +7038,8 @@
 allowed.
 \begin{everbatim*}
 \begin{multicols}{2}
-\xintthealign\xintexpr ndseq(a+b+c+d, a=1000,2000,3000; b=100,200,300; c=10,20,30; d=1,2,3;)\relax
+\xintthealign\xintexpr ndseq(a+b+c+d, a=1000,2000,3000; b=100,200,300;
+                                                        c=10,20,30; d=1,2,3;)\relax
 \end{multicols}% in case of page break, this makes amusing zigzag rendering
 \end{everbatim*}
 
@@ -6966,7 +7203,8 @@
   rules (inclusive of negative indices). Notice though that stepping is
   currently not supported.
 \begin{everbatim*}
-\xinttheiiexpr (1..20)[6:13]\relax\ = \xinttheiiexpr (1..20)[6-20:13-20]\relax\newline
+\xinttheiiexpr (1..20)[6:13]\relax\ = \xinttheiiexpr (1..20)[6-20:13-20]\relax
+\newline
 \xinttheiiexpr [1..20][6:13]\relax\ = \xinttheiiexpr [1..20][6-20:13-20]\relax
 \end{everbatim*}
 
@@ -7074,7 +7312,8 @@
     impacts only situations with a division operator as the last seen
     operator, as multiplication is mathematically associative.
 \begin{everbatim*}
-\xinttheexpr 1/(3)5, (1+2)/(3+4)(5+6), 2/x(10), 2/10x, 3/y\xintiiexpr 5+6\relax, 1/x(y)\relax\
+\xinttheexpr 1/(3)5, (1+2)/(3+4)(5+6), 2/x(10), 2/10x,
+                                 3/y\xintiiexpr 5+6\relax, 1/x(y)\relax\
 differ from\newline\xinttheexpr 1/3*5, (1+2)/(3+4)*(5+6), 2/x*(10), 2/10*x,
                                 3/y*\xintiiexpr 5+6\relax, 1/x*(y)\relax\par
 \end{everbatim*}
@@ -7131,11 +7370,13 @@
 raise an error but simply set the extra variables to the \dtt{nil} value.
 \begin{everbatim*}
 \xintdefiivar a, b, c := [1, 2];% will be automatically unpacked
-The value of a is \xinteval{a}, the one of b is \xinteval{b} and the one of c is \xinteval{c}.
+The value of a is \xinteval{a}, the one of b is \xinteval{b} and
+the one of c is \xinteval{c}.
 \end{everbatim*}
 \begin{everbatim*}
 \xintdefiivar a, b, c := 314;%
-The value of a is \xinteval{a}, the one of b is \xinteval{b} and the one of c is \xinteval{c}.
+The value of a is \xinteval{a}, the one of b is \xinteval{b} and
+the one of c is \xinteval{c}.
 \end{everbatim*}
 
 Notice that \dtt{nil} variables must be used with caution as they break
@@ -7260,15 +7501,19 @@
   \xintfloatexpr
     2.7182818284590452353602874713526624977572470936999595749669676
   \relax
-\relax\newline   % but we can see via the \xintexpr wrapper all the digits were there
-% rounding can be forced using an extra 0+, the float() function, or the [D] option.
-% tidbit: comparison operators do not pre-round, so 1.2345678 is not same as (1.2345678+0)
-% in low precision.
-\begingroup\xintDigits:=4;% with 2 guard digits, this makes 4+2=6 digits from "0+" rounding
+\relax\newline
+%
+% but we can see via the \xintexpr wrapper all the digits were there rounding
+% can be forced using an extra 0+, the float() function, or the [D] option.
+% tidbit: comparison operators do not pre-round, so 1.2345678 is not same as
+% (1.2345678+0) in low precision.
+%
+\begingroup\xintDigits:=4;%
 4) \xintifboolfloatexpr{1.2345 == 1.23456}
    {\error}{Different! Comparisons do not pre-round to Digits precision.}\newline
 5) \xintifboolfloatexpr{1.2345 == 1.2345 + 0}
-   {\error}{Different! Right hand side rounded from operation, left hand side not rounded.}\par
+   {\error}{Different! Right hand side rounded from operation,
+                       left hand side not rounded.}\par
 \endgroup
 \end{everbatim*}
 
@@ -7560,11 +7805,11 @@
 
 It produces in the log:
 \begin{everbatim}
-Package xintexpr Info: (on line 10)
+Package xintexpr Info: (on line 2)
     Function foo for \xintexpr parser associated to \XINT_expr_userfunc_foo wit
 h meaning macro:#1#2#3->{\xintAdd {\xintAdd {\xintAdd {#1}{#2}}{#3}}{\xintPow {
 \xintAdd {\xintAdd {#1}{#2}}{#3}}{2}}}
-Package xintexpr Info: (on line 11)
+Package xintexpr Info: (on line 3)
     Function bar for \xintexpr parser associated to \XINT_expr_userfunc_bar wit
 h meaning macro:#1#2#3->\expanded \bgroup \expanded {\unexpanded {\XINT_expr_se
 q:_b {\xintbareeval S + S^2\relax !S}}{\xintAdd {\xintAdd {#1}{#2}}{#3}}^}
@@ -7840,7 +8085,7 @@
 \def\xintexprPrintOne       #1{\xintTeXFrac{#1}}%
 \def\xintexpralignbegin       {\begin{pmatrix}}%
 \def\xintexpralignend         {\end{pmatrix}}%
-\def\xintexpralignlinesep     {\noexpand\\[2\jot]}% needed to counteract an internal \expanded
+\def\xintexpralignlinesep     {\noexpand\\[2\jot]}% counteract an internal \expanded
 \def\xintexpraligninnersep    {&}%
 \let\xintexpralignleftbracket\empty  \let\xintexpralignleftsep\empty
 \let\xintexpralignrightbracket\empty \let\xintexpralignrightsep\empty
@@ -7875,7 +8120,8 @@
 \def\CR{\cr}
 \halign
 {\tabskip1ex
-\hfil\bfseries#&\xintDigits:=\xintiloopindex\relax \xintthefloatexpr Rump(77617,33096)#\cr
+\hfil\bfseries#&\xintDigits:=\xintiloopindex\relax
+                \xintthefloatexpr Rump(77617,33096)#\cr
 \xintiloop [8+1]
 \xintiloopindex &\relax\CR
 \ifnum\xintiloopindex<40 \repeat
@@ -8428,16 +8674,1390 @@
   never-ending one-dimensional one...\par
 \end{footnotesize}
 
+\subsection{Known bugs/features (last updated at \texttt{1.4j})}
+
+\begin{description}
+\item[if(100>0,(100,125),(100,128)) breaks my code:]
+%
+  This is a feature. This is a syntax error, as the comma serves to contatenate
+  "oples" (see \autoref{oples}), and parentheses do not create analogs of
+  "tuples", so this input is parsed the same as
+\begin{everbatim}
+    if(100>0,100,125,100,128) 
+\end{everbatim}
+  which is an error as \func{if} requires exactly three arguments, not
+  five. Use:
+\begin{everbatim}
+    if(100>0,[100,125],[100,128]) 
+\end{everbatim}
+  which will expand to the "tuple" |[100,125]|.
+\item[{\detokenize{\xintdeffunc foo(x):= gcd((x>0)?{[x,125]}{[x,128]});}
+    creates a broken function:}]
+%
+  Bug. Normally \func{gcd} (and other
+  multi-arguments functions) work both with open lists of arguments or
+  bracketed lists ("nutples") and the above syntax would work perfectly fine
+  in numerical context.  But the presence of the \oper{?} breaks in
+  \csbxint{deffunc} context the flexibility of \func{gcd}. 
+
+   Currently working alternatives:
+\begin{everbatim}
+\xintdeffunc foo(x) := gcd(if(x>0, [x,125], [x,128]));
+\xintdeffunc foo(x) := if(x>0, gcd(x,125), gcd(x,128));
+\xintdeffunc foo(x) := if(x>0, gcd([x,125]), gcd([x,128]));
+\xintdeffunc foo(x) := gcd((x>0)?{x,125}{x,128});
+\xintdeffunc foo(x) := (x>0)?{gcd(x,125)}{gcd(x,128)};
+\xintdeffunc foo(x) := (x>0)?{gcd([x,125])}{gcd([x,128])};
+\end{everbatim}
+   The same problem will arise with an \oper{??} nested inside \func{gcd} or
+   similar functions, in an \csbxint{deffunc}.
+
+ \item[{\detokenize{\xinteval{0^-.5}} says "0 raised to power -1"}]
+%
+  Feature. Half integer exponents are handled via a square-root extraction, so
+  here \xintexprname wanted to first raise \dtt{0} to power \dtt{-1}, as
+  reported.
+
+ \item[{Comparison operator \detokenize{==} crashes with nutples}]
+%
+   Not yet implemented...
+
+ \item[{I liked the ``broadcasting'' \detokenize{[1..10]^10} syntax, but it
+     was removed at 1.4}]
+%
+   Patience...\@ |seq(x^10,x=1..10)| is alternative (add external |[..]| to get
+   a nutple).
+ \item[{\detokenize{1e\numexpr5+2\relax} crashes}]
+%
+   Not clear yet if bug or feature.
+   The syntax accepted in the scientific part is limited, and failure
+   is expected: hitting a |\numexpr|
+   when parsing a number triggers insertion of a tacit multiplication and then
+   |1e| is missing the scientific exponent. The same happens with |1e(2+3)|.
+   Use syntax such as |1e\the\numexpr5+2\relax|, or |1e\xinteval{5+2}|
+   (although here this relies on output format of |\xinteval| using integer
+   notation with no decoration in this case).
+
+ \item[{seq(1e-i,i=1..5) crashes}]
+%
+   Not clear if bug or feature. Use |seq(1e\xinteval{-i},i=1..5)| or, as a
+   possibly faster way |seq(1e\xintiieval{-i},i=\xintiiexpr1..5\relax)|.
+
+ \item[{omit/abort if nested and not last in the sub-expression cause a crash}]
+%
+   For example |seq(subs((i)?{i}{abort},t=i)+10, i=-2, -1, 0, 1)| crashes, due
+   to the presence of the |+10|.  This is a longstanding limitation, applying
+   ever since |omit/abort| were added to the syntax at |1.1|.  Even without
+   the |+10| the nested case was broken by a |1.4| regression and got fixed
+   only at |1.4h|.  The non-nested case |seq((i)?{i}{abort}+10, i=-2, -1, 0,
+   1)| works and the «must be last in expression if nested» limitation is
+   currently considered a feature.
+
+\item[{seq([i,i\string^2], i=1..10) crashes with Ooops, looks like we are missing a
+    ]. Aborting!}]
+%
+   The cause is that the square brackets do not hide the comma from |seq()|
+   parsing.  This will probably remain ``wont-fix''.  Work-arounds: either use
+   an extra pair of parentheses |seq(([i,i^2]), ...)| or hide the inner
+   comma within braces |seq([i{,}i^2], ...)|.
+\end{description}
+
+The list stops here, but there are certainly other pending bugs in my bug-log,
+and many more I am not yet aware of. In particular it is already mentioned in
+the \csbxint{deffunc} documentation that it can not parse currently the
+entirety of the available purely numerical syntax, some (documented or not,
+known or not) limitations apply.
+
+
 \clearpage
 \etocdepthtag.toc {part1B}
 
 \let\xintexprnameUp\undefined
+\csname xintexpr (old doc)nameUp\endcsname
+\section{The macros of \xintexprname (ancient documentation, mostly)}%
+\RaisedLabel{sec:oldxintexpr}
+
+\localtableofcontents
+
+The \xintexprname package was first released with version |1.07|
+(|2013/05/25|) of the \xintname bundle. It was substantially enhanced with
+release |1.1| from |2014/10/28|.
+
+The |1.4| release from |2020/01/31| maintains the same general architecture
+but needed adapting all the code base for the switch from |\csname| to
+|\expanded| techniques. On this occasion the mechanism for defining functions
+was substantially strengthened.  The parser core mechanisms were improved too.
+
+The package loads automatically \xintfracname and \xinttoolsname.
+
+This section should be trimmed to contain only information not
+already covered in \autoref{sec:expr}.
+
+\subsection{The \csh{xintexpr} expressions}
+\label{xintexpr}
+\label{xinttheexpr}
+\label{thexintexpr}
+\label{xintthe}
+
+An \xintexprname{}ession is a construct
+\csbxint{expr}\meta{expandable\_expression}|\relax|\etype{x} where the
+expandable expression is read and completely expanded from left to right.
+
+An |\xintexpr...\relax| \emph{must} end in a |\relax| (which will be absorbed).
+Contrarily to a |\numexpr| expression, it is printable\CHANGED{1.4} as is without a prefix
+|\the| or |\number| (don't use them with |\xintexpr| this will raise an
+error).
+
+But one can use |\xintthe| prefix if one does need the explicit digits and
+other characters as in the final typesetted result.
+
+As an alternative and equivalent syntax to
+\begin{everbatim}
+\xintexpr round(<expression>, D)\relax
+\end{everbatim}
+there is
+\begin{everbatim}
+\xintiexpr [D] <expression> \relax
+\end{everbatim}
+For |D>0| this produces a decimal number with |D| figures after the decimal
+mark, which is the rounding of the expression. For |D=0| the rounding to an
+integer is produced. For |D<0| (and this was changed at |1.4f|), the rounded
+quotient of the expression by \verb=1e|D|= is produced.
+\begin{itemize}
+\item the expression may contain arbitrarily many levels of nested parenthesized
+  sub-expressions,
+\item the expression may contain explicitely or from a macro expansion a
+  sub-expression |\xintexpr...\relax|, which itself may contain a
+  sub-expressions etc\dots
+\item to let sub-contents evaluate as a sub-unit it should thus be either
+   \begin{enumerate}
+   \item parenthesized,
+   \item or a sub-expression |\xintexpr...\relax|.
+   \end{enumerate}
+ \item to use an expression as argument to macros from \xintfracname,
+   or more generally to macros which expand their arguments, one must use the
+   |\xinttheexpr...\relax| or |\xintthe\xintexpr...\relax| forms.
+ \item one should not use |\xintthe\xintexpr...\relax| as a sub-constituent of
+   another expression but only the
+   |\xintexpr...\relax| form which is more efficient in this context.
+ \item each \xintexprname{}ession, whether prefixed or not with |\xintthe|, is
+   completely expandable and obtains its result in two expansion steps.
+\end{itemize}
+
+The information now following is possibly in need of updates.
+
+\begin{itemize}[parsep=0pt, labelwidth=\leftmarginii,
+  itemindent=0pt, listparindent=\leftmarginiii, leftmargin=\leftmarginii]
+\item An expression is built the standard way with opening and closing
+  parentheses, infix operators, and (big) numbers, with possibly a fractional
+  part, and/or scientific notation (except for \csbxint{iiexpr} which only
+  admits big integers). All variants work with comma separated expressions. On
+  output each comma will be followed by a space. A decimal number must have
+  digits either before or after the decimal mark.
+
+\item As everything gets expanded, the characters |.|, |+|, |-|, |*|, |/|, |^|,
+  |!|, |&|, \verb+|+, |?|, |:|, |<|, |>|, |=|, |(|, |)|, |"|, |]|, |[|, |@|
+  and the comma |,| should not (if used in the expression) be active. For
+  example, the French language in |Babel| system, for pdf\LaTeX, activates |!|,
+  |?|, |;| and |:|. Turn off the activity before expressions using such characters.
+
+  Alternatively the macro \csbxint{exprSafeCatcodes} resets all
+  characters potentially needed by \csbxint{expr} to their standard catcodes
+  and \csbxint{exprRestoreCatcodes} restores the former status.
+
+\item Count registers and |\numexpr|-essions are accepted (LaTeX{}'s counters
+  can be inserted using |\value|) natively without |\the| or |\number| as
+  prefix. Also dimen registers and control sequences, skip registers and
+  control sequences (\LaTeX{}'s lengths), |\dimexpr|-essions,
+  |\glueexpr|-essions are automatically unpacked using |\number|, discarding
+  the stretch and shrink components and giving the dimension value in |sp|
+  units ($1/65536$th of a \TeX{} point). Furthermore, tacit multiplication is
+  implied, when the (count or dimen or glue) register or variable, or the
+  (|\numexpr| or |\dimexpr| or |\glueexpr|) expression is immediately prefixed
+  by a (decimal) number. See \autoref{ssec:tacit multiplication} for the complete rules
+  of tacit multiplication.\IMPORTANT
+
+\item With a macro |\x| defined like this:
+  %
+  \leftedline{|\def\x {\xintexpr \a + \b \relax}| or |\edef\x {\xintexpr
+      \a+\b\relax}|}
+  %
+  one may then do |\xintthe\x|, either for printing the result on the page or
+  to use it in some other macros expanding their arguments. The |\edef| does
+  the computation immediately but keeps it in a protected form.
+  Naturally, the |\edef| is only possible if |\a| and |\b| are already
+  defined. With both approaches the |\x| can be inserted in other expressions,
+  as for example (assuming naturally as we use an |\edef| that in the
+  `yet-to-be computed' case the |\a| and |\b| now have some suitable meaning):
+  %
+  \leftedline {|\edef\y {\xintexpr \x^3\relax}|}
+
+\item There is also \csbxint{boolexpr}| ... \relax| and
+  \csbxint{theboolexpr}| ... \relax|.
+
+\item  See also
+  \csbxint{ifboolexpr} (\autoref{xintifboolexpr}) and the
+  \func{bool} and \func{togl} functions
+  in \autoref{sec:expr}. Here is an example. Well in fact the
+  example ended up using only \csbxint{boolexpr} so it 
+  was modified to use \csbxint{ifboolexpr}.
+\catcode`| 12 %
+\begin{everbatim*}
+\xintdeffunc A(p,q,r) =  p && (q || r) ;
+\xintdeffunc B(p,q,r) =  p || (q && r) ;
+\xintdeffunc C(p,q,r) =  xor(p, q, r)  ;
+
+\centeredline{\normalcolor
+\begin{tabular}{ccrclcl}
+        \xintFor* #1 in  {{False}{True}} \do {%
+        \xintFor* #2 in  {{False}{True}} \do {%
+        \xintFor* #3 in  {{False}{True}} \do {%
+    #1 &AND &(#2 &OR  &#3)&is&\textcolor[named]{OrangeRed}
+                              {\xintifboolexpr{A(#1,#2,#3)}{true}{false}}\\
+    #1 &OR  &(#2 &AND &#3)&is&\textcolor[named]{OrangeRed}
+                              {\xintifboolexpr{B(#1,#2,#3)}{yes}{no}}\\
+    #1 &XOR & #2 &XOR &#3 &is&\textcolor[named]{OrangeRed}
+                              {\xintifboolexpr{C(#1,#2,#3)}{oui}{non}}\\
+}}}
+\end{tabular}%
+}
+\end{everbatim*}\catcode`| 13
+
+\item See also \csbxint{ifsgnexpr}.
+
+\item There is  \csbxint{floatexpr}| ... \relax| where the algebra is done
+  in floating point approximation (also for each intermediate result). Use the
+  syntax |\xintDigits:=N\relax| to set the precision. Default: $16$ digits.
+  %
+  \leftedline{|\xintthefloatexpr 2^100000\relax:| \dtt{\xintthefloatexpr
+      2^100000\relax }}
+  %
+  The square-root operation can be used in |\xintexpr|, it is computed
+  as a float with the precision set by |\xintDigits| or by the optional
+  second argument:
+  %
+\begin{everbatim*}
+\xinttheexpr sqrt(2,60)\relax\newline
+Here the [60] is to avoid truncation to |\xinttheDigits| of precision on output.
+\newline
+\printnumber{\xintthefloatexpr [60] sqrt(2,60)\relax}
+\end{everbatim*}
+
+  Floats are quickly indispensable when using the power function, as exact
+  results will easily have hundreds, even thousands of digits.
+  %
+\begin{everbatim*}
+\xintDigits:=48\relax \xintthefloatexpr 2^100000\relax
+\end{everbatim*}
+
+  Only integer and (in |\xintfloatexpr...\relax|) half-integer exponents are
+  allowed.
+
+\item if one uses \emph{macros} within |\xintexpr..\relax| one should
+  obviously take into account that the parser will \emph{not} see the macro
+  arguments, hence one cannot use the syntax there, except if the arguments
+  are themselves wrapped as |\xinttheexpr...\relax| and assuming the macro
+  \fexpan ds these arguments.
+\end{itemize}
+\subsection{\texorpdfstring{\texttt{\protect\string\numexpr}}{\textbackslash
+    numexpr} or \texorpdfstring{\texttt{\protect\string\dimexpr}}{\textbackslash
+    dimexpr} expressions, count and dimension registers and variables}
+\label{ssec:countinexpr}
+
+Count registers, count control sequences, dimen registers, dimen control
+sequences (like |\parindent|), skips and skip control sequences, |\numexpr|,
+|\dimexpr|, |\glueexpr|, |\fontdimen| can be inserted directly, they will be
+unpacked using |\number| which gives the internal value in terms of scaled
+points for the dimensional variables: $1$\,|pt|${}=65536$\,|sp| (stretch and
+shrink components are thus discarded).
+
+Tacit multiplication (see \autoref{ssec:tacit multiplication}) is implied,
+when a number or decimal number prefixes such a register or control sequence.
+\LaTeX{} lengths are skip control sequences and \LaTeX{} counters should be
+inserted using |\value|.
+
+Release |1.2| of the |\xintexpr| parser also recognizes and prefixes with
+|\number| the |\ht|, |\dp|, and |\wd| \TeX{} primitives as well as the
+|\fontcharht|, |\fontcharwd|, |\fontchardp| and |\fontcharic| \eTeX{}
+primitives.
+
+In the case of numbered registers like |\count255| or |\dimen0| (or |\ht0|),
+the resulting digits will be re-parsed, so for example |\count255 0| is like
+|100| if |\the\count255| would give |10|. The same happens with inputs such
+as |\fontdimen6\font|. And |\numexpr 35+52\relax| will be exactly as if |87|
+as been encountered by the parser, thus more digits may follow: |\numexpr
+35+52\relax 000| is like |87000|. If a new |\numexpr| follows, it is treated
+as what would happen when |\xintexpr| scans a number and finds a non-digit: it
+does a tacit multiplication.
+\begin{everbatim*}
+\xinttheexpr \numexpr 351+877\relax\numexpr 1000-125\relax\relax{} is the same
+as \xinttheexpr 1228*875\relax.
+\end{everbatim*}
+
+Control sequences however (such as |\parindent|) are picked up as a whole by
+|\xintexpr|, and the numbers they define cannot be extended extra digits, a
+syntax error is raised if the parser finds digits rather than a legal
+operation after such a control sequence.
+
+A token list variable must be prefixed by |\the|, it will not be unpacked
+automatically (the parser will actually try |\number|, and thus fail). Do not
+use |\the| but only |\number| with a dimen or skip, as the |\xintexpr| parser
+doesn't understand |pt| and its presence is a syntax error. To use a dimension
+expressed in terms of points or other \TeX{} recognized units, incorporate it in
+|\dimexpr...\relax|.
+
+Regarding how dimensional expressions are converted by \TeX{} into scaled points
+see also \autoref{sec:Dimensions}.
+
+\subsection{Catcodes and spaces}
+
+The main problems are caused by active characters, because \csbxint{expr} et
+al.\@ expand forward whatever comes from token stream; they apply |\string|
+only in a second step.  For example the catcode of |&| from |&&| Boolean
+disjunction is not really important as long as it is not active, or comment,
+or escape...\@ or brace...\@ or ignored...\@ in brief, as long as it is reasonable,
+and in particular whether |@| is of catcode letter or other does not matter.
+
+It is always possible to insert manually the |\string| in the expression
+before a problematic (but reasonable) character catcode, or even to use
+|\detokenize| for a big chunk.  
+
+\subsubsection{\csh{xintexprSafeCatcodes}}
+\label{xintexprSafeCatcodes}
+
+Some problems with active characters can be resolved on the fly by prefixing
+them by |\string| but some aspects of the parsing done by \csbxint{expr}
+involves delimited macros which need the comma, equality sign and closing
+parenthesis to have their standard catcodes.
+
+So \csbxint{exprSafeCatcodes} is provided as a utility to set in one go
+catcodes of many characters to \csbxint{expr}-safely compatible values. This
+is a non-expandable step as it changes catcodes.
+%  This is used
+% internally by \csbxint{NewExpr} (restoring the catcodes on exit), hence it
+% does not have to be protected against active characters when used at
+% top-level.
+
+\csbxint{defvar}, \csbxint{deffunc}, et al., use it, and then they restore
+catcodes to the prior state via \csbxint{exprRestoreCatcodes}.
+
+% As \csbxint{NewExpr} and \csbxint{deffunc} and variants use internally some
+% |\scantokens|, they will (reasonably) succeed in sanitizing catcodes in the
+% expressions, even if all is from the replacement text of some macro whose
+% definition was done under some special catcode regime.
+
+% \csbxint{deffunc} is more lenient than \csbxint{defvar} regarding catcodes of
+% characters in expression bodies as it does some |\scantokens| which will reset
+% compatible catcodes.
+
+% Even if used in a context where catcodes are already set, \csbxint{deffunc},
+% \csbxint{defvar} and variants ignore completely the colon in |:=| so it can
+% have any (reasonable) catcode. Moreover it is optional.
+
+% The semi-colon in the syntax of \csbxint{Digits} is no real problem either
+% (cf. \csbxint{Digits} documentation).
+
+\subsubsection{\csh{xintexprRestoreCatcodes}}
+\label{xintexprRestoreCatcodes}
+
+Restores the catcodes to the state prevailing at the time of the last executed
+\csbxint{exprSafeCatcodes} (if located at the same \LaTeX\ environment or
+\TeX\ grouping level).
+
+Prior to |1.4k|, in a situation like the following:
+\begin{everbatim}
+\xintexprSafeCatcodes
+....stuff possibly changing catcodes
+\xintexprSafeCatcodes
+....stuff possibly changing catcodes
+\xintexprSafeCatcodes
+....stuff possibly changing catcodes
+\xintexprRestoreCatcodes
+\end{everbatim}
+On exit, the catcodes recovered their status as prior to the \emph{first}
+\csbxint{exprSafeCatcodes}.  Since |1.4k|, they are set to what they were
+prior to the \emph{last} \csbxint{exprSafeCatcodes}, i.e. the mechanism is now
+similar to a ``last in, first out'' stack.
+
+Note that no global assignments are made so the behaviour can be modified
+by usage of \TeX\ groups or \LaTeX\ environments: e.g. if an
+\csbxint{exprSafeCatcodes} is issued inside a \LaTeX\ environment it does not
+have to be paired by \csbxint{exprRestoreCatcodes} explicitly, the catcode
+scope is limited by the environment.
+
+\bigskip
+
+Spaces inside an |\xinttheexpr...\relax| should mostly be
+innocuous (except inside macro arguments).
+
+|\xintexpr| and |\xinttheexpr| are for the most part agnostic regarding
+catcodes, %  (unbraced) digits, binary operators, minus and plus signs as
+% prefixes, dot as decimal mark, parentheses, may be indifferently of catcode
+% letter or other or subscript or superscript, ..., except that they
+% should not be \emph{active}, as for example are |!?;:| with |babel-french|.%
+% %
+% \footnote{Furthermore, although \csbxint{expr} uses \csa{string}, it is
+%   escape-char agnostic. It should work with any \csa{escapechar} setting
+%   including -1.}
+but the characters
+% |+|, |-|, |*|, |/|, |^|, |!|, |&|, \verb+|+, |?|, |:|, |<|, |>|,
+%|=|, |(|, |)|, |"|, |[|, |]|, |;|, 
+in the expression should not be «active» (except on purpose) as everything is
+expanded along the way, and |\xintexpr| will choke on typesetting related
+commands. One can use |\string| to prefix a problematic character.
+
+
+Digits, slash, square brackets, minus sign, in the output from an
+|\xinttheexpr| are all of catcode 12. For |\xintthefloatexpr| the `e' in the
+output has its standard catcode ``letter''.
+
+
+
+
+\subsection{Expandability, \csh{xintexpro}}
+
+As is the case with all other package macros |\xintexpr| \fexpan ds (in two
+steps) to its final (somewhat protected) result; and |\xinttheexpr| \fexpan ds
+(in two steps) to the chain of digits (and possibly minus sign |-|, decimal
+mark |.|, fraction slash |/|, scientific |e|, square brackets |[|, |]|)
+representing the result.
+
+The once expanded |\xintexpr| is |\romannumeral0\xintexpro|.  And there
+are similarly |\xintiexpro| |\xintiiexpro| and |\xintfloatexpro|.  For an
+example see \autoref{ssec:fibonacci}.
+
+An expression can only be legally finished by a |\relax| token, which
+will be absorbed.
+
+It is quite possible to nest expressions among themselves; for example, if one
+needs inside an |\xintiiexpr...\relax| to do some computations with fractions,
+rounding the final result to an integer, one just has to insert
+|\xintiexpr...\relax|. The functioning of the infix operators will not be in
+the least affected from the fact that the outer ``environment'' is the
+|\xintiiexpr| one.
+
+
+\subsection{\csh{xintDigits*}, \csh{xintSetDigits*}}
+\label{xintDigits*}
+\label{xintSetDigits*}
+
+These starred variants of \csbxint{Digits} and \csbxint{SetDigits} execute
+\csbxint{reloadxinttrig} and \csbxint{reloadxintlog}.
+
+\subsection{\csh{xintiexpr}, \csh{xinttheiexpr}}
+\label{xintiexpr}\label{xinttheiexpr}\label{thexintiexpr}
+
+Equivalent\etype{x} to doing |\xintexpr round(...)\relax| (more precisely,
+|round| is applied to each leaf item of the |ople| independently of its
+depth).
+
+Intermediate calculations are exact, only the final output gets
+rounded. Half integers are rounded towards $+\infty$ for positive
+numbers and towards $-\infty$ for negative ones.
+
+An optional parameter |D| within brackets, immediately after |\xintiexpr| is
+allowed: it instructs (for |D>0|) the expression to do its final rounding to
+the nearest value with that many digits after the decimal mark, i.e.\@
+|\xintiexpr [D] <expression>\relax| is equivalent (in case of a single
+expression) to |\xintexpr round(<expression>, D)\relax|.
+
+|\xintiexpr [0] ...| is the same as |\xintiexpr ...| and rounds to an integer.
+
+The case of negative |D| gives quantization to an integer multiple of
+\dtt{1e-D}.\NewWith{1.4a} This was modified at |1.4f| and the produced value
+is now the rounded quotient by \dtt{1e-D} (i.e. no trailing zeros nor
+scientific exponent in the output).
+
+If truncation rather than rounding is needed on can use |\xintexpr
+trunc(...)\relax| for truncation to an integer or |\xintexpr
+trunc(...,D)\relax| for quantization to an integer multiple or \dtt{1eD} (if
+|D>0|, for |D<0| the analog would be |trunc((...)/1e-D)|).  But
+this works only for a single scalar value.
+
+\begin{framed}
+  When defining a macro doing something such as |\xintiexpr #1\relax|,
+  it is recommended to rather use |\xintiexpr\empty #1\relax|, as the
+  |#1| may start with  a |[| which without the |\empty| would be
+  interpreted by |\xintiexpr| as the start of the optional |[D]|.
+\end{framed}
+
+\subsection{\csh{xintiiexpr}, \csh{xinttheiiexpr}}
+\label{xintiiexpr}\label{xinttheiiexpr}\label{thexintiiexpr}
+
+This variant\etype{x} does not know fractions. It deals almost only with long
+integers. Comma separated lists of expressions are allowed.
+
+\begin{framed}
+  It maps |/| to the \emph{rounded} quotient. The operator
+  |//| is, like in |\xintexpr...\relax|, mapped to \emph{truncated} division.
+  The Euclidean quotient (which for positive operands is like the truncated
+  quotient) was, prior to release |1.1|, associated to |/|. The function
+  |quo(a,b)| can still be employed.
+\end{framed}
+
+The \csbxint{iiexpr}-essions use the `ii' macros for addition, subtraction,
+multiplication, power, square, sums, products, Euclidean quotient and
+remainder.
+
+The |round|, |trunc|, |floor|, |ceil| functions are still available, and are
+about the only places where fractions can be used, but |/| within, if not
+somehow hidden will be executed as integer rounded division. To avoid this one
+can wrap the input in \dtt{qfrac}: this means however that none of the normal
+expression parsing will be executed on the argument.
+
+To understand the illustrative examples, recall that |round| and |trunc| have
+a second (non negative) optional argument. In a normal \csbxint{expr}-essions,
+|round| and |trunc| are mapped to \csbxint{Round} and \csbxint{Trunc}, in
+\csbxint{iiexpr}-essions, they are mapped to \csbxint{iRound} and
+\csbxint{iTrunc}.
+
+
+\begin{everbatim*}
+\xinttheiiexpr 5/3, round(5/3,3), trunc(5/3,3), trunc(\xintDiv {5}{3},3),
+trunc(\xintRaw {5/3},3)\relax{} are problematic, but
+%
+\xinttheiiexpr 5/3,  round(qfrac(5/3),3), trunc(qfrac(5/3),3), floor(qfrac(5/3)),
+ceil(qfrac(5/3))\relax{} work!
+\end{everbatim*}
+
+On the other hand decimal numbers and scientific numbers can be used directly
+as arguments to the |num|, |round|, or any function producing an integer.
+
+\begin{framed}
+  Scientific numbers will be
+  represented with as many zeroes as necessary, thus one does not want to
+  insert \dtt{num(1e100000)} for example in an \csa{xintiiexpr}ession!
+\end{framed}
+
+%
+\begin{everbatim*}
+\xinttheiiexpr num(13.4567e3)+num(10000123e-3)\relax
+% should (num truncates) compute 13456+10000
+\end{everbatim*}
+%
+
+The |reduce| function is not available and will raise an error. The |frac|
+function also. The |sqrt| function is mapped to \csbxint{iiSqrt} which gives
+a truncated square root. The |sqrtr| function is mapped to \csbxint{iiSqrtR}
+which gives a rounded square root.
+
+One can use the Float macros if one is careful to use |num|, or |round|
+etc\dots on their output.
+
+\begin{everbatim*}
+\xinttheiiexpr \xintFloatSqrt [20]{2},
+               \xintFloatSqrt [20]{3}\relax % no operations
+\end{everbatim*}
+The above went through because no actual operations were carried out.  But it
+is dangerous because the ``printer'' for \csbxint{theiiexpr} could choke on
+such values.  By default however it does nothing.
+
+In the next example there will be an addition.  So we firt apply |round| to
+get integers (the second argument of |round| and |trunc| tells how many digits
+from after the decimal mark one should keep.)
+\begin{everbatim*}
+\xinttheiiexpr round(\xintFloatSqrt [20]{2},19) +
+               round(\xintFloatSqrt [20]{3},19)\relax
+\end{everbatim*}
+
+The whole point of \csbxint{iiexpr} is to gain some speed in
+\emph{integer-only} algorithms, and the above explanations related to how to
+nevertheless use fractions therein are a bit peripheral. We observed
+(2013/12/18) of the order of $30$\% speed gain when dealing with numbers with
+circa one hundred digits (1.2: this info may be obsolete).
+
+
+\subsection{\csh{xintboolexpr}, \csh{xinttheboolexpr}}
+\label{xintboolexpr}\label{xinttheboolexpr}\label{thexintboolexpr}
+
+Equivalent\etype{x} to doing |\xintexpr ...\relax| and returning $True$ if the
+result does not vanish, and $False$ if the result is zero. As |\xintexpr|, this
+can be used on comma separated lists of expressions, and even bracketed lists.
+\CHANGED{1.4}
+
+It can be customized, one only needs to modify the following:
+\begin{everbatim}
+\def\xintboolexprPrintOne#1{\xintiiifNotZero{#1}{True}{False}}%
+\end{everbatim}
+Not only are |True| and |False| usable in input, also |true| and |false| are
+pre-declared variables.
+
+Maybe obsolete:
+
+There is slight quirk in case it is used as a sub-expression: the boolean
+expression needs at least one logic operation else the value is not
+standardized to |1| or |0|, for example we get from
+\begin{everbatim*}
+\xinttheexpr \xintboolexpr 1.23\relax\relax\newline
+\end{everbatim*}which is to be compared with
+\begin{everbatim*}
+\xinttheboolexpr 1.23\relax
+\end{everbatim*}
+
+% A related issue existed with
+% |\xinttheexpr \xintiexpr 1.23\relax\relax|, which was fixed with |1.1|
+% release, and I decided back then not to add the needed overhead also to the
+% |\xintboolexpr| context, as one only needs to use |?(1.23)| for example or
+% involve the |1.23| in any logic operation like |1.23 'and' 3.45|, or involve
+% the |\xintboolexpr ..\relax | itself with any logical operation, contrarily to
+% the sub-|\xintiexpr| case where |\xinttheexpr 1+\xintiexpr 1.23\relax\relax|
+% did behave contrarily to expectations until |1.1|.
+
+
+\subsection{\csh{xintfloatexpr},
+  \csh{xintthefloatexpr}}
+\label{xintfloatexpr}\label{xintthefloatexpr}\label{thexintfloatexpr}
+
+\csbxint{floatexpr}|...\relax|\etype{x} is exactly like |\xintexpr...\relax|
+but with the four binary operations and the power function mapped to
+\csa{xintFloatAdd}, \csa{xintFloatSub}, \csa{xintFloatMul}, \csa{xintFloatDiv}
+and \csa{xintFloatPower}, respectively.\footnote{Since |1.2f| the \string^
+  handles half-integer exponents, contrarily to \csa{xintFloatPower}.}
+
+The target precision for the computation is from the
+current setting of |\xintDigits|. Comma separated lists of expressions are
+allowed.
+
+An optional parameter within brackets |[Q]| is allowed at the very start
+of the expression:
+\begin{itemize}
+\item if positive it instructs the macro to round the result to that
+  many digits of precision. It thus makes sense to employ it only if
+  this parameter is less than the \csbxint{theDigits} precision.
+\item if negative it means to trim off that many digits (of course, in
+  the sense of rounding the values to shorter mantissas). Don't use it
+  to trim all digits (or more than all)!
+\end{itemize}
+
+Since |1.2f| all float operations first round their arguments; a parsed number
+is not rounded prior to its use as operand to such a float operation.
+
+
+|\xintDigits:=36\relax|\xintDigits:=36\relax 
+%
+\leftedline{|\xintthefloatexpr
+  (1/13+1/121)*(1/179-1/173)/(1/19-1/18)\relax|}
+%
+\leftedline{\dtt{\xintthefloatexpr
+  (1/13+1/121)*(1/179-1/173)/(1/19-1/18)\relax}}
+% 0.00564487459334466559166166079096852897
+%
+\leftedline{|\xintthefloatexpr\xintexpr
+  (1/13+1/121)*(1/179-1/173)/(1/19-1/18)\relax\relax|}
+%
+\leftedline{\dtt{\xintthefloatexpr\xintexpr
+  (1/13+1/121)*(1/179-1/173)/(1/19-1/18)\relax\relax}}
+
+\xintDigits := 16;
+
+The latter is the rounding of the exact result. The former one has
+its last three digits wrong due to the cumulative effect of rounding errors
+in the intermediate computations, as compared to exact evaluations.
+
+
+
+
+I recall here from \autoref{ssec:floatingpoint} that with release |1.2f| the
+float macros for addition, subtraction, multiplication and division round
+their arguments first to |P| significant places with |P| the asked-for
+precision of the output; and similarly the power macros and the
+square root macro. This does not modify anything for computations with
+arguments having at most |P| significant places already.
+
+\begin{framed}
+  When defining a macro doing something such as |\xintfloatexpr #1\relax|,
+  it is recommended to rather use |\xintfloatexpr\empty #1\relax|, as the
+  |#1| may start with  a |[| which without the |\empty| would be
+  interpreted by |\xintfloatexpr| as the start of the optional |[Q]|.
+\end{framed}
+
+\subsection{\csh{xinteval}, \csh{xintieval}, \csh{xintiieval},
+  \csh{xintfloateval}}
+\label{xinteval}\label{xintieval}\label{xintiieval}\label{xintfloateval}
+
+\csbxint{eval}\etype{x} is an \fexpan dable macro which is basically
+defined in such a way that |\xinteval|\marg{expression} behaves like
+\csbxint{theexpr}\marg{expression}|\relax|.  It expands completely in
+two steps and delivers its output using digits, the dot |.| as decimal
+separator, the letter |e| for scientific notation, the slash |/| for
+fractions, as well as commas in case of multi-items expression and
+square brackets |[| and |]| for nesting.
+
+\csbxint{ieval}\etype{x} is similarly related to \csbxint{theiexpr}. It
+admits an optional argument |[D]| which may be located in the expected
+location from conventions of \LaTeX2e macros with optional argument, but
+had been long constrained (until |1.4k|) to be inside the braces at the
+start of the expression.
+\begin{everbatim*}
+\xintieval[7]{355/113} = \xintieval{[7]355/113}
+\end{everbatim*}
+\begin{framed}
+  When defining a macro doing something such as |\xintieval{#1}|,
+  it is recommended to rather use |\xintieval{\empty #1}|, as the
+  |#1| may start with  a |[| which without the |\empty| would be
+  interpreted by |\xintieval| as the start of the optional |[D]|.
+\end{framed}
+
+\csbxint{iieval}\etype{x} is similarly related to \csbxint{theiiexpr}.
+% \begin{everbatim*}
+% \xintiieval{add(x^2, x = 100..110), add(x^3, x = 100..110)}
+% \end{everbatim*}
+
+\csbxint{floateval}\etype{x} is similarly related to
+\csbxint{thefloatexpr}.  It admits an optional argument |[Q]| which
+may be located either outside (since |1.4k|) or inside the braces.
+\begin{everbatim*}
+\xintfloateval [7]{355/113} = \xintfloateval{[7] 355/113}
+\end{everbatim*}
+
+When negative, the optional argument tells how many digits to remove
+from the prevailing precision:
+\begin{everbatim*}
+\xintfloateval[-2]{355/113}=
+\xintfloateval{[-2]355/113} has \xinttheDigits\ minus 2 digits.
+\end{everbatim*}
+
+\begin{framed}
+  When defining a macro doing something such as |\xintfloateval{#1}|,
+  it is recommended to rather use |\xintfloateval{\empty #1}|, as the
+  |#1| may start with  a |[| which without the |\empty| would be
+  interpreted by |\xintfloateval| as the start of the optional |[Q]|.
+\end{framed}
+
+
+The \csbxint{eval} et al. macros have the advantage that they can be
+nested within things such as the |\num| macro of
+\href{http://ctan.org/pkg/siunitx}{siunitx}, which would choke on some
+of the syntax elements which are allowed inside
+\csb{xinttheexpr}|...\relax|, such as brackets.  Hidden inside the
+braces as argument to \csbxint{eval} et al., they do not cause a
+breakage of |\num| anymore.
+
+And regarding \csbxint{ieval} and \csbxint{floateval} one sees here the
+advantage that their respective optional arguments can (and had to until
+|1.4k|) be located within the braces too...
+
+\subsection{Using an expression parser within another one}
+
+This was already illustrated before. In the following:
+\begin{everbatim*}
+\xintfloatexpr \xintexpr add(1/i, i=1234..1243)\relax ^100\relax
+\end{everbatim*},
+the inner sum is computed exactly. Then it will be rounded to |\xinttheDigits|
+significant digits, and then its power will be evaluated as a float operation.
+One should avoid the "|\xintthe|" parsers in inner positions as this induces
+digit by digit parsing of the inner computation result by the outer parser.
+Here is the same computation done with floats all the way:
+\begin{everbatim*}
+\xintfloatexpr add(1/i, i=1234..1243)^100\relax
+\end{everbatim*}
+
+Not surprisingly this differs from the previous one which was exact until
+raising to the |100|th power.
+
+The fact that the inner expression occurs inside a bigger one has nil
+influence on its behaviour. There is the limitation though that the outputs
+from \csbxint{expr} and \csbxint{floatexpr} can not be used directly in
+\csbxint{theiiexpr} integer-only parser. But one can do:
+\begin{everbatim*}
+\xintiiexpr round(\xintfloatexpr 3.14^10\relax)\relax % or trunc
+\end{everbatim*}
+
+
+\subsection{The \csh{xintthecoords} macro}
+\label{xintthecoords}
+
+It converts (in two expansion steps) the expansion result of
+\csbxint{floatexpr} (or \csbxint{expr} or \csbxint{iiexpr}) into the |(a, b)
+(c, d) ...| format for list of coordinates as expected by the |TikZ|
+|coordinates| syntax.%
+\begin{everbatim*}
+\begin{figure}[htbp]
+\centering\begin{tikzpicture}[scale=10]\xintDigits:=8\relax 
+  \clip (-1.1,-.25) rectangle (.3,.25);
+  \draw [blue] (-1.1,0)--(1,0);
+  \draw [blue] (0,-1)--(0,+1);
+  \draw [red] plot[smooth] coordinates {%
+%%% \xintthecoords converts output of next expression into the
+%%%            (x1, y1) (x2, y2) ... 
+%%% format
+    \xintthecoords\xintfloatexpr
+%%%    This syntax -1+[0..4]/2 is currenty dropped at xint 1.4
+%%%    seq((x^2-1,mul(x-t,t=-1+[0..4]/2)),x=-1.2..[0.1]..+1.2)\relax
+%%%    Use this:
+    seq((x^2-1,mul(x-t,t=seq(-1+u/2, u=0..4))),x=-1.2..[0.1]..+1.2)
+    \relax
+     };
+\end{tikzpicture}
+\caption{Coordinates with \cs{xintthecoords}.}
+\end{figure}
+\end{everbatim*}
+
+% Notice: if x goes not take exactly value 1 or -1, the origin appears slightly
+% off the curve, not MY fault!!!
+It is currently undecided how \csa{xintthecoords} should handle bracketed
+data.\UNSTABLE{} Currently, it (or |TikZ|) will break it the input contains
+nested structures. One can use it with \func{flat} which removes all nesting.
+And in combination with \func{zip} it is easy to plot data given by some
+mechanism in separate
+lists of x- and y-coordinates (see an example in next section)
+
+\subsection{The \csh{xintthespaceseparated} macro}
+\label{xintthespaceseparated}
+
+It converts (in two expansion steps)\NewWith{1.4a} the expansion result of
+\csbxint{floatexpr} (or \csbxint{expr} or \csbxint{iiexpr}) into the space
+separated format suitable for usage with |PS-Tricks| |\listplot| macro.
+
+Here is for example some syntax (the replacement text of |\foo|, which is used
+here only to show that indeed complete expansion is attained in two steps)
+which can be used as argument to |\listplot|. Using 4 fractional decimal
+digits is sufficient when unit is the centimeter (it gives a fixed point
+precision of one micron, amply enough for plots...).
+\begin{everbatim*}
+\oodef\foo{%
+\xintthespaceseparated
+\xintiexpr[4]\xintfloatexpr seq((i, log10(i)), i=1..[0.5]..10)\relax\relax
+}\meaning\foo
+\end{everbatim*}
+
+Here we don't really need the inner |\xintfloatexpr...\relax| because the
+\func{log10} function works the same in the exact parser |\xintexpr| but in
+general this is recommended.
+
+It is currently undecided how \csa{xintthespaceseparated} should handle
+bracketed data.\UNSTABLE{} Currently, it (or |\listplot|) will break if the
+input contains nested structures. One can use it with \func{flat} which
+removes all nesting. And in combination with \func{zip} it is easy to plot
+data given by some mechanism in separate lists of x- and y-coordinates.
+
+\begin{everbatim*}
+% let's imagine we have something like this
+\def\Xcoordinates{1, 3, 5, 7, 9}
+\def\Ycoordinates{1, 9, 25, 49, 81}
+% then:
+|\xintthespaceseparated\xintexpr flat(zip([\Xcoordinates], [\Ycoordinates]))\relax|
+is suitable to use as argument to |\listplot|, as it expands to
+\xintthespaceseparated\xintexpr flat(zip([\Xcoordinates], [\Ycoordinates]))\relax
+\end{everbatim*}
+
+\subsection{\csh{xintifboolexpr}, \csh{xintifboolfloatexpr}, \csh{xintifbooliiexpr}}
+\label{xintifboolexpr}
+\label{xintifboolfloatexpr}
+\label{xintifbooliiexpr}
+
+\csh{xintifboolexpr}\marg{expr}\marg{YES}\marg{NO}\etype{xnn} does
+\csbxint{theexpr}<expr>|\relax| and then executes the \meta{YES} or the
+\meta{NO} branch depending on whether the outcome was non-zero or zero. Thus
+one can read \emph{if bool expr} as meaning \emph{if not zero}:
+\centeredline{if \meta{expr}-ession does not vanish do \meta{YES} else do
+  \meta{NO}}
+
+The expression is not limited to using only comparison operators and Boolean
+logic (|<|, |>|, |==|, |!=|, |&&|, \verb+||+, \func{all}, \func{any},
+\func{xor}, \func{bool}, \func{togl}, ...), it can be the most general
+computation.
+
+\csh{xintifboolfloatexpr}\marg{expr}\marg{YES}\marg{NO}\etype{xnn} does
+\csbxint{thefloatexpr}\meta{expr}|\relax| and then executes the \meta{YES} or the
+\meta{NO} branch depending on whether the outcome was non zero or zero.
+
+\csh{xintifbooliiexpr}\marg{expr}\marg{YES}\marg{NO}\etype{xnn} does
+\csbxint{theiiexpr}\meta{expr}|\relax| and then executes the \meta{YES} or the
+\meta{NO} branch depending on whether the outcome was non zero or zero.
+
+The expression argument must be a single one, comma separated sub-expressions
+will cause low-level errors.
+
+\subsection{\csh{xintifsgnexpr}, \csh{xintifsgnfloatexpr}, \csh{xintifsgniiexpr}}
+\label{xintifsgnexpr}
+\label{xintifsgnfloatexpr}
+\label{xintifsgniiexpr}
+
+\csh{xintifsgnexpr}\marg{expr}\marg{<0}\marg{=0}\marg{>0}\etype{xnnn} evaluates
+the \csbxint{expr}ession and chooses the branch corresponding to its sign.
+
+\csh{xintifsgnfloatexpr}\marg{expr}\marg{<0}\marg{=0}\marg{>0}\etype{xnnn} evaluates
+the \csbxint{floatexpr}ession and chooses the branch corresponding to its sign.
+
+\csh{xintifsgniiexpr}\marg{expr}\marg{<0}\marg{=0}\marg{>0}\etype{xnnn} evaluates
+the \csbxint{iiexpr}ession and chooses the branch corresponding to its sign.
+
+The expression argument must be a single one, comma separated sub-expressions
+will cause low-level errors.
+
+\subsection{The \csh{xintNewExpr}, \csh{xintNewIIExpr},
+  \csh{xintNewFloatExpr}, \csh{xintNewIExpr},  and \csh{xintNewBoolExpr}
+  macros}
+\label{xintNewExpr}
+\label{xintNewIIExpr}
+\label{xintNewFloatExpr}
+\label{xintNewIExpr}
+\label{xintNewBoolExpr}
+
+\csbxint{NewExpr} macro is used as:
+%
+\leftedline{|\xintNewExpr{\myformula}[n]|\marg{stuff}, where}
+\begin{itemize}
+\item \meta{stuff} will be inserted inside |\xinttheexpr . . . \relax|,
+\item |n| is an integer between zero and nine, inclusive, which is the number
+  of parameters of |\myformula|,
+\item the placeholders |#1|, |#2|, ..., |#n| are used inside \meta{stuff} in
+  their usual r\^ole,%
+%
+\catcode`# 12
+\footnote{if \csa{xintNewExpr} is used inside a macro,
+    the |#|'s must be doubled as usual.}
+  \footnote{the |#|'s will in pratice have their usual
+    catcode, but  category code other |#|'s are accepted too.}
+\catcode`# 6
+%
+\item the |[n]| is \emph{mandatory}, even for |n=0|.%
+\footnote{there is some use for \csa{xintNewExpr}|[0]| compared to an
+    \csa{edef} as \csa{xintNewExpr} has some built-in catcode protection.}
+\item the macro |\myformula| is defined without checking if it already exists,
+  \LaTeX{} users might prefer to do first |\newcommand*\myformula {}| to get a
+  reasonable error message in case |\myformula| already exists,
+\item the protection against active characters is done automatically (as long
+  as the whole thing has not already been fetched as a macro argument and
+  the catcodes correspondingly already frozen).
+\end{itemize}
+
+It (if it succeeds) will be a completely expandable macro entirely built-up using |\xintAdd|,
+|\xintSub|, |\xintMul|, |\xintDiv|, |\xintPow|, etc\dots as corresponds to the
+expression written with the infix operators.
+Macros created by |\xintNewExpr| can thus be nested.
+
+\begin{everbatim*}
+    \xintNewFloatExpr \FA [2]{(#1+#2)^10}
+    \xintNewFloatExpr \FB [2]{sqrt(#1*#2)}
+\begin{enumerate}[nosep]
+    \item \FA {5}{5}
+    \item \FB {30}{10}
+    \item \FA {\FB {30}{10}}{\FB {40}{20}}
+\end{enumerate}
+\end{everbatim*}
+
+The documentation is much shortened here because \csbxint{NewExpr} and \csbxint{deffunc}
+are very much related one with the other.
+
+\begin{framed}
+  ATTENTION!
+
+  The original spirit of \csbxint{NewExpr} was to define a (possibly very big)
+  macro using only \xintfracname, and this means in particular that it must be
+  used only with arguments compatible with the \xintfracname input
+  format.\IMPORTANTf
+
+  Thus an |\xintexpr| declared variable has no chance to work, it must be
+  wrapped explicitly in |\xinteval{...}| to be fetched as argument to a macro
+  constructed by \csbxint{NewExpr}.
+\end{framed}
+
+They share essentially the same limitations.
+
+Notice though that \csbxint{NewFloatExpr} accepts and recognizes the optional
+argument |[Q]| of \csbxint{floatexpr}, contrarily to \csbxint{deffloatfunc}.
+Use an |\empty| in case the contents are not known in advance.
+
+
+Historical note: prior to |1.4|, \xintexprname used a |\csname..\endcsname|
+encapsulation technique which impacted the string pool memory. The
+\csbxint{NewExpr} was designed as a method to pre-parse the expression and
+produce one single, gigantic, nested usage of the relevant \xintfracname
+macros. This way, only those macros were expanded which had nil impact on the
+\TeX{} string pool.
+
+Later on it was found that this mechanism could be employed to define
+functions. Basically underneath |98%| of \csbxint{NewExpr} and
+\csbxint{deffunc} are using the same shared code.
+
+\xintDigits:= 16\relax 
+
+\subsection{Analogies and differences of \csh{xintiiexpr} with \csh{numexpr}}
+
+\csbxint{iiexpr}|..\relax| is a parser of expressions knowing only (big)
+integers. There are, besides the enlarged range of allowable inputs, some
+important differences of syntax between |\numexpr| and |\xintiiexpr| and
+variants:
+\begin{itemize}
+\item Contrarily to |\numexpr|, the |\xintiiexpr| parser will stop expanding
+  only after having encountered (and swallowed) a \emph{mandatory} |\relax|
+  token.
+\item In particular, spaces between digits (and not only around infix
+  operators or parentheses) do not stop |\xintiiexpr|, contrarily to the
+  situation with |numexpr|: |\the\numexpr 7 + 3 5\relax| expands (in one
+  step)%
+%
+\footnote {The |\numexpr| triggers continued expansion after the space
+    following the |3| to check if some operator like |+| is upstream. But
+    after having found the |5| it treats it as and end-marker.}
+%
+  to \dtt{\detokenize\expandafter{\the\numexpr 7 + 3 5\relax}\unskip}, whereas
+  |\xintthe\xintiiexpr 7 + 3 5\relax| expands (in two steps) to
+  \dtt{\detokenize\expandafter\expandafter\expandafter {\xintthe\xintiiexpr 7
+      + 3 5\relax}}.%
+%
+\footnote {Since |1.2l| one can also use the underscore |_| to separate digits
+for readability of long numbers.}
+
+\item Inside an |\edef|, an expression |\xintiiexpr...\relax| get fully
+  evaluated, whereas |\numexpr| without |\the| or |\number| prefix would not,
+  if not itself embedded in another |\the\numexpr| or similar context.
+\item (ctd.) The private format to which |\xintiiexpr...\relax| (et al.)
+  evaluates may use |\xintthe| prefix to turn into explicit digits,
+  (for example in arguments to some macros which expand their arguments). The |\the| \TeX\ primitive prefix would
+  not work here.
+\item (ctd.) One can embed a |\numexpr...\relax| (with its |\relax|!) inside an
+  |\xintiiexpr...\relax| without |\the| or |\number|, but the reverse situation
+  requires usage of |\xintthe| or \csbxint{eval} user interface,
+\item |\numexpr -(1)\relax| is illegal. In contrast |\xintiiexpr -(1)\relax| is
+  perfectly legal and gives the expected result (what else ?).
+\item |\numexpr 2\cnta\relax| is illegal (with |\cnta| a |\count| register.)
+  In contrast
+  |\xintiiexpr 2\cnta\relax| is perfectly legal and will do the tacit
+  multiplication.
+\item |\the\numexpr| or |\number\numexpr| expands in one step, but
+  |\xintthe\xintiiexpr| or |\xinttheiiexpr| needs two steps.
+\end{itemize}
+
+\subsection{Chaining expressions for expandable algorithmics}
+\label{ssec:fibonacci}
+
+We will see in this section how to chain |\xintexpr|-essions with
+|\expandafter|'s, like it is possible with |\numexpr|. For this it is
+convenient to use |\romannumeral0\xintexpro| which is the once-expanded form of
+|\xintexpr|, as we can then chain using only one |\expandafter| each time.
+
+For example, here is the code employed
+on the title page to compute (expandably, of course!) the 1250th Fibonacci
+number:
+
+\begin{everbatim*}
+\catcode`_ 11
+\def\Fibonacci #1{%  \Fibonacci{N} computes F(N) with F(0)=0, F(1)=1.
+    \expandafter\Fibonacci_a\expandafter
+        {\the\numexpr #1\expandafter}\expandafter
+        {\romannumeral0\xintiiexpro 1\expandafter\relax\expandafter}\expandafter
+        {\romannumeral0\xintiiexpro 1\expandafter\relax\expandafter}\expandafter
+        {\romannumeral0\xintiiexpro 1\expandafter\relax\expandafter}\expandafter
+        {\romannumeral0\xintiiexpro 0\relax}}
+%
+\def\Fibonacci_a #1{%
+    \ifcase #1
+          \expandafter\Fibonacci_end_i
+    \or
+          \expandafter\Fibonacci_end_ii
+    \else
+          \ifodd #1
+              \expandafter\expandafter\expandafter\Fibonacci_b_ii
+          \else
+              \expandafter\expandafter\expandafter\Fibonacci_b_i
+          \fi
+    \fi {#1}%
+}% * signs are omitted from the next macros, tacit multiplications
+\def\Fibonacci_b_i #1#2#3{\expandafter\Fibonacci_a\expandafter
+  {\the\numexpr #1/2\expandafter}\expandafter
+  {\romannumeral0\xintiiexpro sqr(#2)+sqr(#3)\expandafter\relax
+                                                          \expandafter}\expandafter
+  {\romannumeral0\xintiiexpro (2#2-#3)#3\relax}%
+}% end of Fibonacci_b_i
+\def\Fibonacci_b_ii #1#2#3#4#5{\expandafter\Fibonacci_a\expandafter
+  {\the\numexpr (#1-1)/2\expandafter}\expandafter
+  {\romannumeral0\xintiiexpro sqr(#2)+sqr(#3)\expandafter\relax
+                                                          \expandafter}\expandafter
+  {\romannumeral0\xintiiexpro (2#2-#3)#3\expandafter\relax\expandafter}\expandafter
+  {\romannumeral0\xintiiexpro #2#4+#3#5\expandafter\relax\expandafter}\expandafter
+  {\romannumeral0\xintiiexpro #2#5+#3(#4-#5)\relax}%
+}% end of Fibonacci_b_ii
+%         code as used on title page:
+%\def\Fibonacci_end_i  #1#2#3#4#5{\xintthe#5}
+%\def\Fibonacci_end_ii #1#2#3#4#5{\xinttheiiexpr #2#5+#3(#4-#5)\relax}
+%         new definitions:
+\def\Fibonacci_end_i  #1#2#3#4#5{{#4}{#5}}% {F(N+1)}{F(N)} in \xintexpr format
+\def\Fibonacci_end_ii #1#2#3#4#5%
+    {\expandafter
+     {\romannumeral0\xintiiexpro #2#4+#3#5\expandafter\relax
+      \expandafter}\expandafter
+     {\romannumeral0\xintiiexpro #2#5+#3(#4-#5)\relax}}% idem.
+% \FibonacciN returns F(N) (in encapsulated format: needs \xintthe for printing)
+\def\FibonacciN {\expandafter\xint_secondoftwo\romannumeral-`0\Fibonacci }%
+\catcode`_ 8
+\end{everbatim*}
+
+
+The macro |\Fibonacci| produces not one specific value |F(N)| but a pair of
+successive values |{F(N)}{F(N+1)}| which can then serve as starting point of
+another routine devoted to compute a whole sequence |F(N), F(N+1),
+F(N+2),....|. Each of |F(N)| and |F(N+1)| is kept in the encapsulated internal
+\xintexprname format.
+
+|\FibonacciN| produces the single |F(N)|. It also keeps it in the private
+format; thus printing it will need the |\xintthe| prefix.
+
+\begingroup\footnotesize\sffamily\baselineskip 10pt
+Here a code snippet which
+checks the routine via a \string\message\ of the first $51$ Fibonacci
+numbers (this is not an efficient way to generate a sequence of such
+numbers, it is only for validating \csa{FibonacciN}).
+%
+\begin{everbatim}
+\def\Fibo #1.{\xintthe\FibonacciN {#1}}%
+\message{\xintiloop [0+1] \expandafter\Fibo\xintiloopindex.,
+                          \ifnum\xintiloopindex<49 \repeat \xintthe\FibonacciN{50}.}
+\end{everbatim}
+\endgroup
+
+The way we use |\expandafter|'s to chain successive |\xintiiexpro| evaluations
+is exactly analogous to what is possible with |\numexpr|. The various
+|\romannumeral0\xintiiexpro| could very well all have been |\xintiiexpr|'s but
+then we would have needed |\expandafter\expandafter\expandafter| each
+time.
+
+\begin{framed}
+  There is a difference though: |\numexpr| does \emph{NOT} expand inside an
+  |\edef|, and to force its expansion we must prefix it with |\the| or
+  |\number| or |\romannumeral| or another |\numexpr| which is itself prefixed,
+  etc\dots.
+
+  But |\xintexpr|, |\xintiexpr|, ..., expand fully in an |\edef|, with the
+  completely expanded
+  result encapsulated in a private format.
+
+  Using |\xintthe| as prefix is necessary to print the result (like |\the| or
+  |\number| in the case of |\numexpr|), but it is not necessary to get the
+  computation done (contrarily to the situation with |\numexpr|).
+\end{framed}
+
+
+Our |\Fibonacci| expands completely under \fexpan sion, so we can use
+\hyperref[fdef]{\ttfamily\char92fdef} rather than |\edef| in a situation such
+as
+%
+\leftedline {|\fdef \X {\FibonacciN {100}}|\;,}
+%
+but it is usually about as efficient to employ |\edef|. And if we want
+%
+\leftedline{|\edef \Y {(\FibonacciN{100},\FibonacciN{200})}|\;,}
+%
+then |\edef| is necessary.
+
+Allright, so let's now give the code to generate |{F(N)}{F(N+1)}{F(N+2)}...|,
+using |\Fibonacci| for the first two and then using the standard recursion
+|F(N+2)=F(N+1)+F(N)|:
+
+\catcode`_ 11
+\def\FibonacciSeq #1#2{%#1=starting index, #2>#1=ending index
+    \expandafter\Fibonacci_Seq\expandafter
+    {\the\numexpr #1\expandafter}\expandafter{\the\numexpr #2-1}%
+}%
+\def\Fibonacci_Seq #1#2{%
+     \expandafter\Fibonacci_Seq_loop\expandafter
+                {\the\numexpr #1\expandafter}\romannumeral0\Fibonacci {#1}{#2}%
+}%
+\def\Fibonacci_Seq_loop #1#2#3#4{% standard Fibonacci recursion
+    {#3}\unless\ifnum #1<#4  \Fibonacci_Seq_end\fi
+        \expandafter\Fibonacci_Seq_loop\expandafter
+        {\the\numexpr #1+1\expandafter}\expandafter
+        {\romannumeral0\xintiiexpro #2+#3\relax}{#2}{#4}%
+}%
+\def\Fibonacci_Seq_end\fi\expandafter\Fibonacci_Seq_loop\expandafter
+    #1\expandafter #2#3#4{\fi {#3}}%
+\catcode`_ 8
+
+\begingroup
+\everb|@
+\catcode`_ 11
+\def\FibonacciSeq #1#2{%#1=starting index, #2>#1=ending index
+    \expandafter\Fibonacci_Seq\expandafter
+    {\the\numexpr #1\expandafter}\expandafter{\the\numexpr #2-1}%
+}%
+\def\Fibonacci_Seq #1#2{%
+     \expandafter\Fibonacci_Seq_loop\expandafter
+                {\the\numexpr #1\expandafter}\romannumeral0\Fibonacci {#1}{#2}%
+}%
+\def\Fibonacci_Seq_loop #1#2#3#4{% standard Fibonacci recursion
+    {#3}\unless\ifnum #1<#4  \Fibonacci_Seq_end\fi
+        \expandafter\Fibonacci_Seq_loop\expandafter
+        {\the\numexpr #1+1\expandafter}\expandafter
+        {\romannumeral0\xintiiexpro #2+#3\relax}{#2}{#4}%
+}%
+\def\Fibonacci_Seq_end\fi\expandafter\Fibonacci_Seq_loop\expandafter
+    #1\expandafter #2#3#4{\fi {#3}}%
+\catcode`_ 8
+|
+\endgroup
+
+This |\FibonacciSeq| macro is
+completely expandable but it is not \fexpan dable.
+
+This is not a problem in the next example which uses \csbxint{For*} as the
+latter applies repeatedly full expansion to what comes next each time it
+fetches an item from its list argument. Thus \csbxint{For*} still manages to
+generate the list via iterated full expansion.
+
+
+\begin{figure*}[ht!]
+  \phantomsection\label{fibonacci}
+  \newcounter{myindex}
+  \fdef\Fibxxx{\FibonacciN {30}}%
+  \setcounter{myindex}{30}%
+\centeredline{\tabskip 1ex
+\vbox{\halign{\bfseries#.\hfil&#\hfil &\hfil #\cr
+  \xintFor* #1 in {\FibonacciSeq {30}{59}}\do
+  {\themyindex &\xintthe#1 &
+    \xintiiRem{\xintthe#1}{\xintthe\Fibxxx}\stepcounter{myindex}\cr }}%
+}\vrule
+\vbox{\halign{\bfseries#.\hfil&#\hfil &\hfil #\cr
+  \xintFor* #1 in {\FibonacciSeq {60}{89}}\do
+  {\themyindex &\xintthe#1 &
+    \xintiiRem{\xintthe#1}{\xintthe\Fibxxx}\stepcounter{myindex}\cr }}%
+}\vrule
+\vbox{\halign{\bfseries#.\hfil&#\hfil &\hfil #\cr
+  \xintFor* #1 in {\FibonacciSeq {90}{119}}\do
+  {\themyindex &\xintthe#1 &
+   \xintiiRem{\xintthe#1}{\xintthe\Fibxxx}\stepcounter{myindex}\cr }}%
+}}%
+%
+\centeredline{Some Fibonacci numbers together with their residues modulo
+  |F(30)|\dtt{=\xintthe\Fibxxx}}
+\end{figure*}
+
+\begingroup
+\def\everbhook{\catcode`@ 14 }%
+% à propos après donc de nombreuses années j'ai fait finalement
+% un bug report https://github.com/latex3/latex2e/issues/823
+\everb|@
+\newcounter{myindex}% not "index", which would overwrite theindex environment!
+% (many have probably been bitten by this trap)
+\tabskip 1ex
+  \fdef\Fibxxx{\FibonacciN {30}}%
+  \setcounter{myindex}{30}%
+\vbox{\halign{\bfseries#.\hfil&#\hfil &\hfil #\cr
+  \xintFor* #1 in {\FibonacciSeq {30}{59}}\do
+  {\themyindex &\xintthe#1 &
+    \xintiiRem{\xintthe#1}{\xintthe\Fibxxx}\stepcounter{myindex}\cr }}%
+}\vrule
+\vbox{\halign{\bfseries#.\hfil&#\hfil &\hfil #\cr
+  \xintFor* #1 in {\FibonacciSeq {60}{89}}\do
+  {\themyindex &\xintthe#1 &
+    \xintiiRem{\xintthe#1}{\xintthe\Fibxxx}\stepcounter{myindex}\cr }}%
+}\vrule
+\vbox{\halign{\bfseries#.\hfil&#\hfil &\hfil #\cr
+  \xintFor* #1 in {\FibonacciSeq {90}{119}}\do
+  {\themyindex &\xintthe#1 &
+   \xintiiRem{\xintthe#1}{\xintthe\Fibxxx}\stepcounter{myindex}\cr }}%
+}%
+|
+\endgroup
+
+This produces the Fibonacci numbers from |F(30)| to |F(119)|, and
+computes also  all the
+congruence classes modulo |F(30)|.  The output has
+been put in a \hyperref[fibonacci]{float}, which appears
+\vpageref[above]{fibonacci}. I leave to the mathematically inclined
+readers the task to explain the visible patterns\dots |;-)|.
+
+\subsection{When expandability is too much}
+
+Let's use the macros of \autoref{ssec:fibonacci} related to Fibonacci numbers.
+Notice that the $47$th Fibonacci number is \dtt{\xintthe\FibonacciN {47}} thus
+already too big for \TeX{} and \eTeX{}.
+
+
+The |\FibonacciN| macro found in \autoref{ssec:fibonacci} is completely
+expandable, it is even \fexpan dable. We need a wrapper with |\xintthe|
+prefix
+\begin{everbatim*}
+\def\theFibonacciN{\xintthe\FibonacciN}
+\end{everbatim*}
+to print in the document or to use within |\message| (or \LaTeX\ |typeout|) to
+write to the log and terminal.
+
+\begingroup
+  \def\A {1859}  \def\B {1573}
+  \edef\X {\theFibonacciN\A}  \edef\Y {\theFibonacciN\B}
+  \edef\GCDAB {\xintiiGCD\A\B}\edef\Z {\theFibonacciN\GCDAB}
+  \edef\GCDXY{\xintiiGCD\X\Y}
+
+  The |\xintthe| prefix also allows its use it as argument to the \xintname
+  macros: for example if we are interested in knowing how many digits
+  $F(1250)$ has, it suffices to issue |\xintLen {\theFibonacciN {1250}}|
+  (which expands to \dtt{\xintLen {\theFibonacciN {1250}}}). Or if we want to
+  check the formula $gcd(F(1859),F(1573))=F(gcd(1859,1573))=F(143)$, we only
+  need%
+%
+\footnote{The
+  \csa{xintiiGCD} macro is provided by both the \xintgcdname package (since
+  |1.0|) and by the \xintname package (since |1.3d|).}
+%
+\begin{everbatim}
+$\xintiiGCD{\theFibonacciN{1859}}{\theFibonacciN{1573}}=%
+ \theFibonacciN{\xintiiGCD{1859}{1573}}$
+\end{everbatim}
+%
+which produces:
+%
+\leftedline{$\dtt{\xintiiGCD{\X}{\Y}}=\dtt{\theFibonacciN{\GCDAB}}$}
+
+The |\theFibonacciN| macro expanded its |\xintiiGCD{1859}{1573}| argument via the
+services of |\numexpr|: this step allows only things obeying the \TeX{} bound,
+naturally! (but \dtt{F(\xintiiPow2{31}}) would be rather big anyhow...).
+
+This is very convenient but of course it repeats the complete evaluation each
+time it is done. In practice, it is often useful to store the result of such
+evaluations in macros. Any |\edef| will break expandability, but if the goal
+is at some point to print something to the |dvi| or |pdf| output, and not only
+to the |log| file, then expandability has to be broken one day or another!
+
+Hence, in practice, if we want to print in the document some computation
+results, we can proceed like this and avoid having to repeat identical
+evaluations:
+\begin{everbatim}
+\begingroup
+  \def\A {1859}  \def\B {1573}
+  \edef\X {\theFibonacciN\A}  \edef\Y {\theFibonacciN\B}
+  \edef\GCDAB {\xintiiGCD\A\B}\edef\Z {\theFibonacciN\GCDAB}
+  \edef\GCDXY{\xintiiGCD\X\Y}
+The identity $\gcd(F(\A),F(\B))=F(\gcd(\A,\B))$ can be checked via evaluation
+of both sides: $\gcd(F(\A),F(\B))=\gcd(\printnumber\X,\printnumber\Y)=
+\printnumber{\GCDXY} = F(\gcd(\A,\B)) = F(\GCDAB) =\printnumber\Z$.\par
+          % some further computations involving \A, \B, \X, \Y
+\endgroup % closing the group removes assignments to \A, \B, ...
+% or choose longer names less susceptible to overwrite something.
+% Note: there is no LaTeX \newecommand which would be to \edef like
+% \newcommand is to \def
+\end{everbatim}
+The identity $\gcd(F(\A),F(\B))=F(\gcd(\A,\B))$ can be checked via evaluation
+of both sides: $\gcd(F(\A),F(\B))=\gcd(\printnumber\X,\printnumber\Y)=
+\printnumber{\GCDXY} = F(\gcd(\A,\B)) = F(\GCDAB) =\printnumber\Z$.\par
+\endgroup
+
+One may legitimately ask the author: why expandability
+to such extremes, for things such as big fractions or floating point numbers
+(even continued fractions...) which anyhow can not be used directly within
+\TeX's primitives such as |\ifnum|? Why insist on a concept
+which is foreign to the vast majority of \TeX\ users and even programmers?
+
+I have no answer: it made definitely sense at the start of \xintname (see
+\autoref{ssec:origins}) and once started I could not stop.
+
+
+\subsection{Acknowledgements (2013/05/25)}
+
+I was greatly helped in my preparatory thinking, prior to producing such an
+expandable parser, by the commented source of the
+\href{https://ctan.org/pkg/l3kernel}{l3fp} package, specifically the
+|l3fp-parse.dtx| file (in the version of April-May 2013; I think there was in
+particular a text called ``roadmap'' which was helpful). Also the source of the
+|calc| package was instructive, despite the fact that here for |\xintexpr| the
+principles are necessarily different due to the aim of achieving expandability.
+
+\clearpage
+\expandafter\let\csname xintexpr (old doc)nameUp\endcsname\undefined
 \csname xinttrignameUp\endcsname
 
-\def\n{|{N}|}
-\def\m{|{M}|}
-\def\x{|{x}|}
-\section{Macros of the \xinttrigname package}
+\section{The \xinttrigname package}
 \RaisedLabel{sec:trig}
 
 \localtableofcontents
@@ -8662,6 +10282,7 @@
 \noindent
 \begin{everbatim*}
 \xintDigits* := 48\relax
+Digits at \xinttheDigits:\newline
 $sind(17)\approx\xintfloateval{sind(17)}$\newline
 $cosd(17)\approx\xintfloateval{cosd(17)}$\newline
 $tand(17)\approx\xintfloateval{tand(17)}$\newline
@@ -8674,6 +10295,7 @@
 $tan(atan(7))\approx\xintfloateval{tan(atan(7))}$\newline
 $asind(sind(25))\approx\xintfloateval{asind(sind(25))}$\par\medskip
 \noindent\xintDigits* := 24\relax
+Digits at \xinttheDigits:\newline
 $sind(17)\approx\xintfloateval{sind(17)}$\newline
 $cosd(17)\approx\xintfloateval{cosd(17)}$\newline
 $tand(17)\approx\xintfloateval{tand(17)}$\newline
@@ -8695,7 +10317,7 @@
 \def\m{|{M}|}
 \def\x{|{x}|}
 
-\section{Macros of the \xintlogname package}
+\section{The \xintlogname package}
 \RaisedLabel{sec:log}
 
 This package provides logarithms, exponentials and fractional powers for use
@@ -8785,13 +10407,13 @@
 exponents (say for exponents of the order of \dtt{100000000} or more). Here is
 an example of a precise computation with a very large exponent (\dtt{\xintiieval{12^16}}):
 \begin{everbatim*}
-$\xintTeXfromSci{\xintfloateval{1.00000001^\xintiiexpr 12^16\relax}}$\newline
+$\xintTeXFromSci{\xintfloateval{1.00000001^\xintiiexpr 12^16\relax}}$\newline
 \xintDigits:=48;%\xintreloadxintlog is not done as log10/pow10 will not be used
-$\xintTeXfromSci{\xintfloateval{1.00000001^12^16}}$\newline
+$\xintTeXFromSci{\xintfloateval{1.00000001^12^16}}$\newline
 \xintDigits:=64;%\xintreloadxintlog is not done as log10/pow10 will not be used
-$\xintTeXfromSci{\xintfloateval{1.00000001^12^16}}$\newline
+$\xintTeXFromSci{\xintfloateval{1.00000001^12^16}}$\newline
 \xintDigits:=80;%\xintreloadxintlog is not done as log10/pow10 will not be used
-$\xintTeXfromSci{\xintfloateval{1.00000001^12^16}}$
+$\xintTeXFromSci{\xintfloateval{1.00000001^12^16}}$
 \xintDigits:=16;%
 \end{everbatim*}
 
@@ -8886,6 +10508,2730 @@
 
 \clearpage
 \let\xintlognameUp\undefined
+\csname xinttoolsnameUp\endcsname
+\def\n{|{N}|}
+\def\m{|{M}|}
+\def\x{|{x}|}
+\section{Macros of the \xinttoolsname package}
+
+\RaisedLabel{sec:tools}
+
+These utilities used to be provided within the \xintname package; since |1.09g|
+(|2013/11/22|) they have been moved to an independently usable package
+\xinttoolsname, which has none of the \xintname facilities regarding big
+numbers. Whenever relevant release |1.09h| has made the macros |\long| so they
+accept |\par| tokens on input.
+
+The completely expandable utilities (up to \csbxint{iloop}) are documented
+first, then the non expandable utilities.
+
+\autoref{sec:examples}
+gives additional (some quite dated) examples of use of macros of this package.
+
+\xinttoolsname is automatically loaded by \xintexprname.
+
+\localtableofcontents
+
+\subsection{\csh{xintRevWithBraces}}\label{xintRevWithBraces}
+
+%{\small New in release |1.06|.\par}
+
+\edef\X{\xintRevWithBraces{12345}}
+\edef\y{\xintRevWithBraces\X}
+\expandafter\def\expandafter\w\expandafter
+     {\romannumeral0\xintrevwithbraces{{\A}{\B}{\C}{\D}{\E}}}
+
+%
+\csa{xintRevWithBraces}\marg{list}\etype{f} first does the \fexpan sion of its
+argument then it reverses the order of the tokens, or braced material, it
+encounters, maintaining existing braces and adding a brace pair around each
+naked token encountered. Space tokens (in-between top level braces or naked
+tokens) are gobbled. This macro is mainly thought out for use on a \meta{list}
+of such braced material; with such a list as argument the \fexpan sion will only
+hit against the first opening brace, hence do nothing, and the braced stuff may
+thus be macros one does not want to expand.
+%
+\leftedline{|\edef\x{\xintRevWithBraces{12345}}|}
+%
+\leftedline{|\meaning\x:|\dtt{\meaning\X}}
+%
+\leftedline{|\edef\y{\xintRevWithBraces\x}|}
+%
+\leftedline{|\meaning\y:|\dtt{\meaning\y}}
+%
+The examples above could be defined with |\edef|'s because the braced material
+did not contain macros. Alternatively:
+%
+\leftedline{|\expandafter\def\expandafter\w\expandafter|}
+%
+\leftedline{|{\romannumeral0\xintrevwithbraces{{\A}{\B}{\C}{\D}{\E}}}|}
+%
+\leftedline{|\meaning\w:|\dtt{\meaning\w}}
+%
+The macro \csa{xintReverseWithBracesNoExpand}\etype{n} does the same job
+without the initial expansion of its argument.
+
+
+\subsection{\csh{xintZapFirstSpaces}, \csh{xintZapLastSpaces}, \csh{xintZapSpaces}, \csh{xintZapSpacesB}}
+\label{xintZapFirstSpaces}
+\label{xintZapLastSpaces}
+\label{xintZapSpaces}
+\label{xintZapSpacesB}
+%{\small New with release |1.09f|.\par}
+
+\csa{xintZapFirstSpaces}\marg{stuff}\etype{n} does not do \emph{any} expansion
+of its argument, nor brace removal of any sort, nor does it alter \meta{stuff}
+in anyway apart from stripping away all \emph{leading} spaces.
+
+This macro will be mostly of interest to programmers who will know what I will
+now be talking about. \emph{The essential points, naturally, are the complete
+  expandability and the fact that no brace removal nor any other alteration is
+  done to the input.}
+
+\TeX's input scanner already converts consecutive blanks into single space
+tokens, but |\xintZapFirstSpaces| handles successfully also inputs with
+consecutive multiple space tokens.
+However, it is assumed that \meta{stuff} does not contain (except inside braced
+sub-material) space tokens of character code distinct from $32$.
+
+It expands in two steps, and if the goal is to apply it to the
+expansion text of |\x| to define |\y|, then one can do:
+|\odef\y{\romannumeral0\expandafter\xintzapfirstspaces\expandafter{\x}}|
+(one can also define a wrapper macro to |\xintZapFirstSpaces| in order to
+expand once the argument first, but \xinttoolsname not being a programming
+layer, it provides no «Generate Variants» facilities). 
+
+Other use case: inside a macro which received a parameter |#1|, one can do
+|\oodef\x{\xintZapFirstSpaces {#1}}|, or, if |#1|, after leading spaces have
+been stripped can accept |\edef| expansion, one can do
+|\edef\x{\xintZapFirstSpaces{#1}}|.
+
+\begingroup
+\def\x {  \a {  \X } {  \b  \Y }  }
+%
+\leftedline{|\xintZapFirstSpaces {  \a {  \X } {  \b  \Y }  }->|%
+\dtt{\color{magenta}{}\expandafter\detokenize\expandafter
+{\romannumeral0\expandafter\xintzapfirstspaces\expandafter{\x}}}+++}
+\endgroup
+
+\medskip
+
+\noindent\csbxint{ZapLastSpaces}\marg{stuff}\etype{n}  does not do \emph{any} expansion of
+its argument, nor brace removal of any sort, nor does it alter \meta{stuff} in
+anyway apart from stripping away all \emph{ending} spaces. The same remarks as
+for \csbxint{ZapFirstSpaces} apply.
+
+\begingroup
+\def\x {  \a {  \X } {  \b  \Y }  }
+%
+\leftedline{|\xintZapLastSpaces {  \a {  \X } {  \b  \Y }  }->|%
+\dtt{\color{magenta}{}\expandafter\detokenize\expandafter
+{\romannumeral0\expandafter\xintzaplastspaces\expandafter{\x}}}+++}
+\endgroup
+
+\medskip
+
+\noindent\csbxint{ZapSpaces}\marg{stuff}\etype{n}  does not do \emph{any}
+expansion of its
+argument, nor brace removal of any sort, nor does it alter \meta{stuff} in
+anyway apart from stripping away all \emph{leading} and all \emph{ending}
+spaces. The same remarks as for \csbxint{ZapFirstSpaces} apply.
+
+\begingroup
+\def\x {  \a {  \X } {  \b  \Y }  }
+%
+\leftedline{|\xintZapSpaces {  \a {  \X } {  \b  \Y }  }->|%
+\dtt{\color{magenta}{}\expandafter\detokenize\expandafter
+{\romannumeral0\expandafter\xintzapspaces\expandafter{\x}}}+++}
+\endgroup
+
+\medskip
+
+\noindent\csbxint{ZapSpacesB}\marg{stuff}\etype{n}  does not do \emph{any}
+expansion of
+its argument, nor does it alter \meta{stuff} in anyway apart from stripping away
+all leading and all ending spaces and possibly removing one level of braces if
+\meta{stuff} had the shape |<spaces>{braced}<spaces>|. The same remarks as for
+\csbxint{ZapFirstSpaces} apply.
+
+\begingroup
+\def\x {  \a {  \X } {  \b  \Y }  }
+%
+\leftedline{|\xintZapSpacesB {  \a {  \X } {  \b  \Y }  }->|%
+\dtt{\color{magenta}{}\expandafter\detokenize\expandafter
+{\romannumeral0\expandafter\xintzapspacesb\expandafter{\x}}}+++}
+\def\x {  { \a {  \X } {  \b  \Y } }  }
+%
+\leftedline{|\xintZapSpacesB {  { \a {  \X } {  \b  \Y } }  }->|%
+\dtt{\color{magenta}{}\expandafter\detokenize\expandafter
+{\romannumeral0\expandafter\xintzapspacesb\expandafter{\x}}}+++}
+\endgroup
+ The spaces here at the start and end of the output come from the braced
+ material, and are not removed (one would need a second application for that;
+ recall though that the \xintname zapping macros do not expand their argument).
+
+\subsection{\csh{xintCSVtoList}}
+\label{xintCSVtoList}
+\label{xintCSVtoListNoExpand}
+
+
+\csa{xintCSVtoList}|{a,b,c...,z}|\etype{f}  returns |{a}{b}{c}...{z}|. A
+\emph{list} is by
+convention in this manual simply a succession of tokens, where each braced thing
+will count as one item (``items'' are defined according to the rules of \TeX{}
+for fetching undelimited parameters of a macro, which are exactly the same rules
+as for \LaTeX{} and macro arguments [they are the same things]). The word
+`list' in `comma separated list of items' has its usual linguistic meaning,
+and then an ``item'' is what is delimited by commas.
+
+So \csa{xintCSVtoList} takes on input a `comma separated list of items' and
+converts it into a `\TeX{} list of braced items'. The argument to
+|\xintCSVtoList| may be a macro: it will first be
+\hyperref[ssec:expansions]{\fexpan ded}. Hence the item before the first comma,
+if it is itself a macro, will be expanded which may or may not be a good thing.
+A space inserted at the start of the first item serves to stop that expansion
+(and disappears). The macro \csbxint{CSVtoListNoExpand}\etype{n} does the same
+job without
+the initial expansion of the list argument.
+
+Apart from that no expansion of the items is done and the list items may thus be
+completely arbitrary (and even contain perilous stuff such as unmatched |\if|
+and |\fi| tokens).
+
+Contiguous spaces and tab characters, are collapsed by \TeX{}
+into single spaces. All such spaces around commas%
+%
+\footnote{and multiple space tokens are not a problem; but those at the
+  top level (not hidden inside braces) \emph{must} be of character code
+  |32|.}
+%
+\fbox{are removed}, as well as
+the spaces at the start and the spaces at the end of the list.%
+%
+\footnote{let us recall that this is all done completely expandably...
+  There is absolutely no alteration of any sort of the item apart from
+  the stripping of initial and final space tokens (of character code
+  |32|) and brace removal if and only if the item apart from intial and
+  final spaces (or more generally multiple |char 32| space tokens) is
+  braced.}
+%
+The items may contain explicit |\par|'s or
+empty lines (converted by the \TeX{} input parsing into |\par| tokens).
+
+\begingroup
+
+\edef\X{\xintCSVtoList { 1 ,{ 2 , 3 , 4 , 5 }, a , {b,T} U , { c , d } , { {x ,
+        y} } }}
+
+%
+\leftedline{|\xintCSVtoList { 1 ,{ 2 , 3 , 4 , 5 }, a , {b,T} U , { c , d } ,
+    { {x , y} } }|}
+%
+\leftedline{|->|%
+{\makeatletter\dtt{\expandafter\strip at prefix\meaning\X}}}
+
+One sees on this example how braces protect commas from
+sub-lists to be perceived as delimiters of the top list. Braces around an entire
+item are removed, even when surrounded by spaces before and/or after. Braces for
+sub-parts of an item are not removed.
+
+We observe also that there is a slight difference regarding the brace stripping
+of an item: if the braces were not surrounded by spaces, also the initial and
+final (but no other) spaces of the \emph{enclosed} material are removed. This is
+the only situation where spaces protected by braces are nevertheless removed.
+
+From the rules above: for an empty argument (only spaces, no braces, no comma)
+the output is
+\dtt{\expandafter\detokenize\expandafter{\romannumeral0\xintcsvtolist { }}}
+(a list with one empty item),
+for ``|<opt. spaces>{}<opt.
+spaces>|'' the output is
+\dtt{\expandafter\detokenize\expandafter
+   {\romannumeral0\xintcsvtolist { {} }}}
+(again a list with one empty item, the braces were removed),
+for ``|{ }|'' the output is
+\dtt{\expandafter\detokenize\expandafter
+ {\romannumeral0\xintcsvtolist {{ }}}}
+(again a list with one empty item, the braces were removed and then
+the inner space was removed),
+for ``| { }|'' the output is
+\dtt{\expandafter\detokenize\expandafter
+{\romannumeral0\xintcsvtolist { { }}}} (again a list with one empty item, the initial space served only to stop the expansion, so this was like ``|{ }|'' as input, the braces were removed and the inner space was stripped),
+for ``\texttt{\ \{\ \ \}\ }'' the output is
+\dtt{\expandafter\detokenize\expandafter
+{\romannumeral0\xintcsvtolist { {  } }}} (this time the ending space of the first
+item meant that after brace removal the inner spaces were kept; recall though
+that \TeX{} collapses on input consecutive blanks into one space token),
+for ``|,|'' the output consists of two consecutive
+empty items
+\dtt{\expandafter\detokenize\expandafter{\romannumeral0\xintcsvtolist
+    {,}}}. Recall that on output everything is braced, a |{}| is an ``empty''
+item.
+%
+Most of the above is mainly irrelevant for every day use, apart perhaps from the
+fact to be noted that an empty input does not give an empty output but a
+one-empty-item list (it is as if an ending comma was always added at the end of
+the input).
+
+\def\y { \a,\b,\c,\d,\e}
+\expandafter\def\expandafter\Y\expandafter{\romannumeral0\xintcsvtolist{\y}}
+\def\t {{\if},\ifnum,\ifx,\ifdim,\ifcat,\ifmmode}
+\expandafter\def\expandafter\T\expandafter{\romannumeral0\xintcsvtolist{\t}}
+
+%
+\leftedline{|\def\y{ \a,\b,\c,\d,\e} \xintCSVtoList\y->|%
+  {\makeatletter\dtt{\expandafter\strip at prefix\meaning\Y}}}
+%
+\leftedline{|\def\t {{\if},\ifnum,\ifx,\ifdim,\ifcat,\ifmmode}|}
+%
+\leftedline
+{|\xintCSVtoList\t->|\makeatletter\dtt{\expandafter\strip at prefix\meaning\T}}
+%
+The results above were automatically displayed using \TeX's primitive
+\csa{meaning}, which adds a space after each control sequence name. These spaces
+are not in the actual braced items of the produced lists. The first items |\a|
+and |\if| were either preceded by a space or braced to prevent expansion. The
+macro \csa{xintCSVtoListNoExpand} would have done the same job without the
+initial expansion of the list argument, hence no need for such protection but if
+|\y| is defined as |\def\y{\a,\b,\c,\d,\e}| we then must do:
+%
+\leftedline{|\expandafter\xintCSVtoListNoExpand\expandafter {\y}|} Else, we
+may have direct use: %
+%
+\leftedline{|\xintCSVtoListNoExpand
+ {\if,\ifnum,\ifx,\ifdim,\ifcat,\ifmmode}|}
+%
+\leftedline{|->|\dtt{\expandafter\detokenize\expandafter
+    {\romannumeral0\xintcsvtolistnoexpand
+      {\if,\ifnum,\ifx,\ifdim,\ifcat,\ifmmode}}}}
+%
+Again these spaces are an artefact from the use in the source of the document of
+\csa{meaning} (or rather here, \csa{detokenize}) to display the result of using
+\csa{xintCSVtoListNoExpand} (which is done for real in this document
+source).
+
+For the similar conversion from comma separated list to braced items list, but
+without removal of spaces around the commas, there is
+\csa{xintCSVtoListNonStripped}\etype{f} and
+\csa{xintCSVtoListNonStrippedNoExpand}\etype{n}.
+
+\endgroup
+
+\subsection{\csh{xintNthElt}}\label{xintNthElt}
+
+
+\def\macro #1{\the\numexpr 9-#1\relax}
+
+\csa{xintNthElt\x}\marg{list}\etype{\numx f} gets (expandably) the |x|th
+item of the \meta{list}. A braced item will lose one level of brace
+pairs. The token list is first \fexpan ded.
+
+Items are counted starting at one.
+
+\leftedline{|\xintNthElt {3}{{agh}\u{zzz}\v{Z}}| is
+    \texttt{\xintNthElt {3}{{agh}\u{zzz}\v{Z}}}}
+%
+\leftedline{|\xintNthElt {3}{{agh}\u{{zzz}}\v{Z}}| is
+    \texttt{\expandafter\expandafter\expandafter
+      \detokenize\expandafter\expandafter\expandafter {\xintNthElt
+        {3}{{agh}\u{{zzz}}\v{Z}}}}}
+%
+\leftedline{|\xintNthElt {2}{{agh}\u{{zzz}}\v{Z}}| is
+    \texttt{\expandafter\expandafter\expandafter
+      \detokenize\expandafter\expandafter\expandafter {\xintNthElt
+        {2}{{agh}\u{{zzz}}\v{Z}}}}}
+%
+\leftedline{|\xintNthElt {37}{\xintiiFac {100}}|\dtt{=\xintNthElt
+      {37}{\xintiiFac {100}}} is the thirty-seventh digit of $100!$.}
+%
+\leftedline{|\xintNthElt {10}{\xintFtoCv
+      {566827/208524}}|\dtt{=\xintNthElt {10}{\xintFtoCv
+        {566827/208524}}}}
+\leftedline{is the tenth convergent of $566827/208524$ (uses \xintcfracname
+  package).}
+%
+\leftedline{|\xintNthElt {7}{\xintCSVtoList {1,2,3,4,5,6,7,8,9}}|%
+    \dtt{=\xintNthElt {7}{\xintCSVtoList {1,2,3,4,5,6,7,8,9}}}}
+%
+\leftedline{|\xintNthElt {0}{\xintCSVtoList {1,2,3,4,5,6,7,8,9}}|%
+    \dtt{=\xintNthElt {0}{\xintCSVtoList {1,2,3,4,5,6,7,8,9}}}}
+%
+\leftedline{|\xintNthElt {-3}{\xintCSVtoList {1,2,3,4,5,6,7,8,9}}|%
+    \dtt{=\xintNthElt {-3}{\xintCSVtoList {1,2,3,4,5,6,7,8,9}}}}
+
+If |x=0|,
+the macro returns the \emph{length} of the expanded list: this is not equivalent
+to \csbxint{Length} which does no pre-expansion. And it is different from
+\csbxint{Len} which is to be used only on integers or fractions.
+
+If |x<0|, the macro returns the \verb+|x|+th element from the end of the list.
+Thus for example |x=-1| will fetch the last item of the list.
+%
+\leftedline {|\xintNthElt {-5}{{{agh}}\u{zzz}\v{Z}}| is
+  \texttt{\expandafter\expandafter\expandafter \detokenize
+  \expandafter\expandafter\expandafter{\xintNthElt {-5}{{{agh}}\u{zzz}\v{Z}}}}}
+
+The macro \csa{xintNthEltNoExpand}\etype{\numx n} does the same job but without
+first expanding the list argument: |\xintNthEltNoExpand {-4}{\u\v\w T\x\y\z}| is
+\xintNthEltNoExpand {-4}{\a\b\c\u\v\w T\x\y\z}.
+
+If |x| is strictly larger (in absolute value) than the length of the list
+then |\xintNthElt| produces empty contents.
+
+\subsection{\csh{xintNthOnePy}}
+\label{xintNthOnePy}
+
+\csa{xintNthOnePy\x}\marg{list}\etype{\numx f} gets (expandably) the |x|th
+item of the \meta{list}, adding a brace pair if there wasn't one.\NewWith{1.4}
+
+Attention, items are counted starting at zero. For negative index, behaves
+as \csbxint{NthElt}.
+
+If the index is out of range, the empty output is returned. If the input list
+was empty (had no items) the empty output is returned.
+
+\subsection{\csh{xintKeep}}\label{xintKeep}
+
+\csa{xintKeep\x}\marg{list}\etype{\numx f} expands the token list argument |L|
+and produces a new list, depending on the value of |x|:
+\begin{itemize}[nosep]
+\item if |x>0|, the new list contains the first |x| items from |L| (counting
+  starts at one.) \emph{Each
+    such item will be output within a brace pair.} Use \csbxint{KeepUnbraced} if
+  this is not desired. This means that if the list item was braced to start
+  with, there is no modification, but if it was a token without braces,
+  then it acquires them.
+\item if |x>=length(L)|, the new list is the old one with all its items now
+  braced.
+\item if |x=0| the empty list is returned.
+\item if |x<0| the last \verb+|x|+ elements compose the output in the same
+  order as in the initial list; as the macro proceeds by removing head items
+  the kept items end up in output as they were in input: no added braces.
+\item if |x<=-length(L)| the output is identical with the input.
+\end{itemize}
+
+\csa{xintKeepNoExpand} does the same without first \fexpan ding its list
+argument.
+%
+\begin{everbatim*}
+\fdef\test {\xintKeep {17}{\xintKeep {-69}{\xintSeq {1}{100}}}}\meaning\test\par
+\noindent\fdef\test {\xintKeep {7}{{1}{2}{3}{4}{5}{6}{7}{8}{9}}}\meaning\test\par
+\noindent\fdef\test {\xintKeep {-7}{{1}{2}{3}{4}{5}{6}{7}{8}{9}}}\meaning\test\par
+\noindent\fdef\test {\xintKeep {7}{123456789}}\meaning\test\par
+\noindent\fdef\test {\xintKeep {-7}{123456789}}\meaning\test\par
+\end{everbatim*}
+
+
+\subsection{\csh{xintKeepUnbraced}}\label{xintKeepUnbraced}
+
+Same as \csbxint{Keep} but no brace pairs are added around the kept items from
+the head of the list in the case |x>0|: each such item will lose one level of
+braces. Thus, to remove braces from all items of the list, one can use
+\csbxint{KeepUnbraced} with its first argument larger than the length of the
+list; the same is obtained from \csbxint{ListWithSep}|{}|\marg{list}. But the
+new list will then have generally many more items than the original ones,
+corresponding to the unbraced original items.
+
+For |x<0| the macro is no different from \csbxint{Keep}. Hence the name is a
+bit misleading because brace removal will happen only if |x>0|.
+
+\csa{xintKeepUnbracedNoExpand} does the same without first \fexpan ding
+its list argument.
+%
+\begin{everbatim*}
+\fdef\test {\xintKeepUnbraced {10}{\xintSeq {1}{100}}}\meaning\test\par
+\noindent\fdef\test {\xintKeepUnbraced {7}{{1}{2}{3}{4}{5}{6}{7}{8}{9}}}%
+         \meaning\test\par
+\noindent\fdef\test {\xintKeepUnbraced {-7}{{1}{2}{3}{4}{5}{6}{7}{8}{9}}}%
+         \meaning\test\par
+\noindent\fdef\test {\xintKeepUnbraced {7}{123456789}}\meaning\test\par
+\noindent\fdef\test {\xintKeepUnbraced {-7}{123456789}}\meaning\test\par
+\end{everbatim*}
+
+\subsection{\csh{xintTrim}}\label{xintTrim}
+
+\csa{xintTrim\x}\marg{list}\etype{\numx f} expands the list argument and
+gobbles its first |x| elements.
+\begin{itemize}[nosep]
+\item if |x>0|, the first |x| items from |L| are gobbled. The remaining items
+  are not modified.
+\item if |x>=length(L)|, the returned list is empty.
+\item if |x=0| the original list is returned (with no added braces.)
+\item if |x<0| the last \verb+|x|+ items of the list are removed. \emph{The
+    head items end up braced in the output.} Use \csbxint{TrimUnbraced} if
+  this is not desired.
+\item if |x<=-length(L)| the output is empty.
+\end{itemize}
+
+\csa{xintTrimNoExpand} does the same without first \fexpan ding its list
+argument.
+\begin{everbatim*}
+\fdef\test {\xintTrim {17}{\xintTrim {-69}{\xintSeq {1}{100}}}}\meaning\test\par
+\noindent\fdef\test {\xintTrim {7}{{1}{2}{3}{4}{5}{6}{7}{8}{9}}}\meaning\test\par
+\noindent\fdef\test {\xintTrim {-7}{{1}{2}{3}{4}{5}{6}{7}{8}{9}}}\meaning\test\par
+\noindent\fdef\test {\xintTrim {7}{123456789}}\meaning\test\par
+\noindent\fdef\test {\xintTrim {-7}{123456789}}\meaning\test\par
+\end{everbatim*}
+
+\subsection{\csh{xintTrimUnbraced}}\label{xintTrimUnbraced}
+
+Same as \csbxint{Trim} but in case of a negative |x| (cutting items from
+the tail), the kept items from the head are not enclosed in brace pairs. They
+will lose one level of braces. The name is a bit misleading
+because when |x>0| there is no brace-stripping done on the kept items, because
+the macro works simply by gobbling the head ones.
+
+\csa{xintTrimUnbracedNoExpand} does the same without first \fexpan ding its list
+argument.
+
+\begin{everbatim*}
+\fdef\test {\xintTrimUnbraced {-90}{\xintSeq {1}{100}}}\meaning\test\par
+\noindent\fdef\test {\xintTrimUnbraced {7}{{1}{2}{3}{4}{5}{6}{7}{8}{9}}}%
+         \meaning\test\par
+\noindent\fdef\test {\xintTrimUnbraced {-7}{{1}{2}{3}{4}{5}{6}{7}{8}{9}}}%
+         \meaning\test\par
+\noindent\fdef\test {\xintTrimUnbraced {7}{123456789}}\meaning\test\par
+\noindent\fdef\test {\xintTrimUnbraced {-7}{123456789}}\meaning\test\par
+\end{everbatim*}
+
+\subsection{\csh{xintListWithSep}}\label{xintListWithSep}
+
+
+\def\macro #1{\the\numexpr 9-#1\relax}
+
+\csa{xintListWithSep}\marg{sep}\marg{list}\etype{nf} inserts the separator
+\meta{sep} in-between all items of the given list of braced items (or
+individual tokens). The items are fetched as does \TeX\ with undelimited macro
+arguments, thus they end up unbraced in output. If the \meta{list} is only one
+(or multiple) space tokens, the output is empty.
+
+The list argument \meta{list} gets \fexpan ded first (thus if it is a macro
+whose contents are braced items, the first opening brace stops the expansion,
+and it is as if the macro had been expanded once.) The separator \meta{sep} is
+not pre-expanded, it ends up as is in the output (if the \meta{list} contained
+at least two items.)
+
+The variant \csa{xintListWithSepNoExpand}\etype{nn} does the same
+job without the initial expansion of the \meta{list} argument.
+\begin{everbatim*}
+\edef\foo{\xintListWithSep{, }{123456789{10}{11}{12}}}\meaning\foo\newline
+\edef\foo{\xintListWithSep{:}{\xintiiFac{20}}}\meaning\foo\newline
+\oodef\FOO{\xintListWithSepNoExpand{\FOO}{\bat\baz\biz\buz}}\meaning\FOO\newline
+% a braced item or a space stops the f-expansion:
+\oodef\foo{\xintListWithSep{\FOO}{{\bat}\baz\biz\buz}}\meaning\foo\newline
+\oodef\foo{\xintListWithSep{\FOO}{ \bat\baz\biz\buz}}\meaning\foo\par
+\end{everbatim*}
+
+\subsection{\csh{xintApply}}\label{xintApply}
+
+
+\def\macro #1{\the\numexpr 9-#1\relax}
+
+\csa{xintApply}|{\macro}|\marg{list}\etype{ff} expandably applies the one
+parameter macro |\macro| to each item in the \meta{list} given as second
+argument and returns a new list with these outputs: each item is given one after
+the other as parameter to |\macro| which is expanded at that time (as usual,
+\emph{i.e.\@} fully for what comes first), the results are braced and output
+together as a succession of braced items (if |\macro| is defined to start with a
+space, the space will be gobbled and the |\macro| will not be expanded; it is
+allowed to have its own arguments, the list items serve as last arguments to
+|\macro|). Hence |\xintApply{\macro}{{1}{2}{3}}| returns
+|{\macro{1}}{\macro{2}}{\macro{3}}| where all instances of |\macro| have been
+already \fexpan ded.
+
+Being expandable, |\xintApply| is useful for example inside alignments where
+implicit groups make standard loops constructs usually fail. In such situation
+it is often not wished that the new list elements be braced, see
+\csbxint{ApplyUnbraced}. The |\macro| does not have to be expandable:
+|\xintApply| will try to expand it, the expansion may remain partial.
+
+The \meta{list} may
+itself be some macro expanding (in the previously described way) to the list of
+tokens to which the macro |\macro| will be applied. For example, if the
+\meta{list} expands to some positive number, then each digit will be replaced by
+the result of applying |\macro| on it. %
+%
+\leftedline{|\def\macro #1{\the\numexpr
+    9-#1\relax}|} %
+%
+\leftedline{|\xintApply\macro{\xintiiFac
+ {20}}|\dtt{=\xintApply\macro{\xintiiFac {20}}}}
+
+The macro \csa{xintApplyNoExpand}\etype{fn} does the same job without the first
+initial expansion which gave the \meta{list} of braced tokens to which |\macro|
+is applied.
+
+\subsection{\csh{xintApplyUnbraced}}\label{xintApplyUnbraced}
+
+
+\csa{xintApplyUnbraced}|{\macro}|\marg{list}\etype{ff} is like \csbxint{Apply}.
+The difference is that after having expanded its list argument, and applied
+|\macro| in turn to each item from the list, it reassembles the outputs without
+enclosing them in braces. The net effect is the same as doing
+%
+\leftedline{|\xintListWithSep {}{\xintApply {\macro}|\marg{list}|}|} This is
+useful for preparing a macro which will itself define some other macros or make
+assignments, as the scope will not be limited by brace pairs.
+%
+\begin{everbatim*}
+\def\macro #1{\expandafter\def\csname myself#1\endcsname {#1}}
+\xintApplyUnbraced\macro{{elta}{eltb}{eltc}}
+\begin{enumerate}[nosep,label=(\arabic{*})]
+\item \meaning\myselfelta
+\item \meaning\myselfeltb
+\item \meaning\myselfeltc
+\end{enumerate}
+\end{everbatim*}
+
+%
+The macro \csa{xintApplyUnbracedNoExpand}\etype{fn} does the same job without
+the first initial expansion which gave the \meta{list} of braced tokens to which
+|\macro| is applied.
+
+\subsection{\csh{xintSeq}}\label{xintSeq}
+
+\csa{xintSeq}|[d]{x}{y}|\etype{{{\upshape[\numx]}}\numx\numx} generates
+expandably |{x}{x+d}...| up to and possibly including |{y}| if |d>0| or down
+to and including |{y}| if |d<0|. Naturally |{y}| is omitted if |y-x| is not a
+multiple of |d|. If |d=0| the macro returns |{x}|. If |y-x| and |d| have
+opposite signs, the macro returns nothing. If the optional argument |d| is
+omitted it is taken to be the sign of |y-x|. Hence |\xintSeq {1}{0}| is not
+empty but |{1}{0}|. But |\xintSeq [1]{1}{0}| is empty.
+
+
+The arguments |x| and |y| are expanded inside a |\numexpr| so they may be
+count registers or a \LaTeX{} |\value{countername}|, or arithmetic with such
+things.
+
+%
+\begin{everbatim*}
+\xintListWithSep{,\hskip2pt plus 1pt minus 1pt }{\xintSeq {12}{-25}}
+\end{everbatim*}
+%
+\begin{everbatim*}
+\xintiiSum{\xintSeq [3]{1}{1000}}
+\end{everbatim*}
+
+When the macro is used without the optional argument |d|, it can only generate
+up to about $5000$ numbers\IMPORTANT, the precise value depends upon some
+\TeX{} memory parameter (input save stack).
+
+With the optional argument |d| the macro proceeds differently (but less
+efficiently) and does not stress the input save stack.
+
+
+
+\subsection{\csh{xintloop}, \csh{xintbreakloop}, \csh{xintbreakloopanddo}, \csh{xintloopskiptonext}}
+\label{xintloop}
+\label{xintbreakloop}
+\label{xintbreakloopanddo}
+\label{xintloopskiptonext}
+
+|\xintloop|\meta{stuff}|\if<test>...\repeat|\xtype{} is an expandable loop
+compatible with nesting. However to break out of the loop one almost always need
+some un-expandable step. The cousin \csbxint{iloop} is \csbxint{loop} with an
+embedded expandable mechanism allowing to exit from the loop. The iterated
+macros may contain |\par| tokens or empty lines.
+
+If a sub-loop is to be used all the material from the start of the main loop and
+up to the end of the entire subloop should be braced; these braces will be
+removed and do not create a group. The simplest to allow the nesting of one or
+more sub-loops is to brace everything between \csa{xintloop} and \csa{repeat},
+being careful not to leave a space between the closing brace and |\repeat|.
+
+As this loop and \csbxint{iloop} will primarily be of interest to experienced
+\TeX{} macro programmers, my description will assume that the user is
+knowledgeable enough. Some examples in this document will be perhaps more
+illustrative than my attemps at explanation of use.
+
+One can abort the loop with \csbxint{breakloop}; this should not be used inside
+the final test, and one should expand the |\fi| from the corresponding test
+before. One has also \csbxint{breakloopanddo} whose first argument will be
+inserted in the token stream after the loop; one may need a macro such as
+|\xint_afterfi| to move the whole thing after the |\fi|, as a simple
+|\expandafter| will not be enough.
+
+One will usually employ some count registers to manage the exit test from the
+loop; this breaks expandability, see \csbxint{iloop} for an expandable integer
+indexed loop. Use in alignments will be complicated by the fact that cells
+create groups, and also from the fact that any encountered unexpandable material
+will cause the \TeX{} input scanner to insert |\endtemplate| on each encountered
+|&| or |\cr|; thus |\xintbreakloop| may not work as expected, but the situation
+can be resolved via |\xint_firstofone{&}| or use of |\TAB| with |\def\TAB{&}|.
+It is thus simpler for alignments to use rather than \csbxint{loop} either the
+expandable \csbxint{ApplyUnbraced} or the non-expandable but alignment
+compatible \csbxint{ApplyInline}, \csbxint{For} or \csbxint{For*}.
+
+As an example, let us suppose we have two macros |\A|\marg{i}\marg{j} and
+|\B|\marg{i}\marg{j} behaving like (small) integer valued matrix entries, and we
+want to define a macro |\C|\marg{i}\marg{j} giving the matrix product (|i| and
+|j| may be count registers). We will assume that |\A[I]| expands to the number
+of rows, |\A[J]| to the number of columns and want the produced |\C| to act in
+the same manner. The code is very dispendious in use of |\count| registers, not
+optimized in any way, not made very robust (the defined macro can not have the
+same name as the first two matrices for example), we just wanted to quickly
+illustrate use of the nesting capabilities of |\xintloop|.%
+%
+\footnote{for a more sophisticated implementation of matrix
+  multiplication, inclusive of determinants, inverses, and display
+  utilities, with entries big integers or decimal numbers or even
+  fractions see some code online posted
+  from
+  November 11, 2013.}
+%
+
+
+\begin{everbatim*}
+\newcount\rowmax   \newcount\colmax   \newcount\summax
+\newcount\rowindex \newcount\colindex \newcount\sumindex
+\newcount\tmpcount
+\makeatletter
+\def\MatrixMultiplication #1#2#3{%
+    \rowmax #1[I]\relax
+    \colmax #2[J]\relax
+    \summax #1[J]\relax
+    \rowindex 1
+    \xintloop % loop over row index i
+    {\colindex 1
+     \xintloop % loop over col index k
+     {\tmpcount 0
+      \sumindex 1
+      \xintloop % loop over intermediate index j
+      \advance\tmpcount \numexpr #1\rowindex\sumindex*#2\sumindex\colindex\relax
+      \ifnum\sumindex<\summax
+         \advance\sumindex 1
+      \repeat }%
+     \expandafter\edef\csname\string#3{\the\rowindex.\the\colindex}\endcsname
+      {\the\tmpcount}%
+     \ifnum\colindex<\colmax
+         \advance\colindex 1
+     \repeat }%
+    \ifnum\rowindex<\rowmax
+    \advance\rowindex 1
+    \repeat
+    \expandafter\edef\csname\string#3{I}\endcsname{\the\rowmax}%
+    \expandafter\edef\csname\string#3{J}\endcsname{\the\colmax}%
+    \def #3##1{\ifx[##1\expandafter\Matrix at helper@size
+                    \else\expandafter\Matrix at helper@entry\fi #3{##1}}%
+}%
+\def\Matrix at helper@size #1#2#3]{\csname\string#1{#3}\endcsname }%
+\def\Matrix at helper@entry #1#2#3%
+   {\csname\string#1{\the\numexpr#2.\the\numexpr#3}\endcsname }%
+\def\A #1{\ifx[#1\expandafter\A at size
+            \else\expandafter\A at entry\fi {#1}}%
+\def\A at size #1#2]{\ifx I#23\else4\fi}% 3rows, 4columns
+\def\A at entry #1#2{\the\numexpr #1+#2-1\relax}% not pre-computed...
+\def\B #1{\ifx[#1\expandafter\B at size
+            \else\expandafter\B at entry\fi {#1}}%
+\def\B at size #1#2]{\ifx I#24\else3\fi}% 4rows, 3columns
+\def\B at entry #1#2{\the\numexpr #1-#2\relax}% not pre-computed...
+\makeatother
+\MatrixMultiplication\A\B\C \MatrixMultiplication\C\C\D
+\MatrixMultiplication\C\D\E \MatrixMultiplication\C\E\F
+\begin{multicols}2
+  \[\begin{pmatrix}
+    \A11&\A12&\A13&\A14\\
+    \A21&\A22&\A23&\A24\\
+    \A31&\A32&\A33&\A34
+  \end{pmatrix}
+  \times
+  \begin{pmatrix}
+    \B11&\B12&\B13\\
+    \B21&\B22&\B23\\
+    \B31&\B32&\B33\\
+    \B41&\B42&\B43
+  \end{pmatrix}
+  =
+  \begin{pmatrix}
+    \C11&\C12&\C13\\
+    \C21&\C22&\C23\\
+    \C31&\C32&\C33
+  \end{pmatrix}\]
+  \[\begin{pmatrix}
+    \C11&\C12&\C13\\
+    \C21&\C22&\C23\\
+    \C31&\C32&\C33
+  \end{pmatrix}^2 = \begin{pmatrix}
+    \D11&\D12&\D13\\
+    \D21&\D22&\D23\\
+    \D31&\D32&\D33
+  \end{pmatrix}\]
+  \[\begin{pmatrix}
+    \C11&\C12&\C13\\
+    \C21&\C22&\C23\\
+    \C31&\C32&\C33
+  \end{pmatrix}^3 = \begin{pmatrix}
+    \E11&\E12&\E13\\
+    \E21&\E22&\E23\\
+    \E31&\E32&\E33
+  \end{pmatrix}\]
+  \[\begin{pmatrix}
+    \C11&\C12&\C13\\
+    \C21&\C22&\C23\\
+    \C31&\C32&\C33
+  \end{pmatrix}^4 = \begin{pmatrix}
+    \F11&\F12&\F13\\
+    \F21&\F22&\F23\\
+    \F31&\F32&\F33
+  \end{pmatrix}\]
+\end{multicols}
+\end{everbatim*}
+
+
+\subsection{\csh{xintiloop}, \csh{xintiloopindex}, \csh{xintouteriloopindex},
+  \csh{xintbreakiloop}, \csh{xintbreakiloopanddo}, \csh{xintiloopskiptonext},
+\csh{xintiloopskipandredo}}
+\label{xintiloop}
+\label{xintbreakiloop}
+\label{xintbreakiloopanddo}
+\label{xintiloopskiptonext}
+\label{xintiloopskipandredo}
+\label{xintiloopindex}
+\label{xintouteriloopindex}
+
+\csa{xintiloop}|[start+delta]|\meta{stuff}|\if<test> ... \repeat|\xtype{} is a
+completely expandable nestable loop. complete expandability depends naturally on
+the actual iterated contents, and complete expansion will not be achievable
+under a sole \fexpan sion, as is indicated by the hollow star in the margin;
+thus the loop can be used inside an |\edef| but not inside arguments to the
+package macros. It can be used inside an |\xintexpr..\relax|. The
+|[start+delta]| is mandatory, not optional.
+
+This loop benefits via \csbxint{iloopindex} to (a limited access to) the integer
+index of the iteration. The starting value |start| (which may be a |\count|) and
+increment |delta| (\emph{id.}) are mandatory arguments. A space after the
+closing square bracket is not significant, it will be ignored. Spaces inside the
+square brackets will also be ignored as the two arguments are first given to a
+|\numexpr...\relax|. Empty lines and explicit |\par| tokens are accepted.
+
+As with \csbxint{loop}, this tool will mostly be of interest to advanced users.
+For nesting, one puts inside braces all the
+material from the start (immediately after |[start+delta]|) and up to and
+inclusive of the inner loop, these braces will be removed and do not create a
+loop. In case of nesting, \csbxint{outeriloopindex} gives access to the index of
+the outer loop. If needed one could write on its model a macro giving access to
+the index of the outer outer loop (or even to the |nth| outer loop).
+
+The \csa{xintiloopindex} and \csa{xintouteriloopindex} can not be used inside
+braces, and generally speaking this means they should be expanded first when
+given as argument to a macro, and that this macro receives them as delimited
+arguments, not braced ones. Or, but naturally this will break expandability, one
+can assign the value of \csa{xintiloopindex} to some |\count|. Both
+\csa{xintiloopindex} and \csa{xintouteriloopindex} extend to the litteral
+representation of the index, thus in |\ifnum| tests, if it comes last one has to
+correctly end the macro with a |\space|, or encapsulate it in a
+|\numexpr..\relax|.
+
+When the repeat-test of the loop is, for example, |\ifnum\xintiloopindex<10
+\repeat|, this means that the last iteration will be with |\xintiloopindex=10|
+(assuming |delta=1|). There is also |\ifnum\xintiloopindex=10 \else\repeat| to
+get the last iteration to be the one with |\xintiloopindex=10|.
+
+One has \csbxint{breakiloop} and \csbxint{breakiloopanddo} to abort the loop.
+The syntax of |\xintbreakiloopanddo| is a bit surprising, the sequence of tokens
+to be executed after breaking the loop is not within braces but is delimited by
+a dot as in:
+%
+\leftedline{|\xintbreakiloopanddo <afterloop>.etc.. etc... \repeat|}
+%
+The reason is that one may wish to use the then current value of
+|\xintiloopindex| in |<afterloop>| but it can't be within braces at the time it
+is evaluated. However, it is not that easy as |\xintiloopindex| must be expanded
+before, so one ends up with code like this:
+%
+\leftedline
+{|\expandafter\xintbreakiloopanddo\expandafter\macro\xintiloopindex.%|}
+%
+\leftedline{|etc.. etc.. \repeat|}
+%
+As moreover the |\fi| from the test leading to the decision of breaking out of
+the loop must be cleared out of the way, the above should be
+a branch of an expandable conditional test, else one needs something such
+as:
+%
+\leftedline
+{|\xint_afterfi{\expandafter\xintbreakiloopanddo\expandafter\macro\xintiloopindex.}%|}
+%
+\leftedline{|\fi etc..etc.. \repeat|}
+
+There is \csbxint{iloopskiptonext} to abort the current iteration and skip to
+the next, \hyperref[xintiloopskipandredo]{\ttfamily\hyphenchar\font45 \char92
+  xintiloopskip\-and\-redo} to skip to the end of the current iteration and redo
+it with the same value of the index (something else will have to change for this
+not to become an eternal loop\dots ).
+
+Inside alignments, if the looped-over text contains a |&| or a |\cr|, any
+un-expandable material before a \csbxint{iloopindex} will make it fail because
+of |\endtemplate|; in such cases one can always either replace |&| by a macro
+expanding to it or replace it by a suitable |\firstofone{&}|, and similarly for
+|\cr|.
+
+\phantomsection\label{edefprimes}
+As an example, let us construct an |\edef\z{...}| which will define |\z| to be a
+list of prime numbers:
+\begin{everbatim*}
+\begingroup
+\edef\z
+{\xintiloop [10001+2]
+  {\xintiloop [3+2]
+   \ifnum\xintouteriloopindex<\numexpr\xintiloopindex*\xintiloopindex\relax
+          \xintouteriloopindex,
+          \expandafter\xintbreakiloop
+   \fi
+   \ifnum\xintouteriloopindex=\numexpr
+        (\xintouteriloopindex/\xintiloopindex)*\xintiloopindex\relax
+   \else
+   \repeat
+  }% no space here
+ \ifnum \xintiloopindex < 10999 \repeat }%
+\meaning\z\endgroup
+\end{everbatim*}and we should have taken
+some steps to not have a trailing comma, but
+the point was to show that one can do that in an |\edef|\,! See also
+\autoref{ssec:primesII} which extracts from this code its way of testing
+primality.
+
+Let us create an alignment where each row will contain all divisors of its
+first entry.
+Here is the output, thus obtained without any count register:
+\begin{everbatim*}
+\begin{multicols}2
+\tabskip1ex \normalcolor
+\halign{&\hfil#\hfil\cr
+    \xintiloop [1+1]
+    {\expandafter\bfseries\xintiloopindex &
+     \xintiloop [1+1]
+     \ifnum\xintouteriloopindex=\numexpr
+           (\xintouteriloopindex/\xintiloopindex)*\xintiloopindex\relax
+     \xintiloopindex&\fi
+     \ifnum\xintiloopindex<\xintouteriloopindex\space % CRUCIAL \space HERE
+     \repeat \cr }%
+    \ifnum\xintiloopindex<30
+    \repeat
+}
+\end{multicols}
+\end{everbatim*}
+We wanted this first entry in bold face, but |\bfseries| leads to
+unexpandable tokens, so the |\expandafter| was necessary for |\xintiloopindex|
+and |\xintouteriloopindex| not to be confronted with a hard to digest
+|\endtemplate|. An alternative way of coding:
+%
+\begin{everbatim}
+\tabskip1ex
+\def\firstofone #1{#1}%
+\halign{&\hfil#\hfil\cr
+  \xintiloop [1+1]
+    {\bfseries\xintiloopindex\firstofone{&}%
+    \xintiloop [1+1] \ifnum\xintouteriloopindex=\numexpr
+    (\xintouteriloopindex/\xintiloopindex)*\xintiloopindex\relax
+    \xintiloopindex\firstofone{&}\fi
+    \ifnum\xintiloopindex<\xintouteriloopindex\space % \space is CRUCIAL
+    \repeat \firstofone{\cr}}%
+  \ifnum\xintiloopindex<30 \repeat }
+\end{everbatim}
+
+\begin{framed}
+  The next utilities are not compatible with expansion-only context.
+\end{framed}
+
+\subsection{\csh{xintApplyInline}}\label{xintApplyInline}
+
+
+\csa{xintApplyInline}|{\macro}|\marg{list}\ntype{o{\lowast f}} works non
+expandably. It applies the one-parameter |\macro| to the first element of the
+expanded list (|\macro| may have itself some arguments, the list item will be
+appended as last argument), and is then re-inserted in the input stream after
+the tokens resulting from this first expansion of |\macro|. The next item is
+then handled.
+
+This is to be used in situations where one needs to do some repetitive
+things. It is not expandable and can not be completely expanded inside a
+macro definition, to prepare material for later execution, contrarily to what
+\csbxint{Apply} or \csbxint{ApplyUnbraced} achieve.
+
+\begin{everbatim*}
+\def\Macro #1{\advance\cnta #1 , \the\cnta}
+\cnta 0
+0\xintApplyInline\Macro {3141592653}.
+\end{everbatim*}
+The first argument |\macro| does not have to be an expandable macro.
+
+\csa{xintApplyInline} submits its second, token list parameter to an
+\hyperref[ssec:expansions]{\fexpan
+sion}. Then, each \emph{unbraced} item will also be \fexpan ded. This provides
+an easy way to insert one list inside another. \emph{Braced} items are not
+expanded. Spaces in-between items are gobbled (as well as those at the start
+or the end of the list), but not the spaces \emph{inside} the braced items.
+
+\csa{xintApplyInline}, despite being non-expandable, does survive to
+contexts where the executed |\macro| closes groups, as happens inside
+alignments with the tabulation character |&|.
+This tabular provides an example:\par
+\begin{everbatim*}
+\centerline{\normalcolor\begin{tabular}{ccc}
+     $N$ & $N^2$ & $N^3$ \\ \hline
+     \def\Row #1{ #1 & \xintiiSqr {#1} & \xintiiPow {#1}{3} \\ \hline }%
+     \xintApplyInline \Row {\xintCSVtoList{17,28,39,50,61}}
+\end{tabular}}\medskip
+\end{everbatim*}
+
+We see that despite the fact that the first encountered tabulation character in
+the first row close a group and thus erases |\Row| from \TeX's memory,
+|\xintApplyInline| knows how to deal with this.
+
+Using \csbxint{ApplyUnbraced} is an alternative: the difference is that
+this would have prepared all rows first and only put them back into the
+token stream once they are all assembled, whereas with |\xintApplyInline|
+each row is constructed and immediately fed back into the token stream: when
+one does things with numbers having hundreds of digits, one learns that
+keeping on hold and shuffling around hundreds of tokens has an impact on
+\TeX{}'s speed (make this ``thousands of tokens'' for the impact to be
+noticeable).
+
+One may nest various |\xintApplyInline|'s. For example (see the
+\hyperref[float]{table} \vpageref{float}):\par
+\begin{everbatim*}
+\begin{figure*}[ht!]
+  \centering\phantomsection\label{float}
+  \def\Row #1{#1:\xintApplyInline {\Item {#1}}{0123456789}\\ }%
+  \def\Item #1#2{&\xintiiPow {#1}{#2}}%
+  \centeredline {\begin{tabular}{ccccccccccc} &0&1&2&3&4&5&6&7&8&9\\ \hline
+      \xintApplyInline \Row {0123456789}
+    \end{tabular}}
+\end{figure*}
+\end{everbatim*}
+
+One could not move the definition of |\Item| inside the tabular,
+as it would get lost after the first |&|. But this
+works:
+\everb|@
+\begin{tabular}{ccccccccccc}
+    &0&1&2&3&4&5&6&7&8&9\\ \hline
+    \def\Row #1{#1:\xintApplyInline {&\xintiiPow {#1}}{0123456789}\\ }%
+    \xintApplyInline \Row {0123456789}
+\end{tabular}
+|
+
+A limitation is that, contrarily to what one may have expected, the
+|\macro| for an |\xintApplyInline| can not be used to define
+the |\macro| for a nested sub-|\xintApplyInline|. For example,
+this does not work:\par
+\everb|@
+  \def\Row #1{#1:\def\Item ##1{&\xintiiPow {#1}{##1}}%
+                 \xintApplyInline \Item {0123456789}\\ }%
+  \xintApplyInline \Row {0123456789} % does not work
+|
+\noindent But see \csbxint{For}.
+
+\subsection{\csh{xintFor}, \csh{xintFor*}}\label{xintFor}\label{xintFor*}
+
+\csbxint{For}\ntype{on} is a new kind of for loop.\footnote{first introduced
+  with \xintname |1.09c| of |2013/10/09|.} Rather than using macros
+for encapsulating list items, its behaviour is like a macro with parameters:
+|#1|, |#2|, \dots, |#9| are used to represent the items for up to nine levels of
+nested loops. Here is an example:
+%
+\everb|@
+\xintFor #9 in {1,2,3} \do {%
+  \xintFor #1 in {4,5,6} \do {%
+    \xintFor #3 in {7,8,9} \do {%
+      \xintFor #2 in {10,11,12} \do {%
+      $$#9\times#1\times#3\times#2=\xintiiPrd{{#1}{#2}{#3}{#9}}$$}}}}
+|
+\noindent This example illustrates that one does not have to use |#1| as the
+first one:
+the order is arbitrary. But each level of nesting should have its specific macro
+parameter. Nine levels of nesting is presumably overkill, but I did not know
+where it was reasonable to stop. |\par| tokens are accepted in both the comma
+separated list and the replacement text.
+
+\begin{framed}
+  \TeX nical notes:
+
+\begin{itemize}
+  \item The |#1| is replaced in the iterated-over text exactly as in general
+    \TeX\ macros or \LaTeX\ commands. This spares the user quite a few
+    |\expandafter|'s or other tricks needed with loops which have the
+    values encapsulated in macros, like \LaTeX's |\@for| and |\@tfor|.
+
+  \item \csa{xintFor} (and \csa{xintFor*}) isn't purely expandable: one can
+    not use it inside an |\edef|. But it may be used, as will be shown in
+    examples, in some contexts such as \LaTeX's |tabular| which are usually
+    hostile to non-expandable loops.
+  
+  \item \csa{xintFor} (and \csa{xintFor*}) does some assignments prior to
+    executing each iteration of the replacement text, but it acts purely
+    expandably after the last iteration, hence if for example the replacement
+    text ends with a |\\|, the loop can be used insided a tabular and be
+    followed by a |\hline| without creating the dreaded ``|Misplaced
+    \noalign|'' error.
+
+  \item As stated in previous item the first iteration follows some
+    non-expandable internal dealings. This means for example that in \LaTeX{},
+    one can not inject a |\multicolumn| in the first iteration. Sometimes one
+    way work around this by injecting father |&\multicolumn| or |\\
+    \multicolumn|.
+
+  \item It does not create groups.
+
+  \item It makes no global assignments.
+
+  \item The iterated replacement text may close a group which was opened even
+    before the start of the loop (typical example being with |&| in
+    alignments).
+\begin{everbatim*}
+\begin{tabular}{rccccc}
+    \hline
+    \xintFor #1 in {A, B, C} \do {%
+      #1:\xintFor #2 in {a, b, c, d, e} \do {&($ #2 \to #1 $)}\\ }%
+    \hline
+\end{tabular}
+\end{everbatim*}
+  
+  \item There is no facility provided which would give access to a count of
+    the number of iterations as it is technically not easy to do so it in a
+    way working with nested loops while maintaining the ``expandable after
+    done'' property; something in the spirit of \csbxint{iloopindex} is
+    possible but this approach would bring its own limitations and
+    complications. Hence the user is invited to update her own count or
+    \LaTeX{} counter or macro at each iteration, if needed.
+
+  \item A |\macro| whose definition uses internally an \csbxint{For} loop
+    may be used inside another \csbxint{For} loop even if the two loops both
+    use the same macro parameter. The loop definition inside |\macro|
+    must use |##| as is the general rule for definitions done inside macros.
+
+  \item \csbxint{For} is for comma separated values and \csbxint{For*} for
+    lists of braced items; their respective expansion policies differ. They
+    are described later.
+\end{itemize}
+\unskip
+\end{framed}
+
+\noindent Regarding \csbxint{For}:
+\begin{itemize}[nosep, listparindent=\leftmarginiii]
+\item the spaces between the various declarative elements are all optional,
+\item in the list of comma separated values,  spaces around the commas or at
+  the start and end are ignored,
+\item if an item must contain itself its own commas, then it should
+  be braced, and the braces will be removed before feeding the iterated-over
+  text,
+\item the list may be a macro, it is expanded only once,
+\item items are not pre-expanded. The first item should be braced or start
+  with a space if the list is explicit and the item should not be
+  pre-expanded,
+\item empty items give empty |#1|'s in the replacement text, they are not
+  skipped,
+\item an empty list executes once the replacement text with an empty parameter
+  value,
+\item the list, if not a macro, \fbox{must be braced.}
+\end{itemize}
+
+\noindent Regarding \csbxint{For*}:\ntype{{\lowast f}n}
+\begin{itemize}[nosep, listparindent=\leftmarginiii]
+\item it handles lists of braced items (or naked tokens),
+\item it \hyperref[ssec:expansions]{\fexpan ds} the list,
+\item and more generally it \hyperref[ssec:expansions]{\fexpan ds} each naked
+  token encountered 
+  before assigning the |#1| values (gobbling spaces in the process);
+  this
+  makes it easy to simulate concatenation of multiple lists|\x|, |\y|:
+  if |\x| expands to |{1}{2}{3}| and |\y| expands to |{4}{5}{6}| then |{\x\y}|
+  as argument to |\xintFor*| has the same effect as |{{1}{2}{3}{4}{5}{6}}|.
+
+  For a further illustration see the use of |\xintFor*| at the end of
+  \autoref{ssec:fibonacci}.
+\item spaces at the start, end, or in-between items are gobbled (but naturally
+  not the spaces inside \emph{braced} items),
+\item except if the list argument is a macro (with no parameters), \fbox{it
+    must be braced.},
+\item an empty list leads to an empty result.
+\end{itemize}
+
+The macro \csbxint{Seq} which generates arithmetic sequences is to be used
+with \csbxint{For*} as its output consists of successive braced numbers (given
+as digit tokens).
+\begin{everbatim*}
+\xintFor* #1 in {\xintSeq [+2]{-7}{+2}}\do {stuff
+    with #1\xintifForLast{\par}{\newline}}
+\end{everbatim*}
+
+
+When nesting \csa{xintFor*} loops, using \csa{xintSeq} in the inner loops is
+inefficient, as the arithmetic sequence will be re-created each time. A more
+efficient style is:
+%
+\begin{everbatim}
+    \edef\innersequence {\xintSeq[+2]{-50}{50}}%
+    \xintFor* #1 in {\xintSeq {13}{27}} \do
+        {\xintFor* #2 in \innersequence \do {stuff with #1 and #2}%
+         .. some other macros .. }
+\end{everbatim}
+
+This is a general remark applying for any nesting of loops, one should avoid
+recreating the inner lists of arguments at each iteration of the outer loop.
+
+
+When the loop is defined inside a macro for later execution the |#| characters
+must be doubled.%
+%
+\footnote{sometimes what seems to be a macro argument isn't really; in
+  \csa{raisebox\{1cm\}\{}\csa{xintFor \#1 in \{a,b,c\} }\csa{do
+    \{\#1\}\}} no doubling should be done.}
+%
+For example:
+%
+\begin{everbatim*}
+\def\T{\def\z {}%
+  \xintFor* ##1 in {{u}{v}{w}} \do {%
+    \xintFor ##2 in {x,y,z} \do {%
+      \expandafter\def\expandafter\z\expandafter {\z\sep (##1,##2)} }%
+  }%
+}%
+\T\def\sep {\def\sep{, }}\z
+\end{everbatim*}
+
+Similarly when the replacement text
+of |\xintFor| defines a macro with parameters, the macro character |#| must be
+doubled.
+
+
+The iterated macros as well as the list items are allowed to contain explicit
+|\par| tokens.
+
+
+\subsection{\csh{xintifForFirst}, \csh{xintifForLast}}
+\label{xintifForFirst}\label{xintifForLast}
+
+\csbxint{ifForFirst}\,\texttt{\{YES branch\}\{NO branch\}}\etype{nn}
+ and \csbxint{ifForLast}\,\texttt{\{YES
+  branch\}\hskip 0pt plus 0.2em \{NO branch\}}\etype{nn} execute the |YES| or
+|NO| branch
+if the
+\csbxint{For}
+or \csbxint{For*} loop is currently in its first, respectively last, iteration.
+
+Designed to work as expected under nesting (but see frame next.) Don't forget
+an empty brace pair |{}| if a branch is to do nothing. May be used multiple
+times in the replacement text of the loop.
+
+\begin{framed}
+  \noindent Pay attention to these implementation features:
+  \begin{itemize}[nosep, listparindent=\leftmarginiii]
+  \item \emph{if an inner \csbxint{For} loop is positioned before the
+    \csb{xintifForFirst} or \csb{xintifForLast} of the outer loop it will
+    contaminate their settings. This applies also naturally if the inner loop
+    arises from the expansion of some macro located before the outer
+    conditionals.}
+
+    One fix is to make sure that the outer conditionals are expanded before the
+    inner loop is executed, e.g. this will be the case if the inner loop is
+    located inside one of the branches of the conditional.
+
+    Another approach is to enclose, if feasible, the inner loop in a group of
+    its own.
+  \item \emph{if the replacement text closes a group (e.g. from a |&| inside an
+    alignment), the conditionals will lose their ascribed meanings and end up
+    possibly undefined, depending whether there is some outer loop whose
+    execution started before the opening of the group.}
+
+    The fix is to arrange things so that the conditionals are expanded
+    before \TeX\ encounters the closing-group token.
+  \end{itemize}
+\end{framed}
+
+\subsection{ \csh{xintBreakFor}, \csh{xintBreakForAndDo}}
+\label{xintBreakFor}\label{xintBreakForAndDo}
+
+One may immediately terminate an \csbxint{For} or \csbxint{For*} loop with
+\csbxint{BreakFor}.
+
+\begin{framed}
+  As it acts by clearing up all the rest of the replacement text when
+  encountered, it will not work from inside some |\if...\fi| without
+  suitable |\expandafter| or swapping technique.
+
+  Also it can't be used from inside braces as from there it can't see the end
+  of the replacement text.
+\end{framed}
+
+There is also \csbxint{BreakForAndDo}. Both are illustrated by various examples
+in the next section which is devoted to ``forever'' loops.
+
+\subsection{\csh{xintintegers}, \csh{xintdimensions}, \csh{xintrationals}}
+\label{xintegers}\label{xintintegers}
+\label{xintdimensions}\label{xintrationals}
+
+If the list argument to \csbxint{For} (or \csbxint{For*}, both are equivalent in
+this context) is \csbxint{integers} (equivalently \csbxint{egers}) or more
+generally \csbxint{integers}|[||start|\allowbreak|+|\allowbreak|delta||]|
+(\emph{the whole within braces}!)%
+%
+\footnote{the |start+delta| optional specification may have extra spaces
+  around the plus sign of near the square brackets, such spaces are
+  removed. The same applies with \csa{xintdimensions} and
+  \csa{xintrationals}.},
+%
+then \csbxint{For} does an infinite iteration where
+|#1| (or |#2|, \dots, |#9|) will run through the arithmetic sequence of (short)
+integers with initial value |start| and increment |delta| (default values:
+|start=1|, |delta=1|; if the optional argument is present it must contains both
+of them, and they may be explicit integers, or macros or count registers). The
+|#1| (or |#2|, \dots, |#9|) will stand for |\numexpr <opt sign><digits>\relax|,
+and the litteral representation as a string of digits can thus be obtained as
+\fbox{\csa{the\#1}} or |\number#1|. Such a |#1| can be used in an |\ifnum| test
+with no need to be postfixed with a space or a |\relax| and one should
+\emph{not} add them.
+
+If the list argument is \csbxint{dimensions} or more generally
+\csbxint{dimensions}|[||start|\allowbreak|+|\allowbreak|delta||]|  (\emph{within
+  braces}!), then
+\csbxint{For} does an infinite iteration where |#1| (or |#2|, \dots, |#9|) will
+run through the arithmetic sequence of dimensions with initial value
+|start| and increment |delta|. Default values: |start=0pt|, |delta=1pt|; if
+the optional argument is present it must contain both of them, and they may
+be explicit specifications, or macros, or dimen registers, or length macros
+in \LaTeX{} (the stretch and shrink components will be discarded). The |#1|
+will be |\dimexpr <opt sign><digits>sp\relax|, from which one can get the
+litteral (approximate) representation in points via |\the#1|. So |#1| can be
+used anywhere \TeX{} expects a dimension (and there is no need in conditionals
+to insert a |\relax|, and one should \emph{not} do it), and to print its value
+one uses \fbox{\csa{the\#1}}. The chosen representation guarantees exact
+incrementation with no rounding errors accumulating from converting into
+points at each step.
+
+
+
+
+
+
+If the list argument to \csbxint{For} (or \csbxint{For*}) is \csbxint{rationals}
+or more generally
+\csbxint{rationals}|[||start|\allowbreak|+|\allowbreak|delta||]| (\emph{within
+  braces}!), then \csbxint{For} does an infinite iteration where |#1| (or |#2|,
+\dots, |#9|) will run through the arithmetic sequence of \xintfracname fractions
+with initial value |start| and increment |delta| (default values: |start=1/1|,
+|delta=1/1|). This loop works \emph{only with \xintfracname loaded}. if the
+optional argument is present it must contain both of them, and they may be given
+in any of the formats recognized by \xintfracname (fractions, decimal
+numbers, numbers in scientific notations, numerators and denominators in
+scientific notation, etc...) , or as macros or count registers (if they are
+short integers). The |#1| (or |#2|, \dots, |#9|) will be an |a/b| fraction
+(without a |[n]| part), where
+the denominator |b| is the product of the denominators of
+|start| and |delta| (for reasons of speed |#1| is not reduced to irreducible
+form, and for another reason explained later  |start| and |delta| are not put
+either into irreducible form; the input may use explicitely \csa{xintIrr} to
+achieve that).
+\begin{everbatim*}
+\begingroup\small
+\noindent\parbox{\dimexpr\linewidth-3em}{\color[named]{OrangeRed}%
+\xintFor #1 in {\xintrationals [10/21+1/21]} \do
+{#1=\xintifInt {#1}
+    {\textcolor{blue}{\xintTrunc{10}{#1}}}
+    {\xintTrunc{10}{#1}}% display in blue if an integer
+    \xintifGt {#1}{1.123}{\xintBreakFor}{, }%
+  }}
+\endgroup\smallskip
+\end{everbatim*}
+
+\smallskip The example above confirms that computations are done exactly, and
+illustrates that the two initial (reduced) denominators are not multiplied when
+they are found to be equal.  It is thus recommended to input |start| and |delta|
+with a common smallest possible denominator, or as fixed point numbers with the
+same numbers of digits after the decimal mark;  and this is also the reason why
+|start| and |delta| are not by default made irreducible. As internally the
+computations are done with numerators and denominators completely expanded, one
+should be careful not to input numbers in scientific notation with exponents in
+the hundreds, as they will get converted into as many zeroes.
+
+\begin{everbatim*}
+\noindent\parbox{\dimexpr.7\linewidth}{\raggedright
+\xintFor #1 in {\xintrationals [0.000+0.125]} \do
+{\edef\tmp{\xintTrunc{3}{#1}}%
+ \xintifInt {#1}
+    {\textcolor{blue}{\tmp}}
+    {\tmp}%
+    \xintifGt {#1}{2}{\xintBreakFor}{, }%
+  }}\smallskip
+\end{everbatim*}
+
+We see here that \csbxint{Trunc} outputs (deliberately) zero as $0$, not (here)
+$0.000$, the idea being not to lose the information that the truncated thing was
+truly zero. Perhaps this behaviour should be changed? or made optional? Anyhow
+printing of fixed points numbers should be dealt with via dedicated packages
+such as |numprint| or |siunitx|.\par
+
+
+\subsection{\csh{xintForpair}, \csh{xintForthree}, \csh{xintForfour}}\label{xintForpair}\label{xintForthree}\label{xintForfour}
+
+The syntax\ntype{on} is illustrated in this
+example. The notation is the usual one for |n|-uples, with parentheses and
+commas. Spaces around commas and parentheses are ignored.
+%
+\begin{everbatim*}
+{\centering\begin{tabular}{cccc}
+    \xintForpair #1#2 in { ( A , a ) , ( B , b ) , ( C , c ) } \do {%
+      \xintForpair #3#4 in { ( X , x ) , ( Y , y ) , ( Z , z ) } \do {%
+        $\Biggl($\begin{tabular}{cc}
+          -#1- & -#3-\\
+          -#4- & -#2-\\
+        \end{tabular}$\Biggr)$&}\\\noalign{\vskip1\jot}}%
+\end{tabular}\\}
+\end{everbatim*}
+
+\csbxint{Forpair} must be followed by either |#1#2|, |#2#3|, |#3#4|, \dots, or
+|#8#9| with |#1| usable as an alias for |#1#2|, |#2| as alias for |#2#3|,
+etc \dots\ and similarly for \csbxint{Forthree} (using |#1#2#3| or simply
+|#1|, |#2#3#4| or simply |#2|, \dots) and \csbxint{Forfour} (with |#1#2#3#4|
+etc\dots).
+
+Nesting works as long as the macro parameters are distinct among |#1|, |#2|,
+..., |#9|. A macro which expands to an \csa{xintFor} or a
+\csa{xintFor(pair,three,four)} can be used in another one with no constraint
+about using distinct macro parameters.
+
+|\par| tokens are accepted in both the comma separated list and the
+replacement text.
+
+
+\subsection{\csh{xintAssign}}\label{xintAssign}
+
+\csa{xintAssign}\meta{braced things}\csa{to}%
+\meta{as many cs as they are things} %\ntype{{(f$\to$\lowast [x)}{\lowast N}}
+%
+defines (without checking if something gets overwritten) the control sequences
+on the right of \csa{to} to expand to the successive tokens or braced items
+located to the left of \csa{to}. \csa{xintAssign} is not an expandable macro.
+
+\fexpan sion is first applied to the material in front of \csa{xintAssign}
+which is fetched as one argument if it is braced. Then the expansion of this
+argument is examined and successive items are assigned to the macros following
+|\to|. There must be exactly as many macros as items. No check is done. The
+macro assignments are done with removal of one level of brace pairs from each
+item.
+
+After the initial \fexpan sion, each assigned (brace-stripped) item will be
+expanded according to the setting of the optional parameter.
+
+For example |\xintAssign [e]...| means that all assignments are done using
+|\edef|. With |[f]| the assignments will be made using
+\hyperref[fdef]{\ttfamily\char92fdef}. The default is simply to make the
+definitions with |\def|, corresponding to an empty optional paramter |[]|.
+Possibilities for the optional parameter are: |[], [g], [e], [x], [o], [go],
+[oo], [goo], [f], [gf]|. For example |[oo]| means a double expansion.
+\begin{everbatim*}
+\xintAssign \xintiiDivision{1000000000000}{133333333}\to\Q\R
+\meaning\Q\newline
+\meaning\R\newline
+\xintAssign {{\xintiiDivision{1000000000000}{133333333}}}\to\X
+\meaning\X\newline
+\xintAssign [oo]{{\xintiiDivision{1000000000000}{133333333}}}\to\X
+\meaning\X\newline
+\xintAssign \xintiiPow{7}{13}\to\SevenToThePowerThirteen
+\meaning\SevenToThePowerThirteen\par
+\end{everbatim*}
+
+Two special cases:
+\begin{itemize}[nosep]
+\item if after this initial expansion no brace is found immediately after
+  \csa{xintAssign}, it is assumed that there is only one control sequence
+  following |\to|, and this control sequence is then defined via |\def| (or
+  what is set-up by the optional parameter) to expand to the material between
+  \csa{xintAssign} and \csa{to}.
+\item if the material between \csa{xintAssign} and |\to| is enclosed in two
+  brace pairs, the first brace pair is removed, then the \fexpan sion is
+  immediately stopped by the inner brace pair, hence \csa{xintAssign} now
+  finds a unique item and thus defines only a single macro to be this item,
+  which is now stripped of the second pair of braces.
+\end{itemize}
+
+
+\emph{Note:} prior to release |1.09j|, |\xintAssign| did an |\edef| by default
+for each item assignment but it now does |\def| corresponding to no or empty
+optional parameter.
+
+It is allowed for the successive braced items to be separated by spaces. They
+are removed during the assignments. But if a single macro is defined (which
+happens if the argument after \fexpan sion does not start with a brace),
+naturally the scooped up material has all intervening spaces, as it is
+considered a
+single item. But an upfront initial space will have been absorbed by \fexpan
+sion.
+\begin{everbatim*}
+\def\X{ {a}  {b} {c}   {d} }\def\Y { u {a}  {b} {c}   {d} }
+\xintAssign\X\to\A\B\C\D
+\xintAssign\Y\to\Z
+\meaning\A, \meaning\B, \meaning\C, \meaning\D+++\newline
+\meaning\Z+++\par
+\end{everbatim*}
+As usual successive space characters in input make for a single \TeX\ space token.
+
+
+\subsection{\csh{xintAssignArray}}\label{xintAssignArray}
+
+\xintAssignArray \xintBezout {1000}{113}\to\Bez
+
+\csa{xintAssignArray}\meta{braced things}\csa{to}\csa{myArray}
+%
+%\ntype{{(f$\to$\lowast x)}N}
+%
+first expands fully what comes immediately after |\xintAssignArray| and
+expects to find a list of braced things |{A}{B}...| (or tokens). It then
+defines \csa{myArray} as a macro with one parameter, such that \csa{myArray\x}
+expands to give the |x|th braced thing of this original
+list (the argument \texttt{\x} itself is fed to a |\numexpr| by |\myArray|,
+and |\myArray| expands in two steps to its output). With |0| as parameter,
+\csa{myArray}|{0}| returns the number |M| of elements of the array so that the
+successive elements are \csa{myArray}|{1}|, \dots, \csa{myArray}|{M}|.
+%
+\leftedline{|\xintAssignArray \xintBezout {1000}{113}\to\Bez|} will set
+|\Bez{0}| to \dtt{\Bez0}, |\Bez{1}| to \dtt{\Bez1}, |\Bez{2}| to
+\dtt{\Bez2}, and |\Bez{3}| to \dtt{\Bez3}:
+\dtt{$\Bez1\times1000+\Bez2\times113=\Bez3$.}
+This macro is incompatible with expansion-only contexts.
+
+\csa{xintAssignArray} admits an optional parameter, for example
+|\xintAssignArray [e]| means that the definitions of the macros will be made
+with |\edef|. The empty optional parameter (default) means that definitions
+are done with |\def|. Other possibilities: |[], [o], [oo], [f]|. Contrarily to
+\csbxint{Assign} one can not use the |g| here to make the definitions global.
+For this, one should rather do |\xintAssignArray| within a group starting with
+|\globaldefs 1|.
+
+
+\subsection{\csh{xintDigitsOf}}\label{xintDigitsOf}
+
+This is a synonym for \csbxint{AssignArray},\ntype{fN} to be used to define
+an array giving all the digits of a given (positive, else the minus sign will
+be treated as first item) number.
+\begingroup\xintDigitsOf\xintiiPow {7}{500}\to\digits
+%
+\leftedline{|\xintDigitsOf\xintiiPow {7}{500}\to\digits|}
+\noindent $7^{500}$ has |\digits{0}=|\digits{0} digits, and the 123rd among them
+(starting from the most significant) is
+|\digits{123}=|\digits{123}.
+\endgroup
+
+\subsection{\csh{xintRelaxArray}}\label{xintRelaxArray}
+
+\csa{xintRelaxArray}\csa{myArray} %\ntype{N}
+%
+(globally) sets to \csa{relax} all macros which were defined by the previous
+\csa{xintAssignArray} with \csa{myArray} as array macro.
+
+\clearpage
+\let\xinttoolsnameUp\undefined
+\def\n{|{N}|}
+\def\m{|{M}|}
+\def\x{|{x}|}
+
+\csname ExamplesnameUp\endcsname
+\section {Additional (old) examples with \xinttoolsname or \xintexprname or both}
+\RaisedLabel{sec:examples}
+
+Note: \xintexprname.sty automatically loads \xinttoolsname.sty.
+
+The examples given here start to feel dated and are currently in need of some
+rewrite to better illustrate newer features of the package.
+
+ 
+\localtableofcontents
+
+\subsection{More examples with dummy variables}
+\label{ssec:moredummies}
+
+These examples were first added to this manual at the time of the |1.1|
+release (|2014/10/29|).
+
+\begin{everbatim*}
+Prime numbers are always cool
+\xinttheiiexpr seq((seq((subs((x/:m)?{(m*m>x)?{1}{0}}{-1},m=2n+1))
+                        ??{break(0)}{omit}{break(1)},n=1++))?{x}{omit},
+               x=10001..[2]..10200)\relax
+\end{everbatim*}
+
+The syntax in this last example may look a bit involved (...\@ and it is so I
+admit). First |x/:m| computes |x modulo m| (this is the modulo with respect to
+floored division). The |(x)?{yes}{no}| construct checks if |x| (which
+\emph{must} be within parentheses) is true or false, i.e.\@ non zero or zero. It
+then executes either the |yes| or the |no| branch, the non chosen branch is
+\emph{not} evaluated. Thus if |m| divides |x| we are in the second (``false'')
+branch. This gives a |-1|. This |-1| is the argument to a |??| branch which is
+of the type |(y)??{y<0}{y=0}{y>0}|, thus here the |y<0|, i.e.\@, |break(0)| is
+chosen. This |0| is thus given to another |?| which consequently chooses
+|omit|, hence the number is not kept in the list. The numbers which survive
+are the prime numbers.
+
+\begin{everbatim*}
+The first Fibonacci number beyond |2^64|, |2^64|, and the index are respectively
+\xinttheiiexpr subs(iterr(0,1;(@1>N)?{break(@1,N,i)}{@1+ at 2},i=1++),N=2^64)\relax.
+\end{everbatim*}
+
+% A006877 In the `3x+1' problem, these values for the starting value set new
+% records for number of steps to reach 1. (Formerly M0748) 14 1, 2, 3, 6, 7,
+% 9, 18, 25, 27, 54, 73, 97, 129, 171, 231, 313, 327, 649, 703, 871, 1161,
+% 2223, 2463, 2919, 3711, 6171, 10971, 13255, 17647, 23529, 26623, 34239,
+% 35655, 52527, 77031, 106239, 142587, 156159, 216367, 230631, 410011, 511935,
+% 626331, 837799
+
+One more recursion:
+\begin{everbatim*}
+\def\syr #1{\xinttheiiexpr
+            rseq(#1; (@<=1)?{break(i)}{odd(@)?{3 at +1}{@//2}},i=0++)\relax}
+The 3x+1 problem: \syr{231}\par
+\end{everbatim*}
+
+OK, a final one:%
+\begin{everbatim*}
+\def\syrMax #1{\xintiiexpr iterr(#1,#1;even(i)?
+                                       {(@2<=1)?{break(@1,i//2)}
+                                                {odd(@2)?{3 at 2+1}{@2//2}}}
+                                       {(@1>@2)?{@1}{@2}},i=0++)\relax }
+With initial value 1161, the maximal intermediate value and the number of steps
+needed to reach 1 are respectively \syrMax{1161}.\par
+\end{everbatim*}
+
+Look at the
+  \hyperlink{BrentSalamin}{Brent-Salamin algorithm implementation} for a more
+  interesting recursion.
+
+% \begin{everbatim*}
+% \newcommand\Factors [1]{\xinttheiiexpr
+%     subs(seq((i/:3=1)?{omit}{[L][i]},i=0..len(L)-1),
+%     L=rseq(#1;(p^2>[@][0])?{([@][0]>1)?{break(1,[@][0],1)}{abort}}
+%                           {(([@][0])/:p)?{omit}
+%     {iter(([@][0])//p; (@/:p)?{break(@,p,e)}{@//p},e=1++)}},p=2++))\relax }
+% \Factors {41^4*59^2*29^3*13^5*17^8*29^2*59^4*37^6}
+% \end{everbatim*}
+
+% This might look a bit scary, I admit.%
+% %
+% \footnote{Look at the
+%   \hyperlink{BrentSalamin}{Brent-Salamin algorithm implementation} for a much
+%   saner example.} 
+% %
+
+% \xintexprname has minimal tools and
+% is obstinate about doing everything expandably! We are hampered by absence of a
+% notion of ``nuple''. The algorithm divides |N| by |2| until no more possible,
+% then by |3|, then by |4| (which is silly), then by |5|, then by |6| (silly
+% again), \dots.
+
+% The variable |L=rseq(#1;...)| expands, if one follows the steps, to a comma
+% separated list starting with the initial (evaluated) |N=#1| and then
+% pseudo-triplets where the first item is |N| trimmed of small primes, the
+% second item is the last prime divisor found, and the third item is its
+% exponent in original |N|.
+
+% The algorithm needs to keep handy the last computed quotient by prime powers,
+% hence all of them, but at the very end it will be cleaner to get rid of them
+% (this corresponds to the first line in the code above). This is achieved in a
+% cumbersome inefficient way; indeed each item extraction |[L][i]| is costly: it
+% is not like accessing an array stored in memory, due to expandability, nothing
+% can be stored in memory! Nevertheless, this step could be done here in a far
+% less inefficient manner if there was a variant of |seq| which, in the spirit
+% of \csbxint{iloopindex}, would know how many steps it had been through so far.
+% This is a feature to be added to |\xintexpr|! (as well as a |++| construct
+% allowing a non unit step).
+
+% Notice that in |iter(([@][0])//p;| the |@| refers to the previous triplet (or
+% in the first step to |N|), but the latter |@| showing up in |(@/:p)?| refers
+% to the previous value computed by |iter|.
+
+% \begin{snugframed}
+%   Parentheses are essential in |..([y][0])| else the parser will see |..[| and
+%   end up in ultimate confusion, and also in |([@][0])/:p| else the parser will
+%   see the itemwise operator |]/| on lists and again be very confused (I could
+%   implement a |]/:| on lists, but in this situation this would also be very
+%   confusing to the parser.)
+% \end{snugframed}
+
+% See \autoref{ssec:factorize} for a routine |\Factorize| written directly with
+% \xintname macros. Last time I checked |\Factors| was about seven times slower
+% than |\Factorize| in test cases such as
+% |16246355912554185673266068721806243461403654781833| and others. Among the
+% various things explaining the speed difference, there is fact that the
+% |\Factorize| algorithm step by increments of two, not one, and also it divides
+% only once, obtaining quotient and remainder in one go. These two things
+% already make for a speed-up factor of about four. Thus, |\Factors| is not
+% completely inefficient in comparison, and was quite easier to come up with
+% than |\Factorize|.
+
+\subsection{Completely expandable prime test}
+\label{ssec:primesI}
+
+Let us now construct a completely expandable macro which returns $1$ if its
+given input is prime and $0$ if not:
+\everb|@
+\def\remainder #1#2{\the\numexpr #1-(#1/#2)*#2\relax }
+\def\IsPrime #1%
+ {\xintANDof {\xintApply {\remainder {#1}}{\xintSeq {2}{\xintiiSqrt{#1}}}}}
+|
+
+This uses \csbxint{iiSqrt} and assumes its input is at least $5$. Rather than
+\xintname's own \csbxint{iiRem} we used a quicker |\numexpr| expression as we
+are dealing with short integers. Also we used \csbxint{ANDof} which will
+return $1$ only if all the items are non-zero. The macro is a bit
+silly with an even input, ok, let's enhance it to detect an even input:
+\everb|@
+\def\IsPrime #1%
+   {\xintiiifOdd {#1}
+        {\xintANDof % odd case
+            {\xintApply {\remainder {#1}}
+                        {\xintSeq [2]{3}{\xintiiSqrt{#1}}}%
+            }%
+        }
+        {\xintifEq {#1}{2}{1}{0}}%
+   }
+|
+
+We used the \xintname expandable tests (on big integers or fractions)
+in order for |\IsPrime| to be \fexpan dable.
+
+Our integers are short, but without |\expandafter|'s with
+|\@firstoftwo|, % @ n'est plus actif dans le dtx 1.1 !
+or some other related techniques,
+direct use of |\ifnum..\fi| tests is dangerous. So to make the macro more
+efficient we are going to use the expandable tests provided by the package
+\href{http://ctan.org/pkg/etoolbox}{etoolbox}%
+%
+\footnote{\url{http://ctan.org/pkg/etoolbox}}.
+%
+The macro becomes:
+%
+\everb|@
+\def\IsPrime #1%
+   {\ifnumodd {#1}
+    {\xintANDof % odd case
+     {\xintApply {\remainder {#1}}{\xintSeq [2]{3}{\xintiiSqrt{#1}}}}}
+    {\ifnumequal {#1}{2}{1}{0}}}
+|
+
+In the odd case however we have to assume the integer is at least $7$, as
+|\xintSeq| generates an empty list if |#1=3| or |5|, and |\xintANDof| returns
+$1$ when supplied an empty list. Let us ease up a bit |\xintANDof|'s work by
+letting it work on only $0$'s and $1$'s. We could use:
+%
+\everb|@
+\def\IsNotDivisibleBy #1#2%
+  {\ifnum\numexpr #1-(#1/#2)*#2=0 \expandafter 0\else \expandafter1\fi}
+|
+\noindent
+where the |\expandafter|'s are crucial for this macro to be \fexpan dable and
+hence work within the applied \csbxint{ANDof}. Anyhow, now that we have loaded
+\href{http://ctan.org/pkg/etoolbox}{etoolbox}, we might as well use:
+%
+\everb|@
+\newcommand{\IsNotDivisibleBy}[2]{\ifnumequal{#1-(#1/#2)*#2}{0}{0}{1}}
+|
+\noindent
+Let us enhance our prime macro to work also on the small primes:
+\everb|@
+\newcommand{\IsPrime}[1] % returns 1 if #1 is prime, and 0 if not
+  {\ifnumodd {#1}
+    {\ifnumless {#1}{8}
+      {\ifnumequal{#1}{1}{0}{1}}% 3,5,7 are primes
+      {\xintANDof
+         {\xintApply
+        { \IsNotDivisibleBy {#1}}{\xintSeq [2]{3}{\xintiiSqrt{#1}}}}%
+        }}% END OF THE ODD BRANCH
+    {\ifnumequal {#1}{2}{1}{0}}% EVEN BRANCH
+}
+|
+
+The input is still assumed positive. There is a deliberate blank before
+\csa{IsNotDivisibleBy} to use this feature of \csbxint{Apply}: a space stops the
+expansion of the applied macro (and disappears). This expansion will be done by
+\csbxint{ANDof}, which has been designed to skip everything as soon as it finds
+a false (i.e.\@ zero) input. This way, the efficiency is considerably improved.
+
+We did generate via the \csbxint{Seq} too many potential divisors though. Later
+sections give two variants: one with \csbxint{iloop} (\autoref{ssec:primesII})
+which is still expandable and another one (\autoref{ssec:primesIII}) which is a
+close variant of the |\IsPrime| code above but with the \csbxint{For} loop, thus
+breaking expandability. The \hyperref[ssec:primesII]{xintiloop variant} does not
+first evaluate the integer square root, the \hyperref[ssec:primesIII]{xintFor
+  variant} still does. I did not compare their efficiencies.
+
+
+Let us construct with this expandable primality test a table of the prime
+numbers up to $1000$. We need to count how many we have in order to know how
+many tab stops one shoud add in the last row.%
+%
+\footnote{although a tabular row may have less tabs than in the
+  preamble, there is a problem with the \char`\|\space\space vertical
+  rule, if one does that.}
+%
+There is some subtlety for this
+last row. Turns out to be better to insert a |\\| only when we know for sure we
+are starting a new row; this is how we have designed the |\OneCell| macro. And
+for the last row, there are many ways, we use again |\xintApplyUnbraced| but
+with a macro which gobbles its argument and replaces it with a tabulation
+character. The \csbxint{For*} macro would be more elegant here.
+%
+\everb?@
+\newcounter{primecount}
+\newcounter{cellcount}
+\newcommand{\NbOfColumns}{13}
+\newcommand{\OneCell}[1]{%
+    \ifnumequal{\IsPrime{#1}}{1}
+     {\stepcounter{primecount}
+      \ifnumequal{\value{cellcount}}{\NbOfColumns}
+       {\\\setcounter{cellcount}{1}#1}
+       {&\stepcounter{cellcount}#1}%
+     } % was prime
+  {}% not a prime, nothing to do
+}
+\newcommand{\OneTab}[1]{&}
+\begin{tabular}{|*{\NbOfColumns}{r}|}
+\hline
+2  \setcounter{cellcount}{1}\setcounter{primecount}{1}%
+   \xintApplyUnbraced \OneCell {\xintSeq [2]{3}{999}}%
+   \xintApplyUnbraced \OneTab
+      {\xintSeq [1]{1}{\the\numexpr\NbOfColumns-\value{cellcount}\relax}}%
+    \\
+\hline
+\end{tabular}
+There are \arabic{primecount} prime numbers up to 1000.
+?
+
+The table has been put in \hyperref[primesupto1000]{float} which appears
+\vpageref{primesupto1000}.
+We had to be careful to use in the last row \csbxint{Seq} with its optional
+argument |[1]| so as to not generate a decreasing sequence from |1| to |0|, but
+really an empty sequence in case the row turns out to already have all its
+cells (which doesn't happen here but would with a number of columns dividing
+$168$).
+%
+\newcommand{\IsNotDivisibleBy}[2]{\ifnumequal{#1-(#1/#2)*#2}{0}{0}{1}}
+
+\newcommand{\IsPrime}[1]
+   {\ifnumodd {#1}
+        {\ifnumless {#1}{8}
+          {\ifnumequal{#1}{1}{0}{1}}% 3,5,7 are primes
+          {\xintANDof
+             {\xintApply
+                { \IsNotDivisibleBy {#1}}{\xintSeq [2]{3}{\xintiiSqrt{#1}}}}%
+            }}% END OF THE ODD BRANCH
+        {\ifnumequal {#1}{2}{1}{0}}% EVEN BRANCH
+}
+
+\newcounter{primecount}
+\newcounter{cellcount}
+\newcommand{\NbOfColumns}{13}
+\newcommand{\OneCell}[1]
+     {\ifnumequal{\IsPrime{#1}}{1}
+        {\stepcounter{primecount}
+         \ifnumequal{\value{cellcount}}{\NbOfColumns}
+            {\\\setcounter{cellcount}{1}#1}
+            {&\stepcounter{cellcount}#1}%
+        } % was prime
+        {}% not a prime nothing to do
+}
+\newcommand{\OneTab}[1]{&}
+\begin{figure*}[ht!]
+  \centering
+  \phantomsection\label{primesupto1000}
+  \begin{tabular}{|*{\NbOfColumns}{r}|}
+    \hline
+    2\setcounter{cellcount}{1}\setcounter{primecount}{1}%
+    \xintApplyUnbraced \OneCell {\xintSeq [2]{3}{999}}%
+    \xintApplyUnbraced \OneTab
+    {\xintSeq [1]{1}{\the\numexpr\NbOfColumns-\value{cellcount}\relax}}%
+    \\
+    \hline
+  \end{tabular}
+\smallskip
+\centeredline{There are \arabic{primecount} prime numbers up to 1000.}
+\end{figure*}
+
+\subsection{Another completely expandable prime test}
+\label{ssec:primesII}
+
+The |\IsPrime| macro from \autoref{ssec:primesI} checked expandably if a (short)
+integer was prime, here is a partial rewrite using \csbxint{iloop}. We use the
+|etoolbox| expandable conditionals for convenience, but not everywhere as
+|\xintiloopindex| can not be evaluated while being braced. This is also the
+reason why |\xintbreakiloopanddo| is delimited, and the next macro
+|\SmallestFactor| which returns the smallest prime factor examplifies that. One
+could write more efficient completely expandable routines, the aim here was only
+to illustrate use of the general purpose \csbxint{iloop}. A little table giving
+the first values of |\SmallestFactor| follows, its coding uses \csbxint{For},
+which is described later; none of this uses count registers.
+%
+
+
+\begin{everbatim*}
+% clean up possible left-over mess from previous examples
+\let\IsPrime\undefined \let\SmallestFactor\undefined
+\newcommand{\IsPrime}[1] % returns 1 if #1 is prime, and 0 if not
+  {\ifnumodd {#1}
+    {\ifnumless {#1}{8}
+      {\ifnumequal{#1}{1}{0}{1}}% 3,5,7 are primes
+      {\if
+       \xintiloop [3+2]
+       \ifnum#1<\numexpr\xintiloopindex*\xintiloopindex\relax
+           \expandafter\xintbreakiloopanddo\expandafter1\expandafter.%
+       \fi
+       \ifnum#1=\numexpr (#1/\xintiloopindex)*\xintiloopindex\relax
+       \else
+       \repeat 00\expandafter0\else\expandafter1\fi
+      }%
+    }% END OF THE ODD BRANCH
+    {\ifnumequal {#1}{2}{1}{0}}% EVEN BRANCH
+}%
+\catcode`_ 11
+\newcommand{\SmallestFactor}[1] % returns the smallest prime factor of #1>1
+  {\ifnumodd {#1}
+    {\ifnumless {#1}{8}
+      {#1}% 3,5,7 are primes
+      {\xintiloop [3+2]
+       \ifnum#1<\numexpr\xintiloopindex*\xintiloopindex\relax
+           \xint_afterfi{\xintbreakiloopanddo#1.}%
+       \fi
+       \ifnum#1=\numexpr (#1/\xintiloopindex)*\xintiloopindex\relax
+           \xint_afterfi{\expandafter\xintbreakiloopanddo\xintiloopindex.}%
+       \fi
+       \iftrue\repeat
+      }%
+     }% END OF THE ODD BRANCH
+   {2}% EVEN BRANCH
+}%
+\catcode`_ 8
+{\centering
+  \begin{tabular}{|c|*{10}c|}
+    \hline
+    \xintFor #1 in {0,1,2,3,4,5,6,7,8,9}\do {&\bfseries #1}\\
+    \hline
+    \bfseries 0&--&--&2&3&2&5&2&7&2&3\\
+    \xintFor #1 in {1,2,3,4,5,6,7,8,9}\do
+    {\bfseries #1%
+      \xintFor #2 in {0,1,2,3,4,5,6,7,8,9}\do
+      {&\SmallestFactor{#1#2}}\\}%
+    \hline
+  \end{tabular}\par
+}
+\end{everbatim*}
+
+\subsection{Miller-Rabin Pseudo-Primality expandably}
+\label{ssec:PrimesIV}
+
+
+% 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,
+5, 7, 11, 13, 17$. If this is true and $n<341550071728321$ (which has 15
+digits) then $n$ really is a prime number.
+
+Similarly $n=3825123056546413051$ (19 digits) is the smallest composite number
+which is a strong pseudo prime for bases $2, 3, 5, 7, 11, 13, 17, 19$ and
+$23$. It is easy to extend the code below to include these additional tests
+(we could make the list of tested bases an argument too, now that I think
+about it.)
+
+For more information see
+  \centeredline{\url{https://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test#Deterministic_variants_of_the_test}}
+  and
+\centeredline{\url{http://primes.utm.edu/prove/prove2_3.html}}
+
+In particular, according to \textsc{Jaeschke} \emph{On strong pseudoprimes to
+  several bases,} Math. Comp., 61 (1993) 915-926, if $n < 4,759,123,141$ it is
+enough to establish Rabin-Miller pseudo-primality to bases $a = 2, 7, 61$ to
+prove that $n$ is prime. This range is enough for \TeX\ numbers and we could
+then write a very fast expandable primality test for such numbers using only
+|\numexpr|. Left as an exercise\dots
+
+\begin{everbatim*}
+% I -------------------------------- Modular Exponentiation
+% Computes x^m modulo n (with m non negative).
+% We will always use it with 1 < x < n
+%
+% With xint 1.4 we should use ? and ?? (although in the case at hand ifsgn()
+% and if() would be ok but I should not say that).
+%
+\xintdefiifunc powmod_a(x, m, n) :=
+       isone(m)?
+           % m=1, return x modulo n
+           {   x /: n  }
+           % m > 1 test if odd or even and do recursive call
+           {   odd(m)? {  x*sqr(powmod_a(x, m//2, n)) /: n }
+                       {    sqr(powmod_a(x, m//2, n)) /: n }
+            }
+         ;
+\xintdefiifunc powmod(x, m, n) := (m)?{powmod_a(x, m, n)}{1};
+
+%% Syntax used before xint 1.4:
+% \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_a(x, m//2, n))) /: n,
+%                             sqr(powmod_a(x, m//2, n))  /: n
+%                 )
+%          );
+% \xintdefiifunc powmod(x, m, n) := if(m, powmod_a(x, m, n), 1);
+
+% II ------------------------------ Miller-Rabin compositeness witness
+
+% n=2^k m + 1 with m odd and k at least 1
+
+% Choose 1<x<n.
+% compute y=x^m modulo n
+% if equals 1 we can't say anything
+% if equals n-1 we can't say anything
+% else put j=1, and
+% compute repeatedly the square, incrementing j by 1 each time,
+% thus always we have y^{2^{j-1}}
+%   -> if at some point n-1 mod n found, we can't say anything and break out
+%   -> if however we never find n-1 mod n before reaching
+%        z=y^{2^{k-1}} with j=k
+%        we then have z^2=x^{n-1}.
+    % Suppose z is not -1 mod n. If z^2 is 1 mod n, then n can be prime only if
+    % z is 1 mod n, and we can go back up, until initial y, and we have already
+    % excluded y=1. Thus if z is not -1 mod n and z^2 is 1 then n is not prime.
+    % But if z^2 is not 1, then n is not prime by Fermat. Hence (z not -1 mod n)
+    % implies (n is composite). (Miller test)
+
+% let's use again xintexpr indecipherable (except to author) syntax. Of course
+% doing it with macros only would be faster.
+
+% Here \xintdefiifunc is not usable because not compatible with iter, break, ... 
+% but \xintNewFunction comes to the rescue.
+
+\xintNewFunction{isCompositeWitness}[4]{% x=#1, n=#2, m=#3, k=#4
+   subs((y==1)?{0}
+         {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
+
+% cf
+%  http://oeis.org/A014233
+%     <http://mathworld.wolfram.com/Rabin-MillerStrongPseudoprimeTest.html>
+%     <http://mathworld.wolfram.com/StrongPseudoprime.html>
+
+% check if positive integer <49 si a prime.
+% 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47
+\def\IsVerySmallPrime #1%
+    {\ifnum#1=1 \xintdothis0\fi
+     \ifnum#1=2 \xintdothis1\fi
+     \ifnum#1=3 \xintdothis1\fi
+     \ifnum#1=5 \xintdothis1\fi
+     \ifnum#1=\numexpr (#1/2)*2\relax\xintdothis0\fi
+     \ifnum#1=\numexpr (#1/3)*3\relax\xintdothis0\fi
+     \ifnum#1=\numexpr (#1/5)*5\relax\xintdothis0\fi
+     \xintorthat 1}
+
+\xintNewFunction{isPseudoPrime}[1]{% n = #1
+     (#1<49)?% use ? syntax to evaluate only what is needed
+% prior to 1.4 we had \xintthe#1 here but the actual tokens represented
+% by this #1 when isPseudoPrime() function expands have changed and 
+% the correct way is now \xintiieval{#1} to hand over explicit digits to
+% the \IsVerySmallPrime macro.
+       {\IsVerySmallPrime{\xintiieval{#1}}}
+       {(even(#1))?
+        {0}
+        {subs(%
+         % L expands to two values m, k hence isCompositeWitness does get
+         % its four variables x, n, m, k
+         isCompositeWitness(2, #1, L)?
+          {0}%
+          {isCompositeWitness(3, #1, L)?
+           {0}%
+           {isCompositeWitness(5, #1, L)?
+            {0}%
+            {isCompositeWitness(7, #1, L)?
+             {0}%
+% above enough for N<3215031751 hence all TeX numbers
+             {isCompositeWitness(11, #1, L)?
+              {0}%
+% above enough for N<2152302898747, hence all 12-digits numbers
+              {isCompositeWitness(13, #1, L)?
+               {0}%
+% above enough for N<3474749660383
+               {isCompositeWitness(17, #1, L)?
+                {0}%
+% above enough for N<341550071728321
+                {1}%
+               }% not needed to comment-out end of lines spaces inside
+              }%  \xintexpr but this is too much of a habit for me with TeX!
+             }%   I left some after the ? characters.
+            }%
+           }%
+          }% this computes (m, k) such that n = 2^k m + 1, m odd, k>=1
+          , L=iter(#1//2;(even(@))?{@//2}{break(@,k)},k=1++))%
+         }%
+        }%
+}
+
+% if needed:
+%\def\IsPseudoPrime #1{\xinttheiiexpr isPseudoPrime(#1)\relax}
+
+\noindent The smallest prime number at least equal to 3141592653589 is
+\xintiiexpr 
+   seq(isPseudoPrime(3141592653589+n)?
+                    {break(3141592653589+n)}{omit}, n=0++)\relax.
+% we could not use 3141592653589++ syntax because it works only with TeX numbers
+\par
+\end{everbatim*}
+
+
+
+
+
+\subsection{A table of factorizations}
+\label{ssec:factorizationtable}
+
+As one more example with \csbxint{iloop} let us use an alignment to display the
+factorization of some numbers. The loop will actually only play a minor r\^ole
+here, just handling the row index, the row contents being almost entirely
+produced via a macro |\factorize|. The factorizing macro does not use
+|\xintiloop| as it didn't appear to be the convenient tool. As |\factorize| will
+have to be used on |\xintiloopindex|, it has been defined as a delimited macro.
+
+To spare some fractions of a second in the compilation time of this document
+(which has many many other things to do), \number"7FFFFFED{} and
+\number"7FFFFFFF, which turn out to be prime numbers, are not given to
+|factorize| but just typeset directly; this illustrates use of
+\csbxint{iloopskiptonext}.
+
+The code next generates a \hyperref[floatfactorize]{table} which has
+been made into a float appearing \vpageref{floatfactorize}. Here is now
+the code for factorization; the conditionals use the package provided
+|\xint_firstoftwo| and |\xint_secondoftwo|, one could have employed
+rather \LaTeX{}'s own |\@firstoftwo| and |\@secondoftwo|, or, simpler
+still in \LaTeX{} context, the |\ifnumequal|, |\ifnumless| \dots,
+utilities from the package |etoolbox| which do exactly that under the
+hood. Only \TeX{} acceptable numbers are treated here, but it would be
+easy to make a translation and use the \xintname macros, thus extending
+the scope to big numbers; naturally up to a cost in speed.
+
+The reason for some strange looking expressions is to avoid arithmetic overflow.
+
+\begin{everbatim*}
+\catcode`_ 11
+\def\abortfactorize #1\xint_secondoftwo\fi #2#3{\fi}
+
+\def\factorize #1.{\ifnum#1=1 \abortfactorize\fi
+          \ifnum\numexpr #1-2=\numexpr ((#1/2)-1)*2\relax
+               \expandafter\xint_firstoftwo
+          \else\expandafter\xint_secondoftwo
+          \fi
+         {2&\expandafter\factorize\the\numexpr#1/2.}%
+         {\factorize_b #1.3.}}%
+
+\def\factorize_b #1.#2.{\ifnum#1=1 \abortfactorize\fi
+         \ifnum\numexpr #1-(#2-1)*#2<#2
+                 #1\abortfactorize
+         \fi
+         \ifnum \numexpr #1-#2=\numexpr ((#1/#2)-1)*#2\relax
+              \expandafter\xint_firstoftwo
+         \else\expandafter\xint_secondoftwo
+         \fi
+         {#2&\expandafter\factorize_b\the\numexpr#1/#2.#2.}%
+         {\expandafter\factorize_b\the\numexpr #1\expandafter.%
+                                  \the\numexpr #2+2.}}%
+\catcode`_ 8
+\begin{figure*}[ht!]
+\centering\phantomsection\label{floatfactorize}\normalcolor
+\tabskip1ex
+\centeredline{\vbox{\halign {\hfil\strut#\hfil&&\hfil#\hfil\cr\noalign{\hrule}
+         \xintiloop ["7FFFFFE0+1]
+         \expandafter\bfseries\xintiloopindex &
+         \ifnum\xintiloopindex="7FFFFFED
+              \number"7FFFFFED\cr\noalign{\hrule}
+         \expandafter\xintiloopskiptonext
+         \fi
+         \expandafter\factorize\xintiloopindex.\cr\noalign{\hrule}
+         \ifnum\xintiloopindex<"7FFFFFFE
+         \repeat
+         \bfseries \number"7FFFFFFF&\number "7FFFFFFF\cr\noalign{\hrule}
+}}}
+\centeredline{A table of factorizations}
+\end{figure*}
+\end{everbatim*}
+
+\subsection{Another table of primes}
+\label{ssec:primesIII}
+
+As a further example, let us dynamically generate a tabular with the first $50$
+prime numbers after $12345$. First we need a macro to test if a (short) number
+is prime. Such a completely expandable macro was given in \autoref{ssec:primesI},
+here we consider a variant which will be slightly more efficient. This new
+|\IsPrime| has two parameters. The first one is a macro which it redefines to
+expand to the result of the primality test applied to the second argument. For
+convenience we use the \href{http://ctan.org/pkg/etoolbox}{etoolbox} wrappers to
+various |\ifnum| tests, although here there isn't anymore the constraint of
+complete expandability (but using explicit |\if..\fi| in tabulars has its
+quirks); equivalent tests are provided by \xintname, but they have some overhead
+as they are able to deal with arbitrarily big integers.
+
+\def\IsPrime #1#2%
+{\edef\TheNumber {\the\numexpr #2}% positive integer
+ \ifnumodd {\TheNumber}
+ {\ifnumgreater {\TheNumber}{1}
+  {\edef\ItsSquareRoot{\xintiiSqrt \TheNumber}%
+    \xintFor ##1 in {\xintintegers [3+2]}\do
+    {\ifnumgreater {##1}{\ItsSquareRoot}
+               {\def#1{1}\xintBreakFor}
+               {}%
+     \ifnumequal {\TheNumber}{(\TheNumber/##1)*##1}
+                 {\def#1{0}\xintBreakFor }
+                 {}%
+    }}
+  {\def#1{0}}}% 1 is not prime
+ {\ifnumequal {\TheNumber}{2}{\def#1{1}}{\def#1{0}}}%
+}%
+
+\everb|@
+\def\IsPrime #1#2% """color[named]{PineGreen}#1=\Result, #2=tested number (assumed >0).;!
+{\edef\TheNumber {\the\numexpr #2}%"""color[named]{PineGreen} hence #2 may be a count or \numexpr.;!
+ \ifnumodd {\TheNumber}
+ {\ifnumgreater {\TheNumber}{1}
+  {\edef\ItsSquareRoot{\xintiiSqrt \TheNumber}%
+    \xintFor """color{red}##1;! in {"""color{red}\xintintegers;! [3+2]}\do
+    {\ifnumgreater {"""color{red}##1;!}{\ItsSquareRoot} """color[named]{PineGreen}% "textcolor{red}{##1} is a \numexpr.;!
+               {\def#1{1}\xintBreakFor}
+               {}%
+     \ifnumequal {\TheNumber}{(\TheNumber/##1)*##1}
+                 {\def#1{0}\xintBreakFor }
+                 {}%
+    }}
+  {\def#1{0}}}% 1 is not prime
+ {\ifnumequal {\TheNumber}{2}{\def#1{1}}{\def#1{0}}}%
+}
+|
+
+As we used \csbxint{For} inside a macro we had to double the |#| in its |#1|
+parameter. Here is now the code which creates the prime table (the table has
+been put in a \hyperref[primes]{float}, which should be found on page
+\pageref{primes}):
+
+\everb?@
+\newcounter{primecount}
+\newcounter{cellcount}
+\begin{figure*}[ht!]
+  \centering
+  \begin{tabular}{|*{7}c|}
+  \hline
+  \setcounter{primecount}{0}\setcounter{cellcount}{0}%
+  \xintFor """color{red}#1;! in {"""color{red}\xintintegers;! [12345+2]} \do
+"""color[named]{PineGreen}% "textcolor{red}{#1} is a \numexpr.;!
+  {\IsPrime\Result{#1}%
+   \ifnumgreater{\Result}{0}
+   {\stepcounter{primecount}%
+    \stepcounter{cellcount}%
+    \ifnumequal {\value{cellcount}}{7}
+       {"""color{red}\the#1;! \\\setcounter{cellcount}{0}}
+       {"""color{red}\the#1;! &}}
+   {}%
+    \ifnumequal {\value{primecount}}{50}
+     {\xintBreakForAndDo
+      {\multicolumn {6}{l|}{These are the first 50 primes after 12345.}\\}}
+     {}%
+  }\hline
+\end{tabular}
+\end{figure*}
+?
+
+\begin{figure*}[ht!]
+  \centering\phantomsection\label{primes}
+  \begin{tabular}{|*{7}c|}
+  \hline
+  \setcounter{primecount}{0}\setcounter{cellcount}{0}%
+  \xintFor #1 in {\xintintegers [12345+2]} \do
+  {\IsPrime\Result{#1}%
+   \ifnumgreater{\Result}{0}
+   {\stepcounter{primecount}%
+    \stepcounter{cellcount}%
+    \ifnumequal {\value{cellcount}}{7}
+       {\the#1 \\\setcounter{cellcount}{0}}
+       {\the#1 &}}
+   {}%
+    \ifnumequal {\value{primecount}}{50}
+     {\xintBreakForAndDo
+      {\multicolumn {6}{l|}{These are the first 50 primes after 12345.}\\}}
+     {}%
+  }\hline
+\end{tabular}
+\end{figure*}
+
+\subsection{Factorizing again}
+\label{ssec:factorize}
+
+Here is an \fexpan dable macro which computes the factors of an integer. It
+uses the \xintname macros only.
+\begin{everbatim*}
+\catcode`\@ 11
+\let\factorize\relax
+\newcommand\Factorize [1]
+      {\romannumeral0\expandafter\factorize\expandafter{\romannumeral-`0#1}}%
+\newcommand\factorize [1]{\xintiiifOne{#1}{ 1}{\factors at a #1.{#1};}}%
+\def\factors at a #1.{\xintiiifOdd{#1}
+   {\factors at c 3.#1.}%
+   {\expandafter\factors at b \expandafter1\expandafter.\romannumeral0\xinthalf{#1}.}}%
+\def\factors at b #1.#2.{\xintiiifOne{#2}
+   {\factors at end {2, #1}}%
+   {\xintiiifOdd{#2}{\factors at c 3.#2.{2, #1}}%
+                     {\expandafter\factors at b \the\numexpr #1+\@ne\expandafter.%
+                         \romannumeral0\xinthalf{#2}.}}%
+}%
+\def\factors at c #1.#2.{%
+    \expandafter\factors at d\romannumeral0\xintiidivision {#2}{#1}{#1}{#2}%
+}%
+\def\factors at d #1#2#3#4{\xintiiifNotZero{#2}
+   {\xintiiifGt{#3}{#1}
+        {\factors at end {#4, 1}}% ultimate quotient is a prime with power 1
+        {\expandafter\factors at c\the\numexpr #3+\tw at .#4.}}%
+   {\factors at e 1.#3.#1.}%
+}%
+\def\factors at e #1.#2.#3.{\xintiiifOne{#3}
+   {\factors at end {#2, #1}}%
+   {\expandafter\factors at f\romannumeral0\xintiidivision {#3}{#2}{#1}{#2}{#3}}%
+}%
+\def\factors at f #1#2#3#4#5{\xintiiifNotZero{#2}
+   {\expandafter\factors at c\the\numexpr #4+\tw at .#5.{#4, #3}}%
+   {\expandafter\factors at e\the\numexpr #3+\@ne.#4.#1.}%
+}%
+\def\factors at end #1;{\xintlistwithsep{, }{\xintRevWithBraces {#1}}}%
+\catcode`@ 12
+\end{everbatim*}
+The macro will be acceptably efficient only with numbers having somewhat small
+prime factors.
+\begin{everbatim}
+\Factorize{16246355912554185673266068721806243461403654781833}
+\end{everbatim}
+\begingroup\fdef\Z
+{\Factorize{16246355912554185673266068721806243461403654781833}}
+\noindent{\small\dtt{\Z}}
+
+
+It puts a little stress on the input save stack in order
+not be bothered with previously gathered things.\footnote{2015/11/18 I have
+  not revisited this code for a long time, and perhaps I could improve it now
+  with some new techniques.}
+
+Its output is a comma separated list with the number first, then its prime
+factors with multiplicity. Let's produce something prettier:
+\begin{everbatim*}
+\catcode`_ 11
+\def\ShowFactors #1{\expandafter
+                    \ShowFactors_a\romannumeral-`0\Factorize{#1},\relax,\relax,}
+\def\ShowFactors_a #1,{#1=\ShowFactors_b}
+\def\ShowFactors_b #1,#2,{\if\relax#1\else#1^{#2}\expandafter\ShowFactors_b\fi}
+\catcode`_ 8
+\end{everbatim*}
+\begin{everbatim}
+$$\ShowFactors{16246355912554185673266068721806243461403654781833}$$
+\end{everbatim}
+$$\csname ShowFactors_a\expandafter\endcsname\Z,\relax,\relax,$$
+\endgroup
+
+If we only considered small integers, we could write pure |\numexpr| methods
+which would be very much faster (especially if we had a table of small primes
+prepared first) but still ridiculously slow compared to any non expandable
+implementation, not to mention use of programming languages directly accessing
+the CPU registers\dots
+
+\subsection{The Quick Sort algorithm illustrated}\label{ssec:quicksort}
+
+First a completely expandable macro which sorts a comma separated list of
+numbers.%
+%
+\footnote{The code in earlier versions of this manual handled inputs composed
+  of braced items. I have switched to comma separated inputs on the occasion
+  of (link removed) 
+  The version here is like
+  |code 3| on 
+  (link removed) (which is about |3x| faster
+  than the earlier code it replaced in this manual) with a modification to
+  make it more efficient if the data has many repeated values.
+
+  A faster routine (for sorting hundreds of values) is provided as |code 6| at
+  the link mentioned in the footnote, it is based on Merge Sort, but limited
+  to inputs which one can handle as \TeX{} dimensions.%
+
+  This |code 6| could be extended to handle more general numbers, as
+  acceptable by \xintfracname. I have also written a non expandable version,
+  which is even faster, but this matters really only when handling hundreds or
+  rather thousands of values.}
+%
+
+The |\QSx| macro expands its list argument, which may thus be a macro; its
+comma separated items must expand to integers or decimal numbers or fractions
+or scientific notation as acceptable to \xintfracname, but if an item is
+itself some (expandable) macro, this macro will be expanded each time the item
+is considered in a comparison test! This is actually good if the macro expands
+in one step to the digits, and there are many many digits, but bad if the macro
+needs to do many computations. Thus |\QSx| should be used with either explicit
+numbers or with items being macros expanding in one step to the numbers
+(particularly if these numbers are very big).
+
+If the interest is only in \TeX{} integers, then one should replace the
+|\xintifCmp| macro with a suitable conditional, possibly helped by tools such as
+|\ifnumgreater|, |\ifnumequal| and |\ifnumless| from
+\href{http://ctan.org/pkg/etoolbox}{etoolbox} (\LaTeX{} only; I didn't see a
+direct equivalent to |\xintifCmp|.) Or, if we are dealing with decimal numbers
+with at most four+four digits, then one should use suitable |\ifdim| tests.
+Naturally this will boost consequently the speed, from having skipped all the
+overhead in parsing fractions and scientific numbers as are acceptable by
+\xintfracname macros, and subsequent treatment.
+
+\begin{everbatim*}
+% THE QUICK SORT ALGORITHM EXPANDABLY
+% \usepackage{xintfrac} in the preamble (latex)
+\makeatletter
+% use extra safe delimiters
+\catcode`! 3 \catcode`? 3
+\def\QSx {\romannumeral0\qsx }%
+% first we check if empty list (else \qsx at finish will not find a comma)
+\def\qsx   #1{\expandafter\qsx at a\romannumeral-`0#1,!,?}%
+\def\qsx at a #1{\ifx,#1\expandafter\qsx at abort\else
+                     \expandafter\qsx at start\fi #1}%
+\def\qsx at abort #1?{ }%
+\def\qsx at start {\expandafter\qsx at finish\romannumeral0\qsx at b,}%
+\def\qsx at finish ,#1{ #1}%
+%
+% we check if empty of single and if not pick up the first as Pivot:
+\def\qsx at b ,#1#2,#3{\ifx?#3\xintdothis\qsx at empty\fi
+                    \ifx!#3\xintdothis\qsx at single\fi
+                    \xintorthat\qsx at separate {#1#2}{}{}{#1#2}#3}%
+\def\qsx at empty  #1#2#3#4#5{ }%
+\def\qsx at single #1#2#3#4#5?{, #4}%
+\def\qsx at separate #1#2#3#4#5#6,%
+{%
+    \ifx!#5\expandafter\qsx at separate@done\fi
+    \xintifCmp {#5#6}{#4}%
+          \qsx at separate@appendtosmaller
+          \qsx at separate@appendtoequal
+          \qsx at separate@appendtogreater {#5#6}{#1}{#2}{#3}{#4}%
+}%
+%
+\def\qsx at separate@appendtoequal   #1#2{\qsx at separate {#2,#1}}%
+\def\qsx at separate@appendtogreater #1#2#3{\qsx at separate {#2}{#3,#1}}%
+\def\qsx at separate@appendtosmaller #1#2#3#4{\qsx at separate {#2}{#3}{#4,#1}}%
+%
+\def\qsx at separate@done\xintifCmp #1%
+          \qsx at separate@appendtosmaller
+          \qsx at separate@appendtoequal
+          \qsx at separate@appendtogreater #2#3#4#5#6#7?%
+{%
+    \expandafter\qsx at f\expandafter {\romannumeral0\qsx at b #4,!,?}{\qsx at b #5,!,?}{#3}%
+}%
+%
+\def\qsx at f #1#2#3{#2, #3#1}%
+%
+\catcode`! 12 \catcode`? 12
+\makeatother
+
+% EXAMPLE
+\begingroup
+\edef\z {\QSx {1.0, 0.5, 0.3, 1.5, 1.8, 2.0, 1.7, 0.4, 1.2, 1.4,
+               1.3, 1.1, 0.7, 1.6, 0.6, 0.9, 0.8, 0.2, 0.1, 1.9}}
+\meaning\z
+
+\def\a {3.123456789123456789}\def\b {3.123456789123456788}
+\def\c {3.123456789123456790}\def\d {3.123456789123456787}
+\oodef\z {\QSx { \a, \b, \c, \d}}%
+% The space before \a to let it not be expanded during the conversion from CSV
+% values to List. The \oodef expands exactly twice (via a bunch of \expandafter's)
+\meaning\z
+\endgroup
+\end{everbatim*} (the spaces after \string\d, etc...\@ come from the use of the
+|\meaning| primitive.)
+
+The choice of pivot as first element is bad if the list is already almost
+sorted. Let's add a variant which will pick up the pivot index randomly. The
+previous routine worked also internally with comma separated lists, but for a
+change this one will use internally lists of braced items (the initial
+conversion via \csbxint{CSVtoList} handles all potential spurious space
+problems).
+
+\unless\ifxetex % pour tester compilation de xint.dtx avec xetex qui n'a pas
+                % \pdfuniformdeviate
+\begin{everbatim*}
+% QuickSort expandably on comma separated values with random choice of pivots
+% ====> Requires availability of \pdfuniformdeviate <====
+% \usepackage{xintfrac, xinttools} in preamble
+\makeatletter
+\def\QSx {\romannumeral0\qsx }% This is a f-expandable macro.
+% This converts from comma separated values on input and back on output.
+% **** NOTE: these steps (and the other ones too, actually) are costly if input
+%            has thousands of items.
+\def\qsx #1{\xintlistwithsep{, }%
+            {\expandafter\qsx at sort@a\expandafter{\romannumeral0\xintcsvtolist{#1}}}}%
+%
+% we check if empty or single or double and if not pick up the first as Pivot:
+\def\qsx at sort@a #1%
+    {\expandafter\qsx at sort@b\expandafter{\romannumeral0\xintlength{#1}}{#1}}%
+\def\qsx at sort@b #1{\ifcase #1
+                      \expandafter\qsx at sort@empty
+                      \or\expandafter\qsx at sort@single
+                      \or\expandafter\qsx at sort@double
+                      \else\expandafter\qsx at sort@c\fi {#1}}%
+\def\qsx at sort@empty  #1#2{ }%
+\def\qsx at sort@single #1#2{#2}%
+\catcode`_ 11
+\def\qsx at sort@double #1#2{\xintifGt #2{\xint_exchangetwo_keepbraces}{}#2}%
+\catcode`_ 8
+\def\qsx at sort@c      #1#2{%
+    \expandafter\qsx at sort@sep at a\expandafter
+                {\romannumeral0\xintnthelt{\pdfuniformdeviate #1+\@ne}{#2}}#2?}%
+\def\qsx at sort@sep at a #1{\qsx at sort@sep at loop {}{}{}{#1}}%
+\def\qsx at sort@sep at loop #1#2#3#4#5%
+{%
+    \ifx?#5\expandafter\qsx at sort@sep at done\fi
+    \xintifCmp {#5}{#4}%
+          \qsx at sort@sep at appendtosmaller
+          \qsx at sort@sep at appendtoequal
+          \qsx at sort@sep at appendtogreater {#5}{#1}{#2}{#3}{#4}%
+}%
+%
+\def\qsx at sort@sep at appendtoequal   #1#2{\qsx at sort@sep at loop {#2{#1}}}%
+\def\qsx at sort@sep at appendtogreater #1#2#3{\qsx at sort@sep at loop {#2}{#3{#1}}}%
+\def\qsx at sort@sep at appendtosmaller #1#2#3#4{\qsx at sort@sep at loop {#2}{#3}{#4{#1}}}%
+%
+\def\qsx at sort@sep at done\xintifCmp #1%
+          \qsx at sort@sep at appendtosmaller
+          \qsx at sort@sep at appendtoequal
+          \qsx at sort@sep at appendtogreater #2#3#4#5#6%
+{%
+    \expandafter\qsx at sort@recurse\expandafter
+               {\romannumeral0\qsx at sort@a {#4}}{\qsx at sort@a {#5}}{#3}%
+}%
+%
+\def\qsx at sort@recurse #1#2#3{#2#3#1}%
+%
+\makeatother
+
+% EXAMPLES
+\begingroup
+\edef\z {\QSx {1.0, 0.5, 0.3, 1.5, 1.8, 2.0, 1.7, 0.4, 1.2, 1.4,
+               1.3, 1.1, 0.7, 1.6, 0.6, 0.9, 0.8, 0.2, 0.1, 1.9}}
+\meaning\z
+
+\def\a {3.123456789123456789}\def\b {3.123456789123456788}
+\def\c {3.123456789123456790}\def\d {3.123456789123456787}
+\oodef\z {\QSx { \a, \b, \c, \d}}%
+% The space before \a to let it not be expanded during the conversion from CSV
+% values to List. The \oodef expands exactly twice (via a bunch of \expandafter's)
+\meaning\z
+
+\def\somenumbers{%
+3997.6421, 8809.9358, 1805.4976, 5673.6478, 3179.1328, 1425.4503, 4417.7691,
+2166.9040, 9279.7159, 3797.6992, 8057.1926, 2971.9166, 9372.2699, 9128.4052,
+1228.0931, 3859.5459, 8561.7670, 2949.6929, 3512.1873, 1698.3952, 5282.9359,
+1055.2154, 8760.8428, 7543.6015, 4934.4302, 7526.2729, 6246.0052, 9512.4667,
+7423.1124, 5601.8436, 4433.5361, 9970.4849, 1519.3302, 7944.4953, 4910.7662,
+3679.1515, 8167.6824, 2644.4325, 8239.4799, 4595.1908, 1560.2458, 6098.9677,
+3116.3850, 9130.5298, 3236.2895, 3177.6830, 5373.1193, 5118.4922, 2743.8513,
+8008.5975, 4189.2614, 1883.2764, 9090.9641, 2625.5400, 2899.3257, 9157.1094,
+8048.4216, 3875.6233, 5684.3375, 8399.4277, 4528.5308, 6926.7729, 6941.6278,
+9745.4137, 1875.1205, 2755.0443, 9161.1524, 9491.1593, 8857.3519, 4290.0451,
+2382.4218, 3678.2963, 5647.0379, 1528.7301, 2627.8957, 9007.9860, 1988.5417,
+2405.1911, 5065.8063, 5856.2141, 8989.8105, 9349.7840, 9970.3013, 8105.4062,
+3041.7779, 5058.0480, 8165.0721, 9637.7196, 1795.0894, 7275.3838, 5997.0429,
+7562.6481, 8084.0163, 3481.6319, 8078.8512, 2983.7624, 3925.4026, 4931.5812,
+1323.1517, 6253.0945}%
+
+\oodef\z {\QSx \somenumbers}% produced as a comma+space separated list
+% black magic as workaround to the shrinkability of spaces in last line...
+\hsize 87\fontcharwd\font`0
+\lccode`~=32
+\lowercase{\def~}{\discretionary{}{}{\kern\fontcharwd\font`0}}\catcode32 13
+\noindent\phantom{00}\scantokens\expandafter{\meaning\z}\par
+\endgroup
+\end{everbatim*}
+\fi % fin de si pas xetex
+
+
+All the previous examples were with numbers which could have been handled via
+|\ifdim| tests rather than the \csbxint{ifCmp} macro from \xintfracname; using
+|\ifdim| tests would naturally be faster. Even faster routine is |code 6| at
+(link removed) which uses |\pdfescapestring| and a
+Merge Sort algorithm.
+
+We then turn to a graphical illustration of the algorithm.%
+%
+\footnote{I have rewritten (2015/11/21) the routine to do only once (and not thrice) the
+  needed calls to \csa{xintifCmp}, up to the price of one additional |\edef|,
+  although due to the context execution time on our side is not an issue and
+  moreover is anyhow overwhelmed by the TikZ's activities. Simultaneously I
+  have updated the code.
+  The
+  variant with the choice of pivot on the right has more overhead: the reason
+  is simply that we do not convert the data into an array, but maintain a list
+  of tokens with self-reorganizing delimiters.}
+%
+For simplicity the pivot is always chosen as the first list item. Then we also
+give a variant which picks up the last item as pivot.
+\begin{everbatim*}
+% in LaTeX preamble:
+% \usepackage{xintfrac, xinttools}
+% \usepackage{color}
+% or, when using Plain TeX:
+% \input xintfrac.sty \input xinttools.sty
+% \input color.tex
+%
+% Color definitions
+\definecolor{LEFT}{RGB}{216,195,88}
+\definecolor{RIGHT}{RGB}{208,231,153}
+\definecolor{INERT}{RGB}{199,200,194}
+\definecolor{INERTpiv}{RGB}{237,237,237}
+\definecolor{PIVOT}{RGB}{109,8,57}
+% Start of macro defintions
+\makeatletter
+% \catcode`? 3 % a bit too paranoid. Normal ? will do.
+%
+% argument will never be empty
+\def\QS at cmp@a    #1{\QS at cmp@b  #1??}%
+\def\QS at cmp@b    #1{\noexpand\QS at sep@A\@ne{#1}\QS at cmp@d {#1}}%
+\def\QS at cmp@d    #1#2{\ifx ?#2\expandafter\QS at cmp@done\fi
+                      \xintifCmp {#1}{#2}\tw@\@ne\z@{#2}\QS at cmp@d {#1}}%
+\def\QS at cmp@done #1?{?}%
+%
+\def\QS at sep@A #1?{\QSLr\QS at sep@L #1\thr@@?#1\thr@@?#1\thr@@?}%
+\def\QS at sep@L #1#2{\ifcase #1{#2}\or\or\else
+                                          \expandafter\QS at sep@I at start\fi \QS at sep@L}%
+\def\QS at sep@I at start\QS at sep@L {\noexpand\empty?\QSIr\QS at sep@I}%
+\def\QS at sep@I #1#2{\ifcase#1\or{#2}\or\else\expandafter\QS at sep@R at start\fi\QS at sep@I}%
+\def\QS at sep@R at start\QS at sep@I {\noexpand\empty?\QSRr\QS at sep@R}%
+\def\QS at sep@R #1#2{\ifcase#1\or\or{#2}\else\expandafter\QS at sep@done\fi\QS at sep@R}%
+\def\QS at sep@done\QS at sep@R {\noexpand\empty?}%
+%
+\def\QS at loop {%
+    \xintloop
+    % pivot phase
+    \def\QS at pivotcount{0}%
+    \let\QSLr\DecoLEFTwithPivot  \let\QSIr \DecoINERT
+    \let\QSRr\DecoRIGHTwithPivot \let\QSIrr\DecoINERT
+    \centerline{\QS at list}%
+    % sorting phase
+    \ifnum\QS at pivotcount>\z@
+            \def\QSLr {\QS at cmp@a}\def\QSRr {\QS at cmp@a}%
+            \def\QSIr {\QSIrr}\let\QSIrr\relax
+                \edef\QS at list{\QS at list}% compare
+            \let\QSLr\relax\let\QSRr\relax\let\QSIr\relax
+                \edef\QS at list{\QS at list}% separate
+            \def\QSLr ##1##2?{\ifx\empty##1\else\noexpand \QSLr {{##1}##2}\fi}%
+            \def\QSIr ##1##2?{\ifx\empty##1\else\noexpand \QSIr {{##1}##2}\fi}%
+            \def\QSRr ##1##2?{\ifx\empty##1\else\noexpand \QSRr {{##1}##2}\fi}%
+                \edef\QS at list{\QS at list}% gather
+            \let\QSLr\DecoLEFT \let\QSRr\DecoRIGHT
+            \let\QSIr\DecoINERTwithPivot \let\QSIrr\DecoINERT
+            \centerline{\QS at list}%
+    \repeat }%
+%
+% \xintFor* loops handle gracefully empty lists.
+\def\DecoLEFT  #1{\xintFor* ##1 in {#1} \do {\colorbox{LEFT}{##1}}}%
+\def\DecoINERT #1{\xintFor* ##1 in {#1} \do {\colorbox{INERT}{##1}}}%
+\def\DecoRIGHT #1{\xintFor* ##1 in {#1} \do {\colorbox{RIGHT}{##1}}}%
+\def\DecoPivot #1{\begingroup
+                    \color{PIVOT}\advance\fboxsep-\fboxrule\fbox{#1}\endgroup}%
+%
+\def\DecoLEFTwithPivot #1{\xdef\QS at pivotcount{\the\numexpr\QS at pivotcount+\@ne}%
+    \xintFor* ##1 in {#1} \do
+        {\xintifForFirst {\DecoPivot {##1}}{\colorbox{LEFT}{##1}}}}%
+\def\DecoINERTwithPivot #1{\xdef\QS at pivotcount{\the\numexpr\QS at pivotcount+\@ne}%
+    \xintFor* ##1 in {#1} \do
+        {\xintifForFirst {\colorbox{INERTpiv}{##1}}{\colorbox{INERT}{##1}}}}%
+\def\DecoRIGHTwithPivot #1{\xdef\QS at pivotcount{\the\numexpr\QS at pivotcount+\@ne}%
+    \xintFor* ##1 in {#1}  \do
+        {\xintifForFirst {\DecoPivot {##1}}{\colorbox{RIGHT}{##1}}}}%
+%
+\def\QuickSort #1{% warning: not compatible with empty #1.
+    % initialize, doing conversion from comma separated values
+    % to a list of braced items
+    \edef\QS at list{\noexpand\QSRr{\xintCSVtoList{#1}}}%
+    % may \edef's are to follow anyhow
+% earlier I did a first drawing of the list, here with the color of RIGHT elements,
+% but the color should have been for example white, anyway I drop this first line
+    %\let\QSRr\DecoRIGHT
+    %\par\centerline{\QS at list}%
+%
+    % loop as many times as needed
+    \QS at loop }%
+%
+% \catcode`? 12 % in case we had used a funny ? as delimiter.
+\makeatother
+%% End of macro definitions.
+%% Start of Example
+\begingroup\offinterlineskip
+\small
+% \QuickSort {1.0, 0.5, 0.3, 1.5, 1.8, 2.0, 1.7, 0.4, 1.2, 1.4,
+%                1.3, 1.1, 0.7, 1.6, 0.6, 0.9, 0.8, 0.2, 0.1, 1.9}
+% \medskip
+% with repeated values
+\QuickSort {1.0, 0.5, 0.3, 0.8, 1.5, 1.8, 2.0, 1.7, 0.4, 1.2, 1.4,
+               1.3, 1.1, 0.7, 0.3, 1.6, 0.6, 0.3, 0.8, 0.2, 0.8, 0.7, 1.2}
+\endgroup
+\end{everbatim*}
+
+Here is the variant which always picks the pivot as the rightmost element.
+
+\begin{everbatim*}
+\makeatletter
+%
+\def\QS at cmp@a #1{\noexpand\QS at sep@A\expandafter\QS at cmp@d\expandafter
+                 {\romannumeral0\xintnthelt{-1}{#1}}#1??}%
+%
+\def\DecoLEFTwithPivot #1{\xdef\QS at pivotcount{\the\numexpr\QS at pivotcount+\@ne}%
+    \xintFor* ##1 in {#1} \do
+        {\xintifForLast {\DecoPivot {##1}}{\colorbox{LEFT}{##1}}}}
+\def\DecoINERTwithPivot #1{\xdef\QS at pivotcount{\the\numexpr\QS at pivotcount+\@ne}%
+    \xintFor* ##1 in {#1} \do
+        {\xintifForLast {\colorbox{INERTpiv}{##1}}{\colorbox{INERT}{##1}}}}
+\def\DecoRIGHTwithPivot #1{\xdef\QS at pivotcount{\the\numexpr\QS at pivotcount+\@ne}%
+    \xintFor* ##1 in {#1}  \do
+        {\xintifForLast {\DecoPivot {##1}}{\colorbox{RIGHT}{##1}}}}
+\def\QuickSort #1{%
+    % initialize, doing conversion from comma separated values
+    % to a list of braced items
+    \edef\QS at list{\noexpand\QSLr {\xintCSVtoList{#1}}}%
+    % many \edef's are to follow anyhow
+    %
+    % loop as many times as needed
+    \QS at loop }%
+\makeatother
+\begingroup\offinterlineskip
+\small
+% \QuickSort {1.0, 0.5, 0.3, 1.5, 1.8, 2.0, 1.7, 0.4, 1.2, 1.4,
+%                1.3, 1.1, 0.7, 1.6, 0.6, 0.9, 0.8, 0.2, 0.1, 1.9}
+% \medskip
+% with repeated values
+\QuickSort {1.0, 0.5, 0.3, 0.8, 1.5, 1.8, 2.0, 1.7, 0.4, 1.2, 1.4,
+               1.3, 1.1, 0.7, 0.3, 1.6, 0.6, 0.3, 0.8, 0.2, 0.8, 0.7, 1.2}
+\endgroup
+\end{everbatim*}
+
+The choice of the first or last item as pivot is not a good one as nearly
+ordered lists will take quadratic time. But for explaining the algorithm via a
+graphical interpretation, it is not that bad. If one wanted to pick up the
+pivot randomly, the routine would have to be substantially rewritten: in
+particular the |\Deco..withPivot| macros need to know where the pivot is, and
+currently this is implemented by using either |\xintifForFirst| or
+|\xintifForLast|.
+
+\clearpage
+
+\expandafter\let\csname ExamplesnameUp\endcsname\undefined
+
 \csname xint bundlenameUp\endcsname
 
 \def\xintRunningHeader{{\inheadertrue\catcode`,12\relax
@@ -8898,10 +13244,7 @@
           \xintbinhexname,
           \xintgcdname,
           \xintseriesname,
-          \xintcfracname, 
-          \xinttoolsname,
-          \DOCxintexprmacros,
-          \DOCexamples}}
+          \xintcfracname}}
 \markboth{\makebox[0pt]{\xintRunningHeader}}{\makebox[0pt]{\xintRunningHeader}}
 
 \etocdepthtag.toc {macros}
@@ -8910,7 +13253,7 @@
 \renewcommand{\etocaftertochook}{\addvspace{\bigskipamount}}
 
 \part{The macro layer for expandable computations: \xintcorename, \xintname,
-  \xintfracname,...\@}
+  \xintfracname, and some extras}
 \RaisedLabel[15]{sec:bundle}
 
 
@@ -9225,8 +13568,9 @@
 By convention in this manual \fexpan sion (``full expansion'' or ``full first
 expansion'') will be this \TeX{} process of expanding repeatedly the first
 token seen. For those familiar with \LaTeX3 (which is not used by \xintname)
-this is what is called in its documentation full expansion (whereas expansion
-inside |\edef| would be described I think as ``exhaustive'' expansion).
+this is what is called in its documentation full expansion, whereas expansion
+inside |\edef| would be described I think as ``exhaustive'' expansion
+and will be referred too in this manual as \xexpan sion.
 
 Most of the package macros, and all those dealing with computations%
 %
@@ -9520,9 +13864,8 @@
   in the scientific notation as described in the documentation of
   \csbxint{Float}.
 
-  The exceptions are \csbxint{PFloat} and its variant \csbxint{PFloatb} which
-  do some customizable pretty printing of the result.  The former is also used
-  by default by \csbxint{floateval}.
+  The exception is \csbxint{PFloat} which does some customizable pretty
+  printing of the result.
 \end{itemize}
 
 \subsection{Count registers and variables}\label{sec:useofcount}
@@ -9773,7 +14116,7 @@
 \end{framed}
 
 
-\subsection{\csh{ifcase}, \csh{ifnum}, ...\@ constructs}\label{sec:ifcase}
+\subsection{\csh{ifcase}, \csh{ifnum}, \texorpdfstring{...\@}{...} constructs}\label{sec:ifcase}
 
 When using things such as |\ifcase \xintSgn{\A}| one has to make sure to leave
 a space after the closing brace for \TeX{} to
@@ -9829,7 +14172,8 @@
 exactly twice the replacement text, and |\fdef| which applies \fexpan sion to
 the replacement text during the definition.
 \begin{everbatim*}
-\def\x{1729728} \def\y{352827927} \oodef\w {\xintiiMul\x\y} \fdef\z{\xintiiMul {\x}{\y}}
+\def\x{1729728}\def\y{352827927}
+\oodef\w {\xintiiMul\x\y} \fdef\z{\xintiiMul {\x}{\y}}
 \meaning\w, \meaning\z
 \end{everbatim*}
 
@@ -10009,46 +14353,89 @@
 \subsection{Package namespace, catcodes}
 
 
-The bundle packages needs that the \csa{space} and \csa{empty} control
-sequences are pre-defined with the identical meanings as in Plain \TeX{} (or
-\LaTeX2e which has the same macros).
+This section reviews (probably with some omissions) important
+miscellany regarding control sequence names and catcode matters and is
+basically in its entirety a 
+\begin{TeXnote}
+\begin{itemize}
+\item The bundle packages %\CHANGED{1.4}
+  force the |\space| and |\empty|
+  control sequences into having their default meanings as in Plain \TeX{} or
+  \LaTeX2e formats.
+\item Private macros (or internally used |\count| registers, and one private
+  |\toks|) have names starting with |\xint_| or |\XINT_|.  Some, for legacy or
+  technical reasons, have |\xint| or |\XINT| prefix with no underscore.
+\item All public macros have their names starting with |\xint| except for:
+  \begin{itemize}
+  \item the \xintkernelname provided \hyperref[odef]{|\odef|},
+    \hyperref[oodef]{|\oodef|}, \hyperref[fdef]{|\fdef|}.  If macros with
+    these names already exist \xinttoolsname will not overwrite them. Their
+    meanings are also available under the names \csbxint{odef}, \csbxint{oodef},
+    etc...
+  \item deprecated |\thexintexpr| etc..., which will be removed at next major
+    release.  Use \csbxint{theexpr} etc... rather.
+  \item deprecated |\poormanloghack| which is now a no-op and will be removed
+    at next major release.
+  \end{itemize}
+  
+\item Whether in arguments of \xintfracname macros or inside
+  \csbxint{expr}essions active characters will cause naturally problems, one
+  thinks in particular of characters made active by |babel| languages such as
+  |babel-french| for |!?;:|, and for example the |!| if used as factorial
+  operator will cause breakage.  Prefixing with |\string| is one option, and
+  there is also |\detokenize|.
 
-Private macros of \xintkernelname, \xintcorename, \xinttoolsname,
-\xintname, \xintfracname, \xintexprname, \xintbinhexname, \xintgcdname,
-\xintseriesname, and \xintcfracname{} use one or more underscores |_| as
-private letter, to reduce the risk of getting overwritten. They almost
-all begin either with |\XINT_| or with |\xint_|, a handful of these
-private macros such as \csa{XINTsetupcatcodes}, \csa{XINTdigits} and
-those with names such as |\XINTinFloat...| or |\XINTinfloat...| do not
-have any underscore in their names (for obscure legacy reasons).
+\item Precautions are not needed (but see next item) for
+  \csbxint{defvar} and \csbxint{deffunc} as they use automatically
+  \csbxint{exprSafeCatcodes} and \csbxint{exprRestoreCatcodes} to temporarily
+  set catcodes to safe values.
 
-\xintkernelname provides \hyperref[odef]{|\odef|}, \hyperref[oodef]{|\oodef|},
-\hyperref[fdef]{|\fdef|}: if macros with these names already exist
-\xinttoolsname will not overwrite them. The same meanings are independently
-available under the names |\xintodef|, |\xintoodef|, etc...
+\item \csbxint{exprSafeCatcodes} and \csbxint{exprRestoreCatcodes} can be
+  employed at user level too.  They should be used in case of need before and
+  after macro definitions themselves using \csbxint{expr}, \csbxint{defvar} or
+  \csbxint{deffunc}.  Indeed the latter two won't be able to ``fix''
+  problematic characters already present at definition time when expansion is
+  later done.  In the \LaTeX\ preamble, |babel| has not yet activated
+  (normally) characters, so these precautions should be unneeded there.
 
-Apart from |\thexintexpr|, |\thexintiexpr|, ...\@
-all other public macros from the \xintname bundle packages start with |\xint|.
+\item For the \xintfracname macros to be able to parse their inputs, standard
+  catcodes in the argument are assumed for the digits (of course), the plus
+  and minus signs, the dot, the letter |e|, the forward slash, the square
+  brackets.  Spaces should be avoided although they may go unnoticed
+  sometimes.
 
-For the good functioning of the macros, standard catcodes are assumed for the
-minus sign, the forward slash, the square brackets, the letter `e'. These
-requirements are dropped inside an |\xintexpr|-ession: spaces are gobbled,
-catcodes mostly do not matter, the |e| of scientific notation may be |E| (on
-input) \dots{}
+\item For the \xintexprname expressions there is more leeway: the digit tokens
+  must have their standard catcodes, the letters must have their standard
+  catcodes for variable and function names to be recognized, but other
+  characters may mostly have unusual catcodes, if non-letter and not extremes.
+  A few syntax elements are implemented via delimited macros and normal
+  catcodes must be in effect for the comma, the equal sign and the closing
+  parenthesis for those to work.  Spaces are gobbled.  The |e| of scientific
+  notation may be |E| on input, \xintfracname macros on the other hand will
+  not recognize the |E|.
 
-If a character used in the |\xintexpr| syntax is made active,
-this will surely cause problems; prefixing it with |\string| is one option.
-There is \csbxint{exprSafeCatcodes} and \csbxint{exprRestoreCatcodes} to
-temporarily turn off potentially active characters.
-
-\begin{framed}
-  For advanced \TeX\ users. At loading time of the packages the
+\item
+At loading time the
   catcode configuration may be arbitrary as long as it satisfies the following
-  requirements: the percent is of category code comment character, the
-  backslash is of category code escape character, digits have category code
-  other and letters have category code letter. Nothing else is assumed.
-\end{framed}
+  requirements:
+  \begin{itemize}[nosep]
+  \item \dtt{\%} has its normal category code,
+  \item \dtt{\char92} has its normal category code,
+  \item Latin letters have their normal category code "letter",
+  \item Digits have their normal category code "other".
+  \end{itemize}
+  Nothing more is assumed, for example |{| and |}| may have unusual catcodes
+  at package loading time. This will be admittedly unusual especially in
+  \LaTeX\ as |\usepackage{xintexpr}| would then have had to be replaced by
+  something such as |\usepackage<xintexpr>|...
 
+\item Loading the packages causes no insertion of space tokens.
+
+\item The previous two items also apply to usage of \csbxint{reloadxintlog}
+  and of \csbxint{reloadxinttrig}.
+\end{itemize}
+\end{TeXnote}
+
 \subsection{Origins of the package}
 \label{ssec:origins}
 
@@ -10137,6 +14524,9 @@
 \label{odef}
 \label{oodef}
 \label{fdef}
+\label{xintodef}
+\label{xintoodef}
+\label{xintfdef}
 
 \csa{oodef}|\controlsequence {<stuff>}| does
 \everb|@
@@ -10170,6 +14560,9 @@
 result has a few dozens of digits. |\oodef| needs thousands of digits it seems
 to become competitive.
 
+\xintkernelname will not define these macros if the control sequence names
+already exist.  It provides them always under the names |\xintodef|,
+|\xintoodef| and |\xintfdef| respectively.
 
 \subsection{\csh{xintReverseOrder}}\label{xintReverseOrder}
 
@@ -10439,7 +14832,7 @@
 \par
 \smallskip
 
-\TeXnote 
+\begin{TeXnote} 
 currently the implementation of \csbxint{UniformDeviate} consumes exactly 5
 calls to the engine primitive at each execution; the improved |x/2^{56}|
 non-uniformity could be obtained with only 2 calls, but paranoïa about the
@@ -10459,8 +14852,14 @@
 \InputIfFileExists{JFBUORDI}{}{}%
 \ifdefined\JFBUORDI
 \footnote{%
-          \if0\pdfstrcmp{IMAC}{\JFBUORDI}Timings done during dvi build on a computer with a |2.4GHz| cpu.\else
-          \if0\pdfstrcmp{MBA}{\JFBUORDI}Timings done during dvi build on a computer with a |2GHz| cpu.\else
+          \if0\pdfstrcmp{IMAC}{\JFBUORDI}Timings done during dvi build on a
+          computer with a |2.8GHz| %
+          %quadri-core
+          cpu, old but still kicking, and with a locally compiled |latex| binary.\else
+          \if0\pdfstrcmp{MBA}{\JFBUORDI}Timings done during dvi build on a
+          computer with a |2GHz| %
+          %dual-core
+          cpu, old but still kicking, and with a locally compiled |latex| binary.\else
           %\error
           DOCUMENTATION SEEMINGLY BUILT NOT ON AN AUTHOR-OWNED SYSTEM, BUT \string\JFBUORDI\space IS DEFINED, WEIRD!\fi\fi
 }
@@ -10470,23 +14869,23 @@
 %
 \begin{everbatim*}
 \pdfsetrandomseed 12345678
-\pdfresettimer\romannumeral\xintreplicate
-        {100}{\fdef\foo{\xintiiPow{\xintUniformDeviate{100000000}}{10}}}%
+\pdfresettimer
+\romannumeral\xintreplicate{100}
+                           {\fdef\foo{\xintiiPow{\xintUniformDeviate{100000000}}{10}}}%
 \the\dimexpr\pdfelapsedtime sp\relax\space (with \string\xintUniformDeviate)\newline
-(last result: \foo)\newline
 \pdfsetrandomseed 12345678
-\pdfresettimer\romannumeral\xintreplicate
-        {100}{\fdef\foo{\xintiiPow{\pdfuniformdeviate 100000000}{10}}}%
-\the\dimexpr\pdfelapsedtime sp\relax\space (with \string\pdfuniformdeviate)\newline
-(last result: \foo)\par
+\pdfresettimer
+\romannumeral\xintreplicate{100}
+                           {\fdef\foo{\xintiiPow{\pdfuniformdeviate 100000000}{10}}}%
+\the\dimexpr\pdfelapsedtime sp\relax\space (with \string\pdfuniformdeviate)\par
 \end{everbatim*}
 
-\TeXnote 
-the macros \csbxint{RandomDigits} or \csbxint{iiRandRange}, and their
+The macros \csbxint{RandomDigits} or \csbxint{iiRandRange}, and their
 variants, as well as the supporting macros for \func{random} generate random
 decimal digits eight by eight as if using
 \csa{xintUniformDeviate}|{100000000}|, but via a direct optimized call made
 possibly by the range being a power of 10.
+\end{TeXnote}
 
 \clearpage
 \let\xintkernelnameUp\undefined
@@ -10746,9 +15145,12 @@
 \begin{everbatim*}
 \xintiiQuo{1000}{57} (Euclidean), \xintiiDivTrunc{1000}{57} (truncated),
 \xintiiDivRound{1000}{57} (rounded)\newline
-\xintiiQuo{-1000}{57}, \xintiiDivTrunc{-1000}{57} (t), \xintiiDivRound{-1000}{57} (r)\newline
-\xintiiQuo{1000}{-57}, \xintiiDivTrunc{1000}{-57} (t), \xintiiDivRound{1000}{-57} (r)\newline
-\xintiiQuo{-1000}{-57}, \xintiiDivTrunc{-1000}{-57} (t), \xintiiDivRound{-1000}{-57} (r)\par
+\xintiiQuo{-1000}{57}, \xintiiDivTrunc{-1000}{57} (t), \xintiiDivRound{-1000}{57} (r)
+\newline
+\xintiiQuo{1000}{-57}, \xintiiDivTrunc{1000}{-57} (t), \xintiiDivRound{1000}{-57} (r)
+\newline
+\xintiiQuo{-1000}{-57}, \xintiiDivTrunc{-1000}{-57} (t), \xintiiDivRound{-1000}{-57} (r)
+\par
 \end{everbatim*}
 
 \subsection{\csh{xintiiDivFloor}}\label{xintiiDivFloor}
@@ -11538,8 +15940,10 @@
 \xintRandomDigits{92}
 \end{everbatim*}
 
-\TeXnote the digits are produced eight by eight by the same method which would
-result from \csbxint{UniformDeviate}|{100000000}| but with less overhead.
+\begin{TeXnote}
+  the digits are produced eight by eight by the same method which would result
+  from \csbxint{UniformDeviate}|{100000000}| but with less overhead.
+\end{TeXnote}
 
 % \subsection{\csh{\xintOneRandomDigit}}\label{xintOneRandomDigit}
 
@@ -11571,8 +15975,10 @@
 This can be lifted by increasing the \TeX\ memory settings (installation
 dependent).
 
-\TeXnote the digits are produced eight by eight by the same method which would
-result from \csbxint{UniformDeviate}|{100000000}| but with less overhead.
+\begin{TeXnote}
+  the digits are produced eight by eight by the same method which would result
+  from \csbxint{UniformDeviate}|{100000000}| but with less overhead.
+\end{TeXnote}
 
 \subsection{(WIP) \csh{xintiiRandRange}}\label{xintiiRandRange}
 
@@ -11584,7 +15990,8 @@
 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\newline
 \xintiiRandRange{\xintNum{1e40}}\newline
 \pdfsetrandomseed 271828314
-\xinttheiiexpr randrange(num(1e40))\relax\newline % bare 1e40 not understood by \xintiiexpr
+\xinttheiiexpr randrange(num(1e40))\relax\newline
+% bare 1e40 not understood by \xintiiexpr
 \pdfsetrandomseed 271828314
 \xinttheexpr randrange(1e40)\relax
 \end{everbatim*}
@@ -11604,8 +16011,10 @@
 makes the previous section about usage of \csbxint{XRandomDigits} to generate
 millions of digits a bit comical...
 
-\TeXnote the digits are produced eight by eight by the same method which would
-result from \csbxint{UniformDeviate}|{100000000}| but with less overhead.
+\begin{TeXnote}
+  the digits are produced eight by eight by the same method which would result
+  from \csbxint{UniformDeviate}|{100000000}| but with less overhead.
+\end{TeXnote}
 
 \subsection{(WIP) \csh{xintiiRandRangeAtoB}}\label{xintiiRandRangeAtoB}
 
@@ -11615,16 +16024,21 @@
 \begin{everbatim*}
 \pdfsetrandomseed 271828314
 12345678911111111111111111111\newline
-\xintiiRandRangeAtoB{12345678911111111111111111111}{12345678922222222222222222222}\newline
+\xintiiRandRangeAtoB{12345678911111111111111111111}{12345678922222222222222222222}%
+\newline
 \pdfsetrandomseed 271828314
 \def\test{%
-\xinttheiiexpr randrange(12345678911111111111111111111,12345678922222222222222222222)\relax}%
+\xinttheiiexpr
+            randrange(12345678911111111111111111111,12345678922222222222222222222)
+\relax}%
 \romannumeral\xintreplicate{10}{\test\newline}%
 12345678922222222222222222222
 \end{everbatim*}
 
-\TeXnote the digits are produced eight by eight by the same method which would
-result from \csbxint{UniformDeviate}|{100000000}| but with less overhead.
+\begin{TeXnote}
+  the digits are produced eight by eight by the same method which would result
+  from \csbxint{UniformDeviate}|{100000000}| but with less overhead.
+\end{TeXnote}
 
 \clearpage
 \let\xintnameUp\undefined
@@ -11679,60 +16093,72 @@
 
 \localtableofcontents
 
-\subsection{\csh{xintTeXfromSci}}\label{xintTeXfromSci}
+\subsection{\csh{xintTeXFromSci}}\label{xintTeXFromSci}
 
-Experimental.\etype{} This typesetting math-mode-only macro expects an input
+Experimental.\xtype{} This typesetting math-mode-only macro expects an input
 which is already in, or will expand to, decimal or scientific
 notation.\NewWith{1.4g} A trailing |/B| is accepted and will be handled
 differently according to whether it follows some scientific exponent |eN|
 part or not.
 
-This macro is designed to be used as a typesetting wrapper for \csbxint{eval}
-or \csbxint{floateval} output.  It does no «reflowing» of the mantissa as the
-input is expected to have been already «prettified» (for example via the
-removal of trailing zeros, of a scientific part if the exponent is small,
-etc...) and simply transforms the |e<exponent>| part, if actually present,
-into |\cdot 10^{exponent}|.  A fractional part |/B| if found in the expansion
-of the input must be last and will be tranformed into |\cdot B^{-1}| if there
-was a scientific part, else the output will be |\frac{A}{B}| (or the \TeX\
-equivalent) with |A| the numerator.%
+It was formerly |\xintTeXfromSci|.  Old name deprecated.  Also it used
+to be \fexpan dable but is now only \xexpan dable.  Use |\expanded| if
+needed.\CHANGED{1.4l}
+
+This macro can be used as a typesetting wrapper for \csbxint{eval} or
+\csbxint{floateval} output: it expects its input (after expansion) to
+have been already «prettified» for example via the removal of trailing
+zeros, usage of fixed point notation if scientific exponent is small,
+etc\dots\
 %
-\footnote{I am hesitating whether the |\frac{A}{B}| branch choice should
-  require |A| to be an integer, or will also, as currently, be done with |A|
-  being a number in decimal notation.}
-%
+It simply transforms the |e<exponent>| part, if actually present, into
+|\cdot 10^{exponent}|.  A fractional part |/B| if found in the expansion
+of the input must be last and will be tranformed into |\cdot B^{-1}| if
+there was a scientific part, else the output will be using |\frac{A}{B}|
+(or the \TeX\ equivalent in place of |\frac|) with |A| the numerator.
+
+\begin{TeXnote}
+  \begin{itemize}
+  \item I am hesitating whether the |\frac{A}{B}| branch choice should
+    require |A| to be an integer, or will also, as currently, be done
+    with |A| being a number in decimal notation.  Please advise.
+  \item The package does:
+\begin{everbatim}
+\ifdefined\frac
+  \protected\def\xintTeXFromScifracmacro#1#2{\frac{#2}{#1}}%
+\else
+  \protected\def\xintTeXFromScifracmacro#1#2{{#2\over#1}}%
+\fi
+\end{everbatim}
+    Customize as desired.  Notice the interversion of arguments.
+  \end{itemize}
+\end{TeXnote}
+
+Example:
 \begin{everbatim*}
-$\xintTeXfromSci{\xintfloateval{1.1^10000/5}}$, $\xintTeXfromSci{\xinteval{1.1^10000/5}}$\par
+$\xintTeXFromSci{\xintfloateval{1.1^10000/5}}$,
+$\xintTeXFromSci{\xinteval{1.1^10000/5}}$\par
 \end{everbatim*}
-The macro applies complete expansion to its argument, hence its input can be
-expressed using \csbxint{FracToSci} but it is simpler to use \csbxint{eval}
-which applies and expands completely \csbxint{FracToSci}, as per default
-setting of \csbxint{exprPrintOne}.
 
-Note though that the macro can handle only one value.  If one intends to
-achieve the same effect but with comma separated or bracketed values, the way
-to proceed is via a redefinition of \csbxint{floatexprPrintOne} and/or
-\csbxint{exprPrintOne}.
+The above examples are in the case of a single numerical value.  To
+handle more complex outputs from \csbxint{eval} or \csbxint{floateval}
+one will need to proceed via a redefinition of
+\csbxint{floatexprPrintOne} and/or \csbxint{exprPrintOne} like this:
 \begin{everbatim*}
-\[\def\xintfloatexprPrintOne[#1]#2{\xintTeXfromSci{\xintPFloat[#1]{#2}}}
+\[\def\xintfloatexprPrintOne[#1]#2{\xintTeXFromSci{\xintPFloat[#1]{#2}}}
   \xintfloateval[10]{2^100, 3^100, 13^100}\]
 \end{everbatim*}
 \par\vskip-\belowdisplayskip
 \begin{everbatim*}
-\[\def\xintexprPrintOne#1{\xintTeXfromSci{\xintFracToSci{#1}}}
+\[\def\xintexprPrintOne#1{\xintTeXFromSci{\xintFracToSci{#1}}}
   \xinteval{sqrt(2^101,60), 355/113, 6.02e23/1000}\]
 \end{everbatim*}% attention à l'espace TeX est en mode horizontal après display
-This will however make impossible, due to the added \TeX\ mark-up in the
+This will however make then impossible, due to the added \TeX\ mark-up in the
 output, the nesting of \csbxint{floateval}/\csbxint{eval} inside one another.
-But the \csbxint{expr}|...\relax| syntax remains usable and is indeed the
-recommended way as it is more efficient, only in certain very special
-situations does one need the «eval» which produces explicit digits, and then
-usually the output will be an integer, so will remain invariant and usable as
-before.  Anyway, in the above examples we localized the redefinitions to the
-equation construct which is scope-limiting (as is already the underlying \TeX\
-math display using |$$|).
+The core \csbxint{expr}|...\relax| syntax remains usable and is anyhow the
+recommended way for such nesting as it is more efficient.
 
-Some similar effect is also possible without \csbxint{TeXfromSci},
+Some similar effect is also possible without \csbxint{TeXFromSci},
 simply by a customization of \csbxint{PFloatE} like this:
 \begin{everbatim*}
 \begingroup
@@ -11740,11 +16166,11 @@
 $\xintfloateval{1.1^10000/5}$, $\xinteval{1.1^10000/5}$
 \endgroup\newline
 \end{everbatim*}%
-This method is simpler-minded and will leave trailing |/B|'s «as is», though. 
+This method is simpler-minded but will leave the trailing |/B|'s «as
+is», even if the numerator has no scientific exponent part.  The
+presence of extra \TeX\ mark-up in the output has the consequences
+on nesting which were mentioned above.
 
-And of course, with this poor man method too the presence of \TeX\ mark-up
-makes nesting dangerous, so we limited by security the definition to a group.
-
 \subsection{\csh{xintTeXFrac}}\label{xintTeXFrac}
 
 This is a typesetting \LaTeX{} only macro\etype{\Ff}, math mode only as it
@@ -11754,7 +16180,8 @@
 If the denominator |B| is \dtt{1}, the output is |A\cdot 10^n|. If the
 exponent |n| is \dtt{0}, the |[\cdot]10^n| part is omitted.
 \begin{everbatim*}
-$\xintTeXFrac {178.000/25600000}$, $\xintTeXFrac {178.000/1}$, $\xintTeXFrac {3.5/5.7}$\newline
+$\xintTeXFrac {178.000/25600000}$, $\xintTeXFrac {178.000/1}$,
+$\xintTeXFrac {3.5/5.7}$\newline
 \end{everbatim*}%
 The input, if in a fraction form, is not simplified in any way, except for
 transforming numerator and denominator into integers, separating a power of
@@ -11781,7 +16208,8 @@
 primitive is used for the fraction (in case the denominator is not one; and a
 pair of braces contains the |A\over B| part).
 \begin{everbatim*}
-$\xintTeXOver {178.000/25600000}$, $\xintTeXOver {178.000/1}$, $\xintTeXOver {3.5/5.7}$\newline
+$\xintTeXOver {178.000/25600000}$, $\xintTeXOver {178.000/1}$,
+$\xintTeXOver {3.5/5.7}$\newline
 \end{everbatim*}%
 It is the new name of |\xintFwOver|.\CHANGED{1.4g}
 
@@ -11844,11 +16272,16 @@
 \xintRaw {178000/25600000}
 \end{everbatim*}
 
+\subsection{\csh{xintRawBraced}}\label{xintRawBraced}
+
+This macro expands and parses its input\etype{\Ff} |f| as all
+\xintfracname macros and produces as output |{N}{A}{B}| (with \TeX\
+braces) where \csbxint{Raw} would have returned |A/B[N]|.\NewWith{1.4l}
+
 \subsection{\csh{xintNumerator}}\label{xintNumerator}
 
 The input data\etype{\Ff} is parsed as if by \csbxint{Raw} into |A/B[N]|
-format and
-the macro outputs |A| if |N<=0|, or |A| extended by |N| zeroes if |N>0|.
+and then |A| is returned if |N<=0|, or |A| extended by |N| zeroes if |N>0|.
 \begin{everbatim*}
 \xintNumerator {178000/25600000[17]}\newline
 \xintNumerator {312.289001/20198.27}\newline
@@ -11859,8 +16292,7 @@
 \subsection{\csh{xintDenominator}}\label{xintDenominator}
 
 The input data\etype{\Ff} is parsed as if by \csbxint{Raw} into |A/B[N]|
-format and
-the macro outputs |B| if |N>0|, or |B| extended by \verb+|N|+ zeroes if |N<=0|.
+and then |B| is returned if |N>0|, or |B| extended by \verb+|N|+ zeroes if |N<=0|.
 \begin{everbatim*}
 \xintDenominator {178000/25600000[17]}\newline
 \xintDenominator {312.289001/20198.27}\newline
@@ -11870,8 +16302,8 @@
 
 \subsection{\csh{xintRawWithZeros}}\label{xintRawWithZeros}
 
-This macro parses the input\etype{\Ff} and outputs |A/B|, with |A|
-as would be returned by \csa{xintNumerator}|{f}| and |B| as would be returned by
+This macro parses the input\etype{\Ff} and outputs |A'/B'|, with |A'|
+as would be returned by \csa{xintNumerator}|{f}| and |B'| as would be returned by
 \csa{xintDenominator}|{f}|.
 \begin{everbatim*}
 \xintRawWithZeros{178000/25600000[17]}\newline
@@ -11889,8 +16321,6 @@
 \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{\csh{xintIrr}}\label{xintIrr}
 
@@ -11994,8 +16424,10 @@
 \begin{everbatim*}
 \xintDecToStringREZ{0}, \xintDecToStringREZ{1/2}, \xintDecToStringREZ{0.5000}\newline
 \xintDecToStringREZ{1.23456789e5}, \xintDecToStringREZ {1.23456789e-3}\newline
-\xintDecToStringREZ{12345e-1}, \xintDecToStringREZ {12345e-2}, \xintDecToStringREZ{12345e-3}\newline
-\xintDecToStringREZ{12345e-4}, \xintDecToStringREZ {12345e-5}, \xintDecToStringREZ{12345e-6}\newline
+\xintDecToStringREZ{12345e-1}, \xintDecToStringREZ {12345e-2},
+\xintDecToStringREZ{12345e-3}\newline
+\xintDecToStringREZ{12345e-4}, \xintDecToStringREZ {12345e-5},
+\xintDecToStringREZ{12345e-6}\newline
 \xintDecToStringREZ{1.234567890000e12}, \xintDecToStringREZ{1.23456000e-5/10}\newline
 \xintDecToStringREZ{70/14} % is not reduced to lowest terms
 \end{everbatim*}
@@ -12022,8 +16454,10 @@
 \begin{everbatim*}
 \xintDecToString{0}, \xintDecToString{1/2}, \xintDecToString{0.5000}\newline
 \xintDecToString{1.23456789e5}, \xintDecToString {1.23456789e-3}\newline
-\xintDecToString{12345e-1}, \xintDecToString {12345e-2}, \xintDecToString{12345e-3}\newline
-\xintDecToString{12345e-4}, \xintDecToString {12345e-5}, \xintDecToString{12345e-6}\newline
+\xintDecToString{12345e-1}, \xintDecToString {12345e-2}, \xintDecToString{12345e-3}%
+\newline
+\xintDecToString{12345e-4}, \xintDecToString {12345e-5}, \xintDecToString{12345e-6}%
+\newline
 \xintDecToString{1.234567890000e12}, \xintDecToString{1.23456000e-5/10}\newline
 \xintDecToString{70/14}
 \end{everbatim*}
@@ -12044,6 +16478,85 @@
 \item to accept on input |A| or |A[N]|.
 \end{itemize}
 
+\subsection{\csh{xintFracToSci}}\label{xintFracToSci}
+
+\csa{xintFracToSci}\etype{\Ff} was initially at |1.4| a private macro
+which served as default customization of \csbxint{exprPrintOne} and,
+despite being documented in the user manual, was not supposed to be used
+at user level (not being \fexpan dable it could not be nested within
+macros of \xintfracname, and besides accepted a limited range of
+inputs).
+
+It has now been upgraded to behave like all other \xintfracname
+macros.\CHANGED{1.4l}
+
+Here is what it does:
+\begin{itemize}[noitemsep,nosep]
+\item it first parses the input like any other \xintfracname macro and
+  convert it into the ``raw'' |A/B[N]| format,
+\item it then produces this output: |A/B| if |N=0| (and |/B| is omitted
+  if not |1|), and for |N| not zero, the
+  output numerator will be |AeN| written in scientific notation exactly like it
+  would by \csbxint{PFloat} but without of course prior rounding to a
+  given number of digits; the trailing zeros in the
+  significand will be removed always (the \csbxint{PFloatMinTrimmed}
+  configuration is ignored).  Then this value in scientific notation (or
+  in decimal fixed point notation if the scientific exponent is in the
+  \csbxint{PFloatNoSciEmin} to \csbxint{PFloatNoSciEmax} range) will be
+  attached to a trailing denominator |/B| (omitted if it is |/1|).
+\end{itemize}
+Please note:
+\begin{itemize}
+\item there is no reduction of the fraction |A/B| to lowest terms,
+\item trailing zeros in the integer denominator |B| are not moved and
+  incorporated into the final scientific exponent,
+\item no attempt is made to check if |B| is a product of only |2|'s and
+  |5|'s and thus could be integrated into some pure decimal notation for
+  the numerator or at least its significand.
+\end{itemize}
+Changes\CHANGED{1.4k} of \csbxint{PFloat} at |1.4k| have an impact here.
+In particular the zero value will give \dtt{0} whether the input was
+some |0|, |0e-5|, |0/3|, |0.00|, etc\dots, whereas at |1.4e| it would
+have been \dtt{0.0} for cases triggering some \csbxint{PFloat}
+subroutine.
+
+The general blueprint is still to be considered \emph{unstable}.
+
+The output routine of \csbxint{eval} is customizable via redefining
+\csbxint{exprPrintOne} whose current default is (equivalent to):
+\begin{everbatim}
+\def\xintexprPrintOne{\xintFracToSci}
+\end{everbatim}
+
+\subsection{\csh{xintFracToDecimal}}
+\label{xintFracToDecimal}
+
+\csa{xintFracToDecimal}\etype{\Ff} is a variant of \csbxint{FracToSci} which
+differs from it in so far as it outputs a numerator using decimal notation,
+i.e. with as many zeros as are needed (and no more) and no scientific
+exponent.  The denominator goes through ``as is'' except if it is |1|, then it
+is omitted.\NewWith{1.4k}
+
+In other terms its behaviour is currently intermediate between
+\csbxint{DecToString} and \csbxint{DecToStringREZ}, as it does not
+remove trailing zeros of the denominator.  Consider its behaviour as
+\emph{unstable}.
+
+It can be used to customize \csbxint{exprPrintOne}:
+\begin{everbatim}
+\def\xintexprPrintOne{\xintFracToDecimal}
+\end{everbatim}
+
+It was initially at |1.4k| a private macro which served as an alternative to
+\csb{xintFracToSci} default customization of \csbxint{exprPrintOne} and,
+despite being documented in the user manual, was not supposed to be used at
+user level (not being \fexpan dable it could not be nested within macros of
+\xintfracname, and besides accepted a limited range of inputs).
+
+It has now been upgraded to behave like all other \xintfracname
+macros.\CHANGED{1.4l}
+
+
 \subsection{\csh{xintTrunc}}\label{xintTrunc}
 
 \csa{xintTrunc}|{x}{f}|\etype{\numx\Ff} returns the start of the decimal
@@ -12504,6 +17017,12 @@
 
 The sign of a fraction.\etype{\Ff}
 
+\subsection{\csh{xintSignBit}}\label{xintSignBit}
+
+Expands to \dtt{1} for negative input, to \dtt{0} else.\etype{\Ff}
+
+Added at |1.4l|.
+
 \subsection{\csh{xintOpp}}\label{xintOpp}
 
 The opposite of a fraction.\etype{\Ff}
@@ -12756,7 +17275,8 @@
 No simplification attempted.
 
 \begin{everbatim*}
-$\xintIsOne {21921379213/21921379213}\neq\xintIsOne {1.00000000000000000000000000000001}$
+$\xintIsOne {21921379213/21921379213}\neq
+ \xintIsOne {1.00000000000000000000000000000001}$
 \end{everbatim*}
 
 \subsection{\csh{xintGCD}}\label{xintGCD}
@@ -12821,34 +17341,45 @@
 \label{xintDigits}
 \label{xinttheDigits}
 
-The syntax |\xintDigits := D;| assigns the value of |D| to the number of
-digits to be used by floating point operations (this uses internally a
-|\mathchardef| assignement, and |D| stands for (or expands to) a legal \TeX\
-number). The default is |16|. The maximal value is |32767|.
+The syntax |\xintDigits := N;| or (recommended) |\xintDigits := N\relax|
+assigns the value of |N| to the number of digits to be used by floating
+point operations (this uses internally a |\mathchardef| assignement, and
+|N| stands for (or expands to) a legal \TeX\ number). The default is
+|16|. The maximal value is |32767|.
+
+Accepted syntax includes also |\xintDigits = N;| or |\xintDigits =
+N\relax|, i.e.\@ the colon before the equality sign is optional.
+%
 \begin{framed}
   \xintexprname adds\IMPORTANTf{} the variant \csbxint{Digits*} which executes
-  \csbxint{reloadxinttrig}.
+  \csbxint{reloadxinttrig} and \csbxint{reloadxintlog}.
+
+  A priori, you want \csbxint{Digits*}|:=N\relax|. Use
+  |\xintDigits:=N\relax| only if not needing trigonometric or
+  logarithm/exponential functions and wanting to avoid the overhead of
+  reloading their librairies.  Perhaps for a local temporary
+  configuration.
 \end{framed}
 
-The expandable macro |\xinttheDigits|\etype{} serves to retrieve (internally
-it uses |\number|) the current value.
-
 Spaces do not matter as long as they do not occur in-between digits:
 \begin{everbatim*}
-\xintDigits := 24;\xinttheDigits, %
-\xintDigits:=36  ;\xinttheDigits, %
-\xintDigits:= 16 ;and \xinttheDigits.
+\xintDigits := 24\relax\xinttheDigits, %
+\xintDigits:=36  \relax\xinttheDigits, %
+\xintDigits:= 16 \relax and \xinttheDigits.
 \end{everbatim*}
+As shown above |\xinttheDigits|\etype{} expands to the stored value.
 
+
 % It has always been the case that an active colon |:| was allowed.
 
-Also |\xintDigits = D;| (i.e.\@ without a colon) is accepted syntax.
+An ending active semi-colon |;| is \emph{not} compatible: it can and
+will cause low-level \TeX{} errors.  This is why the alternative syntax
+\begin{everbatim}
+\xintDigits:= N\relax
+\end{everbatim}
+is recommended (with or without the semi-colon).  This is hopefully the
+syntax now in use in most examples from the documentation.
 
-An ending active semi-colon |;| is \emph{not} compatible: it can and will
-cause low-level \TeX{} errors. But this has a trivial workaround: any
-non-expanding token can be used in place of the ending semi-colon. For
-example a full stop or a |\relax| token. This
-non-expanding ending token will get removed from the token stream.
 
 %  This
 % restriction always applied, but never got properly documented prior to
@@ -12855,8 +17386,9 @@
 % |1.3f| release... It is possible to use |\string;| but then there can not be
 % any space separating it from the digits.
 
-The recommended syntax is thus now |\xintDigits := D\relax| (with or without the colon).
-This is the syntax in use in most examples from the documentation.
+Actually, any non-expanding token can be used in place of the
+|\relax|. This non-expanding ending token (for example a full stop) will
+get removed from the token stream.
 \begin{everbatim*}
 \xintDigits  = 24\def\xinttheDigits, % only for showing it works! don't do that!
 \xintDigits := 36.\xinttheDigits,    % one can use a dot in place of semi-colon
@@ -12874,7 +17406,9 @@
 \xintSetDigits{2*8}The value is now \xinttheDigits.\par
 \end{everbatim*}
 \begin{framed}
-  See also the \xintexprname-added variant \csbxint{SetDigits*}.
+  The \xintexprname-added variant \csbxint{SetDigits*} is
+  the preferred usage as it does the extra work to update the math
+  functions from \xinttrigname and \xintlogname.
 \end{framed}
 
 \subsection{\csh{xintFloat}}
@@ -12943,6 +17477,37 @@
 
 
 
+\subsection{\csh{xintFloatBraced}}
+\label{xintFloatBraced}
+
+The experimental macro
+|\xintFloatBraced[P]{f}|\etype{{\upshape[\numx]}\Ff} does like
+\csbxint{Float} but its output consists of three \TeX-braced groups
+\centeredline{\marg{sign bit}\marg{scientific exponent}\marg{full width
+    mantissa with decimal point}} It is provided\NewWith{1.4l} for users
+knowing how to pick one or the other of these constituents from usage
+of auxiliary macros. Or one can use \csbxint{Assign}:
+\begin{everbatim*}
+\begingroup
+\xintAssign\xintFloatBraced[7]{-3.1234e-14}\to\A\B\C
+\string\A\ has meaning \meaning\A\newline
+\string\B\ has meaning \meaning\B\newline
+\string\C\ has meaning \meaning\C\par
+\endgroup
+\end{everbatim*}
+Some aspects are undecided:
+\begin{itemize}[noitemsep]
+\item should the first item be rather |-1|, |0|, or |1|? or |-|, nothing, nothing?
+\item in case of zero value the output ignores \csbxint{FloatZero}, it
+  uses a zero exponent and full width fractional mantissa \dtt{\csname
+    xint_gobble_ii\expandafter\endcsname\romannumeral0\xintfloatbraced{0}}
+  (here no |[P]| and \csbxint{theDigits} has value
+  \dtt{\xinttheDigits}), should it be otherwise?
+\item should the mantissa be without the decimal separator ? should it
+  incorporate the sign ?
+\item in case the mantissa is without separator, should the exponent be biased to match it?
+\end{itemize}
+
 \subsection{\csh{xintFloatToDecimal}}
 \label{xintFloatToDecimal}
 
@@ -12982,7 +17547,8 @@
 |1.4k|\CHANGED{1.4k} brings some breaking changes, which are reversible
 via customizing macros:
 \begin{itemize}
-\item Integers (when scientific notation is dropped) without a "\dtt{.0}"
+\item Integers (when scientific notation is dropped according to
+  criteria mentioned next) without a "\dtt{.0}"
   suffix.
 \item Same for the zero value, now "\dtt{\xintPFloat{0}}".
 \item Significands are trimmed of trailing zeros only if that removes at least
@@ -12995,6 +17561,13 @@
 These changes impact the \csbxint{floateval} output as
 \csbxint{floatexprPrintOne} defaults to using \csbxint{PFloat}.
 
+\begin{framed}
+  In\IMPORTANTf\ this documentation ``trailing zeros'' refers not to how
+  the input looked like, but
+  to the corresponding mantissa of width |P| or \csbxint{theDigits}.
+\end{framed}
+
+
 The default rules are thus now:
 \begin{enumerate}[nolistsep]
 \item The input is float-rounded to either |Digits| or the optional argument.
@@ -13008,8 +17581,6 @@
 \item In case of scientific notation output format, and the mantissa has only
   one digit, no decimal mark is used.
 \end{enumerate}
-Please note that ``trailing zeros'' refers to the ``trailing zeros of the full width
-significand after float-rounding'', and not only to trailing zeros used in the input.
 
 % The old rules were:
 % \begin{enumerate}[nosep]
@@ -13115,9 +17686,14 @@
 \def\xintPFloatMinTrimmed{4}
 \end{everbatim}
 Defining it to expand to \dtt{-1} or \dtt{0} will enable the trimming of
-trailing zeros always, and setting it to a high value will prevent it
-altogther.
+trailing zeros always, and setting it to a value at least equal to |P|
+(or \csbxint{theDigits} if no |[P]|) will prevent it
+altogether.
 
+This setting\CHANGED{1.4l} is ignored for the case of an integer value, if the
+criteria for using fixed point notation are met, and for the case of a
+one-digit mantissa in scientific notation.
+
 \end{itemize}
 
 To mimick approximately the Python behaviour in interactive sessions,
@@ -13710,13 +18286,18 @@
 leading zeroes for |4N| binary digits numbers, whereas using
 \csbxint{HexToBin} gives reproducing round-trips only for |4N| binary numbers
 numbers not starting with |0000|.
+This zero-fills to 4N digits the input, hence gives here a leading zero in output:
 \begin{everbatim*}
-This zero-fills to 4N digits the input, hence gives here a leading zero in output:
-\xintBinToHex{0001111}\newline
+\xintBinToHex{0001111}\par
+\end{everbatim*}
 Chaining, we end up with 4N-3 digits, as three binary zeroes are trimmed:
-\xintHexToBin{\xintBinToHex{0001111}}\newline
+\begin{everbatim*}
+\xintHexToBin{\xintBinToHex{0001111}}\par
+\end{everbatim*}
 But this will always reproduce the initial input zero-filled to length 4N:
+\begin{everbatim*}
 \xintCHexToBin{\xintBinToHex{0001111}}\par
+\end{everbatim*}
 Another example (visible space characters manually inserted):\newline
 $000000001111101001010001\xrightarrow{\text{\string\xintBinToHex}}
 \xintBinToHex{000000001111101001010001}\xrightarrow{\text{\string\xintHexToBin\hphantom{X}}}
@@ -13726,7 +18307,6 @@
 \xintBinToHex{000000001111101001010001}\xrightarrow{\text{\string\xintCHexToBin}}
 \xintCHexToBin{\xintBinToHex{000000001111101001010001}}$
 \par
-\end{everbatim*}
 
 \clearpage
 \let\xintbinhexnameUp\undefined
@@ -14894,7 +19474,8 @@
 \end{everbatim*}
 For regular continued fractions, there is a simpler comma separated format:
 \begin{everbatim*}
-\[-7,6,19,1,33\to\xintTeXFrac{\xintCstoF{-7,6,19,1,33}}=\xintCFrac{\xintCstoF{-7,6,19,1,33}}\]
+\[-7,6,19,1,33\to\xintTeXFrac{\xintCstoF{-7,6,19,1,33}}=
+                 \xintCFrac{\xintCstoF{-7,6,19,1,33}}\]
 \end{everbatim*}
 The macro \csbxint{FtoCs} produces from a fraction |f| the comma separated
 list of its coefficients.
@@ -15243,7 +19824,8 @@
     {-1+1/3+1/-5+1/7+1/-9+1/11+1/-13}}\]
 \end{everbatim*}
 \begin{everbatim*}
-\[\xintGCFrac{{1/2}+1/{1/3}+1/{1/4}+1/{1/5}}=\xintTeXFrac{\xintCstoF {1/2,1/3,1/4,1/5}}\]
+\[\xintGCFrac{{1/2}+1/{1/3}+1/{1/4}+1/{1/5}}=
+                                \xintTeXFrac{\xintCstoF {1/2,1/3,1/4,1/5}}\]
 \end{everbatim*}
 %
 A generalized continued fraction may produce a reducible fraction
@@ -15529,4082 +20111,56 @@
 also more computations as the numerators may be either
 $1$ or $-1$.
 
+\ifnum\NoSourceCode=1
 \clearpage
-\let\xintcfracnameUp\undefined
-\csname xinttoolsnameUp\endcsname
-\def\n{|{N}|}
-\def\m{|{M}|}
-\def\x{|{x}|}
-\section{Macros of the \xinttoolsname package}
+\def\xintRunningHeader{{\inheadertrue\catcode`,12\relax
+          \DOCxintfrontpage,
+          \DOCxintexprintro,
+          \csname xint bundlename\endcsname}}
 
-\RaisedLabel{sec:tools}
+\part{The \xintexprname and allied packages source code (not
+  included, see \protect\dtt{sourcexint.pdf})}
 
-These utilities used to be provided within the \xintname package; since |1.09g|
-(|2013/11/22|) they have been moved to an independently usable package
-\xinttoolsname, which has none of the \xintname facilities regarding big
-numbers. Whenever relevant release |1.09h| has made the macros |\long| so they
-accept |\par| tokens on input.
+\markboth{\makebox[0pt]{\xintRunningHeader}}{\makebox[0pt]{\xintRunningHeader}}
+\vspace{1cm}
 
-The completely expandable utilities (up to \csbxint{iloop}) are documented
-first, then the non expandable utilities.
-
-\autoref{sec:examples}
-gives additional (also dated) examples of use of macros of this package.
-
-\localtableofcontents
-
-\subsection{\csh{xintRevWithBraces}}\label{xintRevWithBraces}
-
-%{\small New in release |1.06|.\par}
-
-\edef\X{\xintRevWithBraces{12345}}
-\edef\y{\xintRevWithBraces\X}
-\expandafter\def\expandafter\w\expandafter
-     {\romannumeral0\xintrevwithbraces{{\A}{\B}{\C}{\D}{\E}}}
-
-%
-\csa{xintRevWithBraces}\marg{list}\etype{f} first does the \fexpan sion of its
-argument then it reverses the order of the tokens, or braced material, it
-encounters, maintaining existing braces and adding a brace pair around each
-naked token encountered. Space tokens (in-between top level braces or naked
-tokens) are gobbled. This macro is mainly thought out for use on a \meta{list}
-of such braced material; with such a list as argument the \fexpan sion will only
-hit against the first opening brace, hence do nothing, and the braced stuff may
-thus be macros one does not want to expand.
-%
-\leftedline{|\edef\x{\xintRevWithBraces{12345}}|}
-%
-\leftedline{|\meaning\x:|\dtt{\meaning\X}}
-%
-\leftedline{|\edef\y{\xintRevWithBraces\x}|}
-%
-\leftedline{|\meaning\y:|\dtt{\meaning\y}}
-%
-The examples above could be defined with |\edef|'s because the braced material
-did not contain macros. Alternatively:
-%
-\leftedline{|\expandafter\def\expandafter\w\expandafter|}
-%
-\leftedline{|{\romannumeral0\xintrevwithbraces{{\A}{\B}{\C}{\D}{\E}}}|}
-%
-\leftedline{|\meaning\w:|\dtt{\meaning\w}}
-%
-The macro \csa{xintReverseWithBracesNoExpand}\etype{n} does the same job
-without the initial expansion of its argument.
-
-
-\subsection{\csh{xintZapFirstSpaces}, \csh{xintZapLastSpaces}, \csh{xintZapSpaces}, \csh{xintZapSpacesB}}
-\label{xintZapFirstSpaces}
-\label{xintZapLastSpaces}
-\label{xintZapSpaces}
-\label{xintZapSpacesB}
-%{\small New with release |1.09f|.\par}
-
-\csa{xintZapFirstSpaces}\marg{stuff}\etype{n} does not do \emph{any} expansion
-of its argument, nor brace removal of any sort, nor does it alter \meta{stuff}
-in anyway apart from stripping away all \emph{leading} spaces.
-
-This macro will be mostly of interest to programmers who will know what I will
-now be talking about. \emph{The essential points, naturally, are the complete
-  expandability and the fact that no brace removal nor any other alteration is
-  done to the input.}
-
-\TeX's input scanner already converts consecutive blanks into single space
-tokens, but |\xintZapFirstSpaces| handles successfully also inputs with
-consecutive multiple space tokens.
-However, it is assumed that \meta{stuff} does not contain (except inside braced
-sub-material) space tokens of character code distinct from $32$.
-
-It expands in two steps, and if the goal is to apply it to the
-expansion text of |\x| to define |\y|, then one can do:
-|\odef\y{\romannumeral0\expandafter\xintzapfirstspaces\expandafter{\x}}|
-(one can also define a wrapper macro to |\xintZapFirstSpaces| in order to
-expand once the argument first, but \xinttoolsname not being a programming
-layer, it provides no «Generate Variants» facilities). 
-
-Other use case: inside a macro which received a parameter |#1|, one can do
-|\oodef\x{\xintZapFirstSpaces {#1}}|, or, if |#1|, after leading spaces have
-been stripped can accept |\edef| expansion, one can do
-|\edef\x{\xintZapFirstSpaces{#1}}|.
-
-\begingroup
-\def\x {  \a {  \X } {  \b  \Y }  }
-%
-\leftedline{|\xintZapFirstSpaces {  \a {  \X } {  \b  \Y }  }->|%
-\dtt{\color{magenta}{}\expandafter\detokenize\expandafter
-{\romannumeral0\expandafter\xintzapfirstspaces\expandafter{\x}}}+++}
-\endgroup
-
-\medskip
-
-\noindent\csbxint{ZapLastSpaces}\marg{stuff}\etype{n}  does not do \emph{any} expansion of
-its argument, nor brace removal of any sort, nor does it alter \meta{stuff} in
-anyway apart from stripping away all \emph{ending} spaces. The same remarks as
-for \csbxint{ZapFirstSpaces} apply.
-
-\begingroup
-\def\x {  \a {  \X } {  \b  \Y }  }
-%
-\leftedline{|\xintZapLastSpaces {  \a {  \X } {  \b  \Y }  }->|%
-\dtt{\color{magenta}{}\expandafter\detokenize\expandafter
-{\romannumeral0\expandafter\xintzaplastspaces\expandafter{\x}}}+++}
-\endgroup
-
-\medskip
-
-\noindent\csbxint{ZapSpaces}\marg{stuff}\etype{n}  does not do \emph{any}
-expansion of its
-argument, nor brace removal of any sort, nor does it alter \meta{stuff} in
-anyway apart from stripping away all \emph{leading} and all \emph{ending}
-spaces. The same remarks as for \csbxint{ZapFirstSpaces} apply.
-
-\begingroup
-\def\x {  \a {  \X } {  \b  \Y }  }
-%
-\leftedline{|\xintZapSpaces {  \a {  \X } {  \b  \Y }  }->|%
-\dtt{\color{magenta}{}\expandafter\detokenize\expandafter
-{\romannumeral0\expandafter\xintzapspaces\expandafter{\x}}}+++}
-\endgroup
-
-\medskip
-
-\noindent\csbxint{ZapSpacesB}\marg{stuff}\etype{n}  does not do \emph{any}
-expansion of
-its argument, nor does it alter \meta{stuff} in anyway apart from stripping away
-all leading and all ending spaces and possibly removing one level of braces if
-\meta{stuff} had the shape |<spaces>{braced}<spaces>|. The same remarks as for
-\csbxint{ZapFirstSpaces} apply.
-
-\begingroup
-\def\x {  \a {  \X } {  \b  \Y }  }
-%
-\leftedline{|\xintZapSpacesB {  \a {  \X } {  \b  \Y }  }->|%
-\dtt{\color{magenta}{}\expandafter\detokenize\expandafter
-{\romannumeral0\expandafter\xintzapspacesb\expandafter{\x}}}+++}
-\def\x {  { \a {  \X } {  \b  \Y } }  }
-%
-\leftedline{|\xintZapSpacesB {  { \a {  \X } {  \b  \Y } }  }->|%
-\dtt{\color{magenta}{}\expandafter\detokenize\expandafter
-{\romannumeral0\expandafter\xintzapspacesb\expandafter{\x}}}+++}
-\endgroup
- The spaces here at the start and end of the output come from the braced
- material, and are not removed (one would need a second application for that;
- recall though that the \xintname zapping macros do not expand their argument).
-
-\subsection{\csh{xintCSVtoList}}
-\label{xintCSVtoList}
-\label{xintCSVtoListNoExpand}
-
-
-\csa{xintCSVtoList}|{a,b,c...,z}|\etype{f}  returns |{a}{b}{c}...{z}|. A
-\emph{list} is by
-convention in this manual simply a succession of tokens, where each braced thing
-will count as one item (``items'' are defined according to the rules of \TeX{}
-for fetching undelimited parameters of a macro, which are exactly the same rules
-as for \LaTeX{} and macro arguments [they are the same things]). The word
-`list' in `comma separated list of items' has its usual linguistic meaning,
-and then an ``item'' is what is delimited by commas.
-
-So \csa{xintCSVtoList} takes on input a `comma separated list of items' and
-converts it into a `\TeX{} list of braced items'. The argument to
-|\xintCSVtoList| may be a macro: it will first be
-\hyperref[ssec:expansions]{\fexpan ded}. Hence the item before the first comma,
-if it is itself a macro, will be expanded which may or may not be a good thing.
-A space inserted at the start of the first item serves to stop that expansion
-(and disappears). The macro \csbxint{CSVtoListNoExpand}\etype{n} does the same
-job without
-the initial expansion of the list argument.
-
-Apart from that no expansion of the items is done and the list items may thus be
-completely arbitrary (and even contain perilous stuff such as unmatched |\if|
-and |\fi| tokens).
-
-Contiguous spaces and tab characters, are collapsed by \TeX{}
-into single spaces. All such spaces around commas%
-%
-\footnote{and multiple space tokens are not a problem; but those at the
-  top level (not hidden inside braces) \emph{must} be of character code
-  |32|.}
-%
-\fbox{are removed}, as well as
-the spaces at the start and the spaces at the end of the list.%
-%
-\footnote{let us recall that this is all done completely expandably...
-  There is absolutely no alteration of any sort of the item apart from
-  the stripping of initial and final space tokens (of character code
-  |32|) and brace removal if and only if the item apart from intial and
-  final spaces (or more generally multiple |char 32| space tokens) is
-  braced.}
-%
-The items may contain explicit |\par|'s or
-empty lines (converted by the \TeX{} input parsing into |\par| tokens).
-
-\begingroup
-
-\edef\X{\xintCSVtoList { 1 ,{ 2 , 3 , 4 , 5 }, a , {b,T} U , { c , d } , { {x ,
-        y} } }}
-
-%
-\leftedline{|\xintCSVtoList { 1 ,{ 2 , 3 , 4 , 5 }, a , {b,T} U , { c , d } ,
-    { {x , y} } }|}
-%
-\leftedline{|->|%
-{\makeatletter\dtt{\expandafter\strip at prefix\meaning\X}}}
-
-One sees on this example how braces protect commas from
-sub-lists to be perceived as delimiters of the top list. Braces around an entire
-item are removed, even when surrounded by spaces before and/or after. Braces for
-sub-parts of an item are not removed.
-
-We observe also that there is a slight difference regarding the brace stripping
-of an item: if the braces were not surrounded by spaces, also the initial and
-final (but no other) spaces of the \emph{enclosed} material are removed. This is
-the only situation where spaces protected by braces are nevertheless removed.
-
-From the rules above: for an empty argument (only spaces, no braces, no comma)
-the output is
-\dtt{\expandafter\detokenize\expandafter{\romannumeral0\xintcsvtolist { }}}
-(a list with one empty item),
-for ``|<opt. spaces>{}<opt.
-spaces>|'' the output is
-\dtt{\expandafter\detokenize\expandafter
-   {\romannumeral0\xintcsvtolist { {} }}}
-(again a list with one empty item, the braces were removed),
-for ``|{ }|'' the output is
-\dtt{\expandafter\detokenize\expandafter
- {\romannumeral0\xintcsvtolist {{ }}}}
-(again a list with one empty item, the braces were removed and then
-the inner space was removed),
-for ``| { }|'' the output is
-\dtt{\expandafter\detokenize\expandafter
-{\romannumeral0\xintcsvtolist { { }}}} (again a list with one empty item, the initial space served only to stop the expansion, so this was like ``|{ }|'' as input, the braces were removed and the inner space was stripped),
-for ``\texttt{\ \{\ \ \}\ }'' the output is
-\dtt{\expandafter\detokenize\expandafter
-{\romannumeral0\xintcsvtolist { {  } }}} (this time the ending space of the first
-item meant that after brace removal the inner spaces were kept; recall though
-that \TeX{} collapses on input consecutive blanks into one space token),
-for ``|,|'' the output consists of two consecutive
-empty items
-\dtt{\expandafter\detokenize\expandafter{\romannumeral0\xintcsvtolist
-    {,}}}. Recall that on output everything is braced, a |{}| is an ``empty''
-item.
-%
-Most of the above is mainly irrelevant for every day use, apart perhaps from the
-fact to be noted that an empty input does not give an empty output but a
-one-empty-item list (it is as if an ending comma was always added at the end of
-the input).
-
-\def\y { \a,\b,\c,\d,\e}
-\expandafter\def\expandafter\Y\expandafter{\romannumeral0\xintcsvtolist{\y}}
-\def\t {{\if},\ifnum,\ifx,\ifdim,\ifcat,\ifmmode}
-\expandafter\def\expandafter\T\expandafter{\romannumeral0\xintcsvtolist{\t}}
-
-%
-\leftedline{|\def\y{ \a,\b,\c,\d,\e} \xintCSVtoList\y->|%
-  {\makeatletter\dtt{\expandafter\strip at prefix\meaning\Y}}}
-%
-\leftedline{|\def\t {{\if},\ifnum,\ifx,\ifdim,\ifcat,\ifmmode}|}
-%
-\leftedline
-{|\xintCSVtoList\t->|\makeatletter\dtt{\expandafter\strip at prefix\meaning\T}}
-%
-The results above were automatically displayed using \TeX's primitive
-\csa{meaning}, which adds a space after each control sequence name. These spaces
-are not in the actual braced items of the produced lists. The first items |\a|
-and |\if| were either preceded by a space or braced to prevent expansion. The
-macro \csa{xintCSVtoListNoExpand} would have done the same job without the
-initial expansion of the list argument, hence no need for such protection but if
-|\y| is defined as |\def\y{\a,\b,\c,\d,\e}| we then must do:
-%
-\leftedline{|\expandafter\xintCSVtoListNoExpand\expandafter {\y}|} Else, we
-may have direct use: %
-%
-\leftedline{|\xintCSVtoListNoExpand
- {\if,\ifnum,\ifx,\ifdim,\ifcat,\ifmmode}|}
-%
-\leftedline{|->|\dtt{\expandafter\detokenize\expandafter
-    {\romannumeral0\xintcsvtolistnoexpand
-      {\if,\ifnum,\ifx,\ifdim,\ifcat,\ifmmode}}}}
-%
-Again these spaces are an artefact from the use in the source of the document of
-\csa{meaning} (or rather here, \csa{detokenize}) to display the result of using
-\csa{xintCSVtoListNoExpand} (which is done for real in this document
-source).
-
-For the similar conversion from comma separated list to braced items list, but
-without removal of spaces around the commas, there is
-\csa{xintCSVtoListNonStripped}\etype{f} and
-\csa{xintCSVtoListNonStrippedNoExpand}\etype{n}.
-
-\endgroup
-
-\subsection{\csh{xintNthElt}}\label{xintNthElt}
-
-
-\def\macro #1{\the\numexpr 9-#1\relax}
-
-\csa{xintNthElt\x}\marg{list}\etype{\numx f} gets (expandably) the |x|th
-item of the \meta{list}. A braced item will lose one level of brace
-pairs. The token list is first \fexpan ded.
-
-Items are counted starting at one.
-
-\leftedline{|\xintNthElt {3}{{agh}\u{zzz}\v{Z}}| is
-    \texttt{\xintNthElt {3}{{agh}\u{zzz}\v{Z}}}}
-%
-\leftedline{|\xintNthElt {3}{{agh}\u{{zzz}}\v{Z}}| is
-    \texttt{\expandafter\expandafter\expandafter
-      \detokenize\expandafter\expandafter\expandafter {\xintNthElt
-        {3}{{agh}\u{{zzz}}\v{Z}}}}}
-%
-\leftedline{|\xintNthElt {2}{{agh}\u{{zzz}}\v{Z}}| is
-    \texttt{\expandafter\expandafter\expandafter
-      \detokenize\expandafter\expandafter\expandafter {\xintNthElt
-        {2}{{agh}\u{{zzz}}\v{Z}}}}}
-%
-\leftedline{|\xintNthElt {37}{\xintiiFac {100}}|\dtt{=\xintNthElt
-      {37}{\xintiiFac {100}}} is the thirty-seventh digit of $100!$.}
-%
-\leftedline{|\xintNthElt {10}{\xintFtoCv
-      {566827/208524}}|\dtt{=\xintNthElt {10}{\xintFtoCv
-        {566827/208524}}}}
-\leftedline{is the tenth convergent of $566827/208524$ (uses \xintcfracname
-  package).}
-%
-\leftedline{|\xintNthElt {7}{\xintCSVtoList {1,2,3,4,5,6,7,8,9}}|%
-    \dtt{=\xintNthElt {7}{\xintCSVtoList {1,2,3,4,5,6,7,8,9}}}}
-%
-\leftedline{|\xintNthElt {0}{\xintCSVtoList {1,2,3,4,5,6,7,8,9}}|%
-    \dtt{=\xintNthElt {0}{\xintCSVtoList {1,2,3,4,5,6,7,8,9}}}}
-%
-\leftedline{|\xintNthElt {-3}{\xintCSVtoList {1,2,3,4,5,6,7,8,9}}|%
-    \dtt{=\xintNthElt {-3}{\xintCSVtoList {1,2,3,4,5,6,7,8,9}}}}
-
-If |x=0|,
-the macro returns the \emph{length} of the expanded list: this is not equivalent
-to \csbxint{Length} which does no pre-expansion. And it is different from
-\csbxint{Len} which is to be used only on integers or fractions.
-
-If |x<0|, the macro returns the \verb+|x|+th element from the end of the list.
-Thus for example |x=-1| will fetch the last item of the list.
-%
-\leftedline {|\xintNthElt {-5}{{{agh}}\u{zzz}\v{Z}}| is
-  \texttt{\expandafter\expandafter\expandafter \detokenize
-  \expandafter\expandafter\expandafter{\xintNthElt {-5}{{{agh}}\u{zzz}\v{Z}}}}}
-
-The macro \csa{xintNthEltNoExpand}\etype{\numx n} does the same job but without
-first expanding the list argument: |\xintNthEltNoExpand {-4}{\u\v\w T\x\y\z}| is
-\xintNthEltNoExpand {-4}{\a\b\c\u\v\w T\x\y\z}.
-
-If |x| is strictly larger (in absolute value) than the length of the list
-then |\xintNthElt| produces empty contents.
-
-\subsection{\csh{xintNthOnePy}}
-\label{xintNthOnePy}
-
-\csa{xintNthOnePy\x}\marg{list}\etype{\numx f} gets (expandably) the |x|th
-item of the \meta{list}, adding a brace pair if there wasn't one.\NewWith{1.4}
-
-Attention, items are counted starting at zero. For negative index, behaves
-as \csbxint{NthElt}.
-
-If the index is out of range, the empty output is returned. If the input list
-was empty (had no items) the empty output is returned.
-
-\subsection{\csh{xintKeep}}\label{xintKeep}
-
-\csa{xintKeep\x}\marg{list}\etype{\numx f} expands the token list argument |L|
-and produces a new list, depending on the value of |x|:
-\begin{itemize}[nosep]
-\item if |x>0|, the new list contains the first |x| items from |L| (counting
-  starts at one.) \emph{Each
-    such item will be output within a brace pair.} Use \csbxint{KeepUnbraced} if
-  this is not desired. This means that if the list item was braced to start
-  with, there is no modification, but if it was a token without braces,
-  then it acquires them.
-\item if |x>=length(L)|, the new list is the old one with all its items now
-  braced.
-\item if |x=0| the empty list is returned.
-\item if |x<0| the last \verb+|x|+ elements compose the output in the same
-  order as in the initial list; as the macro proceeds by removing head items
-  the kept items end up in output as they were in input: no added braces.
-\item if |x<=-length(L)| the output is identical with the input.
-\end{itemize}
-
-\csa{xintKeepNoExpand} does the same without first \fexpan ding its list
-argument.
-%
-\begin{everbatim*}
-\fdef\test {\xintKeep {17}{\xintKeep {-69}{\xintSeq {1}{100}}}}\meaning\test\par
-\noindent\fdef\test {\xintKeep {7}{{1}{2}{3}{4}{5}{6}{7}{8}{9}}}\meaning\test\par
-\noindent\fdef\test {\xintKeep {-7}{{1}{2}{3}{4}{5}{6}{7}{8}{9}}}\meaning\test\par
-\noindent\fdef\test {\xintKeep {7}{123456789}}\meaning\test\par
-\noindent\fdef\test {\xintKeep {-7}{123456789}}\meaning\test\par
-\end{everbatim*}
-
-
-\subsection{\csh{xintKeepUnbraced}}\label{xintKeepUnbraced}
-
-Same as \csbxint{Keep} but no brace pairs are added around the kept items from
-the head of the list in the case |x>0|: each such item will lose one level of
-braces. Thus, to remove braces from all items of the list, one can use
-\csbxint{KeepUnbraced} with its first argument larger than the length of the
-list; the same is obtained from \csbxint{ListWithSep}|{}|\marg{list}. But the
-new list will then have generally many more items than the original ones,
-corresponding to the unbraced original items.
-
-For |x<0| the macro is no different from \csbxint{Keep}. Hence the name is a
-bit misleading because brace removal will happen only if |x>0|.
-
-\csa{xintKeepUnbracedNoExpand} does the same without first \fexpan ding
-its list argument.
-%
-\begin{everbatim*}
-\fdef\test {\xintKeepUnbraced {10}{\xintSeq {1}{100}}}\meaning\test\par
-\noindent\fdef\test {\xintKeepUnbraced {7}{{1}{2}{3}{4}{5}{6}{7}{8}{9}}}\meaning\test\par
-\noindent\fdef\test {\xintKeepUnbraced {-7}{{1}{2}{3}{4}{5}{6}{7}{8}{9}}}\meaning\test\par
-\noindent\fdef\test {\xintKeepUnbraced {7}{123456789}}\meaning\test\par
-\noindent\fdef\test {\xintKeepUnbraced {-7}{123456789}}\meaning\test\par
-\end{everbatim*}
-
-\subsection{\csh{xintTrim}}\label{xintTrim}
-
-\csa{xintTrim\x}\marg{list}\etype{\numx f} expands the list argument and
-gobbles its first |x| elements.
-\begin{itemize}[nosep]
-\item if |x>0|, the first |x| items from |L| are gobbled. The remaining items
-  are not modified.
-\item if |x>=length(L)|, the returned list is empty.
-\item if |x=0| the original list is returned (with no added braces.)
-\item if |x<0| the last \verb+|x|+ items of the list are removed. \emph{The
-    head items end up braced in the output.} Use \csbxint{TrimUnbraced} if
-  this is not desired.
-\item if |x<=-length(L)| the output is empty.
-\end{itemize}
-
-\csa{xintTrimNoExpand} does the same without first \fexpan ding its list
-argument.
-\begin{everbatim*}
-\fdef\test {\xintTrim {17}{\xintTrim {-69}{\xintSeq {1}{100}}}}\meaning\test\par
-\noindent\fdef\test {\xintTrim {7}{{1}{2}{3}{4}{5}{6}{7}{8}{9}}}\meaning\test\par
-\noindent\fdef\test {\xintTrim {-7}{{1}{2}{3}{4}{5}{6}{7}{8}{9}}}\meaning\test\par
-\noindent\fdef\test {\xintTrim {7}{123456789}}\meaning\test\par
-\noindent\fdef\test {\xintTrim {-7}{123456789}}\meaning\test\par
-\end{everbatim*}
-
-\subsection{\csh{xintTrimUnbraced}}\label{xintTrimUnbraced}
-
-Same as \csbxint{Trim} but in case of a negative |x| (cutting items from
-the tail), the kept items from the head are not enclosed in brace pairs. They
-will lose one level of braces. The name is a bit misleading
-because when |x>0| there is no brace-stripping done on the kept items, because
-the macro works simply by gobbling the head ones.
-
-\csa{xintTrimUnbracedNoExpand} does the same without first \fexpan ding its list
-argument.
-
-\begin{everbatim*}
-\fdef\test {\xintTrimUnbraced {-90}{\xintSeq {1}{100}}}\meaning\test\par
-\noindent\fdef\test {\xintTrimUnbraced {7}{{1}{2}{3}{4}{5}{6}{7}{8}{9}}}\meaning\test\par
-\noindent\fdef\test {\xintTrimUnbraced {-7}{{1}{2}{3}{4}{5}{6}{7}{8}{9}}}\meaning\test\par
-\noindent\fdef\test {\xintTrimUnbraced {7}{123456789}}\meaning\test\par
-\noindent\fdef\test {\xintTrimUnbraced {-7}{123456789}}\meaning\test\par
-\end{everbatim*}
-
-\subsection{\csh{xintListWithSep}}\label{xintListWithSep}
-
-
-\def\macro #1{\the\numexpr 9-#1\relax}
-
-\csa{xintListWithSep}\marg{sep}\marg{list}\etype{nf} inserts the separator
-\meta{sep} in-between all items of the given list of braced items (or
-individual tokens). The items are fetched as does \TeX\ with undelimited macro
-arguments, thus they end up unbraced in output. If the \meta{list} is only one
-(or multiple) space tokens, the output is empty.
-
-The list argument \meta{list} gets \fexpan ded first (thus if it is a macro
-whose contents are braced items, the first opening brace stops the expansion,
-and it is as if the macro had been expanded once.) The separator \meta{sep} is
-not pre-expanded, it ends up as is in the output (if the \meta{list} contained
-at least two items.)
-
-The variant \csa{xintListWithSepNoExpand}\etype{nn} does the same
-job without the initial expansion of the \meta{list} argument.
-\begin{everbatim*}
-\edef\foo{\xintListWithSep{, }{123456789{10}{11}{12}}}\meaning\foo\newline
-\edef\foo{\xintListWithSep{:}{\xintiiFac{20}}}\meaning\foo\newline
-\oodef\FOO{\xintListWithSepNoExpand{\FOO}{\bat\baz\biz\buz}}\meaning\FOO\newline
-% a braced item or a space stops the f-expansion:
-\oodef\foo{\xintListWithSep{\FOO}{{\bat}\baz\biz\buz}}\meaning\foo\newline
-\oodef\foo{\xintListWithSep{\FOO}{ \bat\baz\biz\buz}}\meaning\foo\par
-\end{everbatim*}
-
-\subsection{\csh{xintApply}}\label{xintApply}
-
-
-\def\macro #1{\the\numexpr 9-#1\relax}
-
-\csa{xintApply}|{\macro}|\marg{list}\etype{ff} expandably applies the one
-parameter macro |\macro| to each item in the \meta{list} given as second
-argument and returns a new list with these outputs: each item is given one after
-the other as parameter to |\macro| which is expanded at that time (as usual,
-\emph{i.e.\@} fully for what comes first), the results are braced and output
-together as a succession of braced items (if |\macro| is defined to start with a
-space, the space will be gobbled and the |\macro| will not be expanded; it is
-allowed to have its own arguments, the list items serve as last arguments to
-|\macro|). Hence |\xintApply{\macro}{{1}{2}{3}}| returns
-|{\macro{1}}{\macro{2}}{\macro{3}}| where all instances of |\macro| have been
-already \fexpan ded.
-
-Being expandable, |\xintApply| is useful for example inside alignments where
-implicit groups make standard loops constructs usually fail. In such situation
-it is often not wished that the new list elements be braced, see
-\csbxint{ApplyUnbraced}. The |\macro| does not have to be expandable:
-|\xintApply| will try to expand it, the expansion may remain partial.
-
-The \meta{list} may
-itself be some macro expanding (in the previously described way) to the list of
-tokens to which the macro |\macro| will be applied. For example, if the
-\meta{list} expands to some positive number, then each digit will be replaced by
-the result of applying |\macro| on it. %
-%
-\leftedline{|\def\macro #1{\the\numexpr
-    9-#1\relax}|} %
-%
-\leftedline{|\xintApply\macro{\xintiiFac
- {20}}|\dtt{=\xintApply\macro{\xintiiFac {20}}}}
-
-The macro \csa{xintApplyNoExpand}\etype{fn} does the same job without the first
-initial expansion which gave the \meta{list} of braced tokens to which |\macro|
-is applied.
-
-\subsection{\csh{xintApplyUnbraced}}\label{xintApplyUnbraced}
-
-
-\csa{xintApplyUnbraced}|{\macro}|\marg{list}\etype{ff} is like \csbxint{Apply}.
-The difference is that after having expanded its list argument, and applied
-|\macro| in turn to each item from the list, it reassembles the outputs without
-enclosing them in braces. The net effect is the same as doing
-%
-\leftedline{|\xintListWithSep {}{\xintApply {\macro}|\marg{list}|}|} This is
-useful for preparing a macro which will itself define some other macros or make
-assignments, as the scope will not be limited by brace pairs.
-%
-\begin{everbatim*}
-\def\macro #1{\expandafter\def\csname myself#1\endcsname {#1}}
-\xintApplyUnbraced\macro{{elta}{eltb}{eltc}}
-\begin{enumerate}[nosep,label=(\arabic{*})]
-\item \meaning\myselfelta
-\item \meaning\myselfeltb
-\item \meaning\myselfeltc
-\end{enumerate}
-\end{everbatim*}
-
-%
-The macro \csa{xintApplyUnbracedNoExpand}\etype{fn} does the same job without
-the first initial expansion which gave the \meta{list} of braced tokens to which
-|\macro| is applied.
-
-\subsection{\csh{xintSeq}}\label{xintSeq}
-
-\csa{xintSeq}|[d]{x}{y}|\etype{{{\upshape[\numx]}}\numx\numx} generates
-expandably |{x}{x+d}...| up to and possibly including |{y}| if |d>0| or down
-to and including |{y}| if |d<0|. Naturally |{y}| is omitted if |y-x| is not a
-multiple of |d|. If |d=0| the macro returns |{x}|. If |y-x| and |d| have
-opposite signs, the macro returns nothing. If the optional argument |d| is
-omitted it is taken to be the sign of |y-x|. Hence |\xintSeq {1}{0}| is not
-empty but |{1}{0}|. But |\xintSeq [1]{1}{0}| is empty.
-
-
-The arguments |x| and |y| are expanded inside a |\numexpr| so they may be
-count registers or a \LaTeX{} |\value{countername}|, or arithmetic with such
-things.
-
-%
-\begin{everbatim*}
-\xintListWithSep{,\hskip2pt plus 1pt minus 1pt }{\xintSeq {12}{-25}}
-\end{everbatim*}
-%
-\begin{everbatim*}
-\xintiiSum{\xintSeq [3]{1}{1000}}
-\end{everbatim*}
-
-When the macro is used without the optional argument |d|, it can only generate
-up to about $5000$ numbers\IMPORTANT, the precise value depends upon some
-\TeX{} memory parameter (input save stack).
-
-With the optional argument |d| the macro proceeds differently (but less
-efficiently) and does not stress the input save stack.
-
-
-
-\subsection{\csh{xintloop}, \csh{xintbreakloop}, \csh{xintbreakloopanddo}, \csh{xintloopskiptonext}}
-\label{xintloop}
-\label{xintbreakloop}
-\label{xintbreakloopanddo}
-\label{xintloopskiptonext}
-
-|\xintloop|\meta{stuff}|\if<test>...\repeat|\xtype{} is an expandable loop
-compatible with nesting. However to break out of the loop one almost always need
-some un-expandable step. The cousin \csbxint{iloop} is \csbxint{loop} with an
-embedded expandable mechanism allowing to exit from the loop. The iterated
-macros may contain |\par| tokens or empty lines.
-
-If a sub-loop is to be used all the material from the start of the main loop and
-up to the end of the entire subloop should be braced; these braces will be
-removed and do not create a group. The simplest to allow the nesting of one or
-more sub-loops is to brace everything between \csa{xintloop} and \csa{repeat},
-being careful not to leave a space between the closing brace and |\repeat|.
-
-As this loop and \csbxint{iloop} will primarily be of interest to experienced
-\TeX{} macro programmers, my description will assume that the user is
-knowledgeable enough. Some examples in this document will be perhaps more
-illustrative than my attemps at explanation of use.
-
-One can abort the loop with \csbxint{breakloop}; this should not be used inside
-the final test, and one should expand the |\fi| from the corresponding test
-before. One has also \csbxint{breakloopanddo} whose first argument will be
-inserted in the token stream after the loop; one may need a macro such as
-|\xint_afterfi| to move the whole thing after the |\fi|, as a simple
-|\expandafter| will not be enough.
-
-One will usually employ some count registers to manage the exit test from the
-loop; this breaks expandability, see \csbxint{iloop} for an expandable integer
-indexed loop. Use in alignments will be complicated by the fact that cells
-create groups, and also from the fact that any encountered unexpandable material
-will cause the \TeX{} input scanner to insert |\endtemplate| on each encountered
-|&| or |\cr|; thus |\xintbreakloop| may not work as expected, but the situation
-can be resolved via |\xint_firstofone{&}| or use of |\TAB| with |\def\TAB{&}|.
-It is thus simpler for alignments to use rather than \csbxint{loop} either the
-expandable \csbxint{ApplyUnbraced} or the non-expandable but alignment
-compatible \csbxint{ApplyInline}, \csbxint{For} or \csbxint{For*}.
-
-As an example, let us suppose we have two macros |\A|\marg{i}\marg{j} and
-|\B|\marg{i}\marg{j} behaving like (small) integer valued matrix entries, and we
-want to define a macro |\C|\marg{i}\marg{j} giving the matrix product (|i| and
-|j| may be count registers). We will assume that |\A[I]| expands to the number
-of rows, |\A[J]| to the number of columns and want the produced |\C| to act in
-the same manner. The code is very dispendious in use of |\count| registers, not
-optimized in any way, not made very robust (the defined macro can not have the
-same name as the first two matrices for example), we just wanted to quickly
-illustrate use of the nesting capabilities of |\xintloop|.%
-%
-\footnote{for a more sophisticated implementation of matrix
-  multiplication, inclusive of determinants, inverses, and display
-  utilities, with entries big integers or decimal numbers or even
-  fractions see some code online posted
-  from
-  November 11, 2013.}
-%
-
-
-\begin{everbatim*}
-\newcount\rowmax   \newcount\colmax   \newcount\summax
-\newcount\rowindex \newcount\colindex \newcount\sumindex
-\newcount\tmpcount
-\makeatletter
-\def\MatrixMultiplication #1#2#3{%
-    \rowmax #1[I]\relax
-    \colmax #2[J]\relax
-    \summax #1[J]\relax
-    \rowindex 1
-    \xintloop % loop over row index i
-    {\colindex 1
-     \xintloop % loop over col index k
-     {\tmpcount 0
-      \sumindex 1
-      \xintloop % loop over intermediate index j
-      \advance\tmpcount \numexpr #1\rowindex\sumindex*#2\sumindex\colindex\relax
-      \ifnum\sumindex<\summax
-         \advance\sumindex 1
-      \repeat }%
-     \expandafter\edef\csname\string#3{\the\rowindex.\the\colindex}\endcsname
-      {\the\tmpcount}%
-     \ifnum\colindex<\colmax
-         \advance\colindex 1
-     \repeat }%
-    \ifnum\rowindex<\rowmax
-    \advance\rowindex 1
-    \repeat
-    \expandafter\edef\csname\string#3{I}\endcsname{\the\rowmax}%
-    \expandafter\edef\csname\string#3{J}\endcsname{\the\colmax}%
-    \def #3##1{\ifx[##1\expandafter\Matrix at helper@size
-                    \else\expandafter\Matrix at helper@entry\fi #3{##1}}%
-}%
-\def\Matrix at helper@size #1#2#3]{\csname\string#1{#3}\endcsname }%
-\def\Matrix at helper@entry #1#2#3%
-   {\csname\string#1{\the\numexpr#2.\the\numexpr#3}\endcsname }%
-\def\A #1{\ifx[#1\expandafter\A at size
-            \else\expandafter\A at entry\fi {#1}}%
-\def\A at size #1#2]{\ifx I#23\else4\fi}% 3rows, 4columns
-\def\A at entry #1#2{\the\numexpr #1+#2-1\relax}% not pre-computed...
-\def\B #1{\ifx[#1\expandafter\B at size
-            \else\expandafter\B at entry\fi {#1}}%
-\def\B at size #1#2]{\ifx I#24\else3\fi}% 4rows, 3columns
-\def\B at entry #1#2{\the\numexpr #1-#2\relax}% not pre-computed...
-\makeatother
-\MatrixMultiplication\A\B\C \MatrixMultiplication\C\C\D
-\MatrixMultiplication\C\D\E \MatrixMultiplication\C\E\F
-\begin{multicols}2
-  \[\begin{pmatrix}
-    \A11&\A12&\A13&\A14\\
-    \A21&\A22&\A23&\A24\\
-    \A31&\A32&\A33&\A34
-  \end{pmatrix}
-  \times
-  \begin{pmatrix}
-    \B11&\B12&\B13\\
-    \B21&\B22&\B23\\
-    \B31&\B32&\B33\\
-    \B41&\B42&\B43
-  \end{pmatrix}
-  =
-  \begin{pmatrix}
-    \C11&\C12&\C13\\
-    \C21&\C22&\C23\\
-    \C31&\C32&\C33
-  \end{pmatrix}\]
-  \[\begin{pmatrix}
-    \C11&\C12&\C13\\
-    \C21&\C22&\C23\\
-    \C31&\C32&\C33
-  \end{pmatrix}^2 = \begin{pmatrix}
-    \D11&\D12&\D13\\
-    \D21&\D22&\D23\\
-    \D31&\D32&\D33
-  \end{pmatrix}\]
-  \[\begin{pmatrix}
-    \C11&\C12&\C13\\
-    \C21&\C22&\C23\\
-    \C31&\C32&\C33
-  \end{pmatrix}^3 = \begin{pmatrix}
-    \E11&\E12&\E13\\
-    \E21&\E22&\E23\\
-    \E31&\E32&\E33
-  \end{pmatrix}\]
-  \[\begin{pmatrix}
-    \C11&\C12&\C13\\
-    \C21&\C22&\C23\\
-    \C31&\C32&\C33
-  \end{pmatrix}^4 = \begin{pmatrix}
-    \F11&\F12&\F13\\
-    \F21&\F22&\F23\\
-    \F31&\F32&\F33
-  \end{pmatrix}\]
-\end{multicols}
-\end{everbatim*}
-
-
-\subsection{\csh{xintiloop}, \csh{xintiloopindex}, \csh{xintouteriloopindex},
-  \csh{xintbreakiloop}, \csh{xintbreakiloopanddo}, \csh{xintiloopskiptonext},
-\csh{xintiloopskipandredo}}
-\label{xintiloop}
-\label{xintbreakiloop}
-\label{xintbreakiloopanddo}
-\label{xintiloopskiptonext}
-\label{xintiloopskipandredo}
-\label{xintiloopindex}
-\label{xintouteriloopindex}
-
-\csa{xintiloop}|[start+delta]|\meta{stuff}|\if<test> ... \repeat|\xtype{} is a
-completely expandable nestable loop. complete expandability depends naturally on
-the actual iterated contents, and complete expansion will not be achievable
-under a sole \fexpan sion, as is indicated by the hollow star in the margin;
-thus the loop can be used inside an |\edef| but not inside arguments to the
-package macros. It can be used inside an |\xintexpr..\relax|. The
-|[start+delta]| is mandatory, not optional.
-
-This loop benefits via \csbxint{iloopindex} to (a limited access to) the integer
-index of the iteration. The starting value |start| (which may be a |\count|) and
-increment |delta| (\emph{id.}) are mandatory arguments. A space after the
-closing square bracket is not significant, it will be ignored. Spaces inside the
-square brackets will also be ignored as the two arguments are first given to a
-|\numexpr...\relax|. Empty lines and explicit |\par| tokens are accepted.
-
-As with \csbxint{loop}, this tool will mostly be of interest to advanced users.
-For nesting, one puts inside braces all the
-material from the start (immediately after |[start+delta]|) and up to and
-inclusive of the inner loop, these braces will be removed and do not create a
-loop. In case of nesting, \csbxint{outeriloopindex} gives access to the index of
-the outer loop. If needed one could write on its model a macro giving access to
-the index of the outer outer loop (or even to the |nth| outer loop).
-
-The \csa{xintiloopindex} and \csa{xintouteriloopindex} can not be used inside
-braces, and generally speaking this means they should be expanded first when
-given as argument to a macro, and that this macro receives them as delimited
-arguments, not braced ones. Or, but naturally this will break expandability, one
-can assign the value of \csa{xintiloopindex} to some |\count|. Both
-\csa{xintiloopindex} and \csa{xintouteriloopindex} extend to the litteral
-representation of the index, thus in |\ifnum| tests, if it comes last one has to
-correctly end the macro with a |\space|, or encapsulate it in a
-|\numexpr..\relax|.
-
-When the repeat-test of the loop is, for example, |\ifnum\xintiloopindex<10
-\repeat|, this means that the last iteration will be with |\xintiloopindex=10|
-(assuming |delta=1|). There is also |\ifnum\xintiloopindex=10 \else\repeat| to
-get the last iteration to be the one with |\xintiloopindex=10|.
-
-One has \csbxint{breakiloop} and \csbxint{breakiloopanddo} to abort the loop.
-The syntax of |\xintbreakiloopanddo| is a bit surprising, the sequence of tokens
-to be executed after breaking the loop is not within braces but is delimited by
-a dot as in:
-%
-\leftedline{|\xintbreakiloopanddo <afterloop>.etc.. etc... \repeat|}
-%
-The reason is that one may wish to use the then current value of
-|\xintiloopindex| in |<afterloop>| but it can't be within braces at the time it
-is evaluated. However, it is not that easy as |\xintiloopindex| must be expanded
-before, so one ends up with code like this:
-%
-\leftedline
-{|\expandafter\xintbreakiloopanddo\expandafter\macro\xintiloopindex.%|}
-%
-\leftedline{|etc.. etc.. \repeat|}
-%
-As moreover the |\fi| from the test leading to the decision of breaking out of
-the loop must be cleared out of the way, the above should be
-a branch of an expandable conditional test, else one needs something such
-as:
-%
-\leftedline
-{|\xint_afterfi{\expandafter\xintbreakiloopanddo\expandafter\macro\xintiloopindex.}%|}
-%
-\leftedline{|\fi etc..etc.. \repeat|}
-
-There is \csbxint{iloopskiptonext} to abort the current iteration and skip to
-the next, \hyperref[xintiloopskipandredo]{\ttfamily\hyphenchar\font45 \char92
-  xintiloopskip\-and\-redo} to skip to the end of the current iteration and redo
-it with the same value of the index (something else will have to change for this
-not to become an eternal loop\dots ).
-
-Inside alignments, if the looped-over text contains a |&| or a |\cr|, any
-un-expandable material before a \csbxint{iloopindex} will make it fail because
-of |\endtemplate|; in such cases one can always either replace |&| by a macro
-expanding to it or replace it by a suitable |\firstofone{&}|, and similarly for
-|\cr|.
-
-\phantomsection\label{edefprimes}
-As an example, let us construct an |\edef\z{...}| which will define |\z| to be a
-list of prime numbers:
-\begin{everbatim*}
-\begingroup
-\edef\z
-{\xintiloop [10001+2]
-  {\xintiloop [3+2]
-   \ifnum\xintouteriloopindex<\numexpr\xintiloopindex*\xintiloopindex\relax
-          \xintouteriloopindex,
-          \expandafter\xintbreakiloop
-   \fi
-   \ifnum\xintouteriloopindex=\numexpr
-        (\xintouteriloopindex/\xintiloopindex)*\xintiloopindex\relax
-   \else
-   \repeat
-  }% no space here
- \ifnum \xintiloopindex < 10999 \repeat }%
-\meaning\z\endgroup
-\end{everbatim*}and we should have taken
-some steps to not have a trailing comma, but
-the point was to show that one can do that in an |\edef|\,! See also
-\autoref{ssec:primesII} which extracts from this code its way of testing
-primality.
-
-Let us create an alignment where each row will contain all divisors of its
-first entry.
-Here is the output, thus obtained without any count register:
-\begin{everbatim*}
-\begin{multicols}2
-\tabskip1ex \normalcolor
-\halign{&\hfil#\hfil\cr
-    \xintiloop [1+1]
-    {\expandafter\bfseries\xintiloopindex &
-     \xintiloop [1+1]
-     \ifnum\xintouteriloopindex=\numexpr
-           (\xintouteriloopindex/\xintiloopindex)*\xintiloopindex\relax
-     \xintiloopindex&\fi
-     \ifnum\xintiloopindex<\xintouteriloopindex\space % CRUCIAL \space HERE
-     \repeat \cr }%
-    \ifnum\xintiloopindex<30
-    \repeat
-}
-\end{multicols}
-\end{everbatim*}
-We wanted this first entry in bold face, but |\bfseries| leads to
-unexpandable tokens, so the |\expandafter| was necessary for |\xintiloopindex|
-and |\xintouteriloopindex| not to be confronted with a hard to digest
-|\endtemplate|. An alternative way of coding:
-%
-\begin{everbatim}
-\tabskip1ex
-\def\firstofone #1{#1}%
-\halign{&\hfil#\hfil\cr
-  \xintiloop [1+1]
-    {\bfseries\xintiloopindex\firstofone{&}%
-    \xintiloop [1+1] \ifnum\xintouteriloopindex=\numexpr
-    (\xintouteriloopindex/\xintiloopindex)*\xintiloopindex\relax
-    \xintiloopindex\firstofone{&}\fi
-    \ifnum\xintiloopindex<\xintouteriloopindex\space % \space is CRUCIAL
-    \repeat \firstofone{\cr}}%
-  \ifnum\xintiloopindex<30 \repeat }
-\end{everbatim}
-
 \begin{framed}
-  The next utilities are not compatible with expansion-only context.
-\end{framed}
+  %\small % not now that there is the Part which is rather large
 
-\subsection{\csh{xintApplyInline}}\label{xintApplyInline}
+  This documentation has been compiled without including the
+  commented source code, which is available in the separate file
+  |sourcexint.pdf|,
+  and will open in a PDF viewer via:
+  %
+  \centeredline{|texdoc sourcexint.pdf|}
 
 
-\csa{xintApplyInline}|{\macro}|\marg{list}\ntype{o{\lowast f}} works non
-expandably. It applies the one-parameter |\macro| to the first element of the
-expanded list (|\macro| may have itself some arguments, the list item will be
-appended as last argument), and is then re-inserted in the input stream after
-the tokens resulting from this first expansion of |\macro|. The next item is
-then handled.
-
-This is to be used in situations where one needs to do some repetitive
-things. It is not expandable and can not be completely expanded inside a
-macro definition, to prepare material for later execution, contrarily to what
-\csbxint{Apply} or \csbxint{ApplyUnbraced} achieve.
-
-\begin{everbatim*}
-\def\Macro #1{\advance\cnta #1 , \the\cnta}
-\cnta 0
-0\xintApplyInline\Macro {3141592653}.
-\end{everbatim*}
-The first argument |\macro| does not have to be an expandable macro.
-
-\csa{xintApplyInline} submits its second, token list parameter to an
-\hyperref[ssec:expansions]{\fexpan
-sion}. Then, each \emph{unbraced} item will also be \fexpan ded. This provides
-an easy way to insert one list inside another. \emph{Braced} items are not
-expanded. Spaces in-between items are gobbled (as well as those at the start
-or the end of the list), but not the spaces \emph{inside} the braced items.
-
-\csa{xintApplyInline}, despite being non-expandable, does survive to
-contexts where the executed |\macro| closes groups, as happens inside
-alignments with the tabulation character |&|.
-This tabular provides an example:\par
-\begin{everbatim*}
-\centerline{\normalcolor\begin{tabular}{ccc}
-     $N$ & $N^2$ & $N^3$ \\ \hline
-     \def\Row #1{ #1 & \xintiiSqr {#1} & \xintiiPow {#1}{3} \\ \hline }%
-     \xintApplyInline \Row {\xintCSVtoList{17,28,39,50,61}}
-\end{tabular}}\medskip
-\end{everbatim*}
-
-We see that despite the fact that the first encountered tabulation character in
-the first row close a group and thus erases |\Row| from \TeX's memory,
-|\xintApplyInline| knows how to deal with this.
-
-Using \csbxint{ApplyUnbraced} is an alternative: the difference is that
-this would have prepared all rows first and only put them back into the
-token stream once they are all assembled, whereas with |\xintApplyInline|
-each row is constructed and immediately fed back into the token stream: when
-one does things with numbers having hundreds of digits, one learns that
-keeping on hold and shuffling around hundreds of tokens has an impact on
-\TeX{}'s speed (make this ``thousands of tokens'' for the impact to be
-noticeable).
-
-One may nest various |\xintApplyInline|'s. For example (see the
-\hyperref[float]{table} \vpageref{float}):\par
-\begin{everbatim*}
-\begin{figure*}[ht!]
-  \centering\phantomsection\label{float}
-  \def\Row #1{#1:\xintApplyInline {\Item {#1}}{0123456789}\\ }%
-  \def\Item #1#2{&\xintiiPow {#1}{#2}}%
-  \centeredline {\begin{tabular}{ccccccccccc} &0&1&2&3&4&5&6&7&8&9\\ \hline
-      \xintApplyInline \Row {0123456789}
-    \end{tabular}}
-\end{figure*}
-\end{everbatim*}
-
-One could not move the definition of |\Item| inside the tabular,
-as it would get lost after the first |&|. But this
-works:
-\everb|@
-\begin{tabular}{ccccccccccc}
-    &0&1&2&3&4&5&6&7&8&9\\ \hline
-    \def\Row #1{#1:\xintApplyInline {&\xintiiPow {#1}}{0123456789}\\ }%
-    \xintApplyInline \Row {0123456789}
-\end{tabular}
-|
-
-A limitation is that, contrarily to what one may have expected, the
-|\macro| for an |\xintApplyInline| can not be used to define
-the |\macro| for a nested sub-|\xintApplyInline|. For example,
-this does not work:\par
-\everb|@
-  \def\Row #1{#1:\def\Item ##1{&\xintiiPow {#1}{##1}}%
-                 \xintApplyInline \Item {0123456789}\\ }%
-  \xintApplyInline \Row {0123456789} % does not work
-|
-\noindent But see \csbxint{For}.
-
-\subsection{\csh{xintFor}, \csh{xintFor*}}\label{xintFor}\label{xintFor*}
-
-\csbxint{For}\ntype{on} is a new kind of for loop.\footnote{first introduced
-  with \xintname |1.09c| of |2013/10/09|.} Rather than using macros
-for encapsulating list items, its behaviour is like a macro with parameters:
-|#1|, |#2|, \dots, |#9| are used to represent the items for up to nine levels of
-nested loops. Here is an example:
-%
-\everb|@
-\xintFor #9 in {1,2,3} \do {%
-  \xintFor #1 in {4,5,6} \do {%
-    \xintFor #3 in {7,8,9} \do {%
-      \xintFor #2 in {10,11,12} \do {%
-      $$#9\times#1\times#3\times#2=\xintiiPrd{{#1}{#2}{#3}{#9}}$$}}}}
-|
-\noindent This example illustrates that one does not have to use |#1| as the
-first one:
-the order is arbitrary. But each level of nesting should have its specific macro
-parameter. Nine levels of nesting is presumably overkill, but I did not know
-where it was reasonable to stop. |\par| tokens are accepted in both the comma
-separated list and the replacement text.
-
-\begin{framed}
-  \TeX nical notes:
-
-\begin{itemize}
-  \item The |#1| is replaced in the iterated-over text exactly as in general
-    \TeX\ macros or \LaTeX\ commands. This spares the user quite a few
-    |\expandafter|'s or other tricks needed with loops which have the
-    values encapsulated in macros, like \LaTeX's |\@for| and |\@tfor|.
-
-  \item \csa{xintFor} (and \csa{xintFor*}) isn't purely expandable: one can
-    not use it inside an |\edef|. But it may be used, as will be shown in
-    examples, in some contexts such as \LaTeX's |tabular| which are usually
-    hostile to non-expandable loops.
-  
-  \item \csa{xintFor} (and \csa{xintFor*}) does some assignments prior to
-    executing each iteration of the replacement text, but it acts purely
-    expandably after the last iteration, hence if for example the replacement
-    text ends with a |\\|, the loop can be used insided a tabular and be
-    followed by a |\hline| without creating the dreaded ``|Misplaced
-    \noalign|'' error.
-
-  \item As stated in previous item the first iteration follows some
-    non-expandable internal dealings. This means for example that in \LaTeX{},
-    one can not inject a |\multicolumn| in the first iteration. Sometimes one
-    way work around this by injecting father |&\multicolumn| or |\\
-    \multicolumn|.
-
-  \item It does not create groups.
-
-  \item It makes no global assignments.
-
-  \item The iterated replacement text may close a group which was opened even
-    before the start of the loop (typical example being with |&| in
-    alignments).
-\begin{everbatim*}
-\begin{tabular}{rccccc}
-    \hline
-    \xintFor #1 in {A, B, C} \do {%
-      #1:\xintFor #2 in {a, b, c, d, e} \do {&($ #2 \to #1 $)}\\ }%
-    \hline
-\end{tabular}
-\end{everbatim*}
-  
-  \item There is no facility provided which would give access to a count of
-    the number of iterations as it is technically not easy to do so it in a
-    way working with nested loops while maintaining the ``expandable after
-    done'' property; something in the spirit of \csbxint{iloopindex} is
-    possible but this approach would bring its own limitations and
-    complications. Hence the user is invited to update her own count or
-    \LaTeX{} counter or macro at each iteration, if needed.
-
-  \item A |\macro| whose definition uses internally an \csbxint{For} loop
-    may be used inside another \csbxint{For} loop even if the two loops both
-    use the same macro parameter. The loop definition inside |\macro|
-    must use |##| as is the general rule for definitions done inside macros.
-
-  \item \csbxint{For} is for comma separated values and \csbxint{For*} for
-    lists of braced items; their respective expansion policies differ. They
-    are described later.
-\end{itemize}
-\unskip
-\end{framed}
-
-\noindent Regarding \csbxint{For}:
-\begin{itemize}[nosep, listparindent=\leftmarginiii]
-\item the spaces between the various declarative elements are all optional,
-\item in the list of comma separated values,  spaces around the commas or at
-  the start and end are ignored,
-\item if an item must contain itself its own commas, then it should
-  be braced, and the braces will be removed before feeding the iterated-over
-  text,
-\item the list may be a macro, it is expanded only once,
-\item items are not pre-expanded. The first item should be braced or start
-  with a space if the list is explicit and the item should not be
-  pre-expanded,
-\item empty items give empty |#1|'s in the replacement text, they are not
-  skipped,
-\item an empty list executes once the replacement text with an empty parameter
-  value,
-\item the list, if not a macro, \fbox{must be braced.}
-\end{itemize}
-
-\noindent Regarding \csbxint{For*}:\ntype{{\lowast f}n}
-\begin{itemize}[nosep, listparindent=\leftmarginiii]
-\item it handles lists of braced items (or naked tokens),
-\item it \hyperref[ssec:expansions]{\fexpan ds} the list,
-\item and more generally it \hyperref[ssec:expansions]{\fexpan ds} each naked
-  token encountered 
-  before assigning the |#1| values (gobbling spaces in the process);
-  this
-  makes it easy to simulate concatenation of multiple lists|\x|, |\y|:
-  if |\x| expands to |{1}{2}{3}| and |\y| expands to |{4}{5}{6}| then |{\x\y}|
-  as argument to |\xintFor*| has the same effect as |{{1}{2}{3}{4}{5}{6}}|.
-
-  For a further illustration see the use of |\xintFor*| at the end of
-  \autoref{ssec:fibonacci}.
-\item spaces at the start, end, or in-between items are gobbled (but naturally
-  not the spaces inside \emph{braced} items),
-\item except if the list argument is a macro (with no parameters), \fbox{it
-    must be braced.},
-\item an empty list leads to an empty result.
-\end{itemize}
-
-The macro \csbxint{Seq} which generates arithmetic sequences is to be used
-with \csbxint{For*} as its output consists of successive braced numbers (given
-as digit tokens).
-\begin{everbatim*}
-\xintFor* #1 in {\xintSeq [+2]{-7}{+2}}\do {stuff
-    with #1\xintifForLast{\par}{\newline}}
-\end{everbatim*}
-
-
-When nesting \csa{xintFor*} loops, using \csa{xintSeq} in the inner loops is
-inefficient, as the arithmetic sequence will be re-created each time. A more
-efficient style is:
-%
-\begin{everbatim}
-    \edef\innersequence {\xintSeq[+2]{-50}{50}}%
-    \xintFor* #1 in {\xintSeq {13}{27}} \do
-        {\xintFor* #2 in \innersequence \do {stuff with #1 and #2}%
-         .. some other macros .. }
-\end{everbatim}
-
-This is a general remark applying for any nesting of loops, one should avoid
-recreating the inner lists of arguments at each iteration of the outer loop.
-
-
-When the loop is defined inside a macro for later execution the |#| characters
-must be doubled.%
-%
-\footnote{sometimes what seems to be a macro argument isn't really; in
-  \csa{raisebox\{1cm\}\{}\csa{xintFor \#1 in \{a,b,c\} }\csa{do
-    \{\#1\}\}} no doubling should be done.}
-%
-For example:
-%
-\begin{everbatim*}
-\def\T{\def\z {}%
-  \xintFor* ##1 in {{u}{v}{w}} \do {%
-    \xintFor ##2 in {x,y,z} \do {%
-      \expandafter\def\expandafter\z\expandafter {\z\sep (##1,##2)} }%
-  }%
-}%
-\T\def\sep {\def\sep{, }}\z
-\end{everbatim*}
-
-Similarly when the replacement text
-of |\xintFor| defines a macro with parameters, the macro character |#| must be
-doubled.
-
-
-The iterated macros as well as the list items are allowed to contain explicit
-|\par| tokens.
-
-
-\subsection{\csh{xintifForFirst}, \csh{xintifForLast}}
-\label{xintifForFirst}\label{xintifForLast}
-
-\csbxint{ifForFirst}\,\texttt{\{YES branch\}\{NO branch\}}\etype{nn}
- and \csbxint{ifForLast}\,\texttt{\{YES
-  branch\}\hskip 0pt plus 0.2em \{NO branch\}}\etype{nn} execute the |YES| or
-|NO| branch
-if the
-\csbxint{For}
-or \csbxint{For*} loop is currently in its first, respectively last, iteration.
-
-Designed to work as expected under nesting (but see frame next.) Don't forget
-an empty brace pair |{}| if a branch is to do nothing. May be used multiple
-times in the replacement text of the loop.
-
-\begin{framed}
-  \noindent Pay attention to these implementation features:
-  \begin{itemize}[nosep, listparindent=\leftmarginiii]
-  \item \emph{if an inner \csbxint{For} loop is positioned before the
-    \csb{xintifForFirst} or \csb{xintifForLast} of the outer loop it will
-    contaminate their settings. This applies also naturally if the inner loop
-    arises from the expansion of some macro located before the outer
-    conditionals.}
-
-    One fix is to make sure that the outer conditionals are expanded before the
-    inner loop is executed, e.g. this will be the case if the inner loop is
-    located inside one of the branches of the conditional.
-
-    Another approach is to enclose, if feasible, the inner loop in a group of
-    its own.
-  \item \emph{if the replacement text closes a group (e.g. from a |&| inside an
-    alignment), the conditionals will lose their ascribed meanings and end up
-    possibly undefined, depending whether there is some outer loop whose
-    execution started before the opening of the group.}
-
-    The fix is to arrange things so that the conditionals are expanded
-    before \TeX\ encounters the closing-group token.
+  To produce a single file |xint-all.pdf| including both the user
+  documentation and the source code:
+  \begin{itemize}
+  \item acquire |xint.dtx| from 
+        \centeredline{\url{https://www.ctan.org/tex-archive/macros/generic/xint}}
+        and optionally the |Makefile| from the same location,
+  \item execute |etex xint.dtx| to extract files,
+  \item run |make --file=Makefile.mk xint-all.pdf|
   \end{itemize}
-\end{framed}
+  The last step can be simplified into |make xint-all.pdf| if the
+  |Makefile| was downloaded in step one (or extracted |Makefile.mk|
+  was renamed into |Makefile|).
 
-\subsection{ \csh{xintBreakFor}, \csh{xintBreakForAndDo}}
-\label{xintBreakFor}\label{xintBreakForAndDo}
+  These steps require not only |make| but also |latexmk|.
 
-One may immediately terminate an \csbxint{For} or \csbxint{For*} loop with
-\csbxint{BreakFor}.
+  See instructions in |xint-all.tex| (which is produced in the second
+  step) for alternatives without |make| or |latexmk|.
 
-\begin{framed}
-  As it acts by clearing up all the rest of the replacement text when
-  encountered, it will not work from inside some |\if...\fi| without
-  suitable |\expandafter| or swapping technique.
-
-  Also it can't be used from inside braces as from there it can't see the end
-  of the replacement text.
+  In particular it is possible to execute |latex| (three times may be
+  enough, then |dvipdfmx|), or |pdflatex|, directly on |xint.dtx|.  This
+  will produce a file |xint.pdf| including both the user manual and the
+  commented source code.
 \end{framed}
-
-There is also \csbxint{BreakForAndDo}. Both are illustrated by various examples
-in the next section which is devoted to ``forever'' loops.
-
-\subsection{\csh{xintintegers}, \csh{xintdimensions}, \csh{xintrationals}}
-\label{xintegers}\label{xintintegers}
-\label{xintdimensions}\label{xintrationals}
-
-If the list argument to \csbxint{For} (or \csbxint{For*}, both are equivalent in
-this context) is \csbxint{integers} (equivalently \csbxint{egers}) or more
-generally \csbxint{integers}|[||start|\allowbreak|+|\allowbreak|delta||]|
-(\emph{the whole within braces}!)%
-%
-\footnote{the |start+delta| optional specification may have extra spaces
-  around the plus sign of near the square brackets, such spaces are
-  removed. The same applies with \csa{xintdimensions} and
-  \csa{xintrationals}.},
-%
-then \csbxint{For} does an infinite iteration where
-|#1| (or |#2|, \dots, |#9|) will run through the arithmetic sequence of (short)
-integers with initial value |start| and increment |delta| (default values:
-|start=1|, |delta=1|; if the optional argument is present it must contains both
-of them, and they may be explicit integers, or macros or count registers). The
-|#1| (or |#2|, \dots, |#9|) will stand for |\numexpr <opt sign><digits>\relax|,
-and the litteral representation as a string of digits can thus be obtained as
-\fbox{\csa{the\#1}} or |\number#1|. Such a |#1| can be used in an |\ifnum| test
-with no need to be postfixed with a space or a |\relax| and one should
-\emph{not} add them.
-
-If the list argument is \csbxint{dimensions} or more generally
-\csbxint{dimensions}|[||start|\allowbreak|+|\allowbreak|delta||]|  (\emph{within
-  braces}!), then
-\csbxint{For} does an infinite iteration where |#1| (or |#2|, \dots, |#9|) will
-run through the arithmetic sequence of dimensions with initial value
-|start| and increment |delta|. Default values: |start=0pt|, |delta=1pt|; if
-the optional argument is present it must contain both of them, and they may
-be explicit specifications, or macros, or dimen registers, or length macros
-in \LaTeX{} (the stretch and shrink components will be discarded). The |#1|
-will be |\dimexpr <opt sign><digits>sp\relax|, from which one can get the
-litteral (approximate) representation in points via |\the#1|. So |#1| can be
-used anywhere \TeX{} expects a dimension (and there is no need in conditionals
-to insert a |\relax|, and one should \emph{not} do it), and to print its value
-one uses \fbox{\csa{the\#1}}. The chosen representation guarantees exact
-incrementation with no rounding errors accumulating from converting into
-points at each step.
-
-
-
-
-
-
-If the list argument to \csbxint{For} (or \csbxint{For*}) is \csbxint{rationals}
-or more generally
-\csbxint{rationals}|[||start|\allowbreak|+|\allowbreak|delta||]| (\emph{within
-  braces}!), then \csbxint{For} does an infinite iteration where |#1| (or |#2|,
-\dots, |#9|) will run through the arithmetic sequence of \xintfracname fractions
-with initial value |start| and increment |delta| (default values: |start=1/1|,
-|delta=1/1|). This loop works \emph{only with \xintfracname loaded}. if the
-optional argument is present it must contain both of them, and they may be given
-in any of the formats recognized by \xintfracname (fractions, decimal
-numbers, numbers in scientific notations, numerators and denominators in
-scientific notation, etc...) , or as macros or count registers (if they are
-short integers). The |#1| (or |#2|, \dots, |#9|) will be an |a/b| fraction
-(without a |[n]| part), where
-the denominator |b| is the product of the denominators of
-|start| and |delta| (for reasons of speed |#1| is not reduced to irreducible
-form, and for another reason explained later  |start| and |delta| are not put
-either into irreducible form; the input may use explicitely \csa{xintIrr} to
-achieve that).
-\begin{everbatim*}
-\begingroup\small
-\noindent\parbox{\dimexpr\linewidth-3em}{\color[named]{OrangeRed}%
-\xintFor #1 in {\xintrationals [10/21+1/21]} \do
-{#1=\xintifInt {#1}
-    {\textcolor{blue}{\xintTrunc{10}{#1}}}
-    {\xintTrunc{10}{#1}}% display in blue if an integer
-    \xintifGt {#1}{1.123}{\xintBreakFor}{, }%
-  }}
-\endgroup\smallskip
-\end{everbatim*}
-
-\smallskip The example above confirms that computations are done exactly, and
-illustrates that the two initial (reduced) denominators are not multiplied when
-they are found to be equal.  It is thus recommended to input |start| and |delta|
-with a common smallest possible denominator, or as fixed point numbers with the
-same numbers of digits after the decimal mark;  and this is also the reason why
-|start| and |delta| are not by default made irreducible. As internally the
-computations are done with numerators and denominators completely expanded, one
-should be careful not to input numbers in scientific notation with exponents in
-the hundreds, as they will get converted into as many zeroes.
-
-\begin{everbatim*}
-\noindent\parbox{\dimexpr.7\linewidth}{\raggedright
-\xintFor #1 in {\xintrationals [0.000+0.125]} \do
-{\edef\tmp{\xintTrunc{3}{#1}}%
- \xintifInt {#1}
-    {\textcolor{blue}{\tmp}}
-    {\tmp}%
-    \xintifGt {#1}{2}{\xintBreakFor}{, }%
-  }}\smallskip
-\end{everbatim*}
-
-We see here that \csbxint{Trunc} outputs (deliberately) zero as $0$, not (here)
-$0.000$, the idea being not to lose the information that the truncated thing was
-truly zero. Perhaps this behaviour should be changed? or made optional? Anyhow
-printing of fixed points numbers should be dealt with via dedicated packages
-such as |numprint| or |siunitx|.\par
-
-
-\subsection{\csh{xintForpair}, \csh{xintForthree}, \csh{xintForfour}}\label{xintForpair}\label{xintForthree}\label{xintForfour}
-
-The syntax\ntype{on} is illustrated in this
-example. The notation is the usual one for |n|-uples, with parentheses and
-commas. Spaces around commas and parentheses are ignored.
-%
-\begin{everbatim*}
-{\centering\begin{tabular}{cccc}
-    \xintForpair #1#2 in { ( A , a ) , ( B , b ) , ( C , c ) } \do {%
-      \xintForpair #3#4 in { ( X , x ) , ( Y , y ) , ( Z , z ) } \do {%
-        $\Biggl($\begin{tabular}{cc}
-          -#1- & -#3-\\
-          -#4- & -#2-\\
-        \end{tabular}$\Biggr)$&}\\\noalign{\vskip1\jot}}%
-\end{tabular}\\}
-\end{everbatim*}
-
-\csbxint{Forpair} must be followed by either |#1#2|, |#2#3|, |#3#4|, \dots, or
-|#8#9| with |#1| usable as an alias for |#1#2|, |#2| as alias for |#2#3|,
-etc \dots\ and similarly for \csbxint{Forthree} (using |#1#2#3| or simply
-|#1|, |#2#3#4| or simply |#2|, \dots) and \csbxint{Forfour} (with |#1#2#3#4|
-etc\dots).
-
-Nesting works as long as the macro parameters are distinct among |#1|, |#2|,
-..., |#9|. A macro which expands to an \csa{xintFor} or a
-\csa{xintFor(pair,three,four)} can be used in another one with no constraint
-about using distinct macro parameters.
-
-|\par| tokens are accepted in both the comma separated list and the
-replacement text.
-
-
-\subsection{\csh{xintAssign}}\label{xintAssign}
-
-\csa{xintAssign}\meta{braced things}\csa{to}%
-\meta{as many cs as they are things} %\ntype{{(f$\to$\lowast [x)}{\lowast N}}
-%
-defines (without checking if something gets overwritten) the control sequences
-on the right of \csa{to} to expand to the successive tokens or braced items
-located to the left of \csa{to}. \csa{xintAssign} is not an expandable macro.
-
-\fexpan sion is first applied to the material in front of \csa{xintAssign}
-which is fetched as one argument if it is braced. Then the expansion of this
-argument is examined and successive items are assigned to the macros following
-|\to|. There must be exactly as many macros as items. No check is done. The
-macro assignments are done with removal of one level of brace pairs from each
-item.
-
-After the initial \fexpan sion, each assigned (brace-stripped) item will be
-expanded according to the setting of the optional parameter.
-
-For example |\xintAssign [e]...| means that all assignments are done using
-|\edef|. With |[f]| the assignments will be made using
-\hyperref[fdef]{\ttfamily\char92fdef}. The default is simply to make the
-definitions with |\def|, corresponding to an empty optional paramter |[]|.
-Possibilities for the optional parameter are: |[], [g], [e], [x], [o], [go],
-[oo], [goo], [f], [gf]|. For example |[oo]| means a double expansion.
-\begin{everbatim*}
-\xintAssign \xintiiDivision{1000000000000}{133333333}\to\Q\R
-\meaning\Q\newline
-\meaning\R\newline
-\xintAssign {{\xintiiDivision{1000000000000}{133333333}}}\to\X
-\meaning\X\newline
-\xintAssign [oo]{{\xintiiDivision{1000000000000}{133333333}}}\to\X
-\meaning\X\newline
-\xintAssign \xintiiPow{7}{13}\to\SevenToThePowerThirteen
-\meaning\SevenToThePowerThirteen\par
-\end{everbatim*}
-
-Two special cases:
-\begin{itemize}[nosep]
-\item if after this initial expansion no brace is found immediately after
-  \csa{xintAssign}, it is assumed that there is only one control sequence
-  following |\to|, and this control sequence is then defined via |\def| (or
-  what is set-up by the optional parameter) to expand to the material between
-  \csa{xintAssign} and \csa{to}.
-\item if the material between \csa{xintAssign} and |\to| is enclosed in two
-  brace pairs, the first brace pair is removed, then the \fexpan sion is
-  immediately stopped by the inner brace pair, hence \csa{xintAssign} now
-  finds a unique item and thus defines only a single macro to be this item,
-  which is now stripped of the second pair of braces.
-\end{itemize}
-
-
-\emph{Note:} prior to release |1.09j|, |\xintAssign| did an |\edef| by default
-for each item assignment but it now does |\def| corresponding to no or empty
-optional parameter.
-
-It is allowed for the successive braced items to be separated by spaces. They
-are removed during the assignments. But if a single macro is defined (which
-happens if the argument after \fexpan sion does not start with a brace),
-naturally the scooped up material has all intervening spaces, as it is
-considered a
-single item. But an upfront initial space will have been absorbed by \fexpan
-sion.
-\begin{everbatim*}
-\def\X{ {a}  {b} {c}   {d} }\def\Y { u {a}  {b} {c}   {d} }
-\xintAssign\X\to\A\B\C\D
-\xintAssign\Y\to\Z
-\meaning\A, \meaning\B, \meaning\C, \meaning\D+++\newline
-\meaning\Z+++\par
-\end{everbatim*}
-As usual successive space characters in input make for a single \TeX\ space token.
-
-
-\subsection{\csh{xintAssignArray}}\label{xintAssignArray}
-
-\xintAssignArray \xintBezout {1000}{113}\to\Bez
-
-\csa{xintAssignArray}\meta{braced things}\csa{to}\csa{myArray}
-%
-%\ntype{{(f$\to$\lowast x)}N}
-%
-first expands fully what comes immediately after |\xintAssignArray| and
-expects to find a list of braced things |{A}{B}...| (or tokens). It then
-defines \csa{myArray} as a macro with one parameter, such that \csa{myArray\x}
-expands to give the |x|th braced thing of this original
-list (the argument \texttt{\x} itself is fed to a |\numexpr| by |\myArray|,
-and |\myArray| expands in two steps to its output). With |0| as parameter,
-\csa{myArray}|{0}| returns the number |M| of elements of the array so that the
-successive elements are \csa{myArray}|{1}|, \dots, \csa{myArray}|{M}|.
-%
-\leftedline{|\xintAssignArray \xintBezout {1000}{113}\to\Bez|} will set
-|\Bez{0}| to \dtt{\Bez0}, |\Bez{1}| to \dtt{\Bez1}, |\Bez{2}| to
-\dtt{\Bez2}, and |\Bez{3}| to \dtt{\Bez3}:
-\dtt{$\Bez1\times1000+\Bez2\times113=\Bez3$.}
-This macro is incompatible with expansion-only contexts.
-
-\csa{xintAssignArray} admits an optional parameter, for example
-|\xintAssignArray [e]| means that the definitions of the macros will be made
-with |\edef|. The empty optional parameter (default) means that definitions
-are done with |\def|. Other possibilities: |[], [o], [oo], [f]|. Contrarily to
-\csbxint{Assign} one can not use the |g| here to make the definitions global.
-For this, one should rather do |\xintAssignArray| within a group starting with
-|\globaldefs 1|.
-
-
-\subsection{\csh{xintDigitsOf}}\label{xintDigitsOf}
-
-This is a synonym for \csbxint{AssignArray},\ntype{fN} to be used to define
-an array giving all the digits of a given (positive, else the minus sign will
-be treated as first item) number.
-\begingroup\xintDigitsOf\xintiiPow {7}{500}\to\digits
-%
-\leftedline{|\xintDigitsOf\xintiiPow {7}{500}\to\digits|}
-\noindent $7^{500}$ has |\digits{0}=|\digits{0} digits, and the 123rd among them
-(starting from the most significant) is
-|\digits{123}=|\digits{123}.
-\endgroup
-
-\subsection{\csh{xintRelaxArray}}\label{xintRelaxArray}
-
-\csa{xintRelaxArray}\csa{myArray} %\ntype{N}
-%
-(globally) sets to \csa{relax} all macros which were defined by the previous
-\csa{xintAssignArray} with \csa{myArray} as array macro.
-
+\fi
 \clearpage
-\let\xinttoolsnameUp\undefined
-\def\n{|{N}|}
-\def\m{|{M}|}
-\def\x{|{x}|}
-
-\csname xintexprnameUp\endcsname
-\section{Macros of the \xintexprname package}%
-\RaisedLabel{sec:oldxintexpr}
-
-\localtableofcontents
-
-The \xintexprname package was first released with version |1.07|
-(|2013/05/25|) of the \xintname bundle. It was substantially enhanced with
-release |1.1| from |2014/10/28|.
-
-The |1.4| release from |2020/01/31| maintains the same general architecture
-but needed adapting all the code base for the switch from |\csname| to
-|\expanded| techniques. On this occasion the mechanism for defining functions
-was substantially strengthened.  The parser core mechanisms were improved too.
-
-The package loads automatically \xintfracname and \xinttoolsname.
-
-This section should be trimmed to contain only information not
-already covered in \autoref{sec:expr}.
-
-\subsection{The \csh{xintexpr} expressions}
-\label{xintexpr}
-\label{xinttheexpr}
-\label{thexintexpr}
-\label{xintthe}
-
-An \xintexprname{}ession is a construct
-\csbxint{expr}\meta{expandable\_expression}|\relax|\etype{x} where the
-expandable expression is read and completely expanded from left to right.
-
-An |\xintexpr...\relax| \emph{must} end in a |\relax| (which will be absorbed).
-Contrarily to a |\numexpr| expression, it is printable\CHANGED{1.4} as is without a prefix
-|\the| or |\number| (don't use them with |\xintexpr| this will raise an
-error).
-
-But one can use |\xintthe| prefix if one does need the explicit digits and
-other characters as in the final typesetted result.
-
-As an alternative and equivalent syntax to
-\begin{everbatim}
-\xintexpr round(<expression>, D)\relax
-\end{everbatim}
-there is
-\begin{everbatim}
-\xintiexpr [D] <expression> \relax
-\end{everbatim}
-For |D>0| this produces a decimal number with |D| figures after the decimal
-mark, which is the rounding of the expression. For |D=0| the rounding to an
-integer is produced. For |D<0| (and this was changed at |1.4f|), the rounded
-quotient of the expression by \verb=1e|D|= is produced.
-\begin{itemize}
-\item the expression may contain arbitrarily many levels of nested parenthesized
-  sub-expressions,
-\item the expression may contain explicitely or from a macro expansion a
-  sub-expression |\xintexpr...\relax|, which itself may contain a
-  sub-expressions etc\dots
-\item to let sub-contents evaluate as a sub-unit it should thus be either
-   \begin{enumerate}
-   \item parenthesized,
-   \item or a sub-expression |\xintexpr...\relax|.
-   \end{enumerate}
- \item to use an expression as argument to macros from \xintfracname,
-   or more generally to macros which expand their arguments, one must use the
-   |\xinttheexpr...\relax| or |\xintthe\xintexpr...\relax| forms.
- \item one should not use |\xintthe\xintexpr...\relax| as a sub-constituent of
-   another expression but only the
-   |\xintexpr...\relax| form which is more efficient in this context.
- \item each \xintexprname{}ession, whether prefixed or not with |\xintthe|, is
-   completely expandable and obtains its result in two expansion steps.
-\end{itemize}
-
-The information now following is possibly in need of updates.
-
-\begin{itemize}[parsep=0pt, labelwidth=\leftmarginii,
-  itemindent=0pt, listparindent=\leftmarginiii, leftmargin=\leftmarginii]
-\item An expression is built the standard way with opening and closing
-  parentheses, infix operators, and (big) numbers, with possibly a fractional
-  part, and/or scientific notation (except for \csbxint{iiexpr} which only
-  admits big integers). All variants work with comma separated expressions. On
-  output each comma will be followed by a space. A decimal number must have
-  digits either before or after the decimal mark.
-
-\item As everything gets expanded, the characters |.|, |+|, |-|, |*|, |/|, |^|,
-  |!|, |&|, \verb+|+, |?|, |:|, |<|, |>|, |=|, |(|, |)|, |"|, |]|, |[|, |@|
-  and the comma |,| should not (if used in the expression) be active. For
-  example, the French language in |Babel| system, for pdf\LaTeX, activates |!|,
-  |?|, |;| and |:|. Turn off the activity before expressions using such characters.
-
-  Alternatively the macro \csbxint{exprSafeCatcodes} resets all
-  characters potentially needed by \csbxint{expr} to their standard catcodes
-  and \csbxint{exprRestoreCatcodes} restores the former status.
-
-\item Count registers and |\numexpr|-essions are accepted (LaTeX{}'s counters
-  can be inserted using |\value|) natively without |\the| or |\number| as
-  prefix. Also dimen registers and control sequences, skip registers and
-  control sequences (\LaTeX{}'s lengths), |\dimexpr|-essions,
-  |\glueexpr|-essions are automatically unpacked using |\number|, discarding
-  the stretch and shrink components and giving the dimension value in |sp|
-  units ($1/65536$th of a \TeX{} point). Furthermore, tacit multiplication is
-  implied, when the (count or dimen or glue) register or variable, or the
-  (|\numexpr| or |\dimexpr| or |\glueexpr|) expression is immediately prefixed
-  by a (decimal) number. See \autoref{ssec:tacit multiplication} for the complete rules
-  of tacit multiplication.\IMPORTANT
-
-\item With a macro |\x| defined like this:
-  %
-  \leftedline{|\def\x {\xintexpr \a + \b \relax}| or |\edef\x {\xintexpr
-      \a+\b\relax}|}
-  %
-  one may then do |\xintthe\x|, either for printing the result on the page or
-  to use it in some other macros expanding their arguments. The |\edef| does
-  the computation immediately but keeps it in a protected form.
-  Naturally, the |\edef| is only possible if |\a| and |\b| are already
-  defined. With both approaches the |\x| can be inserted in other expressions,
-  as for example (assuming naturally as we use an |\edef| that in the
-  `yet-to-be computed' case the |\a| and |\b| now have some suitable meaning):
-  %
-  \leftedline {|\edef\y {\xintexpr \x^3\relax}|}
-
-\item There is also \csbxint{boolexpr}| ... \relax| and
-  \csbxint{theboolexpr}| ... \relax|.
-
-\item  See also
-  \csbxint{ifboolexpr} (\autoref{xintifboolexpr}) and the
-  \func{bool} and \func{togl} functions
-  in \autoref{sec:expr}. Here is an example. Well in fact the
-  example ended up using only \csbxint{boolexpr} so it 
-  was modified to use \csbxint{ifboolexpr}.
-\catcode`| 12 %
-\begin{everbatim*}
-\xintdeffunc A(p,q,r) =  p && (q || r) ;
-\xintdeffunc B(p,q,r) =  p || (q && r) ;
-\xintdeffunc C(p,q,r) =  xor(p, q, r)  ;
-
-\centeredline{\normalcolor
-\begin{tabular}{ccrclcl}
-        \xintFor* #1 in  {{False}{True}} \do {%
-        \xintFor* #2 in  {{False}{True}} \do {%
-        \xintFor* #3 in  {{False}{True}} \do {%
-    #1 &AND &(#2 &OR  &#3)&is&\textcolor[named]{OrangeRed}
-                              {\xintifboolexpr{A(#1,#2,#3)}{true}{false}}\\
-    #1 &OR  &(#2 &AND &#3)&is&\textcolor[named]{OrangeRed}
-                              {\xintifboolexpr{B(#1,#2,#3)}{yes}{no}}\\
-    #1 &XOR & #2 &XOR &#3 &is&\textcolor[named]{OrangeRed}
-                              {\xintifboolexpr{C(#1,#2,#3)}{oui}{non}}\\
-}}}
-\end{tabular}%
-}
-\end{everbatim*}\catcode`| 13
-
-\item See also \csbxint{ifsgnexpr}.
-
-\item There is  \csbxint{floatexpr}| ... \relax| where the algebra is done
-  in floating point approximation (also for each intermediate result). Use the
-  syntax |\xintDigits:=N\relax| to set the precision. Default: $16$ digits.
-  %
-  \leftedline{|\xintthefloatexpr 2^100000\relax:| \dtt{\xintthefloatexpr
-      2^100000\relax }}
-  %
-  The square-root operation can be used in |\xintexpr|, it is computed
-  as a float with the precision set by |\xintDigits| or by the optional
-  second argument:
-  %
-\begin{everbatim*}
-\xinttheexpr sqrt(2,60)\relax\newline
-Here the [60] is to avoid truncation to |\xinttheDigits| of precision on output.\newline
-\printnumber{\xintthefloatexpr [60] sqrt(2,60)\relax}
-\end{everbatim*}
-
-  Floats are quickly indispensable when using the power function, as exact
-  results will easily have hundreds, even thousands of digits.
-  %
-\begin{everbatim*}
-\xintDigits:=48\relax \xintthefloatexpr 2^100000\relax
-\end{everbatim*}
-
-  Only integer and (in |\xintfloatexpr...\relax|) half-integer exponents are
-  allowed.
-
-\item if one uses \emph{macros} within |\xintexpr..\relax| one should
-  obviously take into account that the parser will \emph{not} see the macro
-  arguments, hence one cannot use the syntax there, except if the arguments
-  are themselves wrapped as |\xinttheexpr...\relax| and assuming the macro
-  \fexpan ds these arguments.
-\end{itemize}
-\subsection{\texorpdfstring{\texttt{\protect\string\numexpr}}{\textbackslash
-    numexpr} or \texorpdfstring{\texttt{\protect\string\dimexpr}}{\textbackslash
-    dimexpr} expressions, count and dimension registers and variables}
-\label{ssec:countinexpr}
-
-Count registers, count control sequences, dimen registers, dimen control
-sequences (like |\parindent|), skips and skip control sequences, |\numexpr|,
-|\dimexpr|, |\glueexpr|, |\fontdimen| can be inserted directly, they will be
-unpacked using |\number| which gives the internal value in terms of scaled
-points for the dimensional variables: $1$\,|pt|${}=65536$\,|sp| (stretch and
-shrink components are thus discarded).
-
-Tacit multiplication (see \autoref{ssec:tacit multiplication}) is implied,
-when a number or decimal number prefixes such a register or control sequence.
-\LaTeX{} lengths are skip control sequences and \LaTeX{} counters should be
-inserted using |\value|.
-
-Release |1.2| of the |\xintexpr| parser also recognizes and prefixes with
-|\number| the |\ht|, |\dp|, and |\wd| \TeX{} primitives as well as the
-|\fontcharht|, |\fontcharwd|, |\fontchardp| and |\fontcharic| \eTeX{}
-primitives.
-
-In the case of numbered registers like |\count255| or |\dimen0| (or |\ht0|),
-the resulting digits will be re-parsed, so for example |\count255 0| is like
-|100| if |\the\count255| would give |10|. The same happens with inputs such
-as |\fontdimen6\font|. And |\numexpr 35+52\relax| will be exactly as if |87|
-as been encountered by the parser, thus more digits may follow: |\numexpr
-35+52\relax 000| is like |87000|. If a new |\numexpr| follows, it is treated
-as what would happen when |\xintexpr| scans a number and finds a non-digit: it
-does a tacit multiplication.
-\begin{everbatim*}
-\xinttheexpr \numexpr 351+877\relax\numexpr 1000-125\relax\relax{} is the same
-as \xinttheexpr 1228*875\relax.
-\end{everbatim*}
-
-Control sequences however (such as |\parindent|) are picked up as a whole by
-|\xintexpr|, and the numbers they define cannot be extended extra digits, a
-syntax error is raised if the parser finds digits rather than a legal
-operation after such a control sequence.
-
-A token list variable must be prefixed by |\the|, it will not be unpacked
-automatically (the parser will actually try |\number|, and thus fail). Do not
-use |\the| but only |\number| with a dimen or skip, as the |\xintexpr| parser
-doesn't understand |pt| and its presence is a syntax error. To use a dimension
-expressed in terms of points or other \TeX{} recognized units, incorporate it in
-|\dimexpr...\relax|.
-
-Regarding how dimensional expressions are converted by \TeX{} into scaled points
-see also \autoref{sec:Dimensions}.
-
-\subsection{Catcodes and spaces}
-
-The main problems are caused by active characters, because \csbxint{expr} et
-al.\@ expand forward whatever comes from token stream; they apply |\string|
-only in a second step.  For example the catcode of |&| from |&&| Boolean
-disjunction is not really important as long as it is not active, or comment,
-or escape...\@ or brace...\@ or ignored...\@ in brief, as long as it is reasonable,
-and in particular whether |@| is of catcode letter or other does not matter.
-
-It is always possible to insert manually the |\string| in the expression
-before a problematic (but reasonable) character catcode, or even to use
-|\detokenize| for a big chunk.  
-
-\subsubsection{\csh{xintexprSafeCatcodes}}
-\label{xintexprSafeCatcodes}
-
-Some problems with active characters can be resolved on the fly by prefixing
-them by |\string| but some aspects of the parsing done by \csbxint{expr}
-involves delimited macros which need the comma, equality sign and closing
-parenthesis to have their standard catcodes.
-
-So \csbxint{exprSafeCatcodes} is provided as a utility to set in one go
-catcodes of many characters to \csbxint{expr}-safely compatible values. This
-is a non-expandable step as it changes catcodes.
-%  This is used
-% internally by \csbxint{NewExpr} (restoring the catcodes on exit), hence it
-% does not have to be protected against active characters when used at
-% top-level.
-
-\csbxint{defvar}, \csbxint{deffunc}, et al., use it, and then they restore
-catcodes to the prior state via \csbxint{exprRestoreCatcodes}.
-
-% As \csbxint{NewExpr} and \csbxint{deffunc} and variants use internally some
-% |\scantokens|, they will (reasonably) succeed in sanitizing catcodes in the
-% expressions, even if all is from the replacement text of some macro whose
-% definition was done under some special catcode regime.
-
-% \csbxint{deffunc} is more lenient than \csbxint{defvar} regarding catcodes of
-% characters in expression bodies as it does some |\scantokens| which will reset
-% compatible catcodes.
-
-% Even if used in a context where catcodes are already set, \csbxint{deffunc},
-% \csbxint{defvar} and variants ignore completely the colon in |:=| so it can
-% have any (reasonable) catcode. Moreover it is optional.
-
-% The semi-colon in the syntax of \csbxint{Digits} is no real problem either
-% (cf. \csbxint{Digits} documentation).
-
-\subsubsection{\csh{xintexprRestoreCatcodes}}
-\label{xintexprRestoreCatcodes}
-
-Restores the catcodes to the state prevailing at the time of the last executed
-\csbxint{exprSafeCatcodes} (if located at the same \LaTeX\ environment or
-\TeX\ grouping level).
-
-Prior to |1.4k|, in a situation like the following:
-\begin{everbatim}
-\xintexprSafeCatcodes
-....stuff possibly changing catcodes
-\xintexprSafeCatcodes
-....stuff possibly changing catcodes
-\xintexprSafeCatcodes
-....stuff possibly changing catcodes
-\xintexprRestoreCatcodes
-\end{everbatim}
-On exit, the catcodes recovered their status as prior to the \emph{first}
-\csbxint{exprSafeCatcodes}.  Since |1.4k|, they are set to what they were
-prior to the \emph{last} \csbxint{exprSafeCatcodes}, i.e. the mechanism is now
-similar to a ``last in, first out'' stack.
-
-Note that no global assignments are made so the behaviour can be modified
-by usage of \TeX\ groups or \LaTeX\ environments: e.g. if an
-\csbxint{exprSafeCatcodes} is issued inside a \LaTeX\ environment it does not
-have to be paired by \csbxint{exprRestoreCatcodes} explicitly, the catcode
-scope is limited by the environment.
-
-\bigskip
-
-Spaces inside an |\xinttheexpr...\relax| should mostly be
-innocuous (except inside macro arguments).
-
-|\xintexpr| and |\xinttheexpr| are for the most part agnostic regarding
-catcodes, %  (unbraced) digits, binary operators, minus and plus signs as
-% prefixes, dot as decimal mark, parentheses, may be indifferently of catcode
-% letter or other or subscript or superscript, ..., except that they
-% should not be \emph{active}, as for example are |!?;:| with |babel-french|.%
-% %
-% \footnote{Furthermore, although \csbxint{expr} uses \csa{string}, it is
-%   escape-char agnostic. It should work with any \csa{escapechar} setting
-%   including -1.}
-but the characters
-% |+|, |-|, |*|, |/|, |^|, |!|, |&|, \verb+|+, |?|, |:|, |<|, |>|,
-%|=|, |(|, |)|, |"|, |[|, |]|, |;|, 
-in the expression should not be «active» (except on purpose) as everything is
-expanded along the way, and |\xintexpr| will choke on typesetting related
-commands. One can use |\string| to prefix a problematic character.
-
-
-Digits, slash, square brackets, minus sign, in the output from an
-|\xinttheexpr| are all of catcode 12. For |\xintthefloatexpr| the `e' in the
-output has its standard catcode ``letter''.
-
-
-
-
-\subsection{Expandability, \csh{xintexpro}}
-
-As is the case with all other package macros |\xintexpr| \fexpan ds (in two
-steps) to its final (somewhat protected) result; and |\xinttheexpr| \fexpan ds
-(in two steps) to the chain of digits (and possibly minus sign |-|, decimal
-mark |.|, fraction slash |/|, scientific |e|, square brackets |[|, |]|)
-representing the result.
-
-The once expanded |\xintexpr| is |\romannumeral0\xintexpro|.  is similarly
-|\xintiexpro| |\xintiiexpro| and |\xintfloatexpro|. For an example see
-\autoref{ssec:fibonacci}.
-
-An expression can only be legally finished by a |\relax| token, which
-will be absorbed.
-
-It is quite possible to nest expressions among themselves; for example, if one
-needs inside an |\xintiiexpr...\relax| to do some computations with fractions,
-rounding the final result to an integer, one just has to insert
-|\xintiexpr...\relax|. The functioning of the infix operators will not be in
-the least affected from the fact that the outer ``environment'' is the
-|\xintiiexpr| one.
-
-
-\subsection{\csh{xintDigits*}, \csh{xintSetDigits*}}
-\label{xintDigits*}
-\label{xintSetDigits*}
-
-These starred variants of \csbxint{Digits} and \csbxint{SetDigits} execute
-\csbxint{reloadxinttrig} and \csbxint{reloadxintlog}.
-
-\subsection{\csh{xintiexpr}, \csh{xinttheiexpr}}
-\label{xintiexpr}\label{xinttheiexpr}\label{thexintiexpr}
-
-Equivalent\etype{x} to doing |\xintexpr round(...)\relax| (more precisely,
-|round| is applied to each leaf item of the |ople| independently of its
-depth).
-
-Intermediate calculations are exact, only the final output gets
-rounded. Half integers are rounded towards $+\infty$ for positive
-numbers and towards $-\infty$ for negative ones.
-
-An optional parameter |D| within brackets, immediately after |\xintiexpr| is
-allowed: it instructs (for |D>0|) the expression to do its final rounding to
-the nearest value with that many digits after the decimal mark, i.e.\@
-|\xintiexpr [D] <expression>\relax| is equivalent (in case of a single
-expression) to |\xintexpr round(<expression>, D)\relax|.
-
-|\xintiexpr [0] ...| is the same as |\xintiexpr ...| and rounds to an integer.
-
-The case of negative |D| gives quantization to an integer multiple of
-\dtt{1e-D}.\NewWith{1.4a} This was modified at |1.4f| and the produced value
-is now the rounded quotient by \dtt{1e-D} (i.e. no trailing zeros nor
-scientific exponent in the output).
-
-If truncation rather than rounding is needed on can use |\xintexpr
-trunc(...)\relax| for truncation to an integer or |\xintexpr
-trunc(...,D)\relax| for quantization to an integer multiple or \dtt{1eD} (if
-|D>0|, for |D<0| the analog would be |trunc((...)/1e-D)|).  But
-this works only for a single scalar value.
-
-
-\subsection{\csh{xintiiexpr}, \csh{xinttheiiexpr}}
-\label{xintiiexpr}\label{xinttheiiexpr}\label{thexintiiexpr}
-
-This variant\etype{x} does not know fractions. It deals almost only with long
-integers. Comma separated lists of expressions are allowed.
-
-\begin{framed}
-  It maps |/| to the \emph{rounded} quotient. The operator
-  |//| is, like in |\xintexpr...\relax|, mapped to \emph{truncated} division.
-  The Euclidean quotient (which for positive operands is like the truncated
-  quotient) was, prior to release |1.1|, associated to |/|. The function
-  |quo(a,b)| can still be employed.
-\end{framed}
-
-The \csbxint{iiexpr}-essions use the `ii' macros for addition, subtraction,
-multiplication, power, square, sums, products, Euclidean quotient and
-remainder.
-
-The |round|, |trunc|, |floor|, |ceil| functions are still available, and are
-about the only places where fractions can be used, but |/| within, if not
-somehow hidden will be executed as integer rounded division. To avoid this one
-can wrap the input in \dtt{qfrac}: this means however that none of the normal
-expression parsing will be executed on the argument.
-
-To understand the illustrative examples, recall that |round| and |trunc| have
-a second (non negative) optional argument. In a normal \csbxint{expr}-essions,
-|round| and |trunc| are mapped to \csbxint{Round} and \csbxint{Trunc}, in
-\csbxint{iiexpr}-essions, they are mapped to \csbxint{iRound} and
-\csbxint{iTrunc}.
-
-
-\begin{everbatim*}
-\xinttheiiexpr 5/3, round(5/3,3), trunc(5/3,3), trunc(\xintDiv {5}{3},3),
-trunc(\xintRaw {5/3},3)\relax{} are problematic, but
-%
-\xinttheiiexpr 5/3,  round(qfrac(5/3),3), trunc(qfrac(5/3),3), floor(qfrac(5/3)),
-ceil(qfrac(5/3))\relax{} work!
-\end{everbatim*}
-
-On the other hand decimal numbers and scientific numbers can be used directly
-as arguments to the |num|, |round|, or any function producing an integer.
-
-\begin{framed}
-  Scientific numbers will be
-  represented with as many zeroes as necessary, thus one does not want to
-  insert \dtt{num(1e100000)} for example in an \csa{xintiiexpr}ession!
-\end{framed}
-
-%
-\begin{everbatim*}
-\xinttheiiexpr num(13.4567e3)+num(10000123e-3)\relax % should (num truncates) compute 13456+10000
-\end{everbatim*}
-%
-
-The |reduce| function is not available and will raise an error. The |frac|
-function also. The |sqrt| function is mapped to \csbxint{iiSqrt} which gives
-a truncated square root. The |sqrtr| function is mapped to \csbxint{iiSqrtR}
-which gives a rounded square root.
-
-One can use the Float macros if one is careful to use |num|, or |round|
-etc\dots on their output.
-
-\begin{everbatim*}
-\xinttheiiexpr \xintFloatSqrt [20]{2}, \xintFloatSqrt [20]{3}\relax % no operations
-
-\noindent The next example requires the |round|, and one could not put the |+| inside it:
-
-\xinttheiiexpr round(\xintFloatSqrt [20]{2},19)+round(\xintFloatSqrt [20]{3},19)\relax
-
-(the second argument of |round| and |trunc| tells how many digits from after the
-decimal mark one should keep.)
-\end{everbatim*}
-
-The whole point of \csbxint{iiexpr} is to gain some speed in
-\emph{integer-only} algorithms, and the above explanations related to how to
-nevertheless use fractions therein are a bit peripheral. We observed
-(2013/12/18) of the order of $30$\% speed gain when dealing with numbers with
-circa one hundred digits (1.2: this info may be obsolete).
-
-
-\subsection{\csh{xintboolexpr}, \csh{xinttheboolexpr}}
-\label{xintboolexpr}\label{xinttheboolexpr}\label{thexintboolexpr}
-
-Equivalent\etype{x} to doing |\xintexpr ...\relax| and returning $True$ if the
-result does not vanish, and $False$ if the result is zero. As |\xintexpr|, this
-can be used on comma separated lists of expressions, and even bracketed lists.
-\CHANGED{1.4}
-
-It can be customized, one only needs to modify the following:
-\begin{everbatim}
-\def\xintboolexprPrintOne#1{\xintiiifNotZero{#1}{True}{False}}%
-\end{everbatim}
-Not only are |True| and |False| usable in input, also |true| and |false| are
-pre-declared variables.
-
-Maybe obsolete:
-
-There is slight quirk in case it is used as a sub-expression: the boolean
-expression needs at least one logic operation else the value is not
-standardized to |1| or |0|, for example we get from
-\begin{everbatim*}
-\xinttheexpr \xintboolexpr 1.23\relax\relax\newline
-\end{everbatim*}which is to be compared with
-\begin{everbatim*}
-\xinttheboolexpr 1.23\relax
-\end{everbatim*}
-
-% A related issue existed with
-% |\xinttheexpr \xintiexpr 1.23\relax\relax|, which was fixed with |1.1|
-% release, and I decided back then not to add the needed overhead also to the
-% |\xintboolexpr| context, as one only needs to use |?(1.23)| for example or
-% involve the |1.23| in any logic operation like |1.23 'and' 3.45|, or involve
-% the |\xintboolexpr ..\relax | itself with any logical operation, contrarily to
-% the sub-|\xintiexpr| case where |\xinttheexpr 1+\xintiexpr 1.23\relax\relax|
-% did behave contrarily to expectations until |1.1|.
-
-
-\subsection{\csh{xintfloatexpr},
-  \csh{xintthefloatexpr}}
-\label{xintfloatexpr}\label{xintthefloatexpr}\label{thexintfloatexpr}
-
-\csbxint{floatexpr}|...\relax|\etype{x} is exactly like |\xintexpr...\relax|
-but with the four binary operations and the power function are mapped to
-\csa{xintFloatAdd}, \csa{xintFloatSub}, \csa{xintFloatMul}, \csa{xintFloatDiv}
-and \csa{xintFloatPower}, respectively.\footnote{Since |1.2f| the \string^
-  handles half-integer exponents, contrarily to \csa{xintFloatPower}.}
-
-The target precision for the computation is from the
-current setting of |\xintDigits|. Comma separated lists of expressions are
-allowed.
-
-An optional parameter within brackets is allowed:
-\begin{itemize}
-\item if positive it instructs the macro to round the result to that many
-  digits of precision. It thus makes sense to employ it only if this parameter is
-  less than the \csbxint{theDigits} precision.
-\item if negative it means to trim off that many digits (of course, in the
-  sense of rounding
-  the values to shorter mantissas). Don't use it to trim all digits (or more than all)!
-\end{itemize}
-
-Since |1.2f| all float operations first round their arguments; a parsed number
-is not rounded prior to its use as operand to such a float operation.
-
-|\thexintfloatexpr| is synonym to |\xintthefloatexpr|.
-
-|\xintDigits:=36\relax|\xintDigits:=36\relax 
-%
-\leftedline{|\xintthefloatexpr
-  (1/13+1/121)*(1/179-1/173)/(1/19-1/18)\relax|}
-%
-\leftedline{\dtt{\xintthefloatexpr
-  (1/13+1/121)*(1/179-1/173)/(1/19-1/18)\relax}}
-% 0.00564487459334466559166166079096852897
-%
-\leftedline{|\xintthefloatexpr\xintexpr
-  (1/13+1/121)*(1/179-1/173)/(1/19-1/18)\relax\relax|}
-%
-\leftedline{\dtt{\xintthefloatexpr\xintexpr
-  (1/13+1/121)*(1/179-1/173)/(1/19-1/18)\relax\relax}}
-
-\xintDigits := 16;
-
-The latter is the rounding of the exact result. The former one has
-its last three digits wrong due to the cumulative effect of rounding errors
-in the intermediate computations, as compared to exact evaluations.
-
-
-
-
-I recall here from \autoref{ssec:floatingpoint} that with release |1.2f| the
-float macros for addition, subtraction, multiplication and division round
-their arguments first to |P| significant places with |P| the asked-for
-precision of the output; and similarly the power macros and the
-square root macro. This does not modify anything for computations with
-arguments having at most |P| significant places already.
-
-\subsection{\csh{xinteval}, \csh{xintieval}, \csh{xintiieval},
-  \csh{xintfloateval}}
-\label{xinteval}\label{xintieval}\label{xintiieval}\label{xintfloateval}
-
-\csbxint{eval}\etype{x} is an \fexpan dable macro which is basically defined
-like this (this is obsolete since |1.4|):
-\begin{everbatim}
-\def\xinteval#1{\romannumeral-`0\xinttheexpr#1\relax}% THIS IS OLD DEFINITION
-\end{everbatim}
-thus expands in two steps.
-\begin{everbatim*}
-\xinteval{add(x^2, x = 100..110), add(x^3, x = 100..110)}
-\end{everbatim*}
-
-\csbxint{ieval}\etype{x} is similarly related to \csbxint{theiexpr}. Its
-optional argument may be located in the expected location for \LaTeX\ users
-since |1.4k|, but was long constrained to be inside the braces.
-\begin{everbatim*}
-\xintieval[7]{355/113} = \xintieval{[7]355/113}
-\end{everbatim*}
-
-If one defines a macro which will do something such as |\xintieval{#1}| it is
-recommended to code it as |\xintieval{\empty#1}| in case the |#1| will start
-with some |[|, which will end up confusing |\xintieval|.
-
-\csbxint{iieval}\etype{x} is similarly related to \csbxint{theiiexpr}.
-\begin{everbatim*}
-\xintiieval{add(x^2, x = 100..110), add(x^3, x = 100..110)}
-\end{everbatim*}
-
-\csbxint{floateval}\etype{x} is similarly related to
-\csbxint{thefloatexpr}.  The same remarks as for |\xintieval| apply.
-\begin{everbatim*}
-\xintfloateval [7]{355/113} = \xintfloateval{[7] 355/113}
-\end{everbatim*}
-
-When negative, the optional argument tells how many digits to remove from the
-prevailing precision (\csbxint{theDigits}):
-\begin{everbatim*}
-\xintfloateval[-2]{355/113}=\xintfloateval{[-2]355/113} has \xinttheDigits\ minus 2 digits.
-\end{everbatim*}
-
-These macros are useful when one uses some extra wrapper doing some parsing of
-its input, like the |\num| macro of
-\href{http://ctan.org/pkg/siunitx}{siunitx}, which would choke on some of the
-syntax elements allowed inside \csb{xintexpr}|...\relax| (for example
-brackets).
-As shown in the above examples, these macros, like the underlying parsers
-accept arbitrarily many comma separated expressions.
-
-
-\subsection{Using an expression parser within another one}
-
-This was already illustrated before. In the following:
-\begin{everbatim*}
-\xintfloatexpr \xintexpr add(1/i, i=1234..1243)\relax ^100\relax
-\end{everbatim*},
-the inner sum is computed exactly. Then it will be rounded to |\xinttheDigits|
-significant digits, and then its power will be evaluated as a float operation.
-One should avoid the "|\xintthe|" parsers in inner positions as this induces
-digit by digit parsing of the inner computation result by the outer parser.
-Here is the same computation done with floats all the way:
-\begin{everbatim*}
-\xintfloatexpr add(1/i, i=1234..1243)^100\relax
-\end{everbatim*}
-
-Not surprisingly this differs from the previous one which was exact until
-raising to the |100|th power.
-
-The fact that the inner expression occurs inside a bigger one has nil
-influence on its behaviour. There is the limitation though that the outputs
-from \csbxint{expr} and \csbxint{floatexpr} can not be used directly in
-\csbxint{theiiexpr} integer-only parser. But one can do:
-\begin{everbatim*}
-\xintiiexpr round(\xintfloatexpr 3.14^10\relax)\relax % or trunc
-\end{everbatim*}
-
-
-\subsection{\csh{xintFracToSci}}\label{xintFracToSci}
-
-% je ne dois pas mettre \Ff car la macro n'utilise pas \XINT_infrac
-
-\csa{xintFracToSci}\NewWith{1.4} is for usage by \csbxint{eval} for
-formatting the output of numbers.  It is not meant for direct use at
-user level as it currently expects input formatted in the so-called
-``relaxed raw format'' from \xintfracname, i.e. |A/B[N]|, with |/B| and
-|[N]| being optional parts, and |A|, |B|, |N| being integers, |B| always
-positive if present, and |A| having at most one leading minus sign (and
-no sign if it is zero, and no leading zeros).
-
-Here is what it does:\CHANGED{1.4e}
-\begin{itemize}[noitemsep,nosep]
-\item with input respectively: |A|, |A/B|, |A[N]|, |A/B[N]|
-\item it produces this output: |A|, |A/B| (if |B| is not |1|), |A| if
-  |N=0|, |A/B| if |N=0| (no |B| if |1|), and if
-  |N| is not zero, the output will be |AeN| written in scientific notation
-  exactly like it would by \csbxint{PFloat} but without of course prior
-  rounding to a given number of digits; in particular trailing zeros in the
-  significand will be removed.  Then this value in scientific notation
-  (or decimal fixed point notation if the scientific exponent is in the
-  range deciding so by \csbxint{PFloat}) will be attached to a trailing
-  denominator part |/B| (if not equal to |1|).
-\end{itemize}
-Please note:
-\begin{itemize}
-\item there is no reduction of the fraction |A/B| to lowest terms,
-\item trailing zeros in |B| are not moved and incorporated
-into the final scientific exponent,
-\item no attempt is made to check is |B| is only products of |2|'s and
-  |5|'s and thus could be integrated into some pure decimal notation for
-  the numerator or at least its significand.
-\end{itemize}
-This has not changed since |1.4| but is to be considered
-\emph{unstable}.  Actually even the description above was until |1.4k|
-only to be found in the commented source code... So everything is
-susceptible to change at some later release.
-
-Changes\CHANGED{1.4k} of \csbxint{PFloat} at |1.4k| have an impact here.
-In particular the zero value will give \dtt{0} whether the input was
-some |0|, |0e-5|, |0/3|, |0.00|, etc\dots, whereas at |1.4e| it would
-have been
-\dtt{0.0} for cases triggering some \csbxint{PFloat} subroutine.  See
-\csbxint{PFloatZero} for reenacting the |1.4e| behaviour.
-
-\medskip
-
-The output routine of \csbxint{eval} uses
-\csbxint{exprPrintOne} whose current default definition is:
-\begin{everbatim}
-\def\xintexprPrintOne{\xintFracToSci}
-\end{everbatim}
-Any replacement should obey the following blueprint:
-\begin{itemize}[noitemsep]
-\item to\xtype{} be expandable, but not necessarily \fexpan dable,
-\item to accept on input |A|, |A/B|, |A[N]|, or |A/B[N]|, i.e. the
-      ``relaxed raw''
-      \xintfracname format.
-\end{itemize}
-% These constraints\CHANGED{1.4e} are much simplified at |1.4e| (and
-% \csa{xintFracToSci} has been internally simplified to only have to obey
-% the reduced constraints, which is a breaking change).
-
-% At |1.4e| the handling\CHANGED{1.4e} by this macro of input with a scientific
-% exponent part has changed. Rather than producing an integer mantissa it now
-% does as \csbxint{PFloat}, apart of course from its initial step of
-% float-rounding.  It trims out trailing zeros of the input always.
-
-Attention, \csa{xintFracToSci} does not behave as do the public macros from
-\xintfracname:
-\begin{itemize}[noitemsep]
-\item it is expandable, but not \fexpan dable, so it can't appear as argument
-  to \xintfracname macros without an explicit |\expanded{...}| wrapper
-  (as they only \fexpan d their arguments).
-\item it expects input which after \fexpan sion will be in ``relaxed raw''
-  \xintfracname format.\IMPORTANT{}
-\end{itemize}
-
-%\noindent\csa{xintFracToSciE} has been removed at |1.4e|, see \csbxint{PFloatE}.
-
-\subsection{\csh{xintFracToDecimal}}
-\label{xintFracToDecimal}
-
-% je ne dois pas mettre \Ff car la macro n'utilise pas \XINT_infrac
-% mais je pourrais utiliser \xtype 
-It is a variant of \csbxint{FracToSci}\NewWith{1.4k}
-which differs from it in so far as it outputs a numerator using decimal
-notation, i.e. with as many zeros as are needed (and no more) and no
-scientific exponent.  The denominator goes through ``as is'' except if
-it is |1|, then it is omitted. 
-
-In other terms its behaviour is currently intermediate between
-\csbxint{DecToString} and \csbxint{DecToStringREZ}, as it does not
-remove trailing zeros of the denominator.
-
-It is not meant to be used directly as it shares the same limitations
-of \csbxint{FracToSci} for user level usage, but solely as a way to
-customize \csbxint{exprPrintOne}:
-\begin{everbatim}
-\def\xintexprPrintOne{\xintFracToDecimal}
-\end{everbatim}
-Consider its behaviour as \emph{unstable} and \emph{barely documented}.
-
-
-\subsection{The \csh{xintthecoords} macro}
-\label{xintthecoords}
-
-It converts (in two expansion steps) the expansion result of
-\csbxint{floatexpr} (or \csbxint{expr} or \csbxint{iiexpr}) into the |(a, b)
-(c, d) ...| format for list of coordinates as expected by the |TikZ|
-|coordinates| syntax.%
-\begin{everbatim*}
-\begin{figure}[htbp]
-\centering\begin{tikzpicture}[scale=10]\xintDigits:=8\relax 
-  \clip (-1.1,-.25) rectangle (.3,.25);
-  \draw [blue] (-1.1,0)--(1,0);
-  \draw [blue] (0,-1)--(0,+1);
-  \draw [red] plot[smooth] coordinates {%
-%%% (\xintthecoords converts output of next expression into (x1, y1) (x2, y2)... format)
-    \xintthecoords\xintfloatexpr
-%%%    This syntax -1+[0..4]/2 is currenty dropped at xint 1.4
-%%%    seq((x^2-1,mul(x-t,t=-1+[0..4]/2)),x=-1.2..[0.1]..+1.2)\relax
-%%%    Use this:
-    seq((x^2-1,mul(x-t,t=seq(-1+u/2, u=0..4))),x=-1.2..[0.1]..+1.2)
-    \relax
-     };
-\end{tikzpicture}
-\caption{Coordinates with \cs{xintthecoords}.}
-\end{figure}
-\end{everbatim*}
-
-% Notice: if x goes not take exactly value 1 or -1, the origin appears slightly
-% off the curve, not MY fault!!!
-It is currently undecided how \csa{xintthecoords} should handle bracketed
-data.\UNSTABLE{} Currently, it (or |TikZ|) will break it the input contains
-nested structures. One can use it with \func{flat} which removes all nesting.
-And in combination with \func{zip} it is easy to plot data given by some
-mechanism in separate
-lists of x- and y-coordinates (see an example in next section)
-
-\subsection{The \csh{xintthespaceseparated} macro}
-\label{xintthespaceseparated}
-
-It converts (in two expansion steps)\NewWith{1.4a} the expansion result of
-\csbxint{floatexpr} (or \csbxint{expr} or \csbxint{iiexpr}) into the space
-separated format suitable for usage with |PS-Tricks| |\listplot| macro.
-
-Here is for example some syntax (the replacement text of |\foo|, which is used
-here only to show that indeed complete expansion is attained in two steps)
-which can be used as argument to |\listplot|. Using 4 fractional decimal
-digits is sufficient when unit is the centimeter (it gives a fixed point
-precision of one micron, amply enough for plots...).
-\begin{everbatim*}
-\oodef\foo{%
-\xintthespaceseparated\xintiexpr[4]\xintfloatexpr seq((i, log10(i)), i=1..[0.5]..10)\relax\relax
-}\meaning\foo
-\end{everbatim*}
-
-Here we don't really need the inner |\xintfloatexpr...\relax| because the
-\func{log10} function works the same in the exact parser |\xintexpr| but in
-general this is recommended.
-
-It is currently undecided how \csa{xintthespaceseparated} should handle
-bracketed data.\UNSTABLE{} Currently, it (or |\listplot|) will break if the
-input contains nested structures. One can use it with \func{flat} which
-removes all nesting. And in combination with \func{zip} it is easy to plot
-data given by some mechanism in separate lists of x- and y-coordinates.
-
-\begin{everbatim*}
-% let's imagine we have something like this
-\def\Xcoordinates{1, 3, 5, 7, 9}
-\def\Ycoordinates{1, 9, 25, 49, 81}
-% then:
-|\xintthespaceseparated\xintexpr flat(zip([\Xcoordinates], [\Ycoordinates]))\relax|
-is suitable to use as argument to |\listplot|, as it expands to
-\xintthespaceseparated\xintexpr flat(zip([\Xcoordinates], [\Ycoordinates]))\relax
-\end{everbatim*}
-
-\subsection{\csh{xintifboolexpr}, \csh{xintifboolfloatexpr}, \csh{xintifbooliiexpr}}
-\label{xintifboolexpr}
-\label{xintifboolfloatexpr}
-\label{xintifbooliiexpr}
-
-\csh{xintifboolexpr}\marg{expr}\marg{YES}\marg{NO}\etype{xnn} does
-\csbxint{theexpr}<expr>|\relax| and then executes the \meta{YES} or the
-\meta{NO} branch depending on whether the outcome was non-zero or zero. Thus
-one can read \emph{if bool expr} as meaning \emph{if not zero}:
-\centeredline{if \meta{expr}-ession does not vanish do \meta{YES} else do
-  \meta{NO}}
-
-The expression is not limited to using only comparison operators and Boolean
-logic (|<|, |>|, |==|, |!=|, |&&|, \verb+||+, \func{all}, \func{any},
-\func{xor}, \func{bool}, \func{togl}, ...), it can be the most general
-computation.
-
-\csh{xintifboolfloatexpr}\marg{expr}\marg{YES}\marg{NO}\etype{xnn} does
-\csbxint{thefloatexpr}\meta{expr}|\relax| and then executes the \meta{YES} or the
-\meta{NO} branch depending on whether the outcome was non zero or zero.
-
-\csh{xintifbooliiexpr}\marg{expr}\marg{YES}\marg{NO}\etype{xnn} does
-\csbxint{theiiexpr}\meta{expr}|\relax| and then executes the \meta{YES} or the
-\meta{NO} branch depending on whether the outcome was non zero or zero.
-
-The expression argument must be a single one, comma separated sub-expressions
-will cause low-level errors.
-
-\subsection{\csh{xintifsgnexpr}, \csh{xintifsgnfloatexpr}, \csh{xintifsgniiexpr}}
-\label{xintifsgnexpr}
-\label{xintifsgnfloatexpr}
-\label{xintifsgniiexpr}
-
-\csh{xintifsgnexpr}\marg{expr}\marg{<0}\marg{=0}\marg{>0}\etype{xnnn} evaluates
-the \csbxint{expr}ession and chooses the branch corresponding to its sign.
-
-\csh{xintifsgnfloatexpr}\marg{expr}\marg{<0}\marg{=0}\marg{>0}\etype{xnnn} evaluates
-the \csbxint{floatexpr}ession and chooses the branch corresponding to its sign.
-
-\csh{xintifsgniiexpr}\marg{expr}\marg{<0}\marg{=0}\marg{>0}\etype{xnnn} evaluates
-the \csbxint{iiexpr}ession and chooses the branch corresponding to its sign.
-
-The expression argument must be a single one, comma separated sub-expressions
-will cause low-level errors.
-
-\subsection{The \csh{xintNewExpr}, \csh{xintNewIIExpr},
-  \csh{xintNewFloatExpr}, \csh{xintNewIExpr},  and \csh{xintNewBoolExpr}
-  macros}
-\label{xintNewExpr}
-\label{xintNewIIExpr}
-\label{xintNewFloatExpr}
-\label{xintNewIExpr}
-\label{xintNewBoolExpr}
-
-\csbxint{NewExpr} macro is used as:
-%
-\leftedline{|\xintNewExpr{\myformula}[n]|\marg{stuff}, where}
-\begin{itemize}
-\item \meta{stuff} will be inserted inside |\xinttheexpr . . . \relax|,
-\item |n| is an integer between zero and nine, inclusive, which is the number
-  of parameters of |\myformula|,
-\item the placeholders |#1|, |#2|, ..., |#n| are used inside \meta{stuff} in
-  their usual r\^ole,%
-%
-\catcode`# 12
-\footnote{if \csa{xintNewExpr} is used inside a macro,
-    the |#|'s must be doubled as usual.}
-  \footnote{the |#|'s will in pratice have their usual
-    catcode, but  category code other |#|'s are accepted too.}
-\catcode`# 6
-%
-\item the |[n]| is \emph{mandatory}, even for |n=0|.%
-\footnote{there is some use for \csa{xintNewExpr}|[0]| compared to an
-    \csa{edef} as \csa{xintNewExpr} has some built-in catcode protection.}
-\item the macro |\myformula| is defined without checking if it already exists,
-  \LaTeX{} users might prefer to do first |\newcommand*\myformula {}| to get a
-  reasonable error message in case |\myformula| already exists,
-\item the protection against active characters is done automatically (as long
-  as the whole thing has not already been fetched as a macro argument and
-  the catcodes correspondingly already frozen).
-\end{itemize}
-
-It (if it succeeds) will be a completely expandable macro entirely built-up using |\xintAdd|,
-|\xintSub|, |\xintMul|, |\xintDiv|, |\xintPow|, etc\dots as corresponds to the
-expression written with the infix operators.
-Macros created by |\xintNewExpr| can thus be nested.
-
-\begin{everbatim*}
-    \xintNewFloatExpr \FA [2]{(#1+#2)^10}
-    \xintNewFloatExpr \FB [2]{sqrt(#1*#2)}
-\begin{enumerate}[nosep]
-    \item \FA {5}{5}
-    \item \FB {30}{10}
-    \item \FA {\FB {30}{10}}{\FB {40}{20}}
-\end{enumerate}
-\end{everbatim*}
-
-The documentation is much shortened here because \csbxint{NewExpr} and \csbxint{deffunc}
-are very much related one with the other.
-
-\begin{framed}
-  ATTENTION!
-
-  The original spirit of \csbxint{NewExpr} was to define a (possibly very big)
-  macro using only \xintfracname, and this means in particular that it must be
-  used only with arguments compatible with the \xintfracname input
-  format.\IMPORTANTf
-
-  Thus an |\xintexpr| declared variable has no chance to work, it must be
-  wrapped explicitly in |\xinteval{...}| to be fetched as argument to a macro
-  constructed by \csbxint{NewExpr}.
-\end{framed}
-
-They share essentially the same limitations.
-
-Notice though that \csbxint{NewFloatExpr} accepts and recognizes the optional
-argument |[Q]| of \csbxint{floatexpr}, contrarily to \csbxint{deffloatfunc}.
-Use an |\empty| in case the contents are not known in advance.
-
-
-Historical note: prior to |1.4|, \xintexprname used a |\csname..\endcsname|
-encapsulation technique which impacted the string pool memory. The
-\csbxint{NewExpr} was designed as a method to pre-parse the expression and
-produce one single, gigantic, nested usage of the relevant \xintfracname
-macros. This way, only those macros were expanded which had nil impact on the
-\TeX{} string pool.
-
-Later on it was found that this mechanism could be employed to define
-functions. Basically underneath |98%| of \csbxint{NewExpr} and
-\csbxint{deffunc} are using the same shared code.
-
-\xintDigits:= 16\relax 
-
-\subsection{Analogies and differences of \csh{xintiiexpr} with \csh{numexpr}}
-
-\csbxint{iiexpr}|..\relax| is a parser of expressions knowing only (big)
-integers. There are, besides the enlarged range of allowable inputs, some
-important differences of syntax between |\numexpr| and |\xintiiexpr| and
-variants:
-\begin{itemize}
-\item Contrarily to |\numexpr|, the |\xintiiexpr| parser will stop expanding
-  only after having encountered (and swallowed) a \emph{mandatory} |\relax|
-  token.
-\item In particular, spaces between digits (and not only around infix
-  operators or parentheses) do not stop |\xintiiexpr|, contrarily to the
-  situation with |numexpr|: |\the\numexpr 7 + 3 5\relax| expands (in one
-  step)%
-%
-\footnote {The |\numexpr| triggers continued expansion after the space
-    following the |3| to check if some operator like |+| is upstream. But
-    after having found the |5| it treats it as and end-marker.}
-%
-  to \dtt{\detokenize\expandafter{\the\numexpr 7 + 3 5\relax}\unskip}, whereas
-  |\xintthe\xintiiexpr 7 + 3 5\relax| expands (in two steps) to
-  \dtt{\detokenize\expandafter\expandafter\expandafter {\xintthe\xintiiexpr 7
-      + 3 5\relax}}.%
-%
-\footnote {Since |1.2l| one can also use the underscore |_| to separate digits
-for readability of long numbers.}
-
-\item Inside an |\edef|, an expression |\xintiiexpr...\relax| get fully
-  evaluated, whereas |\numexpr| without |\the| or |\number| prefix would not,
-  if not itself embedded in another |\the\numexpr| or similar context.
-\item (ctd.) The private format to which |\xintiiexpr...\relax| (et al.)
-  evaluates may use |\xintthe| prefix to turn into explicit digits,
-  (for example in arguments to some macros which expand their arguments). The |\the| \TeX\ primitive prefix would
-  not work here.
-\item (ctd.) One can embed a |\numexpr...\relax| (with its |\relax|!) inside an
-  |\xintiiexpr...\relax| without |\the| or |\number|, but the reverse situation
-  requires usage of |\xintthe| or \csbxint{eval} user interface,
-\item |\numexpr -(1)\relax| is illegal. In contrast |\xintiiexpr -(1)\relax| is
-  perfectly legal and gives the expected result (what else ?).
-\item |\numexpr 2\cnta\relax| is illegal (with |\cnta| a |\count| register.)
-  In contrast
-  |\xintiiexpr 2\cnta\relax| is perfectly legal and will do the tacit
-  multiplication.
-\item |\the\numexpr| or |\number\numexpr| expands in one step, but
-  |\xintthe\xintiiexpr| or |\xinttheiiexpr| needs two steps.
-\end{itemize}
-
-\subsection{Chaining expressions for expandable algorithmics}
-\label{ssec:fibonacci}
-
-We will see in this section how to chain |\xintexpr|-essions with
-|\expandafter|'s, like it is possible with |\numexpr|. For this it is
-convenient to use |\romannumeral0\xintexpro| which is the once-expanded form of
-|\xintexpr|, as we can then chain using only one |\expandafter| each time.
-
-For example, here is the code employed
-on the title page to compute (expandably, of course!) the 1250th Fibonacci
-number:
-
-\begin{everbatim*}
-\catcode`_ 11
-\def\Fibonacci #1{%  \Fibonacci{N} computes F(N) with F(0)=0, F(1)=1.
-    \expandafter\Fibonacci_a\expandafter
-        {\the\numexpr #1\expandafter}\expandafter
-        {\romannumeral0\xintiiexpro 1\expandafter\relax\expandafter}\expandafter
-        {\romannumeral0\xintiiexpro 1\expandafter\relax\expandafter}\expandafter
-        {\romannumeral0\xintiiexpro 1\expandafter\relax\expandafter}\expandafter
-        {\romannumeral0\xintiiexpro 0\relax}}
-%
-\def\Fibonacci_a #1{%
-    \ifcase #1
-          \expandafter\Fibonacci_end_i
-    \or
-          \expandafter\Fibonacci_end_ii
-    \else
-          \ifodd #1
-              \expandafter\expandafter\expandafter\Fibonacci_b_ii
-          \else
-              \expandafter\expandafter\expandafter\Fibonacci_b_i
-          \fi
-    \fi {#1}%
-}% * signs are omitted from the next macros, tacit multiplications
-\def\Fibonacci_b_i #1#2#3{\expandafter\Fibonacci_a\expandafter
-  {\the\numexpr #1/2\expandafter}\expandafter
-  {\romannumeral0\xintiiexpro sqr(#2)+sqr(#3)\expandafter\relax\expandafter}\expandafter
-  {\romannumeral0\xintiiexpro (2#2-#3)#3\relax}%
-}% end of Fibonacci_b_i
-\def\Fibonacci_b_ii #1#2#3#4#5{\expandafter\Fibonacci_a\expandafter
-  {\the\numexpr (#1-1)/2\expandafter}\expandafter
-  {\romannumeral0\xintiiexpro sqr(#2)+sqr(#3)\expandafter\relax\expandafter}\expandafter
-  {\romannumeral0\xintiiexpro (2#2-#3)#3\expandafter\relax\expandafter}\expandafter
-  {\romannumeral0\xintiiexpro #2#4+#3#5\expandafter\relax\expandafter}\expandafter
-  {\romannumeral0\xintiiexpro #2#5+#3(#4-#5)\relax}%
-}% end of Fibonacci_b_ii
-%         code as used on title page:
-%\def\Fibonacci_end_i  #1#2#3#4#5{\xintthe#5}
-%\def\Fibonacci_end_ii #1#2#3#4#5{\xinttheiiexpr #2#5+#3(#4-#5)\relax}
-%         new definitions:
-\def\Fibonacci_end_i  #1#2#3#4#5{{#4}{#5}}% {F(N+1)}{F(N)} in \xintexpr format
-\def\Fibonacci_end_ii #1#2#3#4#5%
-    {\expandafter
-     {\romannumeral0\xintiiexpro #2#4+#3#5\expandafter\relax
-      \expandafter}\expandafter
-     {\romannumeral0\xintiiexpro #2#5+#3(#4-#5)\relax}}% idem.
-% \FibonacciN returns F(N) (in encapsulated format: needs \xintthe for printing)
-\def\FibonacciN {\expandafter\xint_secondoftwo\romannumeral-`0\Fibonacci }%
-\catcode`_ 8
-\end{everbatim*}
-
-
-The macro |\Fibonacci| produces not one specific value |F(N)| but a pair of
-successive values |{F(N)}{F(N+1)}| which can then serve as starting point of
-another routine devoted to compute a whole sequence |F(N), F(N+1),
-F(N+2),....|. Each of |F(N)| and |F(N+1)| is kept in the encapsulated internal
-\xintexprname format.
-
-|\FibonacciN| produces the single |F(N)|. It also keeps it in the private
-format; thus printing it will need the |\xintthe| prefix.
-
-\begingroup\footnotesize\sffamily\baselineskip 10pt
-Here a code snippet which
-checks the routine via a \string\message\ of the first $51$ Fibonacci
-numbers (this is not an efficient way to generate a sequence of such
-numbers, it is only for validating \csa{FibonacciN}).
-%
-\begin{everbatim}
-\def\Fibo #1.{\xintthe\FibonacciN {#1}}%
-\message{\xintiloop [0+1] \expandafter\Fibo\xintiloopindex.,
-                          \ifnum\xintiloopindex<49 \repeat \xintthe\FibonacciN{50}.}
-\end{everbatim}
-\endgroup
-
-The way we use |\expandafter|'s to chain successive |\xintiiexpro| evaluations
-is exactly analogous to what is possible with |\numexpr|. The various
-|\romannumeral0\xintiiexpro| could very well all have been |\xintiiexpr|'s but
-then we would have needed |\expandafter\expandafter\expandafter| each
-time.
-
-\begin{framed}
-  There is a difference though: |\numexpr| does \emph{NOT} expand inside an
-  |\edef|, and to force its expansion we must prefix it with |\the| or
-  |\number| or |\romannumeral| or another |\numexpr| which is itself prefixed,
-  etc\dots.
-
-  But |\xintexpr|, |\xintiexpr|, ..., expand fully in an |\edef|, with the
-  completely expanded
-  result encapsulated in a private format.
-
-  Using |\xintthe| as prefix is necessary to print the result (like |\the| or
-  |\number| in the case of |\numexpr|), but it is not necessary to get the
-  computation done (contrarily to the situation with |\numexpr|).
-\end{framed}
-
-
-Our |\Fibonacci| expands completely under \fexpan sion, so we can use
-\hyperref[fdef]{\ttfamily\char92fdef} rather than |\edef| in a situation such
-as
-%
-\leftedline {|\fdef \X {\FibonacciN {100}}|}
-%
-but it is usually about as efficient to employ |\edef|. And if we want
-%
-\leftedline{|\edef \Y {(\FibonacciN{100},\FibonacciN{200})}|,}
-%
-then |\edef| is necessary.
-
-Allright, so let's now give the code to generate |{F(N)}{F(N+1)}{F(N+2)}...|,
-using |\Fibonacci| for the first two and then using the standard recursion
-|F(N+2)=F(N+1)+F(N)|:
-
-\catcode`_ 11
-\def\FibonacciSeq #1#2{%#1=starting index, #2>#1=ending index
-    \expandafter\Fibonacci_Seq\expandafter
-    {\the\numexpr #1\expandafter}\expandafter{\the\numexpr #2-1}%
-}%
-\def\Fibonacci_Seq #1#2{%
-     \expandafter\Fibonacci_Seq_loop\expandafter
-                {\the\numexpr #1\expandafter}\romannumeral0\Fibonacci {#1}{#2}%
-}%
-\def\Fibonacci_Seq_loop #1#2#3#4{% standard Fibonacci recursion
-    {#3}\unless\ifnum #1<#4  \Fibonacci_Seq_end\fi
-        \expandafter\Fibonacci_Seq_loop\expandafter
-        {\the\numexpr #1+1\expandafter}\expandafter
-        {\romannumeral0\xintiiexpro #2+#3\relax}{#2}{#4}%
-}%
-\def\Fibonacci_Seq_end\fi\expandafter\Fibonacci_Seq_loop\expandafter
-    #1\expandafter #2#3#4{\fi {#3}}%
-\catcode`_ 8
-
-\begingroup\footnotesize\baselineskip10pt
-\everb|@
-\catcode`_ 11
-\def\FibonacciSeq #1#2{%#1=starting index, #2>#1=ending index
-    \expandafter\Fibonacci_Seq\expandafter
-    {\the\numexpr #1\expandafter}\expandafter{\the\numexpr #2-1}%
-}%
-\def\Fibonacci_Seq #1#2{%
-     \expandafter\Fibonacci_Seq_loop\expandafter
-                {\the\numexpr #1\expandafter}\romannumeral0\Fibonacci {#1}{#2}%
-}%
-\def\Fibonacci_Seq_loop #1#2#3#4{% standard Fibonacci recursion
-    {#3}\unless\ifnum #1<#4  \Fibonacci_Seq_end\fi
-        \expandafter\Fibonacci_Seq_loop\expandafter
-        {\the\numexpr #1+1\expandafter}\expandafter
-        {\romannumeral0\xintiiexpro #2+#3\relax}{#2}{#4}%
-}%
-\def\Fibonacci_Seq_end\fi\expandafter\Fibonacci_Seq_loop\expandafter
-    #1\expandafter #2#3#4{\fi {#3}}%
-\catcode`_ 8
-|
-\endgroup
-
-This |\FibonacciSeq| macro is
-completely expandable but it is not \fexpan dable.
-
-This is not a problem in the next example which uses \csbxint{For*} as the
-latter applies repeatedly full expansion to what comes next each time it
-fetches an item from its list argument. Thus \csbxint{For*} still manages to
-generate the list via iterated full expansion.
-
-
-\begin{figure*}[ht!]
-  \phantomsection\label{fibonacci}
-  \newcounter{myindex}
-  \fdef\Fibxxx{\FibonacciN {30}}%
-  \setcounter{myindex}{30}%
-\centeredline{\tabskip 1ex
-\vbox{\halign{\bfseries#.\hfil&#\hfil &\hfil #\cr
-  \xintFor* #1 in {\FibonacciSeq {30}{59}}\do
-  {\themyindex &\xintthe#1 &
-    \xintiiRem{\xintthe#1}{\xintthe\Fibxxx}\stepcounter{myindex}\cr }}%
-}\vrule
-\vbox{\halign{\bfseries#.\hfil&#\hfil &\hfil #\cr
-  \xintFor* #1 in {\FibonacciSeq {60}{89}}\do
-  {\themyindex &\xintthe#1 &
-    \xintiiRem{\xintthe#1}{\xintthe\Fibxxx}\stepcounter{myindex}\cr }}%
-}\vrule
-\vbox{\halign{\bfseries#.\hfil&#\hfil &\hfil #\cr
-  \xintFor* #1 in {\FibonacciSeq {90}{119}}\do
-  {\themyindex &\xintthe#1 &
-   \xintiiRem{\xintthe#1}{\xintthe\Fibxxx}\stepcounter{myindex}\cr }}%
-}}%
-%
-\centeredline{Some Fibonacci numbers together with their residues modulo
-  |F(30)|\dtt{=\xintthe\Fibxxx}}
-\end{figure*}
-
-\begingroup\footnotesize\baselineskip10pt
-\everb|@
-\newcounter{myindex}% not "index", which would overwrite theindex environment!
-% (many have probably been bitten by this trap)
-\tabskip 1ex
-  \fdef\Fibxxx{\FibonacciN {30}}%
-  \setcounter{myindex}{30}%
-\vbox{\halign{\bfseries#.\hfil&#\hfil &\hfil #\cr
-  \xintFor* #1 in {\FibonacciSeq {30}{59}}\do
-  {\themyindex &\xintthe#1 &
-    \xintiiRem{\xintthe#1}{\xintthe\Fibxxx}\stepcounter{myindex}\cr }}%
-}\vrule
-\vbox{\halign{\bfseries#.\hfil&#\hfil &\hfil #\cr
-  \xintFor* #1 in {\FibonacciSeq {60}{89}}\do
-  {\themyindex &\xintthe#1 &
-    \xintiiRem{\xintthe#1}{\xintthe\Fibxxx}\stepcounter{myindex}\cr }}%
-}\vrule
-\vbox{\halign{\bfseries#.\hfil&#\hfil &\hfil #\cr
-  \xintFor* #1 in {\FibonacciSeq {90}{119}}\do
-  {\themyindex &\xintthe#1 &
-   \xintiiRem{\xintthe#1}{\xintthe\Fibxxx}\stepcounter{myindex}\cr }}%
-}%
-|
-\endgroup
-
-This produces the Fibonacci numbers from |F(30)| to |F(119)|, and
-computes also  all the
-congruence classes modulo |F(30)|.  The output has
-been put in a \hyperref[fibonacci]{float}, which appears
-\vpageref[above]{fibonacci}. I leave to the mathematically inclined
-readers the task to explain the visible patterns\dots |;-)|.
-
-\subsection{When expandability is too much}
-
-Let's use the macros of \autoref{ssec:fibonacci} related to Fibonacci numbers.
-Notice that the $47$th Fibonacci number is \dtt{\xintthe\FibonacciN {47}} thus
-already too big for \TeX{} and \eTeX{}.
-
-
-The |\FibonacciN| macro found in \autoref{ssec:fibonacci} is completely
-expandable, it is even \fexpan dable. We need a wrapper with |\xintthe|
-prefix
-\begin{everbatim*}
-\def\theFibonacciN{\xintthe\FibonacciN}
-\end{everbatim*}
-to print in the document or to use within |\message| (or \LaTeX\ |typeout|) to
-write to the log and terminal.
-
-\begingroup
-  \def\A {1859}  \def\B {1573}
-  \edef\X {\theFibonacciN\A}  \edef\Y {\theFibonacciN\B}
-  \edef\GCDAB {\xintiiGCD\A\B}\edef\Z {\theFibonacciN\GCDAB}
-  \edef\GCDXY{\xintiiGCD\X\Y}
-
-  The |\xintthe| prefix also allows its use it as argument to the \xintname
-  macros: for example if we are interested in knowing how many digits
-  $F(1250)$ has, it suffices to issue |\xintLen {\theFibonacciN {1250}}|
-  (which expands to \dtt{\xintLen {\theFibonacciN {1250}}}). Or if we want to
-  check the formula $gcd(F(1859),F(1573))=F(gcd(1859,1573))=F(143)$, we only
-  need%
-%
-\footnote{The
-  \csa{xintiiGCD} macro is provided by both the \xintgcdname package (since
-  |1.0|) and by the \xintname package (since |1.3d|).}
-%
-\begin{everbatim}
-$\xintiiGCD{\theFibonacciN{1859}}{\theFibonacciN{1573}}=%
- \theFibonacciN{\xintiiGCD{1859}{1573}}$
-\end{everbatim}
-%
-which produces:
-%
-\leftedline{$\dtt{\xintiiGCD{\X}{\Y}}=\dtt{\theFibonacciN{\GCDAB}}$}
-
-The |\theFibonacciN| macro expanded its |\xintiiGCD{1859}{1573}| argument via the
-services of |\numexpr|: this step allows only things obeying the \TeX{} bound,
-naturally! (but \dtt{F(\xintiiPow2{31}}) would be rather big anyhow...).
-
-This is very convenient but of course it repeats the complete evaluation each
-time it is done. In practice, it is often useful to store the result of such
-evaluations in macros. Any |\edef| will break expandability, but if the goal
-is at some point to print something to the |dvi| or |pdf| output, and not only
-to the |log| file, then expandability has to be broken one day or another!
-
-Hence, in practice, if we want to print in the document some computation
-results, we can proceed like this and avoid having to repeat identical
-evaluations:
-\begin{everbatim}
-\begingroup
-  \def\A {1859}  \def\B {1573}
-  \edef\X {\theFibonacciN\A}  \edef\Y {\theFibonacciN\B}
-  \edef\GCDAB {\xintiiGCD\A\B}\edef\Z {\theFibonacciN\GCDAB}
-  \edef\GCDXY{\xintiiGCD\X\Y}
-The identity $\gcd(F(\A),F(\B))=F(\gcd(\A,\B))$ can be checked via evaluation
-of both sides: $\gcd(F(\A),F(\B))=\gcd(\printnumber\X,\printnumber\Y)=
-\printnumber{\GCDXY} = F(\gcd(\A,\B)) = F(\GCDAB) =\printnumber\Z$.\par
-          % some further computations involving \A, \B, \X, \Y
-\endgroup % closing the group removes assignments to \A, \B, ...
-% or choose longer names less susceptible to overwrite something.
-% Note: there is no LaTeX \newecommand which would be to \edef like \newcommand is to \def
-\end{everbatim}
-The identity $\gcd(F(\A),F(\B))=F(\gcd(\A,\B))$ can be checked via evaluation
-of both sides: $\gcd(F(\A),F(\B))=\gcd(\printnumber\X,\printnumber\Y)=
-\printnumber{\GCDXY} = F(\gcd(\A,\B)) = F(\GCDAB) =\printnumber\Z$.\par
-\endgroup
-
-One may legitimately ask the author: why expandability
-to such extremes, for things such as big fractions or floating point numbers
-(even continued fractions...) which anyhow can not be used directly within
-\TeX's primitives such as |\ifnum|? Why insist on a concept
-which is foreign to the vast majority of \TeX\ users and even programmers?
-
-I have no answer: it made definitely sense at the start of \xintname (see
-\autoref{ssec:origins}) and once started I could not stop.
-
-
-\subsection{Acknowledgements (2013/05/25)}
-
-I was greatly helped in my preparatory thinking, prior to producing such an
-expandable parser, by the commented source of the
-\href{https://ctan.org/pkg/l3kernel}{l3fp} package, specifically the
-|l3fp-parse.dtx| file (in the version of April-May 2013; I think there was in
-particular a text called ``roadmap'' which was helpful). Also the source of the
-|calc| package was instructive, despite the fact that here for |\xintexpr| the
-principles are necessarily different due to the aim of achieving expandability.
-
-\clearpage
-\expandafter\let\csname xintexprnameUp\endcsname\undefined
-\csname ExamplesnameUp\endcsname
-\section {More examples with \xinttoolsname or \xintexprname or both}
-\RaisedLabel{sec:examples}
-
-Note: \xintexprname.sty automatically loads \xinttoolsname.sty.
-
-The examples given here start to feel dated and are currently in need of some
-rewrite to better illustrate newer features of the package.
-
- 
-\localtableofcontents
-
-\subsection{More examples with dummy variables}
-\label{ssec:moredummies}
-
-These examples were first added to this manual at the time of the |1.1|
-release (|2014/10/29|).
-
-\begin{everbatim*}
-Prime numbers are always cool
-\xinttheiiexpr seq((seq((subs((x/:m)?{(m*m>x)?{1}{0}}{-1},m=2n+1))
-                        ??{break(0)}{omit}{break(1)},n=1++))?{x}{omit},
-               x=10001..[2]..10200)\relax
-\end{everbatim*}
-
-The syntax in this last example may look a bit involved (...\@ and it is so I
-admit). First |x/:m| computes |x modulo m| (this is the modulo with respect to
-floored division). The |(x)?{yes}{no}| construct checks if |x| (which
-\emph{must} be within parentheses) is true or false, i.e.\@ non zero or zero. It
-then executes either the |yes| or the |no| branch, the non chosen branch is
-\emph{not} evaluated. Thus if |m| divides |x| we are in the second (``false'')
-branch. This gives a |-1|. This |-1| is the argument to a |??| branch which is
-of the type |(y)??{y<0}{y=0}{y>0}|, thus here the |y<0|, i.e.\@, |break(0)| is
-chosen. This |0| is thus given to another |?| which consequently chooses
-|omit|, hence the number is not kept in the list. The numbers which survive
-are the prime numbers.
-
-\begin{everbatim*}
-The first Fibonacci number beyond |2^64|, |2^64|, and the index are respectively
-\xinttheiiexpr subs(iterr(0,1;(@1>N)?{break(@1,N,i)}{@1+ at 2},i=1++),N=2^64)\relax.
-\end{everbatim*}
-
-% A006877 In the `3x+1' problem, these values for the starting value set new
-% records for number of steps to reach 1. (Formerly M0748) 14 1, 2, 3, 6, 7,
-% 9, 18, 25, 27, 54, 73, 97, 129, 171, 231, 313, 327, 649, 703, 871, 1161,
-% 2223, 2463, 2919, 3711, 6171, 10971, 13255, 17647, 23529, 26623, 34239,
-% 35655, 52527, 77031, 106239, 142587, 156159, 216367, 230631, 410011, 511935,
-% 626331, 837799
-
-One more recursion:
-\begin{everbatim*}
-\def\syr #1{\xinttheiiexpr rseq(#1; (@<=1)?{break(i)}{odd(@)?{3 at +1}{@//2}},i=0++)\relax}
-The 3x+1 problem: \syr{231}\par
-\end{everbatim*}
-
-OK, a final one:%
-\begin{everbatim*}
-\def\syrMax #1{\xintiiexpr iterr(#1,#1;even(i)?
-                                       {(@2<=1)?{break(@1,i//2)}{odd(@2)?{3 at 2+1}{@2//2}}}
-                                       {(@1>@2)?{@1}{@2}},i=0++)\relax }
-With initial value 1161, the maximal intermediate value and the number of steps
-needed to reach 1 are respectively \syrMax{1161}.\par
-\end{everbatim*}
-
-Look at the
-  \hyperlink{BrentSalamin}{Brent-Salamin algorithm implementation} for a more
-  interesting recursion.
-
-% \begin{everbatim*}
-% \newcommand\Factors [1]{\xinttheiiexpr
-%     subs(seq((i/:3=1)?{omit}{[L][i]},i=0..len(L)-1),
-%     L=rseq(#1;(p^2>[@][0])?{([@][0]>1)?{break(1,[@][0],1)}{abort}}
-%                           {(([@][0])/:p)?{omit}
-%     {iter(([@][0])//p; (@/:p)?{break(@,p,e)}{@//p},e=1++)}},p=2++))\relax }
-% \Factors {41^4*59^2*29^3*13^5*17^8*29^2*59^4*37^6}
-% \end{everbatim*}
-
-% This might look a bit scary, I admit.%
-% %
-% \footnote{Look at the
-%   \hyperlink{BrentSalamin}{Brent-Salamin algorithm implementation} for a much
-%   saner example.} 
-% %
-
-% \xintexprname has minimal tools and
-% is obstinate about doing everything expandably! We are hampered by absence of a
-% notion of ``nuple''. The algorithm divides |N| by |2| until no more possible,
-% then by |3|, then by |4| (which is silly), then by |5|, then by |6| (silly
-% again), \dots.
-
-% The variable |L=rseq(#1;...)| expands, if one follows the steps, to a comma
-% separated list starting with the initial (evaluated) |N=#1| and then
-% pseudo-triplets where the first item is |N| trimmed of small primes, the
-% second item is the last prime divisor found, and the third item is its
-% exponent in original |N|.
-
-% The algorithm needs to keep handy the last computed quotient by prime powers,
-% hence all of them, but at the very end it will be cleaner to get rid of them
-% (this corresponds to the first line in the code above). This is achieved in a
-% cumbersome inefficient way; indeed each item extraction |[L][i]| is costly: it
-% is not like accessing an array stored in memory, due to expandability, nothing
-% can be stored in memory! Nevertheless, this step could be done here in a far
-% less inefficient manner if there was a variant of |seq| which, in the spirit
-% of \csbxint{iloopindex}, would know how many steps it had been through so far.
-% This is a feature to be added to |\xintexpr|! (as well as a |++| construct
-% allowing a non unit step).
-
-% Notice that in |iter(([@][0])//p;| the |@| refers to the previous triplet (or
-% in the first step to |N|), but the latter |@| showing up in |(@/:p)?| refers
-% to the previous value computed by |iter|.
-
-% \begin{snugframed}
-%   Parentheses are essential in |..([y][0])| else the parser will see |..[| and
-%   end up in ultimate confusion, and also in |([@][0])/:p| else the parser will
-%   see the itemwise operator |]/| on lists and again be very confused (I could
-%   implement a |]/:| on lists, but in this situation this would also be very
-%   confusing to the parser.)
-% \end{snugframed}
-
-% See \autoref{ssec:factorize} for a routine |\Factorize| written directly with
-% \xintname macros. Last time I checked |\Factors| was about seven times slower
-% than |\Factorize| in test cases such as
-% |16246355912554185673266068721806243461403654781833| and others. Among the
-% various things explaining the speed difference, there is fact that the
-% |\Factorize| algorithm step by increments of two, not one, and also it divides
-% only once, obtaining quotient and remainder in one go. These two things
-% already make for a speed-up factor of about four. Thus, |\Factors| is not
-% completely inefficient in comparison, and was quite easier to come up with
-% than |\Factorize|.
-
-\subsection{Completely expandable prime test}
-\label{ssec:primesI}
-
-Let us now construct a completely expandable macro which returns $1$ if its
-given input is prime and $0$ if not:
-\everb|@
-\def\remainder #1#2{\the\numexpr #1-(#1/#2)*#2\relax }
-\def\IsPrime #1%
- {\xintANDof {\xintApply {\remainder {#1}}{\xintSeq {2}{\xintiiSqrt{#1}}}}}
-|
-
-This uses \csbxint{iiSqrt} and assumes its input is at least $5$. Rather than
-\xintname's own \csbxint{iiRem} we used a quicker |\numexpr| expression as we
-are dealing with short integers. Also we used \csbxint{ANDof} which will
-return $1$ only if all the items are non-zero. The macro is a bit
-silly with an even input, ok, let's enhance it to detect an even input:
-\everb|@
-\def\IsPrime #1%
-   {\xintiiifOdd {#1}
-        {\xintANDof % odd case
-            {\xintApply {\remainder {#1}}
-                        {\xintSeq [2]{3}{\xintiiSqrt{#1}}}%
-            }%
-        }
-        {\xintifEq {#1}{2}{1}{0}}%
-   }
-|
-
-We used the \xintname expandable tests (on big integers or fractions)
-in order for |\IsPrime| to be \fexpan dable.
-
-Our integers are short, but without |\expandafter|'s with
-|\@firstoftwo|, % @ n'est plus actif dans le dtx 1.1 !
-or some other related techniques,
-direct use of |\ifnum..\fi| tests is dangerous. So to make the macro more
-efficient we are going to use the expandable tests provided by the package
-\href{http://ctan.org/pkg/etoolbox}{etoolbox}%
-%
-\footnote{\url{http://ctan.org/pkg/etoolbox}}.
-%
-The macro becomes:
-%
-\everb|@
-\def\IsPrime #1%
-   {\ifnumodd {#1}
-    {\xintANDof % odd case
-     {\xintApply {\remainder {#1}}{\xintSeq [2]{3}{\xintiiSqrt{#1}}}}}
-    {\ifnumequal {#1}{2}{1}{0}}}
-|
-
-In the odd case however we have to assume the integer is at least $7$, as
-|\xintSeq| generates an empty list if |#1=3| or |5|, and |\xintANDof| returns
-$1$ when supplied an empty list. Let us ease up a bit |\xintANDof|'s work by
-letting it work on only $0$'s and $1$'s. We could use:
-%
-\everb|@
-\def\IsNotDivisibleBy #1#2%
-  {\ifnum\numexpr #1-(#1/#2)*#2=0 \expandafter 0\else \expandafter1\fi}
-|
-\noindent
-where the |\expandafter|'s are crucial for this macro to be \fexpan dable and
-hence work within the applied \csbxint{ANDof}. Anyhow, now that we have loaded
-\href{http://ctan.org/pkg/etoolbox}{etoolbox}, we might as well use:
-%
-\everb|@
-\newcommand{\IsNotDivisibleBy}[2]{\ifnumequal{#1-(#1/#2)*#2}{0}{0}{1}}
-|
-\noindent
-Let us enhance our prime macro to work also on the small primes:
-\everb|@
-\newcommand{\IsPrime}[1] % returns 1 if #1 is prime, and 0 if not
-  {\ifnumodd {#1}
-    {\ifnumless {#1}{8}
-      {\ifnumequal{#1}{1}{0}{1}}% 3,5,7 are primes
-      {\xintANDof
-         {\xintApply
-        { \IsNotDivisibleBy {#1}}{\xintSeq [2]{3}{\xintiiSqrt{#1}}}}%
-        }}% END OF THE ODD BRANCH
-    {\ifnumequal {#1}{2}{1}{0}}% EVEN BRANCH
-}
-|
-
-The input is still assumed positive. There is a deliberate blank before
-\csa{IsNotDivisibleBy} to use this feature of \csbxint{Apply}: a space stops the
-expansion of the applied macro (and disappears). This expansion will be done by
-\csbxint{ANDof}, which has been designed to skip everything as soon as it finds
-a false (i.e.\@ zero) input. This way, the efficiency is considerably improved.
-
-We did generate via the \csbxint{Seq} too many potential divisors though. Later
-sections give two variants: one with \csbxint{iloop} (\autoref{ssec:primesII})
-which is still expandable and another one (\autoref{ssec:primesIII}) which is a
-close variant of the |\IsPrime| code above but with the \csbxint{For} loop, thus
-breaking expandability. The \hyperref[ssec:primesII]{xintiloop variant} does not
-first evaluate the integer square root, the \hyperref[ssec:primesIII]{xintFor
-  variant} still does. I did not compare their efficiencies.
-
-
-Let us construct with this expandable primality test a table of the prime
-numbers up to $1000$. We need to count how many we have in order to know how
-many tab stops one shoud add in the last row.%
-%
-\footnote{although a tabular row may have less tabs than in the
-  preamble, there is a problem with the \char`\|\space\space vertical
-  rule, if one does that.}
-%
-There is some subtlety for this
-last row. Turns out to be better to insert a |\\| only when we know for sure we
-are starting a new row; this is how we have designed the |\OneCell| macro. And
-for the last row, there are many ways, we use again |\xintApplyUnbraced| but
-with a macro which gobbles its argument and replaces it with a tabulation
-character. The \csbxint{For*} macro would be more elegant here.
-%
-\everb?@
-\newcounter{primecount}
-\newcounter{cellcount}
-\newcommand{\NbOfColumns}{13}
-\newcommand{\OneCell}[1]{%
-    \ifnumequal{\IsPrime{#1}}{1}
-     {\stepcounter{primecount}
-      \ifnumequal{\value{cellcount}}{\NbOfColumns}
-       {\\\setcounter{cellcount}{1}#1}
-       {&\stepcounter{cellcount}#1}%
-     } % was prime
-  {}% not a prime, nothing to do
-}
-\newcommand{\OneTab}[1]{&}
-\begin{tabular}{|*{\NbOfColumns}{r}|}
-\hline
-2  \setcounter{cellcount}{1}\setcounter{primecount}{1}%
-   \xintApplyUnbraced \OneCell {\xintSeq [2]{3}{999}}%
-   \xintApplyUnbraced \OneTab
-      {\xintSeq [1]{1}{\the\numexpr\NbOfColumns-\value{cellcount}\relax}}%
-    \\
-\hline
-\end{tabular}
-There are \arabic{primecount} prime numbers up to 1000.
-?
-
-The table has been put in \hyperref[primesupto1000]{float} which appears
-\vpageref{primesupto1000}.
-We had to be careful to use in the last row \csbxint{Seq} with its optional
-argument |[1]| so as to not generate a decreasing sequence from |1| to |0|, but
-really an empty sequence in case the row turns out to already have all its
-cells (which doesn't happen here but would with a number of columns dividing
-$168$).
-%
-\newcommand{\IsNotDivisibleBy}[2]{\ifnumequal{#1-(#1/#2)*#2}{0}{0}{1}}
-
-\newcommand{\IsPrime}[1]
-   {\ifnumodd {#1}
-        {\ifnumless {#1}{8}
-          {\ifnumequal{#1}{1}{0}{1}}% 3,5,7 are primes
-          {\xintANDof
-             {\xintApply
-                { \IsNotDivisibleBy {#1}}{\xintSeq [2]{3}{\xintiiSqrt{#1}}}}%
-            }}% END OF THE ODD BRANCH
-        {\ifnumequal {#1}{2}{1}{0}}% EVEN BRANCH
-}
-
-\newcounter{primecount}
-\newcounter{cellcount}
-\newcommand{\NbOfColumns}{13}
-\newcommand{\OneCell}[1]
-     {\ifnumequal{\IsPrime{#1}}{1}
-        {\stepcounter{primecount}
-         \ifnumequal{\value{cellcount}}{\NbOfColumns}
-            {\\\setcounter{cellcount}{1}#1}
-            {&\stepcounter{cellcount}#1}%
-        } % was prime
-        {}% not a prime nothing to do
-}
-\newcommand{\OneTab}[1]{&}
-\begin{figure*}[ht!]
-  \centering
-  \phantomsection\label{primesupto1000}
-  \begin{tabular}{|*{\NbOfColumns}{r}|}
-    \hline
-    2\setcounter{cellcount}{1}\setcounter{primecount}{1}%
-    \xintApplyUnbraced \OneCell {\xintSeq [2]{3}{999}}%
-    \xintApplyUnbraced \OneTab
-    {\xintSeq [1]{1}{\the\numexpr\NbOfColumns-\value{cellcount}\relax}}%
-    \\
-    \hline
-  \end{tabular}
-\smallskip
-\centeredline{There are \arabic{primecount} prime numbers up to 1000.}
-\end{figure*}
-
-\subsection{Another completely expandable prime test}
-\label{ssec:primesII}
-
-The |\IsPrime| macro from \autoref{ssec:primesI} checked expandably if a (short)
-integer was prime, here is a partial rewrite using \csbxint{iloop}. We use the
-|etoolbox| expandable conditionals for convenience, but not everywhere as
-|\xintiloopindex| can not be evaluated while being braced. This is also the
-reason why |\xintbreakiloopanddo| is delimited, and the next macro
-|\SmallestFactor| which returns the smallest prime factor examplifies that. One
-could write more efficient completely expandable routines, the aim here was only
-to illustrate use of the general purpose \csbxint{iloop}. A little table giving
-the first values of |\SmallestFactor| follows, its coding uses \csbxint{For},
-which is described later; none of this uses count registers.
-%
-
-
-\begin{everbatim*}
-\let\IsPrime\undefined \let\SmallestFactor\undefined % clean up possible previous mess
-\newcommand{\IsPrime}[1] % returns 1 if #1 is prime, and 0 if not
-  {\ifnumodd {#1}
-    {\ifnumless {#1}{8}
-      {\ifnumequal{#1}{1}{0}{1}}% 3,5,7 are primes
-      {\if
-       \xintiloop [3+2]
-       \ifnum#1<\numexpr\xintiloopindex*\xintiloopindex\relax
-           \expandafter\xintbreakiloopanddo\expandafter1\expandafter.%
-       \fi
-       \ifnum#1=\numexpr (#1/\xintiloopindex)*\xintiloopindex\relax
-       \else
-       \repeat 00\expandafter0\else\expandafter1\fi
-      }%
-    }% END OF THE ODD BRANCH
-    {\ifnumequal {#1}{2}{1}{0}}% EVEN BRANCH
-}%
-\catcode`_ 11
-\newcommand{\SmallestFactor}[1] % returns the smallest prime factor of #1>1
-  {\ifnumodd {#1}
-    {\ifnumless {#1}{8}
-      {#1}% 3,5,7 are primes
-      {\xintiloop [3+2]
-       \ifnum#1<\numexpr\xintiloopindex*\xintiloopindex\relax
-           \xint_afterfi{\xintbreakiloopanddo#1.}%
-       \fi
-       \ifnum#1=\numexpr (#1/\xintiloopindex)*\xintiloopindex\relax
-           \xint_afterfi{\expandafter\xintbreakiloopanddo\xintiloopindex.}%
-       \fi
-       \iftrue\repeat
-      }%
-     }% END OF THE ODD BRANCH
-   {2}% EVEN BRANCH
-}%
-\catcode`_ 8
-{\centering
-  \begin{tabular}{|c|*{10}c|}
-    \hline
-    \xintFor #1 in {0,1,2,3,4,5,6,7,8,9}\do {&\bfseries #1}\\
-    \hline
-    \bfseries 0&--&--&2&3&2&5&2&7&2&3\\
-    \xintFor #1 in {1,2,3,4,5,6,7,8,9}\do
-    {\bfseries #1%
-      \xintFor #2 in {0,1,2,3,4,5,6,7,8,9}\do
-      {&\SmallestFactor{#1#2}}\\}%
-    \hline
-  \end{tabular}\par
-}
-\end{everbatim*}
-
-\subsection{Miller-Rabin Pseudo-Primality expandably}
-\label{ssec:PrimesIV}
-
-
-% 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,
-5, 7, 11, 13, 17$. If this is true and $n<341550071728321$ (which has 15
-digits) then $n$ really is a prime number.
-
-Similarly $n=3825123056546413051$ (19 digits) is the smallest composite number
-which is a strong pseudo prime for bases $2, 3, 5, 7, 11, 13, 17, 19$ and
-$23$. It is easy to extend the code below to include these additional tests
-(we could make the list of tested bases an argument too, now that I think
-about it.)
-
-For more information see
-  \centeredline{\url{https://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test#Deterministic_variants_of_the_test}}
-  and
-\centeredline{\url{http://primes.utm.edu/prove/prove2_3.html}}
-
-In particular, according to \textsc{Jaeschke} \emph{On strong pseudoprimes to
-  several bases,} Math. Comp., 61 (1993) 915-926, if $n < 4,759,123,141$ it is
-enough to establish Rabin-Miller pseudo-primality to bases $a = 2, 7, 61$ to
-prove that $n$ is prime. This range is enough for \TeX\ numbers and we could
-then write a very fast expandable primality test for such numbers using only
-|\numexpr|. Left as an exercise\dots
-
-\begin{everbatim*}
-% I -------------------------------- Modular Exponentiation
-% Computes x^m modulo n (with m non negative).
-% We will always use it with 1 < x < n
-%
-% With xint 1.4 we should use ? and ?? (although in the case at hand ifsgn()
-% and if() would be ok but I should not say that).
-%
-\xintdefiifunc powmod_a(x, m, n) :=
-       isone(m)?
-           % m=1, return x modulo n
-           {   x /: n  }
-           % m > 1 test if odd or even and do recursive call
-           {   odd(m)? {  x*sqr(powmod_a(x, m//2, n)) /: n }
-                       {    sqr(powmod_a(x, m//2, n)) /: n }
-            }
-         ;
-\xintdefiifunc powmod(x, m, n) := (m)?{powmod_a(x, m, n)}{1};
-
-%% Syntax used before xint 1.4:
-% \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_a(x, m//2, n))) /: n,
-%                             sqr(powmod_a(x, m//2, n))  /: n
-%                 )
-%          );
-% \xintdefiifunc powmod(x, m, n) := if(m, powmod_a(x, m, n), 1);
-
-% II ------------------------------ Miller-Rabin compositeness witness
-
-% n=2^k m + 1 with m odd and k at least 1
-
-% Choose 1<x<n.
-% compute y=x^m modulo n
-% if equals 1 we can't say anything
-% if equals n-1 we can't say anything
-% else put j=1, and
-% compute repeatedly the square, incrementing j by 1 each time,
-% thus always we have y^{2^{j-1}}
-%   -> if at some point n-1 mod n found, we can't say anything and break out
-%   -> if however we never find n-1 mod n before reaching
-%        z=y^{2^{k-1}} with j=k
-%        we then have z^2=x^{n-1}.
-    % Suppose z is not -1 mod n. If z^2 is 1 mod n, then n can be prime only if
-    % z is 1 mod n, and we can go back up, until initial y, and we have already
-    % excluded y=1. Thus if z is not -1 mod n and z^2 is 1 then n is not prime.
-    % But if z^2 is not 1, then n is not prime by Fermat. Hence (z not -1 mod n)
-    % implies (n is composite). (Miller test)
-
-% let's use again xintexpr indecipherable (except to author) syntax. Of course
-% doing it with macros only would be faster.
-
-% Here \xintdefiifunc is not usable because not compatible with iter, break, ... 
-% but \xintNewFunction comes to the rescue.
-
-\xintNewFunction{isCompositeWitness}[4]{% x=#1, n=#2, m=#3, k=#4
-   subs((y==1)?{0}
-         {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
-
-% cf
-%  http://oeis.org/A014233
-%     <http://mathworld.wolfram.com/Rabin-MillerStrongPseudoprimeTest.html>
-%     <http://mathworld.wolfram.com/StrongPseudoprime.html>
-
-% check if positive integer <49 si a prime.
-% 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47
-\def\IsVerySmallPrime #1%
-    {\ifnum#1=1 \xintdothis0\fi
-     \ifnum#1=2 \xintdothis1\fi
-     \ifnum#1=3 \xintdothis1\fi
-     \ifnum#1=5 \xintdothis1\fi
-     \ifnum#1=\numexpr (#1/2)*2\relax\xintdothis0\fi
-     \ifnum#1=\numexpr (#1/3)*3\relax\xintdothis0\fi
-     \ifnum#1=\numexpr (#1/5)*5\relax\xintdothis0\fi
-     \xintorthat 1}
-
-\xintNewFunction{isPseudoPrime}[1]{% n = #1
-     (#1<49)?% use ? syntax to evaluate only what is needed
-% prior to 1.4 we had \xintthe#1 here but the actual tokens represented
-% by this #1 when isPseudoPrime() function expands have changed and 
-% the correct way is now \xintiieval{#1} to hand over explicit digits to
-% the \IsVerySmallPrime macro.
-       {\IsVerySmallPrime{\xintiieval{#1}}}
-       {(even(#1))?
-        {0}
-        {subs(%
-         % L expands to two values m, k hence isCompositeWitness does get
-         % its four variables x, n, m, k
-         isCompositeWitness(2, #1, L)?
-          {0}%
-          {isCompositeWitness(3, #1, L)?
-           {0}%
-           {isCompositeWitness(5, #1, L)?
-            {0}%
-            {isCompositeWitness(7, #1, L)?
-             {0}%
-% above enough for N<3215031751 hence all TeX numbers
-             {isCompositeWitness(11, #1, L)?
-              {0}%
-% above enough for N<2152302898747, hence all 12-digits numbers
-              {isCompositeWitness(13, #1, L)?
-               {0}%
-% above enough for N<3474749660383
-               {isCompositeWitness(17, #1, L)?
-                {0}%
-% above enough for N<341550071728321
-                {1}%
-               }% not needed to comment-out end of lines spaces inside
-              }%  \xintexpr but this is too much of a habit for me with TeX!
-             }%   I left some after the ? characters.
-            }%
-           }%
-          }% this computes (m, k) such that n = 2^k m + 1, m odd, k>=1
-          , L=iter(#1//2;(even(@))?{@//2}{break(@,k)},k=1++))%
-         }%
-        }%
-}
-
-% if needed:
-%\def\IsPseudoPrime #1{\xinttheiiexpr isPseudoPrime(#1)\relax}
-
-\noindent The smallest prime number at least equal to 3141592653589 is
-\xintiiexpr 
-   seq(isPseudoPrime(3141592653589+n)?
-                    {break(3141592653589+n)}{omit}, n=0++)\relax.
-% we could not use 3141592653589++ syntax because it works only with TeX numbers
-\par
-\end{everbatim*}
-
-
-
-
-
-\subsection{A table of factorizations}
-\label{ssec:factorizationtable}
-
-As one more example with \csbxint{iloop} let us use an alignment to display the
-factorization of some numbers. The loop will actually only play a minor r\^ole
-here, just handling the row index, the row contents being almost entirely
-produced via a macro |\factorize|. The factorizing macro does not use
-|\xintiloop| as it didn't appear to be the convenient tool. As |\factorize| will
-have to be used on |\xintiloopindex|, it has been defined as a delimited macro.
-
-To spare some fractions of a second in the compilation time of this document
-(which has many many other things to do), \number"7FFFFFED{} and
-\number"7FFFFFFF, which turn out to be prime numbers, are not given to
-|factorize| but just typeset directly; this illustrates use of
-\csbxint{iloopskiptonext}.
-
-The code next generates a \hyperref[floatfactorize]{table} which has
-been made into a float appearing \vpageref{floatfactorize}. Here is now
-the code for factorization; the conditionals use the package provided
-|\xint_firstoftwo| and |\xint_secondoftwo|, one could have employed
-rather \LaTeX{}'s own |\@firstoftwo| and |\@secondoftwo|, or, simpler
-still in \LaTeX{} context, the |\ifnumequal|, |\ifnumless| \dots,
-utilities from the package |etoolbox| which do exactly that under the
-hood. Only \TeX{} acceptable numbers are treated here, but it would be
-easy to make a translation and use the \xintname macros, thus extending
-the scope to big numbers; naturally up to a cost in speed.
-
-The reason for some strange looking expressions is to avoid arithmetic overflow.
-
-\begin{everbatim*}
-\catcode`_ 11
-\def\abortfactorize #1\xint_secondoftwo\fi #2#3{\fi}
-
-\def\factorize #1.{\ifnum#1=1 \abortfactorize\fi
-          \ifnum\numexpr #1-2=\numexpr ((#1/2)-1)*2\relax
-               \expandafter\xint_firstoftwo
-          \else\expandafter\xint_secondoftwo
-          \fi
-         {2&\expandafter\factorize\the\numexpr#1/2.}%
-         {\factorize_b #1.3.}}%
-
-\def\factorize_b #1.#2.{\ifnum#1=1 \abortfactorize\fi
-         \ifnum\numexpr #1-(#2-1)*#2<#2
-                 #1\abortfactorize
-         \fi
-         \ifnum \numexpr #1-#2=\numexpr ((#1/#2)-1)*#2\relax
-              \expandafter\xint_firstoftwo
-         \else\expandafter\xint_secondoftwo
-         \fi
-         {#2&\expandafter\factorize_b\the\numexpr#1/#2.#2.}%
-         {\expandafter\factorize_b\the\numexpr #1\expandafter.%
-                                  \the\numexpr #2+2.}}%
-\catcode`_ 8
-\begin{figure*}[ht!]
-\centering\phantomsection\label{floatfactorize}\normalcolor
-\tabskip1ex
-\centeredline{\vbox{\halign {\hfil\strut#\hfil&&\hfil#\hfil\cr\noalign{\hrule}
-         \xintiloop ["7FFFFFE0+1]
-         \expandafter\bfseries\xintiloopindex &
-         \ifnum\xintiloopindex="7FFFFFED
-              \number"7FFFFFED\cr\noalign{\hrule}
-         \expandafter\xintiloopskiptonext
-         \fi
-         \expandafter\factorize\xintiloopindex.\cr\noalign{\hrule}
-         \ifnum\xintiloopindex<"7FFFFFFE
-         \repeat
-         \bfseries \number"7FFFFFFF&\number "7FFFFFFF\cr\noalign{\hrule}
-}}}
-\centeredline{A table of factorizations}
-\end{figure*}
-\end{everbatim*}
-
-\subsection{Another table of primes}
-\label{ssec:primesIII}
-
-As a further example, let us dynamically generate a tabular with the first $50$
-prime numbers after $12345$. First we need a macro to test if a (short) number
-is prime. Such a completely expandable macro was given in \autoref{ssec:primesI},
-here we consider a variant which will be slightly more efficient. This new
-|\IsPrime| has two parameters. The first one is a macro which it redefines to
-expand to the result of the primality test applied to the second argument. For
-convenience we use the \href{http://ctan.org/pkg/etoolbox}{etoolbox} wrappers to
-various |\ifnum| tests, although here there isn't anymore the constraint of
-complete expandability (but using explicit |\if..\fi| in tabulars has its
-quirks); equivalent tests are provided by \xintname, but they have some overhead
-as they are able to deal with arbitrarily big integers.
-
-\def\IsPrime #1#2%
-{\edef\TheNumber {\the\numexpr #2}% positive integer
- \ifnumodd {\TheNumber}
- {\ifnumgreater {\TheNumber}{1}
-  {\edef\ItsSquareRoot{\xintiiSqrt \TheNumber}%
-    \xintFor ##1 in {\xintintegers [3+2]}\do
-    {\ifnumgreater {##1}{\ItsSquareRoot}
-               {\def#1{1}\xintBreakFor}
-               {}%
-     \ifnumequal {\TheNumber}{(\TheNumber/##1)*##1}
-                 {\def#1{0}\xintBreakFor }
-                 {}%
-    }}
-  {\def#1{0}}}% 1 is not prime
- {\ifnumequal {\TheNumber}{2}{\def#1{1}}{\def#1{0}}}%
-}%
-
-\everb|@
-\def\IsPrime #1#2% """color[named]{PineGreen}#1=\Result, #2=tested number (assumed >0).;!
-{\edef\TheNumber {\the\numexpr #2}%"""color[named]{PineGreen} hence #2 may be a count or \numexpr.;!
- \ifnumodd {\TheNumber}
- {\ifnumgreater {\TheNumber}{1}
-  {\edef\ItsSquareRoot{\xintiiSqrt \TheNumber}%
-    \xintFor """color{red}##1;! in {"""color{red}\xintintegers;! [3+2]}\do
-    {\ifnumgreater {"""color{red}##1;!}{\ItsSquareRoot} """color[named]{PineGreen}% "textcolor{red}{##1} is a \numexpr.;!
-               {\def#1{1}\xintBreakFor}
-               {}%
-     \ifnumequal {\TheNumber}{(\TheNumber/##1)*##1}
-                 {\def#1{0}\xintBreakFor }
-                 {}%
-    }}
-  {\def#1{0}}}% 1 is not prime
- {\ifnumequal {\TheNumber}{2}{\def#1{1}}{\def#1{0}}}%
-}
-|
-
-As we used \csbxint{For} inside a macro we had to double the |#| in its |#1|
-parameter. Here is now the code which creates the prime table (the table has
-been put in a \hyperref[primes]{float}, which should be found on page
-\pageref{primes}):
-
-\everb?@
-\newcounter{primecount}
-\newcounter{cellcount}
-\begin{figure*}[ht!]
-  \centering
-  \begin{tabular}{|*{7}c|}
-  \hline
-  \setcounter{primecount}{0}\setcounter{cellcount}{0}%
-  \xintFor """color{red}#1;! in {"""color{red}\xintintegers;! [12345+2]} \do
-"""color[named]{PineGreen}% "textcolor{red}{#1} is a \numexpr.;!
-  {\IsPrime\Result{#1}%
-   \ifnumgreater{\Result}{0}
-   {\stepcounter{primecount}%
-    \stepcounter{cellcount}%
-    \ifnumequal {\value{cellcount}}{7}
-       {"""color{red}\the#1;! \\\setcounter{cellcount}{0}}
-       {"""color{red}\the#1;! &}}
-   {}%
-    \ifnumequal {\value{primecount}}{50}
-     {\xintBreakForAndDo
-      {\multicolumn {6}{l|}{These are the first 50 primes after 12345.}\\}}
-     {}%
-  }\hline
-\end{tabular}
-\end{figure*}
-?
-
-\begin{figure*}[ht!]
-  \centering\phantomsection\label{primes}
-  \begin{tabular}{|*{7}c|}
-  \hline
-  \setcounter{primecount}{0}\setcounter{cellcount}{0}%
-  \xintFor #1 in {\xintintegers [12345+2]} \do
-  {\IsPrime\Result{#1}%
-   \ifnumgreater{\Result}{0}
-   {\stepcounter{primecount}%
-    \stepcounter{cellcount}%
-    \ifnumequal {\value{cellcount}}{7}
-       {\the#1 \\\setcounter{cellcount}{0}}
-       {\the#1 &}}
-   {}%
-    \ifnumequal {\value{primecount}}{50}
-     {\xintBreakForAndDo
-      {\multicolumn {6}{l|}{These are the first 50 primes after 12345.}\\}}
-     {}%
-  }\hline
-\end{tabular}
-\end{figure*}
-
-\subsection{Factorizing again}
-\label{ssec:factorize}
-
-Here is an \fexpan dable macro which computes the factors of an integer. It
-uses the \xintname macros only.
-\begin{everbatim*}
-\catcode`\@ 11
-\let\factorize\relax
-\newcommand\Factorize [1]
-      {\romannumeral0\expandafter\factorize\expandafter{\romannumeral-`0#1}}%
-\newcommand\factorize [1]{\xintiiifOne{#1}{ 1}{\factors at a #1.{#1};}}%
-\def\factors at a #1.{\xintiiifOdd{#1}
-   {\factors at c 3.#1.}%
-   {\expandafter\factors at b \expandafter1\expandafter.\romannumeral0\xinthalf{#1}.}}%
-\def\factors at b #1.#2.{\xintiiifOne{#2}
-   {\factors at end {2, #1}}%
-   {\xintiiifOdd{#2}{\factors at c 3.#2.{2, #1}}%
-                     {\expandafter\factors at b \the\numexpr #1+\@ne\expandafter.%
-                         \romannumeral0\xinthalf{#2}.}}%
-}%
-\def\factors at c #1.#2.{%
-    \expandafter\factors at d\romannumeral0\xintiidivision {#2}{#1}{#1}{#2}%
-}%
-\def\factors at d #1#2#3#4{\xintiiifNotZero{#2}
-   {\xintiiifGt{#3}{#1}
-        {\factors at end {#4, 1}}% ultimate quotient is a prime with power 1
-        {\expandafter\factors at c\the\numexpr #3+\tw at .#4.}}%
-   {\factors at e 1.#3.#1.}%
-}%
-\def\factors at e #1.#2.#3.{\xintiiifOne{#3}
-   {\factors at end {#2, #1}}%
-   {\expandafter\factors at f\romannumeral0\xintiidivision {#3}{#2}{#1}{#2}{#3}}%
-}%
-\def\factors at f #1#2#3#4#5{\xintiiifNotZero{#2}
-   {\expandafter\factors at c\the\numexpr #4+\tw at .#5.{#4, #3}}%
-   {\expandafter\factors at e\the\numexpr #3+\@ne.#4.#1.}%
-}%
-\def\factors at end #1;{\xintlistwithsep{, }{\xintRevWithBraces {#1}}}%
-\catcode`@ 12
-\end{everbatim*}
-The macro will be acceptably efficient only with numbers having somewhat small
-prime factors.
-\begin{everbatim}
-\Factorize{16246355912554185673266068721806243461403654781833}
-\end{everbatim}
-\begingroup\fdef\Z
-{\Factorize{16246355912554185673266068721806243461403654781833}}
-\noindent{\small\dtt{\Z}}
-
-
-It puts a little stress on the input save stack in order
-not be bothered with previously gathered things.\footnote{2015/11/18 I have
-  not revisited this code for a long time, and perhaps I could improve it now
-  with some new techniques.}
-
-Its output is a comma separated list with the number first, then its prime
-factors with multiplicity. Let's produce something prettier:
-\begin{everbatim*}
-\catcode`_ 11
-\def\ShowFactors #1{\expandafter\ShowFactors_a\romannumeral-`0\Factorize{#1},\relax,\relax,}
-\def\ShowFactors_a #1,{#1=\ShowFactors_b}
-\def\ShowFactors_b #1,#2,{\if\relax#1\else#1^{#2}\expandafter\ShowFactors_b\fi}
-\catcode`_ 8
-\end{everbatim*}
-\begin{everbatim}
-$$\ShowFactors{16246355912554185673266068721806243461403654781833}$$
-\end{everbatim}
-$$\csname ShowFactors_a\expandafter\endcsname\Z,\relax,\relax,$$
-\endgroup
-
-If we only considered small integers, we could write pure |\numexpr| methods
-which would be very much faster (especially if we had a table of small primes
-prepared first) but still ridiculously slow compared to any non expandable
-implementation, not to mention use of programming languages directly accessing
-the CPU registers\dots
-
-\subsection{The Quick Sort algorithm illustrated}\label{ssec:quicksort}
-
-First a completely expandable macro which sorts a comma separated list of
-numbers.%
-%
-\footnote{The code in earlier versions of this manual handled inputs composed
-  of braced items. I have switched to comma separated inputs on the occasion
-  of (link removed) 
-  The version here is like
-  |code 3| on 
-  (link removed) (which is about |3x| faster
-  than the earlier code it replaced in this manual) with a modification to
-  make it more efficient if the data has many repeated values.
-
-  A faster routine (for sorting hundreds of values) is provided as |code 6| at
-  the link mentioned in the footnote, it is based on Merge Sort, but limited
-  to inputs which one can handle as \TeX{} dimensions.%
-
-  This |code 6| could be extended to handle more general numbers, as
-  acceptable by \xintfracname. I have also written a non expandable version,
-  which is even faster, but this matters really only when handling hundreds or
-  rather thousands of values.}
-%
-
-The |\QSx| macro expands its list argument, which may thus be a macro; its
-comma separated items must expand to integers or decimal numbers or fractions
-or scientific notation as acceptable to \xintfracname, but if an item is
-itself some (expandable) macro, this macro will be expanded each time the item
-is considered in a comparison test! This is actually good if the macro expands
-in one step to the digits, and there are many many digits, but bad if the macro
-needs to do many computations. Thus |\QSx| should be used with either explicit
-numbers or with items being macros expanding in one step to the numbers
-(particularly if these numbers are very big).
-
-If the interest is only in \TeX{} integers, then one should replace the
-|\xintifCmp| macro with a suitable conditional, possibly helped by tools such as
-|\ifnumgreater|, |\ifnumequal| and |\ifnumless| from
-\href{http://ctan.org/pkg/etoolbox}{etoolbox} (\LaTeX{} only; I didn't see a
-direct equivalent to |\xintifCmp|.) Or, if we are dealing with decimal numbers
-with at most four+four digits, then one should use suitable |\ifdim| tests.
-Naturally this will boost consequently the speed, from having skipped all the
-overhead in parsing fractions and scientific numbers as are acceptable by
-\xintfracname macros, and subsequent treatment.
-
-\begin{everbatim*}
-% THE QUICK SORT ALGORITHM EXPANDABLY
-% \usepackage{xintfrac} in the preamble (latex)
-\makeatletter
-% use extra safe delimiters
-\catcode`! 3 \catcode`? 3
-\def\QSx {\romannumeral0\qsx }%
-% first we check if empty list (else \qsx at finish will not find a comma)
-\def\qsx   #1{\expandafter\qsx at a\romannumeral-`0#1,!,?}%
-\def\qsx at a #1{\ifx,#1\expandafter\qsx at abort\else
-                     \expandafter\qsx at start\fi #1}%
-\def\qsx at abort #1?{ }%
-\def\qsx at start {\expandafter\qsx at finish\romannumeral0\qsx at b,}%
-\def\qsx at finish ,#1{ #1}%
-%
-% we check if empty of single and if not pick up the first as Pivot:
-\def\qsx at b ,#1#2,#3{\ifx?#3\xintdothis\qsx at empty\fi
-                    \ifx!#3\xintdothis\qsx at single\fi
-                    \xintorthat\qsx at separate {#1#2}{}{}{#1#2}#3}%
-\def\qsx at empty  #1#2#3#4#5{ }%
-\def\qsx at single #1#2#3#4#5?{, #4}%
-\def\qsx at separate #1#2#3#4#5#6,%
-{%
-    \ifx!#5\expandafter\qsx at separate@done\fi
-    \xintifCmp {#5#6}{#4}%
-          \qsx at separate@appendtosmaller
-          \qsx at separate@appendtoequal
-          \qsx at separate@appendtogreater {#5#6}{#1}{#2}{#3}{#4}%
-}%
-%
-\def\qsx at separate@appendtoequal   #1#2{\qsx at separate {#2,#1}}%
-\def\qsx at separate@appendtogreater #1#2#3{\qsx at separate {#2}{#3,#1}}%
-\def\qsx at separate@appendtosmaller #1#2#3#4{\qsx at separate {#2}{#3}{#4,#1}}%
-%
-\def\qsx at separate@done\xintifCmp #1%
-          \qsx at separate@appendtosmaller
-          \qsx at separate@appendtoequal
-          \qsx at separate@appendtogreater #2#3#4#5#6#7?%
-{%
-    \expandafter\qsx at f\expandafter {\romannumeral0\qsx at b #4,!,?}{\qsx at b #5,!,?}{#3}%
-}%
-%
-\def\qsx at f #1#2#3{#2, #3#1}%
-%
-\catcode`! 12 \catcode`? 12
-\makeatother
-
-% EXAMPLE
-\begingroup
-\edef\z {\QSx {1.0, 0.5, 0.3, 1.5, 1.8, 2.0, 1.7, 0.4, 1.2, 1.4,
-               1.3, 1.1, 0.7, 1.6, 0.6, 0.9, 0.8, 0.2, 0.1, 1.9}}
-\meaning\z
-
-\def\a {3.123456789123456789}\def\b {3.123456789123456788}
-\def\c {3.123456789123456790}\def\d {3.123456789123456787}
-\oodef\z {\QSx { \a, \b, \c, \d}}%
-% The space before \a to let it not be expanded during the conversion from CSV
-% values to List. The \oodef expands exactly twice (via a bunch of \expandafter's)
-\meaning\z
-\endgroup
-\end{everbatim*} (the spaces after \string\d, etc...\@ come from the use of the
-|\meaning| primitive.)
-
-The choice of pivot as first element is bad if the list is already almost
-sorted. Let's add a variant which will pick up the pivot index randomly. The
-previous routine worked also internally with comma separated lists, but for a
-change this one will use internally lists of braced items (the initial
-conversion via \csbxint{CSVtoList} handles all potential spurious space
-problems).
-
-\unless\ifxetex % pour tester compilation de xint.dtx avec xetex qui n'a pas
-                % \pdfuniformdeviate
-\begin{everbatim*}
-% QuickSort expandably on comma separated values with random choice of pivots
-% ====> Requires availability of \pdfuniformdeviate <====
-% \usepackage{xintfrac, xinttools} in preamble
-\makeatletter
-\def\QSx {\romannumeral0\qsx }% This is a f-expandable macro.
-% This converts from comma separated values on input and back on output.
-% **** NOTE: these steps (and the other ones too, actually) are costly if input
-%            has thousands of items.
-\def\qsx #1{\xintlistwithsep{, }%
-            {\expandafter\qsx at sort@a\expandafter{\romannumeral0\xintcsvtolist{#1}}}}%
-%
-% we check if empty or single or double and if not pick up the first as Pivot:
-\def\qsx at sort@a #1%
-    {\expandafter\qsx at sort@b\expandafter{\romannumeral0\xintlength{#1}}{#1}}%
-\def\qsx at sort@b #1{\ifcase #1
-                      \expandafter\qsx at sort@empty
-                      \or\expandafter\qsx at sort@single
-                      \or\expandafter\qsx at sort@double
-                      \else\expandafter\qsx at sort@c\fi {#1}}%
-\def\qsx at sort@empty  #1#2{ }%
-\def\qsx at sort@single #1#2{#2}%
-\catcode`_ 11
-\def\qsx at sort@double #1#2{\xintifGt #2{\xint_exchangetwo_keepbraces}{}#2}%
-\catcode`_ 8
-\def\qsx at sort@c      #1#2{%
-    \expandafter\qsx at sort@sep at a\expandafter
-                {\romannumeral0\xintnthelt{\pdfuniformdeviate #1+\@ne}{#2}}#2?}%
-\def\qsx at sort@sep at a #1{\qsx at sort@sep at loop {}{}{}{#1}}%
-\def\qsx at sort@sep at loop #1#2#3#4#5%
-{%
-    \ifx?#5\expandafter\qsx at sort@sep at done\fi
-    \xintifCmp {#5}{#4}%
-          \qsx at sort@sep at appendtosmaller
-          \qsx at sort@sep at appendtoequal
-          \qsx at sort@sep at appendtogreater {#5}{#1}{#2}{#3}{#4}%
-}%
-%
-\def\qsx at sort@sep at appendtoequal   #1#2{\qsx at sort@sep at loop {#2{#1}}}%
-\def\qsx at sort@sep at appendtogreater #1#2#3{\qsx at sort@sep at loop {#2}{#3{#1}}}%
-\def\qsx at sort@sep at appendtosmaller #1#2#3#4{\qsx at sort@sep at loop {#2}{#3}{#4{#1}}}%
-%
-\def\qsx at sort@sep at done\xintifCmp #1%
-          \qsx at sort@sep at appendtosmaller
-          \qsx at sort@sep at appendtoequal
-          \qsx at sort@sep at appendtogreater #2#3#4#5#6%
-{%
-    \expandafter\qsx at sort@recurse\expandafter
-               {\romannumeral0\qsx at sort@a {#4}}{\qsx at sort@a {#5}}{#3}%
-}%
-%
-\def\qsx at sort@recurse #1#2#3{#2#3#1}%
-%
-\makeatother
-
-% EXAMPLES
-\begingroup
-\edef\z {\QSx {1.0, 0.5, 0.3, 1.5, 1.8, 2.0, 1.7, 0.4, 1.2, 1.4,
-               1.3, 1.1, 0.7, 1.6, 0.6, 0.9, 0.8, 0.2, 0.1, 1.9}}
-\meaning\z
-
-\def\a {3.123456789123456789}\def\b {3.123456789123456788}
-\def\c {3.123456789123456790}\def\d {3.123456789123456787}
-\oodef\z {\QSx { \a, \b, \c, \d}}%
-% The space before \a to let it not be expanded during the conversion from CSV
-% values to List. The \oodef expands exactly twice (via a bunch of \expandafter's)
-\meaning\z
-
-\def\somenumbers{%
-3997.6421, 8809.9358, 1805.4976, 5673.6478, 3179.1328, 1425.4503, 4417.7691,
-2166.9040, 9279.7159, 3797.6992, 8057.1926, 2971.9166, 9372.2699, 9128.4052,
-1228.0931, 3859.5459, 8561.7670, 2949.6929, 3512.1873, 1698.3952, 5282.9359,
-1055.2154, 8760.8428, 7543.6015, 4934.4302, 7526.2729, 6246.0052, 9512.4667,
-7423.1124, 5601.8436, 4433.5361, 9970.4849, 1519.3302, 7944.4953, 4910.7662,
-3679.1515, 8167.6824, 2644.4325, 8239.4799, 4595.1908, 1560.2458, 6098.9677,
-3116.3850, 9130.5298, 3236.2895, 3177.6830, 5373.1193, 5118.4922, 2743.8513,
-8008.5975, 4189.2614, 1883.2764, 9090.9641, 2625.5400, 2899.3257, 9157.1094,
-8048.4216, 3875.6233, 5684.3375, 8399.4277, 4528.5308, 6926.7729, 6941.6278,
-9745.4137, 1875.1205, 2755.0443, 9161.1524, 9491.1593, 8857.3519, 4290.0451,
-2382.4218, 3678.2963, 5647.0379, 1528.7301, 2627.8957, 9007.9860, 1988.5417,
-2405.1911, 5065.8063, 5856.2141, 8989.8105, 9349.7840, 9970.3013, 8105.4062,
-3041.7779, 5058.0480, 8165.0721, 9637.7196, 1795.0894, 7275.3838, 5997.0429,
-7562.6481, 8084.0163, 3481.6319, 8078.8512, 2983.7624, 3925.4026, 4931.5812,
-1323.1517, 6253.0945}%
-
-\oodef\z {\QSx \somenumbers}% produced as a comma+space separated list
-% black magic as workaround to the shrinkability of spaces in last line...
-\hsize 87\fontcharwd\font`0
-\lccode`~=32
-\lowercase{\def~}{\discretionary{}{}{\kern\fontcharwd\font`0}}\catcode32 13
-\noindent\phantom{00}\scantokens\expandafter{\meaning\z}\par
-\endgroup
-\end{everbatim*}
-\fi % fin de si pas xetex
-
-
-All the previous examples were with numbers which could have been handled via
-|\ifdim| tests rather than the \csbxint{ifCmp} macro from \xintfracname; using
-|\ifdim| tests would naturally be faster. Even faster routine is |code 6| at
-(link removed) which uses |\pdfescapestring| and a
-Merge Sort algorithm.
-
-We then turn to a graphical illustration of the algorithm.%
-%
-\footnote{I have rewritten (2015/11/21) the routine to do only once (and not thrice) the
-  needed calls to \csa{xintifCmp}, up to the price of one additional |\edef|,
-  although due to the context execution time on our side is not an issue and
-  moreover is anyhow overwhelmed by the TikZ's activities. Simultaneously I
-  have updated the code.
-  The
-  variant with the choice of pivot on the right has more overhead: the reason
-  is simply that we do not convert the data into an array, but maintain a list
-  of tokens with self-reorganizing delimiters.}
-%
-For simplicity the pivot is always chosen as the first list item. Then we also
-give a variant which picks up the last item as pivot.
-\begin{everbatim*}
-% in LaTeX preamble:
-% \usepackage{xintfrac, xinttools}
-% \usepackage{color}
-% or, when using Plain TeX:
-% \input xintfrac.sty \input xinttools.sty
-% \input color.tex
-%
-% Color definitions
-\definecolor{LEFT}{RGB}{216,195,88}
-\definecolor{RIGHT}{RGB}{208,231,153}
-\definecolor{INERT}{RGB}{199,200,194}
-\definecolor{INERTpiv}{RGB}{237,237,237}
-\definecolor{PIVOT}{RGB}{109,8,57}
-% Start of macro defintions
-\makeatletter
-% \catcode`? 3 % a bit too paranoid. Normal ? will do.
-%
-% argument will never be empty
-\def\QS at cmp@a    #1{\QS at cmp@b  #1??}%
-\def\QS at cmp@b    #1{\noexpand\QS at sep@A\@ne{#1}\QS at cmp@d {#1}}%
-\def\QS at cmp@d    #1#2{\ifx ?#2\expandafter\QS at cmp@done\fi
-                      \xintifCmp {#1}{#2}\tw@\@ne\z@{#2}\QS at cmp@d {#1}}%
-\def\QS at cmp@done #1?{?}%
-%
-\def\QS at sep@A #1?{\QSLr\QS at sep@L #1\thr@@?#1\thr@@?#1\thr@@?}%
-\def\QS at sep@L #1#2{\ifcase #1{#2}\or\or\else\expandafter\QS at sep@I at start\fi \QS at sep@L}%
-\def\QS at sep@I at start\QS at sep@L {\noexpand\empty?\QSIr\QS at sep@I}%
-\def\QS at sep@I #1#2{\ifcase#1\or{#2}\or\else\expandafter\QS at sep@R at start\fi\QS at sep@I}%
-\def\QS at sep@R at start\QS at sep@I {\noexpand\empty?\QSRr\QS at sep@R}%
-\def\QS at sep@R #1#2{\ifcase#1\or\or{#2}\else\expandafter\QS at sep@done\fi\QS at sep@R}%
-\def\QS at sep@done\QS at sep@R {\noexpand\empty?}%
-%
-\def\QS at loop {%
-    \xintloop
-    % pivot phase
-    \def\QS at pivotcount{0}%
-    \let\QSLr\DecoLEFTwithPivot  \let\QSIr \DecoINERT
-    \let\QSRr\DecoRIGHTwithPivot \let\QSIrr\DecoINERT
-    \centerline{\QS at list}%
-    % sorting phase
-    \ifnum\QS at pivotcount>\z@
-            \def\QSLr {\QS at cmp@a}\def\QSRr {\QS at cmp@a}%
-            \def\QSIr {\QSIrr}\let\QSIrr\relax
-                \edef\QS at list{\QS at list}% compare
-            \let\QSLr\relax\let\QSRr\relax\let\QSIr\relax
-                \edef\QS at list{\QS at list}% separate
-            \def\QSLr ##1##2?{\ifx\empty##1\else\noexpand \QSLr {{##1}##2}\fi}%
-            \def\QSIr ##1##2?{\ifx\empty##1\else\noexpand \QSIr {{##1}##2}\fi}%
-            \def\QSRr ##1##2?{\ifx\empty##1\else\noexpand \QSRr {{##1}##2}\fi}%
-                \edef\QS at list{\QS at list}% gather
-            \let\QSLr\DecoLEFT \let\QSRr\DecoRIGHT
-            \let\QSIr\DecoINERTwithPivot \let\QSIrr\DecoINERT
-            \centerline{\QS at list}%
-    \repeat }%
-%
-% \xintFor* loops handle gracefully empty lists.
-\def\DecoLEFT  #1{\xintFor* ##1 in {#1} \do {\colorbox{LEFT}{##1}}}%
-\def\DecoINERT #1{\xintFor* ##1 in {#1} \do {\colorbox{INERT}{##1}}}%
-\def\DecoRIGHT #1{\xintFor* ##1 in {#1} \do {\colorbox{RIGHT}{##1}}}%
-\def\DecoPivot #1{\begingroup\color{PIVOT}\advance\fboxsep-\fboxrule\fbox{#1}\endgroup}%
-%
-\def\DecoLEFTwithPivot #1{\xdef\QS at pivotcount{\the\numexpr\QS at pivotcount+\@ne}%
-    \xintFor* ##1 in {#1} \do
-        {\xintifForFirst {\DecoPivot {##1}}{\colorbox{LEFT}{##1}}}}%
-\def\DecoINERTwithPivot #1{\xdef\QS at pivotcount{\the\numexpr\QS at pivotcount+\@ne}%
-    \xintFor* ##1 in {#1} \do
-        {\xintifForFirst {\colorbox{INERTpiv}{##1}}{\colorbox{INERT}{##1}}}}%
-\def\DecoRIGHTwithPivot #1{\xdef\QS at pivotcount{\the\numexpr\QS at pivotcount+\@ne}%
-    \xintFor* ##1 in {#1}  \do
-        {\xintifForFirst {\DecoPivot {##1}}{\colorbox{RIGHT}{##1}}}}%
-%
-\def\QuickSort #1{% warning: not compatible with empty #1.
-    % initialize, doing conversion from comma separated values to a list of braced items
-    \edef\QS at list{\noexpand\QSRr{\xintCSVtoList{#1}}}% many \edef's are to follow anyhow
-% earlier I did a first drawing of the list, here with the color of RIGHT elements,
-% but the color should have been for example white, anyway I drop this first line
-    %\let\QSRr\DecoRIGHT
-    %\par\centerline{\QS at list}%
-%
-    % loop as many times as needed
-    \QS at loop }%
-%
-% \catcode`? 12 % in case we had used a funny ? as delimiter.
-\makeatother
-%% End of macro definitions.
-%% Start of Example
-\begingroup\offinterlineskip
-\small
-% \QuickSort {1.0, 0.5, 0.3, 1.5, 1.8, 2.0, 1.7, 0.4, 1.2, 1.4,
-%                1.3, 1.1, 0.7, 1.6, 0.6, 0.9, 0.8, 0.2, 0.1, 1.9}
-% \medskip
-% with repeated values
-\QuickSort {1.0, 0.5, 0.3, 0.8, 1.5, 1.8, 2.0, 1.7, 0.4, 1.2, 1.4,
-               1.3, 1.1, 0.7, 0.3, 1.6, 0.6, 0.3, 0.8, 0.2, 0.8, 0.7, 1.2}
-\endgroup
-\end{everbatim*}
-
-Here is the variant which always picks the pivot as the rightmost element.
-
-\begin{everbatim*}
-\makeatletter
-%
-\def\QS at cmp@a #1{\noexpand\QS at sep@A\expandafter\QS at cmp@d\expandafter
-                 {\romannumeral0\xintnthelt{-1}{#1}}#1??}%
-%
-\def\DecoLEFTwithPivot #1{\xdef\QS at pivotcount{\the\numexpr\QS at pivotcount+\@ne}%
-    \xintFor* ##1 in {#1} \do
-        {\xintifForLast {\DecoPivot {##1}}{\colorbox{LEFT}{##1}}}}
-\def\DecoINERTwithPivot #1{\xdef\QS at pivotcount{\the\numexpr\QS at pivotcount+\@ne}%
-    \xintFor* ##1 in {#1} \do
-        {\xintifForLast {\colorbox{INERTpiv}{##1}}{\colorbox{INERT}{##1}}}}
-\def\DecoRIGHTwithPivot #1{\xdef\QS at pivotcount{\the\numexpr\QS at pivotcount+\@ne}%
-    \xintFor* ##1 in {#1}  \do
-        {\xintifForLast {\DecoPivot {##1}}{\colorbox{RIGHT}{##1}}}}
-\def\QuickSort #1{%
-    % initialize, doing conversion from comma separated values to a list of braced items
-    \edef\QS at list{\noexpand\QSLr {\xintCSVtoList{#1}}}% many \edef's are to follow anyhow
-    %
-    % loop as many times as needed
-    \QS at loop }%
-\makeatother
-\begingroup\offinterlineskip
-\small
-% \QuickSort {1.0, 0.5, 0.3, 1.5, 1.8, 2.0, 1.7, 0.4, 1.2, 1.4,
-%                1.3, 1.1, 0.7, 1.6, 0.6, 0.9, 0.8, 0.2, 0.1, 1.9}
-% \medskip
-% with repeated values
-\QuickSort {1.0, 0.5, 0.3, 0.8, 1.5, 1.8, 2.0, 1.7, 0.4, 1.2, 1.4,
-               1.3, 1.1, 0.7, 0.3, 1.6, 0.6, 0.3, 0.8, 0.2, 0.8, 0.7, 1.2}
-\endgroup
-\end{everbatim*}
-
-The choice of the first or last item as pivot is not a good one as nearly
-ordered lists will take quadratic time. But for explaining the algorithm via a
-graphical interpretation, it is not that bad. If one wanted to pick up the
-pivot randomly, the routine would have to be substantially rewritten: in
-particular the |\Deco..withPivot| macros need to know where the pivot is, and
-currently this is implemented by using either |\xintifForFirst| or
-|\xintifForLast|.
-
-\clearpage
-
-\expandafter\let\csname ExamplesnameUp\endcsname\undefined
-
-\ifnum\NoSourceCode=1
-\bigskip
-\begin{framed}
-  \small This documentation has been compiled without the source code,
-  which is available in the separate file:
-  %
-  \centeredline{|sourcexint.pdf|,}
-  %
-  which will open in a PDF viewer via |texdoc sourcexint.pdf|.
-
-  To produce a single file including both the user documentation and the
-  source code:
-  \begin{itemize}
-  \item run |etex| on |xint.dtx| to generate |xint.tex| among other files,
-  \item edit |xint.tex| to set the |\NoSourceCode| toggle within it to |0|,
-  \item run |make clean| and then |make xint.pdf|.
-  \end{itemize}
-  This will need |latexmk|; if not available you will need in replacement of
-  the last step to execute manually |latex| on |xint.tex| (thrice)
-  then |dvipdfmx|.
-\end{framed}
-\fi
-
+\let\xintcfracnameUp\undefined
 \ifnum\dosourcexint=1
 +fi
 +catcode`\ 0
@@ -19616,26 +20172,45 @@
 \makeatletter
 \@gobble\fi
 \StopEventually{\end{document}\endinput}
+\etocignoredepthtags
+\def\MARGEPAGENO{1.25em}
+\etocdepthtag.toc {implementation}
+\addtocontents{toc}{\gdef\string\sectioncouleur{{tocsectionimpcolor}}}
+
 \ifnum\dosourcexint=1
-\renewcommand{\etocaftertochook}{\addvspace{\bigskipamount}}
-\etocsettocstyle {}{}
-\clearpage
+  \renewcommand{\etocaftertochook}{\addvspace{\bigskipamount}}
+  \etocsettocstyle {}{}
+% \clearpage
 % \newgeometry{%hmarginratio=4:3,
 %              hscale=0.7,vscale=0.75}% ATTENTION \newgeometry fait
 %                                 % un reset de vscale si on ne le
 %                                 % précise pas ici !!!
 \else
-\clearpage
+  \etocsetnexttocdepth{section}
+  \part{The \xintexprnameimp and allied packages source code}
+  \localtableofcontents
 \fi
+\def\xintImpRunningHeader{{\inheadertrue\catcode`,12\relax
+          \DOCxintfrontpage,
+          \xintkernelnameimp,
+          \xinttoolsnameimp,
+          \xintcorenameimp,
+          \xintnameimp,
+          \xintbinhexnameimp,
+          \xintgcdnameimp,
+          \xintfracnameimp,
+          \xintseriesnameimp,
+          \xintcfracnameimp,
+          \xintexprnameimp,
+          \xinttrignameimp, \xintlognameimp}}
+\markboth{\makebox[0pt]{\xintImpRunningHeader}}{\makebox[0pt]{\xintImpRunningHeader}}
 
+\clearpage
+
 \makeatletter
 
-\def\MARGEPAGENO{1.25em}
 \etocsettocdepth{subsubsection}% 2015/09/15
 
-\etocdepthtag.toc {implementation}
-\addtocontents{toc}{\gdef\string\sectioncouleur{{tocsectionimpcolor}}}
-
 \def\storedlinecounts {}
 \def\StoreCodelineNo #1{\edef\storedlinecounts{%
                         \unexpanded\expandafter{\storedlinecounts}%
@@ -19848,21 +20423,6 @@
 
 %% END OF MACRO DEFINITIONS FOR SOURCEXINT
 
-\def\xintImpRunningHeader{{\inheadertrue\catcode`,12\relax
-          \DOCxintfrontpage,
-          \xintkernelnameimp,
-          \xinttoolsnameimp,
-          \xintcorenameimp,
-          \xintnameimp,
-          \xintbinhexnameimp,
-          \xintgcdnameimp,
-          \xintfracnameimp,
-          \xintseriesnameimp,
-          \xintcfracnameimp,
-          \xintexprnameimp,
-          \xinttrignameimp, \xintlognameimp}}
-\markboth{\makebox[0pt]{\xintImpRunningHeader}}{\makebox[0pt]{\xintImpRunningHeader}}
-
 \makeatother
 
 \section{Timeline (in brief)}
@@ -19958,10 +20518,10 @@
   the code.
 
 Warning: pay attention when looking at the code to the catcode configuration
-as found in \csbXINT{_setcatcodes}. Additional temporary configuration is used
-at some locations. For example |!| is of catcode letter in \xintexprnameimp
-and there are locations with funny catcodes e.g. using some letters with the
-math shift catcode.
+as found in \csbXINT{setcatcodes} from \xintkernelnameimp. Additional
+temporary configuration is used at some locations. For example |!| is of
+catcode letter in \xintexprnameimp and there are locations with funny catcodes
+e.g. using some letters with the math shift catcode.
 
 \MakePercentIgnore
 %\def\gardesactifs {^^A
@@ -19999,6 +20559,10 @@
 % \changed[2020/01/11]{1.4}
 % \csbxint{Replicate}, \csbxint{Gobble}, \csbxint{LastOne}, \csbxint{FirstOne}.
 %
+% \changed{1.4l}
+% Fix the |1.4| added bug that |\XINTrestorecatcodes| forgot to restore
+% the catcode of |^||^A| which is set to |3| by |\XINTsetcatcodes|.
+%
 % \subsection{Catcodes, \protect\eTeX{} and reload detection}
 %
 % The code for reload detection was initially copied from \textsc{Heiko
@@ -20007,6 +20571,17 @@
 % The method for catcodes was also initially directly inspired by these
 % packages.
 %
+% \lverb|1.4l replaces Info level user messages issued in case of problems
+% such as \numexpr not being available with Warning level messages (in the
+% LaTeX terminolgy).  Should arguably be Error level in that case.
+%
+% xintkernel.sty was the only xint package emitting such an Info, now Warning
+% in case of being loaded twice (via \input in non-LaTeX).  This was probably
+% a left-over from initial development stage of the loading architecture for
+% debugging.  Starting with 1.4l, it will abort input silently in such case.
+%
+% Also at 1.4l I refactored a bit the loading code in the xint*sty files for
+% no real reason other than losing time.|
 %    \begin{macrocode}
 \begingroup\catcode61\catcode48\catcode32=10\relax%
   \catcode13=5    % ^^M
@@ -20013,122 +20588,143 @@
   \endlinechar=13 %
   \catcode123=1   % {
   \catcode125=2   % }
-  \catcode35=6    % #
   \catcode44=12   % ,
-  \catcode45=12   % -
   \catcode46=12   % .
   \catcode58=12   % :
-  \catcode95=11   % _
-  \expandafter
-    \ifx\csname PackageInfo\endcsname\relax
-      \def\y#1#2{\immediate\write-1{Package #1 Info: #2.}}%
+  \catcode94=7    % ^
+  \def\space{ }\newlinechar10
+  \let\z\relax
+  \expandafter\ifx\csname numexpr\endcsname\relax
+    \expandafter\ifx\csname PackageWarning\endcsname\relax
+      \immediate\write128{^^JPackage xintkernel Warning:^^J%
+                          \space\space\space\space
+                          \numexpr not available, aborting input.^^J}%
     \else
-      \def\y#1#2{\PackageInfo{#1}{#2}}%
+      \PackageWarningNoLine{xintkernel}{\numexpr not available, aborting input}%
     \fi
-  \let\z\relax
-  \expandafter
-    \ifx\csname numexpr\endcsname\relax
-     \y{xintkernel}{\numexpr not available, aborting input}%
-     \def\z{\endgroup\endinput}%
+    \def\z{\endgroup\endinput}%
+  \else
+    \expandafter\ifx\csname XINTsetupcatcodes\endcsname\relax
     \else
-    \expandafter
-     \ifx\csname XINTsetupcatcodes\endcsname\relax
-      \else
-       \y{xintkernel}{I was already loaded, aborting input}%
        \def\z{\endgroup\endinput}%
-      \fi
     \fi
+  \fi
   \ifx\z\relax\else\expandafter\z\fi%
 %    \end{macrocode}
 % \subsubsection{\csh{XINTrestorecatcodes}, \csh{XINTsetcatcodes},
 %                \csh{XINTrestorecatcodesendinput}}
-% \lverb|Renamed at 1.4e without underscores, in connexion with
-% easying up reloading process for xintlog.sty and xinttrig.sty.|
+% \changed{1.4e}
+% \lverb|Renamed \XINT{set,restore}catcodes
+% to be without underscores, to facilitate the reloading process
+% for xintlog.sty and xinttrig.sty in uncontrolled contexts.|
+% \changed{1.4l}
+% \lverb|Fix the 1.4 bug of omission of \catcode1 restore.
+%
+% Reordered all catcodes assignements for easier maintenance and dropped most
+% disparate indications of which packages make use of which settings.
+%
+% The \XINTrestorecatcodes is somewhat misnamed as it is more a template
+% to be used in an \edef to help define actual catcode restoring macros.
+%
+% However \edef needs usually { and } so there is a potential difficulty with
+% telling people to do \edef\myrestore{\XINTrestorecatcodes}, and I almost
+% added at 1.4l some \XINTsettorestore:#1->\edef#1{\XINTrestorecatcodes} but
+% well, this is not public interface anyhow.  The reloading method of
+% xintlog.sty and xinttrig.sty does protect itself though against such irreal
+% usage possibility with non standard { or }.
+%
+% Removed at 1.4l the \XINT_setcatcodes and \XINT_restorecatcodes not used
+% anywhere now.  Used by old version of xintsession.tex, but not anymore since
+% a while.|
 %    \begin{macrocode}
   \def\PrepareCatcodes
   {%
       \endgroup
       \def\XINTrestorecatcodes
-      {% takes care of all, to allow more economical code in modules
-           \catcode0=\the\catcode0 %
-           \catcode59=\the\catcode59   % ; xintexpr
-           \catcode126=\the\catcode126 % ~ xintexpr
-           \catcode39=\the\catcode39   % ' xintexpr
-           \catcode34=\the\catcode34   % " xintbinhex, and xintexpr
-           \catcode63=\the\catcode63   % ? xintexpr
-           \catcode124=\the\catcode124 % | xintexpr
-           \catcode38=\the\catcode38   % & xintexpr
-           \catcode64=\the\catcode64   % @ xintexpr
-           \catcode33=\the\catcode33   % ! xintexpr
-           \catcode93=\the\catcode93   % ] -, xintfrac, xintseries, xintcfrac
-           \catcode91=\the\catcode91   % [ -, xintfrac, xintseries, xintcfrac
-           \catcode36=\the\catcode36   % $ xintgcd only $
-           \catcode94=\the\catcode94   % ^
-           \catcode96=\the\catcode96   % `
-           \catcode47=\the\catcode47   % /
-           \catcode41=\the\catcode41   % )
-           \catcode40=\the\catcode40   % (
-           \catcode42=\the\catcode42   % *
-           \catcode43=\the\catcode43   % +
-           \catcode62=\the\catcode62   % >
-           \catcode60=\the\catcode60   % <
-           \catcode58=\the\catcode58   % :
-           \catcode46=\the\catcode46   % .
-           \catcode45=\the\catcode45   % -
-           \catcode44=\the\catcode44   % ,
-           \catcode35=\the\catcode35   % #
-           \catcode95=\the\catcode95   % _
-           \catcode125=\the\catcode125 % }
-           \catcode123=\the\catcode123 % {
-           \endlinechar=\the\endlinechar
-           \catcode13=\the\catcode13   % ^^M
-           \catcode32=\the\catcode32   %
-           \catcode61=\the\catcode61\relax   % =
+      {% prepared for use in \edef
+          \catcode0=\the\catcode0     % ^^@
+          \catcode1=\the\catcode1     % ^^A
+          \catcode13=\the\catcode13   % ^^M
+          \catcode32=\the\catcode32   % <space>
+          \catcode33=\the\catcode33   % !
+          \catcode34=\the\catcode34   % "
+          \catcode35=\the\catcode35   % #
+          \catcode36=\the\catcode36   % $
+          \catcode38=\the\catcode38   % &
+          \catcode39=\the\catcode39   % '
+          \catcode40=\the\catcode40   % (
+          \catcode41=\the\catcode41   % )
+          \catcode42=\the\catcode42   % *
+          \catcode43=\the\catcode43   % +
+          \catcode44=\the\catcode44   % ,
+          \catcode45=\the\catcode45   % -
+          \catcode46=\the\catcode46   % .
+          \catcode47=\the\catcode47   % /
+          \catcode58=\the\catcode58   % :
+          \catcode59=\the\catcode59   % ;
+          \catcode60=\the\catcode60   % <
+          \catcode61=\the\catcode61   % =
+          \catcode62=\the\catcode62   % >
+          \catcode63=\the\catcode63   % ?
+          \catcode64=\the\catcode64   % @
+          \catcode91=\the\catcode91   % [
+          \catcode93=\the\catcode93   % ]
+          \catcode94=\the\catcode94   % ^
+          \catcode95=\the\catcode95   % _
+          \catcode96=\the\catcode96   % `
+          \catcode123=\the\catcode123 % {
+          \catcode124=\the\catcode124 % |
+          \catcode125=\the\catcode125 % }
+          \catcode126=\the\catcode126 % ~
+          \endlinechar=\the\endlinechar\relax
       }%
+%    \end{macrocode}
+% \lverb|The \noexpand here is required.  This feels to me a bit surprising,
+% but is a fact, and the source of this must be in the \edef implementation
+% but I have not checked it out at this time.|
+%    \begin{macrocode}
       \edef\XINTrestorecatcodesendinput
       {%
            \XINTrestorecatcodes\noexpand\endinput %
       }%
       \def\XINTsetcatcodes
-      {%
-        \catcode61=12   % =
-        \catcode32=10   % space
-        \catcode13=5    % ^^M
-        \endlinechar=13 %
-        \catcode123=1   % {
-        \catcode125=2   % }
-        \catcode95=11   % _ LETTER
-        \catcode35=6    % #
-        \catcode44=12   % ,
-        \catcode45=12   % -
-        \catcode46=12   % .
-        \catcode58=11   % : LETTER
-        \catcode60=12   % <
-        \catcode62=12   % >
-        \catcode43=12   % +
-        \catcode42=12   % *
-        \catcode40=12   % (
-        \catcode41=12   % )
-        \catcode47=12   % /
-        \catcode96=12   % `
-        \catcode94=11   % ^ LETTER
-        \catcode36=3    % $
-        \catcode91=12   % [
-        \catcode93=12   % ]
-        \catcode33=12   % ! (xintexpr.sty will use catcode 11)
-        \catcode64=11   % @ LETTER
-        \catcode38=7    % & for \romannumeral`&&@ trick.
-        \catcode124=12  % |
-        \catcode63=11   % ? LETTER
-        \catcode34=12   % "
-        \catcode39=12   % '
-        \catcode126=3   % ~ MATH
-        \catcode59=12   % ;
-        \catcode0=12    % for \romannumeral`&&@ trick
-        \catcode1=3     % for ultra-safe séparateur &&A
+      {% standard settings with a few xint*sty specific ones
+          \catcode0=12    % for \romannumeral`&&@
+          \catcode1=3     % for safe separator &&A
+          \catcode13=5    % ^^M
+          \catcode32=10   % <space>
+          \catcode33=12   % ! but used as LETTER inside xintexpr.sty
+          \catcode34=12   % "
+          \catcode35=6    % #
+          \catcode36=3    % $
+          \catcode38=7    % & SUPERSCRIPT for && as replacement of ^^
+          \catcode39=12   % '
+          \catcode40=12   % (
+          \catcode41=12   % )
+          \catcode42=12   % *
+          \catcode43=12   % +
+          \catcode44=12   % ,
+          \catcode45=12   % -
+          \catcode46=12   % .
+          \catcode47=12   % /
+          \catcode58=11   % : LETTER
+          \catcode59=12   % ;
+          \catcode60=12   % <
+          \catcode61=12   % =
+          \catcode62=12   % >
+          \catcode63=11   % ? LETTER
+          \catcode64=11   % @ LETTER
+          \catcode91=12   % [
+          \catcode93=12   % ]
+          \catcode94=11   % ^ LETTER
+          \catcode95=11   % _ LETTER
+          \catcode96=12   % `
+          \catcode123=1   % {
+          \catcode124=12  % |
+          \catcode125=2   % }
+          \catcode126=3   % ~ MATH SHIFT
+          \endlinechar=13 %
       }%
-      \let\XINT_setcatcodes\XINTsetcatcodes
-      \let\XINT_restorecatcodes\XINTrestorecatcodes
       \XINTsetcatcodes
   }%
 \PrepareCatcodes
@@ -20162,7 +20758,7 @@
 \fi
 \XINT_providespackage
 \ProvidesPackage {xintkernel}%
-  [2022/05/18 v1.4k Paraphernalia for the xint packages (JFB)]%
+  [2022/05/29 v1.4l Paraphernalia for the xint packages (JFB)]%
 %    \end{macrocode}
 % \subsection{Constants}
 %    \begin{macrocode}
@@ -20204,10 +20800,14 @@
 \fi
 %    \end{macrocode}
 % \subsection{Token management utilities}
+% \added{1.2}
+% Check if  \cs{empty} and \cs{space} have their standard meanings
+% and raise a warning if not.
 % \changed{1.3b}
-% |\xint_gobandstop_...| macros because this is handy for
+% Moved here |\xint_gobandstop_...| macros because this is handy for
 % \csbxint{RandomDigits}.
-% |1.3g| forces \cs{empty} and \cs{space} to have their standard meanings,
+% \changed{1.4}
+% Force \cs{empty} and \cs{space} to have their standard meanings,
 % rather than simply alerting user in the (theoretical) case they don't that
 % nothing will work.
 % If some \LaTeX{} user has \cs{renewcommand}ed them they will be long and
@@ -20849,7 +21449,7 @@
 }%
 \newif\ifxintverbose
 %    \end{macrocode}
-% \subsection{\csh{ifxintglobaldefs}, \csh{XINT_global}}\label{src-xintglobaldefstrue}
+% \subsection{\csh{ifxintglobaldefs}, \csh{XINT_global}}
 % \changed{1.3c}
 %    \begin{macrocode}
 \newif\ifxintglobaldefs
@@ -21080,24 +21680,23 @@
   \catcode123=1   % {
   \catcode125=2   % }
   \catcode64=11   % @
-  \catcode35=6    % #
   \catcode44=12   % ,
-  \catcode45=12   % -
   \catcode46=12   % .
   \catcode58=12   % :
-  \let\z\endgroup
+  \catcode94=7    % ^
+  \def\empty{}\def\space{ }\newlinechar10
+  \def\z{\endgroup}%
   \expandafter\let\expandafter\x\csname ver at xinttools.sty\endcsname
   \expandafter\let\expandafter\w\csname ver at xintkernel.sty\endcsname
-  \expandafter
-    \ifx\csname PackageInfo\endcsname\relax
-      \def\y#1#2{\immediate\write-1{Package #1 Info: #2.}}%
+  \expandafter\ifx\csname numexpr\endcsname\relax
+    \expandafter\ifx\csname PackageWarning\endcsname\relax
+      \immediate\write128{^^JPackage xinttools Warning:^^J%
+                          \space\space\space\space
+                          \numexpr not available, aborting input.^^J}%
     \else
-      \def\y#1#2{\PackageInfo{#1}{#2}}%
+      \PackageWarningNoLine{xinttools}{\numexpr not available, aborting input}%
     \fi
-  \expandafter
-  \ifx\csname numexpr\endcsname\relax
-     \y{xinttools}{\numexpr not available, aborting input}%
-     \aftergroup\endinput
+    \def\z{\endgroup\endinput}%
   \else
     \ifx\x\relax   % plain-TeX, first loading of xinttools.sty
       \ifx\w\relax % but xintkernel.sty not yet loaded.
@@ -21104,7 +21703,6 @@
          \def\z{\endgroup\input xintkernel.sty\relax}%
       \fi
     \else
-      \def\empty {}%
       \ifx\x\empty % LaTeX, first loading,
       % variable is initialized, but \ProvidesPackage not yet seen
           \ifx\w\relax % xintkernel.sty not yet loaded.
@@ -21111,7 +21709,7 @@
             \def\z{\endgroup\RequirePackage{xintkernel}}%
           \fi
       \else
-        \aftergroup\endinput % xinttools already loaded.
+        \def\z{\endgroup\endinput}% xinttools already loaded.
       \fi
     \fi
   \fi
@@ -21122,7 +21720,7 @@
 %    \begin{macrocode}
 \XINT_providespackage
 \ProvidesPackage{xinttools}%
-  [2022/05/18 v1.4k Expandable and non-expandable utilities (JFB)]%
+  [2022/05/29 v1.4l 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.|
@@ -23441,24 +24039,23 @@
   \catcode123=1   % {
   \catcode125=2   % }
   \catcode64=11   % @
-  \catcode35=6    % #
   \catcode44=12   % ,
-  \catcode45=12   % -
   \catcode46=12   % .
   \catcode58=12   % :
-  \let\z\endgroup
+  \catcode94=7    % ^
+  \def\empty{}\def\space{ }\newlinechar10
+  \def\z{\endgroup}%
   \expandafter\let\expandafter\x\csname ver at xintcore.sty\endcsname
   \expandafter\let\expandafter\w\csname ver at xintkernel.sty\endcsname
-  \expandafter
-    \ifx\csname PackageInfo\endcsname\relax
-      \def\y#1#2{\immediate\write-1{Package #1 Info: #2.}}%
+  \expandafter\ifx\csname numexpr\endcsname\relax
+    \expandafter\ifx\csname PackageWarning\endcsname\relax
+      \immediate\write128{^^JPackage xintcore Warning:^^J%
+                          \space\space\space\space
+                          \numexpr not available, aborting input.^^J}%
     \else
-      \def\y#1#2{\PackageInfo{#1}{#2}}%
+      \PackageWarningNoLine{xintcore}{\numexpr not available, aborting input}%
     \fi
-  \expandafter
-  \ifx\csname numexpr\endcsname\relax
-     \y{xintcore}{\numexpr not available, aborting input}%
-     \aftergroup\endinput
+    \def\z{\endgroup\endinput}%
   \else
     \ifx\x\relax   % plain-TeX, first loading of xintcore.sty
       \ifx\w\relax % but xintkernel.sty not yet loaded.
@@ -23465,7 +24062,6 @@
          \def\z{\endgroup\input xintkernel.sty\relax}%
       \fi
     \else
-      \def\empty {}%
       \ifx\x\empty % LaTeX, first loading,
       % variable is initialized, but \ProvidesPackage not yet seen
           \ifx\w\relax % xintkernel.sty not yet loaded.
@@ -23472,7 +24068,7 @@
             \def\z{\endgroup\RequirePackage{xintkernel}}%
           \fi
       \else
-        \aftergroup\endinput % xintkernel already loaded.
+        \def\z{\endgroup\endinput}% xintkernel already loaded.
       \fi
     \fi
   \fi
@@ -23483,7 +24079,7 @@
 %    \begin{macrocode}
 \XINT_providespackage
 \ProvidesPackage{xintcore}%
-  [2022/05/18 v1.4k Expandable arithmetic on big integers (JFB)]%
+  [2022/05/29 v1.4l 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
@@ -26795,24 +27391,23 @@
   \catcode123=1   % {
   \catcode125=2   % }
   \catcode64=11   % @
-  \catcode35=6    % #
   \catcode44=12   % ,
-  \catcode45=12   % -
   \catcode46=12   % .
   \catcode58=12   % :
-  \let\z\endgroup
+  \catcode94=7    % ^
+  \def\empty{}\def\space{ }\newlinechar10
+  \def\z{\endgroup}%
   \expandafter\let\expandafter\x\csname ver at xint.sty\endcsname
   \expandafter\let\expandafter\w\csname ver at xintcore.sty\endcsname
-  \expandafter
-    \ifx\csname PackageInfo\endcsname\relax
-      \def\y#1#2{\immediate\write-1{Package #1 Info: #2.}}%
+  \expandafter\ifx\csname numexpr\endcsname\relax
+    \expandafter\ifx\csname PackageWarning\endcsname\relax
+      \immediate\write128{^^JPackage xint Warning:^^J%
+                          \space\space\space\space
+                          \numexpr not available, aborting input.^^J}%
     \else
-      \def\y#1#2{\PackageInfo{#1}{#2}}%
+      \PackageWarningNoLine{xint}{\numexpr not available, aborting input}%
     \fi
-  \expandafter
-  \ifx\csname numexpr\endcsname\relax
-     \y{xint}{\numexpr not available, aborting input}%
-     \aftergroup\endinput
+    \def\z{\endgroup\endinput}%
   \else
     \ifx\x\relax   % plain-TeX, first loading of xintcore.sty
       \ifx\w\relax % but xintkernel.sty not yet loaded.
@@ -26819,7 +27414,6 @@
          \def\z{\endgroup\input xintcore.sty\relax}%
       \fi
     \else
-      \def\empty {}%
       \ifx\x\empty % LaTeX, first loading,
       % variable is initialized, but \ProvidesPackage not yet seen
           \ifx\w\relax % xintcore.sty not yet loaded.
@@ -26826,7 +27420,7 @@
             \def\z{\endgroup\RequirePackage{xintcore}}%
           \fi
       \else
-        \aftergroup\endinput % xint already loaded.
+        \def\z{\endgroup\endinput}% xint already loaded.
       \fi
     \fi
   \fi
@@ -26837,7 +27431,7 @@
 %    \begin{macrocode}
 \XINT_providespackage
 \ProvidesPackage{xint}%
-  [2022/05/18 v1.4k Expandable operations on big integers (JFB)]%
+  [2022/05/29 v1.4l Expandable operations on big integers (JFB)]%
 %    \end{macrocode}
 % \subsection{More token management}
 %    \begin{macrocode}
@@ -29374,24 +29968,23 @@
   \catcode123=1   % {
   \catcode125=2   % }
   \catcode64=11   % @
-  \catcode35=6    % #
   \catcode44=12   % ,
-  \catcode45=12   % -
   \catcode46=12   % .
   \catcode58=12   % :
-  \let\z\endgroup
+  \catcode94=7    % ^
+  \def\empty{}\def\space{ }\newlinechar10
+  \def\z{\endgroup}%
   \expandafter\let\expandafter\x\csname ver at xintbinhex.sty\endcsname
   \expandafter\let\expandafter\w\csname ver at xintkernel.sty\endcsname
-  \expandafter
-    \ifx\csname PackageInfo\endcsname\relax
-      \def\y#1#2{\immediate\write-1{Package #1 Info: #2.}}%
+  \expandafter\ifx\csname numexpr\endcsname\relax
+    \expandafter\ifx\csname PackageWarning\endcsname\relax
+      \immediate\write128{^^JPackage xintbinhex Warning:^^J%
+                          \space\space\space\space
+                          \numexpr not available, aborting input.^^J}%
     \else
-      \def\y#1#2{\PackageInfo{#1}{#2}}%
+      \PackageWarningNoLine{xintbinhex}{\numexpr not available, aborting input}%
     \fi
-  \expandafter
-  \ifx\csname numexpr\endcsname\relax
-     \y{xintbinhex}{\numexpr not available, aborting input}%
-     \aftergroup\endinput
+    \def\z{\endgroup\endinput}%
   \else
     \ifx\x\relax   % plain-TeX, first loading of xintbinhex.sty
       \ifx\w\relax % but xintkernel.sty not yet loaded.
@@ -29398,7 +29991,6 @@
          \def\z{\endgroup\input xintkernel.sty\relax}%
       \fi
     \else
-      \def\empty {}%
       \ifx\x\empty % LaTeX, first loading,
       % variable is initialized, but \ProvidesPackage not yet seen
           \ifx\w\relax % xintkernel.sty not yet loaded.
@@ -29405,7 +29997,7 @@
             \def\z{\endgroup\RequirePackage{xintkernel}}%
           \fi
       \else
-        \aftergroup\endinput % xintbinhex already loaded.
+        \def\z{\endgroup\endinput}% xintbinhex already loaded.
       \fi
     \fi
   \fi
@@ -29416,7 +30008,7 @@
 %    \begin{macrocode}
 \XINT_providespackage
 \ProvidesPackage{xintbinhex}%
-  [2022/05/18 v1.4k Expandable binary and hexadecimal conversions (JFB)]%
+  [2022/05/29 v1.4l Expandable binary and hexadecimal conversions (JFB)]%
 %    \end{macrocode}
 % \subsection{Constants, etc...}
 % \lverb|1.2n switches to \csname-governed expansion at various places.|
@@ -30039,25 +30631,24 @@
   \catcode123=1   % {
   \catcode125=2   % }
   \catcode64=11   % @
-  \catcode35=6    % #
   \catcode44=12   % ,
-  \catcode45=12   % -
   \catcode46=12   % .
   \catcode58=12   % :
+  \catcode94=7    % ^
+  \def\empty{}\def\space{ }\newlinechar10
   \def\z{\endgroup}%
   \expandafter\let\expandafter\x\csname ver at xintgcd.sty\endcsname
   \expandafter\let\expandafter\w\csname ver at xint.sty\endcsname
   \expandafter\let\expandafter\t\csname ver at xinttools.sty\endcsname
-  \expandafter
-    \ifx\csname PackageInfo\endcsname\relax
-      \def\y#1#2{\immediate\write-1{Package #1 Info: #2.}}%
+  \expandafter\ifx\csname numexpr\endcsname\relax
+    \expandafter\ifx\csname PackageWarning\endcsname\relax
+      \immediate\write128{^^JPackage xintgcd Warning:^^J%
+                          \space\space\space\space
+                          \numexpr not available, aborting input.^^J}%
     \else
-      \def\y#1#2{\PackageInfo{#1}{#2}}%
+      \PackageWarningNoLine{xintgcd}{\numexpr not available, aborting input}%
     \fi
-  \expandafter
-  \ifx\csname numexpr\endcsname\relax
-     \y{xintgcd}{\numexpr not available, aborting input}%
-     \aftergroup\endinput
+    \def\z{\endgroup\endinput}%
   \else
     \ifx\x\relax   % plain-TeX, first loading of xintgcd.sty
       \ifx\w\relax % but xint.sty not yet loaded.
@@ -30067,7 +30658,6 @@
          \expandafter\def\expandafter\z\expandafter{\z\input xinttools.sty\relax}%
       \fi
     \else
-      \def\empty {}%
       \ifx\x\empty % LaTeX, first loading,
       % variable is initialized, but \ProvidesPackage not yet seen
           \ifx\w\relax % xint.sty not yet loaded.
@@ -30077,7 +30667,7 @@
             \expandafter\def\expandafter\z\expandafter{\z\RequirePackage{xinttools}}%
           \fi
       \else
-        \aftergroup\endinput % xintgcd already loaded.
+        \def\z{\endgroup\endinput}% xintgcd already loaded.
       \fi
     \fi
   \fi
@@ -30088,7 +30678,7 @@
 %    \begin{macrocode}
 \XINT_providespackage
 \ProvidesPackage{xintgcd}%
-  [2022/05/18 v1.4k Euclide algorithm with xint package (JFB)]%
+  [2022/05/29 v1.4l Euclide algorithm with xint package (JFB)]%
 %    \end{macrocode}
 % \subsection{\csh{xintBezout}}
 % \lverb|&
@@ -30646,24 +31236,23 @@
   \catcode123=1   % {
   \catcode125=2   % }
   \catcode64=11   % @
-  \catcode35=6    % #
   \catcode44=12   % ,
-  \catcode45=12   % -
   \catcode46=12   % .
   \catcode58=12   % :
-  \let\z\endgroup
+  \catcode94=7    % ^
+  \def\empty{}\def\space{ }\newlinechar10
+  \def\z{\endgroup}%
   \expandafter\let\expandafter\x\csname ver at xintfrac.sty\endcsname
   \expandafter\let\expandafter\w\csname ver at xint.sty\endcsname
-  \expandafter
-    \ifx\csname PackageInfo\endcsname\relax
-      \def\y#1#2{\immediate\write-1{Package #1 Info: #2.}}%
+  \expandafter\ifx\csname numexpr\endcsname\relax
+    \expandafter\ifx\csname PackageWarning\endcsname\relax
+      \immediate\write128{^^JPackage xintfrac Warning:^^J%
+                          \space\space\space\space
+                          \numexpr not available, aborting input.^^J}%
     \else
-      \def\y#1#2{\PackageInfo{#1}{#2}}%
+      \PackageWarningNoLine{xintfrac}{\numexpr not available, aborting input}%
     \fi
-  \expandafter
-  \ifx\csname numexpr\endcsname\relax
-     \y{xintfrac}{\numexpr not available, aborting input}%
-     \aftergroup\endinput
+    \def\z{\endgroup\endinput}%
   \else
     \ifx\x\relax   % plain-TeX, first loading of xintfrac.sty
       \ifx\w\relax % but xint.sty not yet loaded.
@@ -30670,7 +31259,6 @@
          \def\z{\endgroup\input xint.sty\relax}%
       \fi
     \else
-      \def\empty {}%
       \ifx\x\empty % LaTeX, first loading,
       % variable is initialized, but \ProvidesPackage not yet seen
           \ifx\w\relax % xint.sty not yet loaded.
@@ -30677,7 +31265,7 @@
             \def\z{\endgroup\RequirePackage{xint}}%
           \fi
       \else
-        \aftergroup\endinput % xintfrac already loaded.
+        \def\z{\endgroup\endinput}% xintfrac already loaded.
       \fi
     \fi
   \fi
@@ -30688,7 +31276,7 @@
 %    \begin{macrocode}
 \XINT_providespackage
 \ProvidesPackage{xintfrac}%
-  [2022/05/18 v1.4k Expandable operations on fractions (JFB)]%
+  [2022/05/29 v1.4l Expandable operations on fractions (JFB)]%
 %    \end{macrocode}
 % \subsection{\csh{XINT_cntSgnFork}}
 % \lverb|1.09i. Used internally, #1 must expand to \m at ne, \z@, or \@ne or
@@ -30769,7 +31357,7 @@
     \expandafter\XINT_outfrac_P\expandafter {#2}{#1}%
 }%
 %    \end{macrocode}
-% \subsection{\csh{XINT_inFrac}}\label{src-XINT_infrac}
+% \subsection{\csh{XINT_infrac}}
 % \added{1.03}
 % \lverb|&
 % Parses fraction, scientific notation, etc... and produces {n}{A}{B}
@@ -30822,7 +31410,7 @@
 % expression must be suitably hidden for example in \firstofone type
 % constructs.
 %
-% Note: when the numerator is found to be zero \XINT_inFrac *always* returns
+% Note: when the numerator is found to be zero \XINT_infrac *always* returns
 % {0}{0}{1}. This behaviour must not change because 1.2g \xintFloat and
 % XINTinFloat (for example) rely upon it: if the denominator on output is not
 % 1, then \xintFloat assumes that the numerator is not zero.
@@ -30847,9 +31435,15 @@
 % used as delimiter not as operator. Anyway, I thus fixed this problem
 % belatedly here regarding \XINT_infrac.
 % |
+% \changed{1.4l}
+% \lverb|&
+% The venerable \XINT_inFrac is used nowhere, only \XINT_infrac is.
+% It is deprecated and I will remove it at next major release.
+% See \xintRawBraced.
+% |
 %    \begin{macrocode}
-\def\XINT_inFrac {\romannumeral0\XINT_infrac }%
-\def\XINT_infrac #1%
+\def\XINT_inFrac {\romannumeral0\XINT_infrac }% this one deprecated
+\def\XINT_infrac #1% this one is core xintfrac macro
 {%
     \expandafter\XINT_infrac_fork\romannumeral`&&@#1\xint:/\XINT_W[\XINT_W\XINT_T
 }%
@@ -31194,6 +31788,15 @@
 }%
 \def\XINT_raw #1#2#3{ #2/#3[#1]}%
 %    \end{macrocode}
+% \subsection{\csh{xintRawBraced}}
+% \added{1.4l}
+% \lverb|&
+% User level interface to core \romannumeral0\XINT_infrac. Replaces
+% \XINT_inFrac which was defined but nowhere used by the xint packages.|
+%    \begin{macrocode}
+\def\xintRawBraced {\romannumeral0\xintrawbraced }%
+\let\xintrawbraced \XINT_infrac
+%    \end{macrocode}
 % \subsection{\csh{xintiLogTen}}
 % \added{1.3e}
 % \lverb|&
@@ -31277,6 +31880,44 @@
 \def\XINT_spraw_a\W\XINT_spraw_p #1[\W]{ #1}%
 \def\XINT_spraw_p #1[\W]{\xintpraw {#1}}%
 %    \end{macrocode}
+% \subsection{\csh{xintFracToSci}}
+% \added{1.4l}
+% \lverb|The macro with this name which was added here at 1.4 then had
+% various changes and finally was moved to $xintexprnameimp at 1.4k
+% is now called there
+% \xint_FracToSci_x and is private.  The present macro is public and
+% behaves like the other $xintfracnameimp macros: f-expandable and
+% accepts general input.  Its output is exactly the same as
+% \xint_FracToSci_x for same inputs, with the exception of the empty
+% input which \xintFracToSci will output as 0 but \xint_FracToSci_x
+% as empty.  But the latter is not used by \xinteval for an empty
+% leaf as it employs then \xintexprEmptyItem.|
+%    \begin{macrocode}
+\def\xintFracToSci{\romannumeral0\xintfractosci}%
+\def\xintfractosci#1{\expandafter\XINT_fractosci\romannumeral0\xintraw{#1}}%
+\def\XINT_fractosci#1#2/#3[#4]{\expanded{ %
+    \ifnum#4=\xint_c_ #1#2\else
+      \romannumeral0\expandafter\XINT_pfloat_a_fork\romannumeral0\xintrez{#1#2[#4]}%
+    \fi
+    \if\XINT_isOne{#3}1\else\if#10\else/#3\fi\fi}%
+}%
+%    \end{macrocode}
+% \subsection{\csh{xintFracToDecimal}}
+% \added{1.4l}
+% \lverb|The macro with this name which was added at 1.4k to
+% $xintexprnameimp has been removed.  The public variant here
+% behaves like the other
+% $xintfracnameimp macros: f-expandable and accepts general input.|
+%    \begin{macrocode}
+\def\xintFracToDecimal{\romannumeral0\xintfractodecimal}%
+\def\xintfractodecimal#1{\expandafter\XINT_fractodecimal\romannumeral0\xintraw{#1}}%
+\def\XINT_fractodecimal #1#2/#3[#4]{\expanded{ %
+    \ifnum#4=\xint_c_ #1#2\else
+      \romannumeral0\expandafter\XINT_dectostr\romannumeral0\xintrez{#1#2[#4]}%
+    \fi
+    \if\XINT_isOne{#3}1\else\if#10\else/#3\fi\fi}%
+}%
+%    \end{macrocode}
 % \subsection{\csh{xintRawWithZeros}}
 % \lverb|&
 % This was called \xintRaw in versions earlier than 1.07|
@@ -31476,12 +32117,11 @@
     \expandafter-\romannumeral0\XINT_sgnfrac_P
 }%
 %    \end{macrocode}
-% \subsection{\csh{xintTeXfromSci}}
+% \subsection{\csh{xintTeXFromSci}}
 % \added{1.4g}
 % \lverb|The main problem is how to name this and related macros.
 %
-% I use \expanded here, as \xintFracToSci is not f-expandable. But why do I
-% bother with the external \expanded?
+% I use \expanded here, as \xintFracToSci is not f-expandable.
 %
 % Some complications as I want this to be usable on output of \xintFracToSci
 % hence need to handle the case of a /B.  After some hesitations I ended with
@@ -31490,16 +32130,27 @@
 %:- if scientific part, postfix /B as \cdot B^{-1}
 %)
 % |
+% \changed{1.4l}
+% \lverb|Suppress external \expanded. Keep internal one.
+%
+% Rename \xintTeXFromSci from \xintTeXfromSci. Keep deprecated old name
+% for the moment.
+%
+% Add \xintTeXFromScifracmacro. Make it \protected.
+%
+% Nota bene: catcode of ^ is normal one here (else nothing would work).
+% |
 %    \begin{macrocode}
-\def\xintTeXfromSci#1%
+\def\xintTeXfromSci{\xintfracTeXDeprecation\xintTeXfromSci\xintTeXFromSci}%
+\def\xintTeXFromSci#1%
 {%
-    \expanded{\expandafter\XINT_texfromsci\expanded{#1}/\relax/\xint:}%
+    \expandafter\XINT_texfromsci\expanded{#1}/\relax/\xint:
 }%
 \def\XINT_texfromsci #1/#2#3/#4\xint:
 {%
     \XINT_texfromsci_a #1e\relax e\xint:
     {\ifx\relax#2\xint_dothis\xint_firstofone\fi
-     \xint_orthat{\XINT_texfromsci_frac{#2#3}}}%
+     \xint_orthat{\xintTeXFromScifracmacro{#2#3}}}%
     {\unless\ifx\relax#2\cdot{#2#3}^{-1}\fi}%
 }%
 \def\XINT_texfromsci_a #1e#2#3e#4\xint:#5#6%
@@ -31507,9 +32158,9 @@
     \ifx\relax#2#5{#1}\else#1\cdot10^{#2#3}#6\fi
 }%
 \ifdefined\frac
-  \def\XINT_texfromsci_frac#1#2{\noexpand\frac{#2}{#1}}%
+  \protected\def\xintTeXFromScifracmacro#1#2{\frac{#2}{#1}}%
 \else
-  \def\XINT_texfromsci_frac#1#2{{#2\over#1}}%
+  \protected\def\xintTeXFromScifracmacro#1#2{{#2\over#1}}%
 \fi
 %    \end{macrocode}
 % \subsection{\csh{xintTeXOver}}
@@ -33219,6 +33870,20 @@
 \def\xintSgn   {\romannumeral0\xintsgn }%
 \def\xintsgn #1{\expandafter\XINT_sgn\romannumeral0\xintraw {#1}\xint:}%
 %    \end{macrocode}
+% \subsection{\csh{xintSignBit}}
+% \added{1.4l}
+%    \begin{macrocode}
+\def\xintSignBit   {\romannumeral0\xintsignbit }%
+\def\xintsignbit #1{\expandafter\XINT_signbit\romannumeral0\xintraw {#1}\xint:}%
+\def\XINT_signbit #1#2\xint:
+{%
+    \xint_UDzerominusfork
+      #1-{ 0}%
+      0#1{ 1}%
+       0-{ 0}%
+    \krof
+}%
+%    \end{macrocode}
 % \subsection{\csh{xintGCD}}
 % \changed{1.4}
 % They replace the former \xintgcdnameimp macros of the same names which
@@ -33673,11 +34338,11 @@
     \expandafter\XINT_float_post
     \romannumeral0\XINTinfloat[\XINTdigits]{#1}\XINTdigits.%
 }%
-\def\XINT_float_opt [\xint:#1]%
+\def\XINT_float_opt [\xint:
 {%
-    \expandafter\XINT_float_opt_a\the\numexpr #1.%
+    \expandafter\XINT_float_opt_a\the\numexpr
 }%
-\def\XINT_float_opt_a #1.#2%
+\def\XINT_float_opt_a #1]#2%
 {%
     \expandafter\XINT_float_post
     \romannumeral0\XINTinfloat[#1]{#2}#1.%
@@ -33698,6 +34363,76 @@
 }%
 \def\XINT_float_pos_done #1.#2;{ #2e#1}%
 %    \end{macrocode}
+% \subsection{\csh{xintFloatBraced}}
+% \added{1.4l}
+%\lverb|&
+% Je ne le fais pas comme un wrapper au-dessus de \xintFloat
+% car c'est pénible avec argument optionnel donc finalemnt
+% on est obligé de rajouter overhead comme ici.
+%
+%( Hésitation si on obéit à \xintFloatZero ou pas. Finalement non.
+%: Hésitation si on renvoie avec séparateur décimal ou pas.
+%: Hésitation si on met l'exposant scientifique en premier.
+%: Hésitation si on sépare le signe pour le mettre en premier.
+%: Hésitation si on renvoie un exposant pour mantisse normalisée&
+%  ou pas normalisée.
+%)
+%
+% Finalement je décide {signe}{exposant}{mantisse sans point décimal}.
+% Avec en fait 0 ou 1 pour signe (mais ce sign bit mais ça n'a pas grand
+% sens en décimal...). Non finalement mantisse avec point décimal.
+% |
+%    \begin{macrocode}
+\def\xintFloatBraced{\romannumeral0\xintfloatbraced }%
+\def\xintfloatbraced#1{\XINT_floatbr_chkopt #1\xint:}%
+\def\XINT_floatbr_chkopt #1%
+{%
+    \ifx [#1\expandafter\XINT_floatbr_opt
+       \else\expandafter\XINT_floatbr_noopt
+    \fi  #1%
+}%
+\def\XINT_floatbr_noopt #1\xint:%
+{%
+    \expandafter\XINT_floatbr_post
+    \romannumeral0\XINTinfloat[\XINTdigits]{#1}\XINTdigits.%
+}%
+\def\XINT_floatbr_opt [\xint:
+{%
+    \expandafter\XINT_floatbr_opt_a\the\numexpr
+}%
+\def\XINT_floatbr_opt_a #1]#2%
+{%
+    \expandafter\XINT_floatbr_post
+    \romannumeral0\XINTinfloat[#1]{#2}#1.%
+}%
+\def\XINT_floatbr_post #1%
+{%
+    \xint_UDzerominusfork
+      #1-\XINT_floatbr_zero
+       0#1\XINT_floatbr_neg
+       0-\XINT_floatbr_pos
+    \krof #1%
+}%
+%    \end{macrocode}
+%\lverb|&
+% Hésitation à faire
+%( \def\XINT_floatbr_zero #1]#2.{\expandafter\XINT_floatbr_zero_a\xintFloatZero e0e\relax}%
+%: \def\XINT_floatbr_zero_a#1e#2e#3\relax{{#1}{#2}}%
+%)
+% Finalement non. Et même je décide de renvoyer autant de zéros que P.
+% De plus depuis j'ai opté pour {sign bit}{exposant}{mantisse}
+% Hésitation si mantisse avec ou sans le séparateur décimal.
+% Est-ce que je devrais mettre plutôt -0+ au début?
+% |
+%    \begin{macrocode}
+\def\XINT_floatbr_zero #1]#2.{\expanded{{0}{0}{0.\xintReplicate{#2-\xint_c_i}0}}}%
+\def\XINT_floatbr_neg-{\expandafter\XINT_floatbr_neg_a\romannumeral0\XINT_floatbr_pos}%
+\def\XINT_floatbr_neg_a#1{{1}}%
+\def\XINT_floatbr_pos #1#2[#3]#4.%
+{%
+    \expanded{{0}{\the\numexpr#3+#4-\xint_c_i}}{#1.#2}%
+}%
+%    \end{macrocode}
 % \subsection{\csh{XINTinFloat}, \csh{XINTinFloatS}}
 % \lverb|&
 % This routine is like \xintFloat but produces an output of the shape A[N]
@@ -33763,12 +34498,13 @@
 \def\XINT_infloatS_clean_a !#1.{ }%
 %    \end{macrocode}
 % \lverb|début de la routine proprement dite,
-% l'argument optionnel est obligatoire.|
+% l'argument optionnel est obligatoire.
+% |
 %    \begin{macrocode}
-\def\XINT_infloat [#1]#2%
+\def\XINT_infloat [#1]%#2%
 {%
     \expandafter\XINT_infloat_a\the\numexpr #1\expandafter.%
-    \romannumeral0\XINT_infrac {#2}%
+    \romannumeral0\XINT_infrac% {#2}%
 }%
 %    \end{macrocode}
 % \lverb| #1=P, #2=n, #3=A, #4=B.|
@@ -34077,6 +34813,11 @@
 % \added{1.3e}
 % \lverb|Le comportement pour un input nul est non
 % encore finalisé. Il changera lorsque NaN, +Inf, -Inf existeront.
+%
+% The optional argument [#1] is in fact mandatory and #1 is
+% not pre-expanded in a \numexpr.
+%
+% The return value here 2^31-2^15 is highly undecided.
 % |
 %    \begin{macrocode}
 \def\XINTFloatiLogTen {\the\numexpr\XINTfloatilogten}%
@@ -34089,80 +34830,9 @@
     \xint_orthat\XINT_floatilogten_b #1%
 }%
 \def\XINT_floatilogten_z 0[0]#1.{-"7FFF8000\relax}%
-\def\XINT_floatilogten_a !#1.#2[#3]#4.{#3-#1+#4-1\relax}%
-\def\XINT_floatilogten_b #1[#2]#3.{#2+#3-1\relax}%
+\def\XINT_floatilogten_a !#1.#2[#3]#4.{#3-#1+#4-\xint_c_i\relax}%
+\def\XINT_floatilogten_b #1[#2]#3.{#2+#3-\xint_c_i\relax}%
 %    \end{macrocode}
-% \subsection{\csh{xintFloatSciExp}}
-% \added[2022/05/16]{1.4k}
-% \lverb|Hesitation about whether keeping the general \romannumeral0
-% trigger which is documented as general rule.|
-%    \begin{macrocode}
-\def\xintFloatSciExp {\the\numexpr\xintfloatsciexp }%
-\def\xintpfloatsciexp #1{\XINT_floatsciexp_chkopt #1\xint:}%
-\def\XINT_floatsciexp_chkopt #1%
-{%
-    \ifx [#1\expandafter\XINT_floatsciexp_opt
-       \else\expandafter\XINT_floatsciexp_noopt
-    \fi  #1%
-}%
-\def\XINT_floatsciexp_noopt #1\xint:%
-{%
-    \expandafter\XINT_floatsciexp\romannumeral0\XINT_infloat[\XINTdigits]{#1}%
-    \XINTdigits.%
-}%
-\def\XINT_floatsciexp_opt [\xint:#1]#2%
-{%
-    \expandafter\XINT_floatsciexp\romannumeral0\XINT_infloat[#1]{#2}#1.%
-}%
-\def\XINT_floatsciexp #1{%
-    \if #10\xint_dothis\XINT_floatsciexp_z\fi
-    \if #1!\xint_dothis\XINT_floatsciexp_a\fi
-    \xint_orthat\XINT_floatsciexp_b #1%
-}%
-\def\XINT_floatsciexp_z 0[0]#1.{0\relax}%
-\def\XINT_floatsciexp_a !#1.#2[#3]#4.{#3-#1+#4-1\relax}%
-\def\XINT_floatsciexp_b #1[#2]#3.{#2+#3-1\relax}%
-%    \end{macrocode}
-% \subsection{\csh{xintFloatSignificand}}
-% \added[2022/05/16]{1.4k}
-% \lverb|Hesitation about whether returning abcd... or a.bcd...
-% with a separator
-% and slight hesitation about handling of zero.|
-%    \begin{macrocode}
-\def\xintFloatSignificand {\romannumeral0\xintfloatsignificand}%
-\def\xintfloatsignificand #1{\XINT_floatsgf_chkopt #1\xint:}%
-\def\XINT_floatsgf_chkopt #1%
-{%
-    \ifx [#1\expandafter\XINT_floatsgf_opt
-       \else\expandafter\XINT_floatsgf_noopt
-    \fi  #1%
-}%
-\def\XINT_floatsgf_noopt #1\xint:%
-{%
-    \expandafter\XINT_floatsgf_post
-    \romannumeral0\XINTinfloat[\XINTdigits]{#1}\XINTdigits.%
-}%
-\def\XINT_floatsgf_opt [\xint:#1]%
-{%
-    \expandafter\XINT_floatsgf_opt_a\the\numexpr #1.%
-}%
-\def\XINT_floatsgf_opt_a #1.#2%
-{%
-    \expandafter\XINT_floatsgf_post
-    \romannumeral0\XINTinfloat[#1]{#2}#1.%
-}%
-\def\XINT_floatsgf_post #1%
-{%
-    \xint_UDzerominusfork
-      #1-\XINT_floatsgf_zero
-       0#1\XINT_floatsgf_neg
-       0-\XINT_floatsgf_pos
-    \krof #1%
-}%[
-\def\XINT_floatsgf_zero #1]#2.{\XINT_dsx_addzeros{#2};}%
-\def\XINT_floatsgf_neg-{\XINT_floatsgf_pos}%
-\def\XINT_floatsgf_pos #1[#2]#3.{ #1}%
-%    \end{macrocode}
 % \subsection{\csh{xintPFloat}}
 % \added{1.1}
 % \changed{1.4e}
@@ -34221,7 +34891,7 @@
 % as it knows it will
 % be used always with a [P] argument in the xintexpr.sty context.
 % |
-% \changed[2022/05/18]{1.4k}
+% \changed{1.4k}
 % \lverb|&
 % Addition of customization via \xintPFloatZero, \xintPFloatLengthOneSuffix,
 % \xintPFloatNoSciEmax, \xintPFloatNoSciEmin which replace formerly
@@ -34257,6 +34927,13 @@
 %
 % Threshold customizable via \xintPFloatMinTrimmed.
 % |
+% \changed[2022/05/22]{1.4l}
+% \lverb|The 1.4k check for canceling the trimming of trailing zeros
+% took over priority over the later check for being an integer when
+% decimal fixed point notation was used (or being only with a one-digit
+% trimmed mantissa).  In particular if user set \xintPFloatMinTrimmed to
+% the value of Digits (or P) to avoid trimming it also prevented
+% recognition of some integers (but not all).  Fixed at 1.4l|
 %    \begin{macrocode}
 \def\xintPFloatE{e}%
 \def\xintPFloatNoSciEmax{\xint_c_v}%   1e6  uses sci.not.
@@ -34283,7 +34960,8 @@
     \expandafter\XINT_pfloat\romannumeral0\XINTinfloatS[\XINTdigits]{#1}%
     \XINTdigits.%
 }%
-\def\XINT_pfloat_opt [\xint:#1]#2%
+\def\XINT_pfloat_opt [\xint:{\expandafter\XINT_pfloat_opt_a\the\numexpr}%
+\def\XINT_pfloat_opt_a #1]#2%
 {%
     \expandafter\XINT_pfloat\romannumeral0\XINTinfloatS[#1]{#2}%
     #1.%
@@ -34308,28 +34986,15 @@
     #3.#2.#1.%
 }%
 %    \end{macrocode}
-%\lverb|Needed for \xintFracToSci, which uses old pre 1.4k interface.|
-%    \begin{macrocode}
-\def\XINT_pfloat_keeptrimmed_fork#1%
-{%
-    \xint_UDzerominusfork
-       #1-\XINT_pfloat_keeptrimmed_zero
-       0#1\XINT_pfloat_keeptrimmed_neg
-        0-\XINT_pfloat_keeptrimmed_pos
-    \krof #1%
-}%
-\def\XINT_pfloat_keeptrimmed_zero#1]{\expanded{ \xintPFloatZero}}%
-\def\XINT_pfloat_keeptrimmed_neg-{\expandafter-\romannumeral0\XINT_pfloat_keeptrimmed_pos}%
-\def\XINT_pfloat_keeptrimmed_pos#1/1[#2]%
-{%
-    \expandafter\XINT_pfloat_a\the\numexpr\xintLength{#1}.#2.#1.%
-}%
-%    \end{macrocode}
 %\lverb|&
 %( #1 est la longueur de la mantisse trimmée
 %: #2 est Digits ou P
-%: Si #2-#1 < MinTrimmed, on remet les trailing zeros
+%: Si #2-#1 < MinTrimmed, on se prépare à peut-être remettre les trailing zeros
 %)
+%
+% On teste pour #2=#1, car c'est le cas le plus fréquent (mais est-ce
+% une bonne idée) car on sait qu'alors il n'y a pas de trailing zéros
+% donc on va direct vers \XINT_pfloat_a.
 %|
 %    \begin{macrocode}
 \def\XINT_pfloat_aa #1.#2.%
@@ -34340,39 +35005,79 @@
     \xint_orthat\XINT_pfloat_a #1.%
 }%
 %    \end{macrocode}
+%\lverb|Needed for \xintFracToSci, which uses old pre 1.4k interface,
+% where the P parameter was not stored for counting how many zeros
+% were trimmed. \xintFracToSci trims always.|
+%    \begin{macrocode}
+\def\XINT_pfloat_a_fork#1%
+{%
+    \xint_UDzerominusfork
+       #1-\XINT_pfloat_a_zero
+       0#1\XINT_pfloat_a_neg
+        0-\XINT_pfloat_a_pos
+    \krof #1%
+}%
+\def\XINT_pfloat_a_zero#1]{\expanded{ \xintPFloatZero}}%
+\def\XINT_pfloat_a_neg-{\expandafter-\romannumeral0\XINT_pfloat_a_pos}%
+\def\XINT_pfloat_a_pos#1/1[#2]%
+{%
+    \expandafter\XINT_pfloat_a\the\numexpr\xintLength{#1}.#2.#1.%
+}%
+%    \end{macrocode}
 %\lverb|&
-%( #2 est la longueur de la mantisse trimmée
-%: #1 est P mais peut être encore sous la forme \XINTdigits
+%( #1 est P > #2 mais peut être encore sous la forme \XINTdigits
+%: #2 est la longueur de la mantisse trimmée
 %: #3 est l'exposant non normalisé
 %: #4 est la mantisse
 %)
+% On reconstitue les trailing zéros à remettre éventuellement.
 %|
 %    \begin{macrocode}
-\def\XINT_pfloat_i #1.#2.#3.#4.%
+\def\XINT_pfloat_i #1.#2.%#3.#4.%
 {%
-    \expandafter\XINT_pfloat_j
-    \the\numexpr#3+#2-#1\expandafter.%
-    \romannumeral0\XINT_dsx_addzerosnofuss{#1-#2}#4;.#1.%
+    \expandafter\XINT_pfloat_j\romannumeral\xintreplicate{#1-#2}0.#2.%
 }%
 %    \end{macrocode}
-%\lverb|&
-%( #1 est le nouvel exposant non normalisé
-%: #2 est la nouvelle mantisse à P chiffres
-%: #3 est P (peut être sous forme \XINTdigits)
+% \lverb|&
+%( #1 est les trailing zeros à remettre peut-être
+%: #2 est la longueur de la mantisse trimmée
+%: #3#4 est l'exposant N pour mantisse trimmée entière
+%: #5 serait la mantisse trimmée
 %)
+% On calcule l'exposant scientifique.
+%
+% La façon bizarre de mettre #3 est liée aux versions anciennes
+% de la macro, héritage conservé pour minimiser effort d'adaptation.
 %|
 %    \begin{macrocode}
-\def\XINT_pfloat_j #1.#2.#3.{\XINT_pfloat_a#3.#1.#2.}%
-\def\XINT_pfloat_a #1.#2#3.%
+\def\XINT_pfloat_j #1.#2.#3#4.%#5.
 {%
+    \expandafter\XINT_pfloat_b\the\numexpr#2+#3#4-\xint_c_i.%
+    #3#2.#1.%
+}%
+%    \end{macrocode}
+% \lverb|&
+%( #1 est la longueur de la mantisse trimmée
+%: #2#3 est l'exposant N pour mantisse trimmée
+%: #4 serait la mantisse
+%)
+% On calcule l'exposant scientifique. On est arrivé ici dans
+% une branche où on n'a pas besoin de remettre les zéros trimmés
+% donc on positionne un dernier argument vide pour \XINT_pfloat_b
+% |
+%    \begin{macrocode}
+\def\XINT_pfloat_a #1.#2#3.%#4.
+{%
     \expandafter\XINT_pfloat_b\the\numexpr#1+#2#3-\xint_c_i.%
-    #2#1.%
+    #2#1..%
 }%
 %    \end{macrocode}
 % \lverb|&
 %( #1 est l'exposant scientifique K
 %: #2 est le signe ou premier chiffre de l'exposant N pour mantisse trimmée
-%: Il est suivi par la longueur de la mantisse trimmée
+%: #3 serait la longueur de la mantisse trimmée
+%: #4 serait les trailing zéros
+%: #5 serait la mantisse trimmée
 %)
 % On va vers \XINT_float_P lorsque l'on n'utilise pas la notation
 % scientifique, mais qu'on a besoin de chiffres non nuls fractionnaires,
@@ -34382,7 +35087,7 @@
 % scientifique et que l'exposant scientifique était strictement négatif.
 %|
 %    \begin{macrocode}
-\def\XINT_pfloat_b #1.#2%
+\def\XINT_pfloat_b #1.#2%#3.#4.#5.
 {%
     \ifnum \xintPFloatNoSciEmax<#1 \xint_dothis\XINT_pfloat_sci\fi
     \ifnum \xintPFloatNoSciEmin>#1 \xint_dothis\XINT_pfloat_sci\fi
@@ -34393,8 +35098,8 @@
 }%
 %    \end{macrocode}
 % \lverb|&
-% #1 is the scientific exponent, #2 is the length of the trimmed mantissa.
-% (may be the \XINTdigits token)
+% #1 is the scientific exponent, #2 is the length of the trimmed mantissa,
+% #3 are the trailing zeros, #4 is the trimmed integer mantissa
 %
 % \xintPFloatE can be replaced by any f-expandable macro with a dot-delimited
 % argument which produces a dot-delimited output.
@@ -34405,7 +35110,7 @@
     \ifnum#2=\xint_c_i\expandafter\XINT_pfloat_sci_i\expandafter\fi
     \expandafter\XINT_pfloat_sci_a\romannumeral`&&@\xintPFloatE #1.%
 }%
-\def\XINT_pfloat_sci_a #1.#2#3.{ #2.#3#1}%
+\def\XINT_pfloat_sci_a #1.#2.#3#4.{ #3.#4#2#1}%
 %    \end{macrocode}
 % \lverb|&
 % #1#2=\fi\XINT_pfloat_sci_a
@@ -34414,44 +35119,46 @@
 % Finally at 1.4k, \xintPFloatLengthOneSuffix for customization.
 % |
 %    \begin{macrocode}
-\def\XINT_pfloat_sci_i #1#2#3.#4.{\expanded{#1 #4\xintPFloatLengthOneSuffix}#3}%
+\def\XINT_pfloat_sci_i #1#2#3.#4.#5.{\expanded{#1 #5\xintPFloatLengthOneSuffix}#3}%
 %    \end{macrocode}
 % \lverb|&
-% #1=sci.exp. K, #2=mant. wd L, #3=mantissa
+% #1=sci.exp. K, #2=mant. wd L, #3=trailing zéros, #4=trimmed mantissa
 % 
 % For _N, #1 is at most -1, for _P, #1 is at least 0. For _P there
 % will be fractional digits, and #1+1 digits before the mark.
 % |
 %    \begin{macrocode}
-\def\XINT_pfloat_N#1.#2.#3.%
+\def\XINT_pfloat_N#1.#2.#3.#4.%
 {%
-    \expandafter\XINT_pfloat_N_e\romannumeral\xintreplicate{-#1}{0}#3%
+    \expandafter\XINT_pfloat_N_e\romannumeral\xintreplicate{-#1}{0}#4#3%
 }%
 \def\XINT_pfloat_N_e 0{ 0.}%
 %    \end{macrocode}
 % \lverb|&
+% #1=sci.exp. K, #2=mant. wd L, #3=trailing zéros, #4=trimmed mantissa
+%
 % Abusive usage of internal \XINT_split_fromleft_a.
 % It means using x = -1 - #1 in \xintDecSplit from xint.sty.
 % We benefit also with the way \xintDecSplit is built upon
 % \XINT_split_fromleft with a final clean-up which here
-% we can shortcut (non \xint_bye. not \xint_bye..).
+% we can shortcut via using terminator "\xint_bye." not "\xint_bye.."
 % |
 %    \begin{macrocode}
-\def\XINT_pfloat_P #1.#2.#3.%
+\def\XINT_pfloat_P #1.#2.#3.#4.%
 {%
     \expandafter\XINT_split_fromleft_a
-    \the\numexpr\xint_c_vii-#1.#3\xint_bye2345678\xint_bye.%
+    \the\numexpr\xint_c_vii-#1.#4\xint_bye2345678\xint_bye.#3%
 }%
 %    \end{macrocode}
 % \lverb|&
-% Here we have an integer so we only need to postfix mantissa #3
-% with #1+1-#2 zeros (#1=sci exp., #2=mantissa width).  Less cumbersome
-% to do that with \expanded.
+% Here we have an integer so we only need to postfix the trimmed mantissa #4
+% with #1+1-#2 zeros (#1=sci exp., #2=trimmed mantissa width).  Less cumbersome
+% to do that with \expanded.  And the trailing zeros #3 ignored here.
 % |
 %    \begin{macrocode}
-\def\XINT_pfloat_Ps #1.#2.#3.%
+\def\XINT_pfloat_Ps #1.#2.#3.#4.%
 {%
-    \expanded{ #3%
+    \expanded{ #4%
     \romannumeral\xintreplicate{#1+\xint_c_i-#2}{0}\xintPFloatIntSuffix}%
 }%
 %    \end{macrocode}
@@ -34475,7 +35182,7 @@
     \expandafter\XINT_floattodec\romannumeral0\XINTinfloatS[#1]%
 }%
 %    \end{macrocode}
-% \lverb|Tentation to try to use direct access to lower entry points
+% \lverb|Temptation to try to use direct access to lower entry points
 % from \xintREZ, but it dates back from very early days and uses old \Z
 % delimiters (same remarks for the code jumping from \xintFracToSci
 % to \xintrez)|
@@ -36168,24 +36875,23 @@
   \catcode123=1   % {
   \catcode125=2   % }
   \catcode64=11   % @
-  \catcode35=6    % #
   \catcode44=12   % ,
-  \catcode45=12   % -
   \catcode46=12   % .
   \catcode58=12   % :
-  \let\z\endgroup
+  \catcode94=7    % ^
+  \def\empty{}\def\space{ }\newlinechar10
+  \def\z{\endgroup}%
   \expandafter\let\expandafter\x\csname ver at xintseries.sty\endcsname
   \expandafter\let\expandafter\w\csname ver at xintfrac.sty\endcsname
-  \expandafter
-    \ifx\csname PackageInfo\endcsname\relax
-      \def\y#1#2{\immediate\write-1{Package #1 Info: #2.}}%
+  \expandafter\ifx\csname numexpr\endcsname\relax
+    \expandafter\ifx\csname PackageWarning\endcsname\relax
+      \immediate\write128{^^JPackage xintseries Warning:^^J%
+                          \space\space\space\space
+                          \numexpr not available, aborting input.^^J}%
     \else
-      \def\y#1#2{\PackageInfo{#1}{#2}}%
+      \PackageWarningNoLine{xintseries}{\numexpr not available, aborting input}%
     \fi
-  \expandafter
-  \ifx\csname numexpr\endcsname\relax
-     \y{xintseries}{\numexpr not available, aborting input}%
-     \aftergroup\endinput
+    \def\z{\endgroup\endinput}%
   \else
     \ifx\x\relax   % plain-TeX, first loading of xintseries.sty
       \ifx\w\relax % but xintfrac.sty not yet loaded.
@@ -36192,7 +36898,6 @@
          \def\z{\endgroup\input xintfrac.sty\relax}%
       \fi
     \else
-      \def\empty {}%
       \ifx\x\empty % LaTeX, first loading,
       % variable is initialized, but \ProvidesPackage not yet seen
           \ifx\w\relax % xintfrac.sty not yet loaded.
@@ -36199,7 +36904,7 @@
             \def\z{\endgroup\RequirePackage{xintfrac}}%
           \fi
       \else
-        \aftergroup\endinput % xintseries already loaded.
+        \def\z{\endgroup\endinput}% xintseries already loaded.
       \fi
     \fi
   \fi
@@ -36210,7 +36915,7 @@
 %    \begin{macrocode}
 \XINT_providespackage
 \ProvidesPackage{xintseries}%
-  [2022/05/18 v1.4k Expandable partial sums with xint package (JFB)]%
+  [2022/05/29 v1.4l Expandable partial sums with xint package (JFB)]%
 %    \end{macrocode}
 % \subsection{\csh{xintSeries}}
 %    \begin{macrocode}
@@ -36676,24 +37381,23 @@
   \catcode123=1   % {
   \catcode125=2   % }
   \catcode64=11   % @
-  \catcode35=6    % #
   \catcode44=12   % ,
-  \catcode45=12   % -
   \catcode46=12   % .
   \catcode58=12   % :
-  \let\z\endgroup
+  \catcode94=7    % ^
+  \def\empty{}\def\space{ }\newlinechar10
+  \def\z{\endgroup}%
   \expandafter\let\expandafter\x\csname ver at xintcfrac.sty\endcsname
   \expandafter\let\expandafter\w\csname ver at xintfrac.sty\endcsname
-  \expandafter
-    \ifx\csname PackageInfo\endcsname\relax
-      \def\y#1#2{\immediate\write-1{Package #1 Info: #2.}}%
+  \expandafter\ifx\csname numexpr\endcsname\relax
+    \expandafter\ifx\csname PackageWarning\endcsname\relax
+      \immediate\write128{^^JPackage xintcfrac Warning:^^J%
+                          \space\space\space\space
+                          \numexpr not available, aborting input.^^J}%
     \else
-      \def\y#1#2{\PackageInfo{#1}{#2}}%
+      \PackageWarningNoLine{xintcfrac}{\numexpr not available, aborting input}%
     \fi
-  \expandafter
-  \ifx\csname numexpr\endcsname\relax
-     \y{xintcfrac}{\numexpr not available, aborting input}%
-     \aftergroup\endinput
+    \def\z{\endgroup\endinput}%
   \else
     \ifx\x\relax   % plain-TeX, first loading of xintcfrac.sty
       \ifx\w\relax % but xintfrac.sty not yet loaded.
@@ -36700,7 +37404,6 @@
          \def\z{\endgroup\input xintfrac.sty\relax}%
       \fi
     \else
-      \def\empty {}%
       \ifx\x\empty % LaTeX, first loading,
       % variable is initialized, but \ProvidesPackage not yet seen
           \ifx\w\relax % xintfrac.sty not yet loaded.
@@ -36707,7 +37410,7 @@
             \def\z{\endgroup\RequirePackage{xintfrac}}%
           \fi
       \else
-        \aftergroup\endinput % xintcfrac already loaded.
+        \def\z{\endgroup\endinput}% xintcfrac already loaded.
       \fi
     \fi
   \fi
@@ -36718,7 +37421,7 @@
 %    \begin{macrocode}
 \XINT_providespackage
 \ProvidesPackage{xintcfrac}%
-  [2022/05/18 v1.4k Expandable continued fractions with xint package (JFB)]%
+  [2022/05/29 v1.4l Expandable continued fractions with xint package (JFB)]%
 %    \end{macrocode}
 % \subsection{\csh{xintCFrac}}
 %    \begin{macrocode}
@@ -38052,26 +38755,25 @@
   \catcode123=1   % {
   \catcode125=2   % }
   \catcode64=11   % @
-  \catcode35=6    % #
   \catcode44=12   % ,
-  \catcode45=12   % -
   \catcode46=12   % .
   \catcode58=12   % :
-  \def\z {\endgroup}%
+  \catcode94=7    % ^
+  \def\empty{}\def\space{ }\newlinechar10
+  \def\z{\endgroup}%
   \expandafter\let\expandafter\x\csname ver at xintexpr.sty\endcsname
   \expandafter\let\expandafter\w\csname ver at xintfrac.sty\endcsname
   \expandafter\let\expandafter\t\csname ver at xinttools.sty\endcsname
-  \expandafter
-    \ifx\csname PackageInfo\endcsname\relax
-      \def\y#1#2{\immediate\write-1{Package #1 Info: #2.}}%
+  % I don't think engine exists providing \expanded but not \numexpr
+  \expandafter\ifx\csname expanded\endcsname\relax
+    \expandafter\ifx\csname PackageWarning\endcsname\relax
+      \immediate\write128{^^JPackage xintexpr Warning:^^J%
+                          \space\space\space\space
+                          \expanded not available, aborting input.^^J}%
     \else
-      \def\y#1#2{\PackageInfo{#1}{#2}}%
+      \PackageWarningNoLine{xintexpr}{\expanded not available, aborting input}%
     \fi
-  \expandafter
-  % I don't think engine exists providing \expanded but not \numexpr
-  \ifx\csname expanded\endcsname\relax
-     \y{xintexpr}{\expanded not available, aborting input}%
-     \aftergroup\endinput
+    \def\z{\endgroup\endinput}%
   \else
     \ifx\x\relax   % plain-TeX, first loading of xintexpr.sty
       \ifx\w\relax % but xintfrac.sty not yet loaded.
@@ -38083,7 +38785,6 @@
                     {\z\input xinttools.sty\relax}%
       \fi
     \else
-      \def\empty {}%
       \ifx\x\empty % LaTeX, first loading,
       % variable is initialized, but \ProvidesPackage not yet seen
           \ifx\w\relax % xintfrac.sty not yet loaded.
@@ -38095,7 +38796,7 @@
                            {\z\RequirePackage{xinttools}}%
           \fi
       \else
-        \aftergroup\endinput % xintexpr already loaded.
+        \def\z{\endgroup\endinput}% xintexpr already loaded.
       \fi
     \fi
   \fi
@@ -38111,7 +38812,7 @@
 %    \begin{macrocode}
 \XINT_providespackage
 \ProvidesPackage{xintexpr}%
-  [2022/05/18 v1.4k Expandable expression parser (JFB)]%
+  [2022/05/29 v1.4l Expandable expression parser (JFB)]%
 \catcode`! 11
 \let\XINT_Cmp \xintiiCmp
 \def\XINTfstop{\noexpand\XINTfstop}%
@@ -38159,11 +38860,15 @@
 % technique made very difficult implementation of nested structures.
 % \subsubsection{Bracketed list rendering with prettifying of leaves from nested
 % braced contents}
-% \lverb|1.4 The braces in \XINT:expr:toblistwith are there because there is
-% an \expanded trigger.
-%
-% 1.4d: support for polexpr 0.8 polynomial type.
-% |
+% \added{1.4}
+% \lverb|The braces in \XINT:expr:toblistwith are there because there is
+% an \expanded trigger.|
+% \changed{1.4d}
+% \lverb|Add support for the polexpr 0.8 polynomial type. See \XINT:expr:toblist_a|
+% \changed{1.4l}
+% \lverb|Let \XINT:expr:toblist_b use #1{#2} with regular { and } in case
+% macro #1 is \protected and things are output to external file where former
+% #1<#2> would end up with catcode 12 < and >.|
 %    \begin{macrocode}
 \def\XINT:expr:toblistwith#1#2%
 {%
@@ -38186,10 +38891,12 @@
 <%
     pol([\XINT:expr:toblist_b #1!#3}^])\XINT:expr:toblist_c #1!}%
 >%
-\def\XINT:expr:toblist_b #1!#2}%
-<%
-    \if\relax#2\relax\xintexprEmptyItem\else#1<#2>\fi\XINT:expr:toblist_c #1!}%
->%
+\catcode`{ 1 \catcode`} 2
+\def\XINT:expr:toblist_b #1{%
+\def\XINT:expr:toblist_b ##1!##2#1%
+{%
+    \if\relax##2\relax\xintexprEmptyItem\else##1{##2}\fi\XINT:expr:toblist_c ##1!#1%
+}}\catcode`{ 12 \catcode`} 12 \XINT:expr:toblist_b<}>%
 \def\XINT:expr:toblist_c #1}#2%
 <%
     \if ^#2\xint_dothis<\xint_gob_til_^>\fi
@@ -38322,6 +39029,11 @@
 %
 % This code is used by \xintiexpr and \xintfloatexpr in case of optional
 % argument and by the «Universal functions».
+%
+% Comment at 1.4l: this seems to be used only at private package level, else
+% I should modify \XINT:expr:mapwithin_b like I did with \XINT:expr:toblist_b
+% to use regular braces in case the applied macro is \protected and
+% things end up in external file.
 % |
 %
 %    \begin{macrocode}
@@ -38335,7 +39047,7 @@
     \if ^#2\expandafter\xint_gob_til_^\else\expandafter\XINT:expr:mapwithin_a\fi
     #1!#2%
 }%
-\begingroup % should I check lccode s generally if corrupted context at load?
+\begingroup
 \catcode`[ 1 \catcode`] 2 \lccode`[`{ \lccode`]`}
 \catcode`< 1 \catcode`> 2 \catcode`{ 12 \catcode`} 12
 \lowercase<\endgroup
@@ -38671,8 +39383,9 @@
 \def\xintifsgnfloatexpr #1{\romannumeral0\xintiiifsgn {\xintthefloatexpr #1\relax}}%
 \def\xintifsgniiexpr    #1{\romannumeral0\xintiiifsgn {\xinttheiiexpr #1\relax}}%
 %    \end{macrocode}
-% \subsubsection{\csh{xintFracToSci}}
+% \subsubsection{\csh{xint_FracToSci_x}}
 % \added{1.4}
+% Under the name of |\xintFracToSci| and defined in \xintfracnameimp.
 % \changed{1.4e}
 % \lverb|Refactored and much simplified
 %
@@ -38700,9 +39413,9 @@
 %:         If N is not zero, scientific notation like \xintPFloat,&
 %          i.e. behaviour like \xintfloateval apart from the rounding&
 %          to significands of width Digits.&
-%          At 1.4k, trimming of zeros is always done, i.e.&
+%          At 1.4k, trimming of zeros from A is always done, i.e.&
 %          the \xintPFloatMinTrimmed is ignored to keep behaviour.&
-%          unchanged.
+%          unchanged.  Trailing zeros of B are kept as is.
 %: The zero gives 0, except in A[N] and A/B[N] cases, it may give&
 %  0.0
 %)
@@ -38709,75 +39422,50 @@
 % |
 % \changed{1.4k}
 % Moved from \xintfracnameimp to \xintexprnameimp.
+% \changed{1.4l}
+% \lverb|&
+% Renamed to \xint_FracToSci_x to make it private and provide in
+% $xintfracnameimp another \xintFracToSci with same output but which behaves
+% like other macros there: f-expandable and accepting the whole range of
+% inputs accepted by the xintfrac public macros.
+%
+% The private x-expandable macro here will have an empty output for an empty
+% input but is never used for an empty input (see \xintexprEmptyItem).
+% |
 %    \begin{macrocode}
-\def\xintFracToSci #1{\expandafter\XINT_FracToSci\romannumeral`&&@#1/\W[\R}%
-\def\XINT_FracToSci #1/#2#3[#4%
+\def\xint_FracToSci_x #1{\expandafter\XINT_FracToSci_x\romannumeral`&&@#1/\W[\R}%
+\def\XINT_FracToSci_x #1/#2#3[#4%
 {%
-    \xint_gob_til_W #2\XINT_FracToSci_noslash\W
-    \xint_gob_til_R #4\XINT_FracToSci_slash_noN\R
-    \XINT_FracToSci_slash_N #1/#2#3[#4%
+    \xint_gob_til_W #2\XINT_FracToSci_x_noslash\W
+    \xint_gob_til_R #4\XINT_FracToSci_x_slash_noN\R
+    \XINT_FracToSci_x_slash_N #1/#2#3[#4%
 }%
-\def\XINT_FracToSci_noslash#1\XINT_FracToSci_slash_N #2[#3%
+\def\XINT_FracToSci_x_noslash#1\XINT_FracToSci_x_slash_N #2[#3%
 {%
-    \xint_gob_til_R #3\XINT_FracToSci_noslash_noN\R
-    \XINT_FracToSci_noslash_N #2[#3%
+    \xint_gob_til_R #3\XINT_FracToSci_x_noslash_noN\R
+    \XINT_FracToSci_x_noslash_N #2[#3%
 }%
-\def\XINT_FracToSci_noslash_noN\R\XINT_FracToSci_noslash_N #1/\W[\R{#1}%
-\def\XINT_FracToSci_noslash_N #1[#2]/\W[\R%
+\def\XINT_FracToSci_x_noslash_noN\R\XINT_FracToSci_x_noslash_N #1/\W[\R{#1}%
+\def\XINT_FracToSci_x_noslash_N #1[#2]/\W[\R%
 {%
     \ifnum#2=\xint_c_ #1\else
-      \romannumeral0\expandafter\XINT_pfloat_keeptrimmed_fork\romannumeral0\xintrez{#1[#2]}%
+      \romannumeral0\expandafter\XINT_pfloat_a_fork\romannumeral0\xintrez{#1[#2]}%
     \fi
 }%
-\def\XINT_FracToSci_slash_noN\R\XINT_FracToSci_slash_N #1#2/#3/\W[\R%
+\def\XINT_FracToSci_x_slash_noN\R\XINT_FracToSci_x_slash_N #1#2/#3/\W[\R%
 {%
     #1\xint_gob_til_zero#1\expandafter\iffalse\xint_gobble_ii0\iftrue
     #2\if\XINT_isOne{#3}1\else/#3\fi\fi
 }%
-\def\XINT_FracToSci_slash_N #1#2/#3[#4]/\W[\R%
+\def\XINT_FracToSci_x_slash_N #1#2/#3[#4]/\W[\R%
 {%
     \ifnum#4=\xint_c_ #1#2\else
-      \romannumeral0\expandafter\XINT_pfloat_keeptrimmed_fork\romannumeral0\xintrez{#1#2[#4]}%
+      \romannumeral0\expandafter\XINT_pfloat_a_fork\romannumeral0\xintrez{#1#2[#4]}%
     \fi
     \if\XINT_isOne{#3}1\else\if#10\else/#3\fi\fi
 }%
-\let\xintexprPrintOne\xintFracToSci
+\let\xintexprPrintOne\xint_FracToSci_x
 %    \end{macrocode}
-% \subsubsection{\csh{xintFracToDecimal}}
-% \added{1.4k}
-%    \begin{macrocode}
-\def\xintFracToDecimal #1{\expandafter\XINT_FracToDecimal\romannumeral`&&@#1/\W[\R}%
-\def\XINT_FracToDecimal #1/#2#3[#4%
-{%
-    \xint_gob_til_W #2\XINT_FracToDecimal_noslash\W
-    \xint_gob_til_R #4\XINT_FracToDecimal_slash_noN\R
-    \XINT_FracToDecimal_slash_N #1/#2#3[#4%
-}%
-\def\XINT_FracToDecimal_noslash#1\XINT_FracToDecimal_slash_N #2[#3%
-{%
-    \xint_gob_til_R #3\XINT_FracToDecimal_noslash_noN\R
-    \XINT_FracToDecimal_noslash_N #2[#3%
-}%
-\def\XINT_FracToDecimal_noslash_noN\R\XINT_FracToDecimal_noslash_N #1/\W[\R{#1}%
-\def\XINT_FracToDecimal_noslash_N #1[#2]/\W[\R%
-{%
-    \ifnum#2=\xint_c_ #1\else
-      \romannumeral0\expandafter\XINT_dectostr\romannumeral0\xintrez{#1[#2]}%
-    \fi
-}%
-\def\XINT_FracToDecimal_slash_noN\R\XINT_FracToDecimal_slash_N #1#2/#3/\W[\R%
-{%
-    #1\xint_gob_til_zero#1\expandafter\iffalse\xint_gobble_ii0\iftrue
-    #2\if\XINT_isOne{#3}1\else/#3\fi\fi
-}%
-\def\XINT_FracToDecimal_slash_N #1#2/#3[#4]/\W[\R%
-{%
-    \ifnum#4=\xint_c_ #1#2\else
-      \romannumeral0\expandafter\XINT_dectostr\romannumeral0\xintrez{#1#2[#4]}%
-    \fi
-    \if\XINT_isOne{#3}1\else\if#10\else/#3\fi\fi
-}%
-%    \end{macrocode}
 % \subsubsection{Small bits we have to put somewhere}
 % \lverb|&
 % Some renaming and modifications here with release 1.2 to switch from
@@ -45144,12 +45832,35 @@
 }%
 \let\XINT_tmpa\undefined \let\XINT_tmpb\undefined \let\XINT_tmpc\undefined
 \let\XINT_tmpd\undefined \let\XINT_tmpe\undefined
-\ifdefined\RequirePackage\expandafter\xint_firstoftwo\else\expandafter\xint_secondoftwo\fi
-{\RequirePackage{xinttrig}%
-\RequirePackage{xintlog}}%
-{\input xinttrig.sty
-\input xintlog.sty
-}%
+%    \end{macrocode}
+%\lverb|1.4l makes \usepackage{xintlog} with no prior \usepackage{xintexpr}
+% not abort but attempt to do the right thing.  We have to work-around the
+% fact that LaTeX will ignore a \usepackage here.  Simpler for non-LaTeX.
+%
+% In all cases, notice that the input of xintlog.sty and xinttrig.sty is done
+% with xintexpr catcodes in place.  And xintlog will sanitize catcodes at time
+% of loading poormanlog.  Attention also to not mix-up things at time of
+% restoring catcodes.  This is reason why xintlog.sty and xinttrig.sty have
+% their own endinput wrappers.  And that the rescue attempt of loading
+% xintexpr (which will load xintlog) from xintlog itself is done carefully.
+%
+% |
+%    \begin{macrocode}
+\ifdefined\RequirePackage
+ \ifcsname ver at xinttrig.sty\endcsname
+    \@@input xinttrig.sty\relax
+ \else
+    \RequirePackage{xinttrig}%
+ \fi
+ \ifcsname ver at xintlog.sty\endcsname
+    \@@input xintlog.sty\relax
+ \else
+    \RequirePackage{xintlog}%
+ \fi
+\else
+  \input xinttrig.sty
+  \input xintlog.sty
+\fi
 \XINTrestorecatcodesendinput%
 %    \end{macrocode}
 % \StoreCodelineNo {xintexpr}
@@ -45241,6 +45952,17 @@
 % 2021 standards (not a period of enlightenment generally speaking, though).
 %
 % \subsection{Catcodes, \protect\eTeX{} and reload detection}
+% \changed{1.4l}
+% \lverb|Silly paranoid modification of \z in case { and } do not have their
+% normal catcodes when xinttrig.sty is reloaded (initial loading via
+% xintexpr.sty does not need this), to define \XINTtrigendinput there and not
+% after the \endgroup from \z has already restored possibly bad catcodes.
+%
+% 1.4l handles much better the situation with \usepackage{xinttrig} without
+% previous loading of xintexpr (or same with \input and etex). cf comments in
+% xintlog.sty.
+%
+%|
 %    \begin{macrocode}
 \begingroup\catcode61\catcode48\catcode32=10\relax%
   \catcode13=5    % ^^M
@@ -45250,35 +45972,49 @@
   \catcode64=11   % @
   \catcode35=6    % #
   \catcode44=12   % ,
-  \catcode45=12   % -
   \catcode46=12   % .
   \catcode58=12   % :
   \catcode94=7    % ^
+  \def\empty{}\def\space{ }\newlinechar10
   \def\z{\endgroup}%
-  \def\empty{}\def\space{ }\newlinechar10
+  \expandafter\let\expandafter\x\csname ver at xinttrig.sty\endcsname
   \expandafter\let\expandafter\w\csname ver at xintexpr.sty\endcsname
   \expandafter
-    \ifx\csname PackageInfo\endcsname\relax
-      \def\y#1#2{\immediate\write-1{Package #1 Info:^^J%
-                 \space\space\space\space#2.}}%
+    \ifx\csname PackageWarning\endcsname\relax
+      \def\y#1#2{\immediate\write128{^^JPackage #1 Warning:^^J%
+                 \space\space\space\space#2.^^J}}%
     \else
-      \def\y#1#2{\PackageInfo{#1}{#2}}%
+      \def\y#1#2{\PackageWarningNoLine{#1}{#2}}%
     \fi
   \expandafter
   \ifx\csname numexpr\endcsname\relax
      \y{xinttrig}{\numexpr not available, aborting input}%
-     \aftergroup\endinput
+     \def\z{\endgroup\endinput}%
   \else
     \ifx\w\relax % xintexpr.sty not yet loaded.
+        \edef\MsgBrk{^^J\space\space\space\space}%
         \y{xinttrig}%
-          {Loading should be via \ifx\x\empty\string\usepackage{xintexpr.sty}
-                          \else\string\input\space xintexpr.sty \fi
-           rather, aborting}%
-         \aftergroup\endinput
+          {\ifx\x\empty
+             xinttrig should not be loaded directly\MessageBreak
+             The correct way is \string\usepackage{xintexpr}.\MessageBreak
+             Will try that now%
+           \else
+             First loading of xinttrig.sty should be via
+             \string\input\space xintexpr.sty\relax\MsgBrk
+             Will try that now%
+           \fi
+          }%
+        \ifx\x\empty
+          \def\z{\endgroup\RequirePackage{xintexpr}\endinput}%
+        \else
+          \def\z{\endgroup\input xintexpr.sty\relax\endinput}%
+        \fi
+    \else
+      \def\z{\endgroup\edef\XINTtrigendinput{\XINTrestorecatcodes\noexpand\endinput}}%
     \fi
   \fi
 \z%
-\edef\XINTtrigendinput{\XINTrestorecatcodes\noexpand\endinput}\XINTsetcatcodes%
+\XINTsetcatcodes%
 \catcode`? 12
 %    \end{macrocode}
 % \subsection{Library identification}
@@ -45288,11 +46024,11 @@
 \else
   \expandafter\xint_secondoftwo
 \fi
-{\immediate\write-1{Reloading xinttrig library using Digits=\xinttheDigits.}}%
-{\expandafter\gdef\csname xintlibver at trig\endcsname{2022/05/18 v1.4k}%
+{\immediate\write128{Reloading xinttrig library using Digits=\xinttheDigits.}}%
+{\expandafter\gdef\csname xintlibver at trig\endcsname{2022/05/29 v1.4l}%
 \XINT_providespackage
 \ProvidesPackage{xinttrig}%
-[2022/05/18 v1.4k Trigonometrical functions for xintexpr (JFB)]%
+[2022/05/29 v1.4l Trigonometrical functions for xintexpr (JFB)]%
 }%
 %    \end{macrocode}
 % \subsection{Ensure used letters are dummy letters}
@@ -46562,6 +47298,21 @@
 %
 %
 % \subsection{Catcodes, \protect\eTeX{} and reload detection}
+% \changed{1.4l}
+% \lverb|Silly paranoid modification of \z in case { and } do not have their
+% normal catcodes when xintlog.sty is reloaded (initial loading via
+% xintexpr.sty does not need this), to define \XINTlogendinput there and not
+% after the \endgroup from \z has already restored possibly bad catcodes.
+%
+%
+% 1.4l handles much better the situation with \usepackage{xintlog} without
+% previous loading of xintexpr (or same with \input and etex).  Instead of
+% aborting with a message (which actually was wrong with LaTeX since 1.4e,
+% mentioning \input in place of \usepackage), it will initiate loading
+% xintexpr itself.  This required an adaptation at end of xintexpr and some
+% care to not leave bad catcodes.
+%
+% |
 %    \begin{macrocode}
 \begingroup\catcode61\catcode48\catcode32=10\relax%
   \catcode13=5    % ^^M
@@ -46571,37 +47322,65 @@
   \catcode64=11   % @
   \catcode35=6    % #
   \catcode44=12   % ,
-  \catcode45=12   % -
   \catcode46=12   % .
   \catcode58=12   % :
   \catcode94=7    % ^
+  \def\empty{}\def\space{ }\newlinechar10
   \def\z{\endgroup}%
-  \def\empty{}\def\space{ }\newlinechar10
+  \expandafter\let\expandafter\x\csname ver at xintlog.sty\endcsname
   \expandafter\let\expandafter\w\csname ver at xintexpr.sty\endcsname
   \expandafter
-    \ifx\csname PackageInfo\endcsname\relax
-      \def\y#1#2{\immediate\write-1{Package #1 Info:^^J%
-                 \space\space\space\space#2.}}%
+    \ifx\csname PackageWarning\endcsname\relax
+      \def\y#1#2{\immediate\write128{^^JPackage #1 Warning:^^J%
+                 \space\space\space\space#2.^^J}}%
     \else
-      \def\y#1#2{\PackageInfo{#1}{#2}}%
+      \def\y#1#2{\PackageWarningNoLine{#1}{#2}}%
     \fi
   \expandafter
   \ifx\csname numexpr\endcsname\relax
      \y{xintlog}{\numexpr not available, aborting input}%
-     \aftergroup\endinput
+     \def\z{\endgroup\endinput}%
   \else
     \ifx\w\relax % xintexpr.sty not yet loaded.
+        \edef\MsgBrk{^^J\space\space\space\space}%
         \y{xintlog}%
-          {Loading should be via \ifx\x\empty\string\usepackage{xintexpr.sty}
-                          \else\string\input\space xintexpr.sty \fi
-           rather, aborting}%
-        \aftergroup\endinput
+          {\ifx\x\empty
+             xintlog should not be loaded directly\MessageBreak
+             The correct way is \string\usepackage{xintexpr}.\MessageBreak
+             Will try that now%
+           \else
+             First loading of xintlog.sty should be via
+             \string\input\space xintexpr.sty\relax\MsgBrk
+             Will try that now%
+           \fi
+          }%
+        \ifx\x\empty
+          \def\z{\endgroup\RequirePackage{xintexpr}\endinput}%
+        \else
+          \def\z{\endgroup\input xintexpr.sty\relax\endinput}%
+        \fi
+    \else
+      \def\z{\endgroup\edef\XINTlogendinput{\XINTrestorecatcodes\noexpand\endinput}}%
     \fi
   \fi
 \z%
-\edef\XINTendxintloginput{\XINTrestorecatcodes\noexpand\endinput}\XINTsetcatcodes%
 %    \end{macrocode}
+% \lverb|Here we set catcodes to the package values, the current settings
+% having been saved in the \XINTlogendinput macro. We arrive here only if
+% xintlog is either loaded from xintexpr or is being reloaded via an \input
+% from \xintreloadxintlog.  Else we aborted right before via \endinput and do
+% not modify catcodes.  As xintexpr inputs xintlog.sty at a time the catcode
+% configuration is already the package one we pay attention to not use
+% \XINTsetupcatcodes which would badly redefine \XINTrestorecatcodesendinput
+% as executed at end of xintexpr.sty.  There is slight inefficiency here to
+% execute \XINTsetcatcodes when xintexpr initiated the xintlog loading, but
+% let's live with it.|
+%    \begin{macrocode}
+\XINTsetcatcodes%
+%    \end{macrocode}
 % \subsection{Library identification}
+% \changed{1.4l}
+% \lverb|Reloading message also to Terminal not only log file.|
 %    \begin{macrocode}
 \ifcsname xintlibver at log\endcsname
   \expandafter\xint_firstoftwo
@@ -46608,11 +47387,11 @@
 \else
   \expandafter\xint_secondoftwo
 \fi
-{\immediate\write-1{Reloading xintlog library using Digits=\xinttheDigits.}}%
-{\expandafter\gdef\csname xintlibver at log\endcsname{2022/05/18 v1.4k}%
+{\immediate\write128{Reloading xintlog library using Digits=\xinttheDigits.}}%
+{\expandafter\gdef\csname xintlibver at log\endcsname{2022/05/29 v1.4l}%
 \XINT_providespackage
 \ProvidesPackage{xintlog}%
-[2022/05/18 v1.4k Logarithms and exponentials for xintexpr (JFB)]%
+[2022/05/29 v1.4l Logarithms and exponentials for xintexpr (JFB)]%
 }%
 %    \end{macrocode}
 % \subsection{\csh{xintreloadxintlog}}
@@ -46626,16 +47405,13 @@
 % \lverb|&
 % Attention to the catcode regime when loading poormanlog.
 %
-% As I learned the hard way (I never use my user macros), at the worst moment
-% when wrapping up the final things for 1.3e release,
-% \xintexprSafeCatcodes MUST be followed by some \xintexprRestoreCatcodes
-% quickly, else next time it is used (for example by \xintdefvar) the
-% \xintexprRestoreCatcodes will restore an obsolete catcode regime...
 %
 % Also, for xintlog.sty to be multiple-times loadable, we need to avoid using
-% LaTeX's \RequirePackage twice.|
+% LaTeX's \RequirePackage twice.
+%
+%|
 %    \begin{macrocode}
-\xintexprSafeCatcodes\catcode`_ 11
+\xintexprSafeCatcodes
 \unless\ifdefined\XINTinFloatPowTen
 \ifdefined\RequirePackage
   \RequirePackage{poormanlog}%
@@ -46642,7 +47418,7 @@
 \else
   \input poormanlog.tex
 \fi\fi
-\xintexprRestoreCatcodes\XINTsetcatcodes
+\xintexprRestoreCatcodes
 %    \end{macrocode}
 % \subsection{Macro layer on top of the poormanlog package}
 % \lverb|This was moved here with some macro renames from xintfrac on occasion
@@ -47176,7 +47952,7 @@
 %    \end{macrocode}
 % \subsection{End of package loading for low Digits}
 %    \begin{macrocode}
-\ifnum\XINTdigits<9 \expandafter\XINTendxintloginput\fi%
+\ifnum\XINTdigits<9 \expandafter\XINTlogendinput\fi%
 %    \end{macrocode}
 % \subsection{Stored constants}
 % \lverb|The constants were obtained from Maple at 80 digits: fractional power
@@ -48635,7 +49411,7 @@
   \XINTinFloat[\XINTdigitsormax-43]{1/9[0]}.%
   }%
 \fi
-\XINTendxintloginput%
+\XINTlogendinput%
 %    \end{macrocode}
 % \StoreCodelineNo {xintlog}
 % \cleardoublepage\let\xintlognameUp\undefined
@@ -48648,7 +49424,7 @@
 xintbinhex.sty:53
 xintcfrac.sty:183
 xintcore.sty:272
-xintexpr.sty:465
+xintexpr.sty:461
 xintfrac.sty:522
 xintgcd.sty:41
 xintkernel.sty:17
@@ -48658,7 +49434,7 @@
 xinttrig.sty:65
 \fi
 % grep -o "^{%" xint*sty | wc -l
-\def\totala{    2178}
+\def\totala{    2174}
 \iffalse
 % grep -c -e "^}%" xint*sty
 xint.sty:204
@@ -48665,8 +49441,8 @@
 xintbinhex.sty:52
 xintcfrac.sty:183
 xintcore.sty:269
-xintexpr.sty:448
-xintfrac.sty:527
+xintexpr.sty:442
+xintfrac.sty:528
 xintgcd.sty:43
 xintkernel.sty:17
 xintlog.sty:151
@@ -48675,7 +49451,7 @@
 xinttrig.sty:64
 \fi
 % grep -o "^}%" xint*sty | wc -l
-\def\totalb{    2162}
+\def\totalb{    2157}
 \cleardoublepage
 \section{Cumulative line count}
 
@@ -48699,8 +49475,8 @@
     \TeX\strut. Version {\xintbndlversion} of {\xintbndldate}.\par
 }
 
-\CheckSum {38925}% 1.4j
-% 38590 pour 1.4j, 38591 pour 1.4i, 38427 pour 1.4h
+\CheckSum {39032}% 1.4l
+% 38925 pour 1.4j, 38590 pour 1.4j, 38591 pour 1.4i, 38427 pour 1.4h
 % 38423 pour 1.4g, 38212 pour 1.4f, 38813 pour 1.4e, 35184 pour 1.4d
 % 35109 pour 1.4c, 35103 pour 1.4b, 34648 pour 1.4a, 34575 pour 1.4
 % 33497 pour 1.3f, 33274 pour 1.3e, 31601 pour 1.3d, 31122 pour 1.3c

Modified: trunk/Master/texmf-dist/tex/generic/xint/xint.sty
===================================================================
--- trunk/Master/texmf-dist/tex/generic/xint/xint.sty	2022-05-29 10:40:23 UTC (rev 63435)
+++ trunk/Master/texmf-dist/tex/generic/xint/xint.sty	2022-05-29 20:36:02 UTC (rev 63436)
@@ -21,7 +21,7 @@
 %% same distribution. (The sources need not necessarily be
 %% in the same archive or directory.)
 %% ---------------------------------------------------------------
-%% The xint bundle 1.4k 2022/05/18
+%% The xint bundle 1.4l 2022/05/29
 %% Copyright (C) 2013-2022 by Jean-Francois Burnol
 %% xint: Expandable operations on big integers
 %% ---------------------------------------------------------------
@@ -31,24 +31,23 @@
   \catcode123=1   % {
   \catcode125=2   % }
   \catcode64=11   % @
-  \catcode35=6    % #
   \catcode44=12   % ,
-  \catcode45=12   % -
   \catcode46=12   % .
   \catcode58=12   % :
-  \let\z\endgroup
+  \catcode94=7    % ^
+  \def\empty{}\def\space{ }\newlinechar10
+  \def\z{\endgroup}%
   \expandafter\let\expandafter\x\csname ver at xint.sty\endcsname
   \expandafter\let\expandafter\w\csname ver at xintcore.sty\endcsname
-  \expandafter
-    \ifx\csname PackageInfo\endcsname\relax
-      \def\y#1#2{\immediate\write-1{Package #1 Info: #2.}}%
+  \expandafter\ifx\csname numexpr\endcsname\relax
+    \expandafter\ifx\csname PackageWarning\endcsname\relax
+      \immediate\write128{^^JPackage xint Warning:^^J%
+                          \space\space\space\space
+                          \numexpr not available, aborting input.^^J}%
     \else
-      \def\y#1#2{\PackageInfo{#1}{#2}}%
+      \PackageWarningNoLine{xint}{\numexpr not available, aborting input}%
     \fi
-  \expandafter
-  \ifx\csname numexpr\endcsname\relax
-     \y{xint}{\numexpr not available, aborting input}%
-     \aftergroup\endinput
+    \def\z{\endgroup\endinput}%
   \else
     \ifx\x\relax   % plain-TeX, first loading of xintcore.sty
       \ifx\w\relax % but xintkernel.sty not yet loaded.
@@ -55,7 +54,6 @@
          \def\z{\endgroup\input xintcore.sty\relax}%
       \fi
     \else
-      \def\empty {}%
       \ifx\x\empty % LaTeX, first loading,
       % variable is initialized, but \ProvidesPackage not yet seen
           \ifx\w\relax % xintcore.sty not yet loaded.
@@ -62,7 +60,7 @@
             \def\z{\endgroup\RequirePackage{xintcore}}%
           \fi
       \else
-        \aftergroup\endinput % xint already loaded.
+        \def\z{\endgroup\endinput}% xint already loaded.
       \fi
     \fi
   \fi
@@ -70,7 +68,7 @@
 \XINTsetupcatcodes% defined in xintkernel.sty (loaded by xintcore.sty)
 \XINT_providespackage
 \ProvidesPackage{xint}%
-  [2022/05/18 v1.4k Expandable operations on big integers (JFB)]%
+  [2022/05/29 v1.4l 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}%

Modified: trunk/Master/texmf-dist/tex/generic/xint/xintbinhex.sty
===================================================================
--- trunk/Master/texmf-dist/tex/generic/xint/xintbinhex.sty	2022-05-29 10:40:23 UTC (rev 63435)
+++ trunk/Master/texmf-dist/tex/generic/xint/xintbinhex.sty	2022-05-29 20:36:02 UTC (rev 63436)
@@ -21,7 +21,7 @@
 %% same distribution. (The sources need not necessarily be
 %% in the same archive or directory.)
 %% ---------------------------------------------------------------
-%% The xint bundle 1.4k 2022/05/18
+%% The xint bundle 1.4l 2022/05/29
 %% Copyright (C) 2013-2022 by Jean-Francois Burnol
 %% xintbinhex: Expandable binary and hexadecimal conversions
 %% ---------------------------------------------------------------
@@ -31,24 +31,23 @@
   \catcode123=1   % {
   \catcode125=2   % }
   \catcode64=11   % @
-  \catcode35=6    % #
   \catcode44=12   % ,
-  \catcode45=12   % -
   \catcode46=12   % .
   \catcode58=12   % :
-  \let\z\endgroup
+  \catcode94=7    % ^
+  \def\empty{}\def\space{ }\newlinechar10
+  \def\z{\endgroup}%
   \expandafter\let\expandafter\x\csname ver at xintbinhex.sty\endcsname
   \expandafter\let\expandafter\w\csname ver at xintkernel.sty\endcsname
-  \expandafter
-    \ifx\csname PackageInfo\endcsname\relax
-      \def\y#1#2{\immediate\write-1{Package #1 Info: #2.}}%
+  \expandafter\ifx\csname numexpr\endcsname\relax
+    \expandafter\ifx\csname PackageWarning\endcsname\relax
+      \immediate\write128{^^JPackage xintbinhex Warning:^^J%
+                          \space\space\space\space
+                          \numexpr not available, aborting input.^^J}%
     \else
-      \def\y#1#2{\PackageInfo{#1}{#2}}%
+      \PackageWarningNoLine{xintbinhex}{\numexpr not available, aborting input}%
     \fi
-  \expandafter
-  \ifx\csname numexpr\endcsname\relax
-     \y{xintbinhex}{\numexpr not available, aborting input}%
-     \aftergroup\endinput
+    \def\z{\endgroup\endinput}%
   \else
     \ifx\x\relax   % plain-TeX, first loading of xintbinhex.sty
       \ifx\w\relax % but xintkernel.sty not yet loaded.
@@ -55,7 +54,6 @@
          \def\z{\endgroup\input xintkernel.sty\relax}%
       \fi
     \else
-      \def\empty {}%
       \ifx\x\empty % LaTeX, first loading,
       % variable is initialized, but \ProvidesPackage not yet seen
           \ifx\w\relax % xintkernel.sty not yet loaded.
@@ -62,7 +60,7 @@
             \def\z{\endgroup\RequirePackage{xintkernel}}%
           \fi
       \else
-        \aftergroup\endinput % xintbinhex already loaded.
+        \def\z{\endgroup\endinput}% xintbinhex already loaded.
       \fi
     \fi
   \fi
@@ -70,7 +68,7 @@
 \XINTsetupcatcodes% defined in xintkernel.sty
 \XINT_providespackage
 \ProvidesPackage{xintbinhex}%
-  [2022/05/18 v1.4k Expandable binary and hexadecimal conversions (JFB)]%
+  [2022/05/29 v1.4l 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

Modified: trunk/Master/texmf-dist/tex/generic/xint/xintcfrac.sty
===================================================================
--- trunk/Master/texmf-dist/tex/generic/xint/xintcfrac.sty	2022-05-29 10:40:23 UTC (rev 63435)
+++ trunk/Master/texmf-dist/tex/generic/xint/xintcfrac.sty	2022-05-29 20:36:02 UTC (rev 63436)
@@ -21,7 +21,7 @@
 %% same distribution. (The sources need not necessarily be
 %% in the same archive or directory.)
 %% ---------------------------------------------------------------
-%% The xint bundle 1.4k 2022/05/18
+%% The xint bundle 1.4l 2022/05/29
 %% Copyright (C) 2013-2022 by Jean-Francois Burnol
 %% xintcfrac: Expandable continued fractions with xint package
 %% ---------------------------------------------------------------
@@ -31,24 +31,23 @@
   \catcode123=1   % {
   \catcode125=2   % }
   \catcode64=11   % @
-  \catcode35=6    % #
   \catcode44=12   % ,
-  \catcode45=12   % -
   \catcode46=12   % .
   \catcode58=12   % :
-  \let\z\endgroup
+  \catcode94=7    % ^
+  \def\empty{}\def\space{ }\newlinechar10
+  \def\z{\endgroup}%
   \expandafter\let\expandafter\x\csname ver at xintcfrac.sty\endcsname
   \expandafter\let\expandafter\w\csname ver at xintfrac.sty\endcsname
-  \expandafter
-    \ifx\csname PackageInfo\endcsname\relax
-      \def\y#1#2{\immediate\write-1{Package #1 Info: #2.}}%
+  \expandafter\ifx\csname numexpr\endcsname\relax
+    \expandafter\ifx\csname PackageWarning\endcsname\relax
+      \immediate\write128{^^JPackage xintcfrac Warning:^^J%
+                          \space\space\space\space
+                          \numexpr not available, aborting input.^^J}%
     \else
-      \def\y#1#2{\PackageInfo{#1}{#2}}%
+      \PackageWarningNoLine{xintcfrac}{\numexpr not available, aborting input}%
     \fi
-  \expandafter
-  \ifx\csname numexpr\endcsname\relax
-     \y{xintcfrac}{\numexpr not available, aborting input}%
-     \aftergroup\endinput
+    \def\z{\endgroup\endinput}%
   \else
     \ifx\x\relax   % plain-TeX, first loading of xintcfrac.sty
       \ifx\w\relax % but xintfrac.sty not yet loaded.
@@ -55,7 +54,6 @@
          \def\z{\endgroup\input xintfrac.sty\relax}%
       \fi
     \else
-      \def\empty {}%
       \ifx\x\empty % LaTeX, first loading,
       % variable is initialized, but \ProvidesPackage not yet seen
           \ifx\w\relax % xintfrac.sty not yet loaded.
@@ -62,7 +60,7 @@
             \def\z{\endgroup\RequirePackage{xintfrac}}%
           \fi
       \else
-        \aftergroup\endinput % xintcfrac already loaded.
+        \def\z{\endgroup\endinput}% xintcfrac already loaded.
       \fi
     \fi
   \fi
@@ -70,7 +68,7 @@
 \XINTsetupcatcodes% defined in xintkernel.sty
 \XINT_providespackage
 \ProvidesPackage{xintcfrac}%
-  [2022/05/18 v1.4k Expandable continued fractions with xint package (JFB)]%
+  [2022/05/29 v1.4l Expandable continued fractions with xint package (JFB)]%
 \def\xintCFrac {\romannumeral0\xintcfrac }%
 \def\xintcfrac #1%
 {%

Modified: trunk/Master/texmf-dist/tex/generic/xint/xintcore.sty
===================================================================
--- trunk/Master/texmf-dist/tex/generic/xint/xintcore.sty	2022-05-29 10:40:23 UTC (rev 63435)
+++ trunk/Master/texmf-dist/tex/generic/xint/xintcore.sty	2022-05-29 20:36:02 UTC (rev 63436)
@@ -21,7 +21,7 @@
 %% same distribution. (The sources need not necessarily be
 %% in the same archive or directory.)
 %% ---------------------------------------------------------------
-%% The xint bundle 1.4k 2022/05/18
+%% The xint bundle 1.4l 2022/05/29
 %% Copyright (C) 2013-2022 by Jean-Francois Burnol
 %% xintcore: Expandable arithmetic on big integers
 %% ---------------------------------------------------------------
@@ -31,24 +31,23 @@
   \catcode123=1   % {
   \catcode125=2   % }
   \catcode64=11   % @
-  \catcode35=6    % #
   \catcode44=12   % ,
-  \catcode45=12   % -
   \catcode46=12   % .
   \catcode58=12   % :
-  \let\z\endgroup
+  \catcode94=7    % ^
+  \def\empty{}\def\space{ }\newlinechar10
+  \def\z{\endgroup}%
   \expandafter\let\expandafter\x\csname ver at xintcore.sty\endcsname
   \expandafter\let\expandafter\w\csname ver at xintkernel.sty\endcsname
-  \expandafter
-    \ifx\csname PackageInfo\endcsname\relax
-      \def\y#1#2{\immediate\write-1{Package #1 Info: #2.}}%
+  \expandafter\ifx\csname numexpr\endcsname\relax
+    \expandafter\ifx\csname PackageWarning\endcsname\relax
+      \immediate\write128{^^JPackage xintcore Warning:^^J%
+                          \space\space\space\space
+                          \numexpr not available, aborting input.^^J}%
     \else
-      \def\y#1#2{\PackageInfo{#1}{#2}}%
+      \PackageWarningNoLine{xintcore}{\numexpr not available, aborting input}%
     \fi
-  \expandafter
-  \ifx\csname numexpr\endcsname\relax
-     \y{xintcore}{\numexpr not available, aborting input}%
-     \aftergroup\endinput
+    \def\z{\endgroup\endinput}%
   \else
     \ifx\x\relax   % plain-TeX, first loading of xintcore.sty
       \ifx\w\relax % but xintkernel.sty not yet loaded.
@@ -55,7 +54,6 @@
          \def\z{\endgroup\input xintkernel.sty\relax}%
       \fi
     \else
-      \def\empty {}%
       \ifx\x\empty % LaTeX, first loading,
       % variable is initialized, but \ProvidesPackage not yet seen
           \ifx\w\relax % xintkernel.sty not yet loaded.
@@ -62,7 +60,7 @@
             \def\z{\endgroup\RequirePackage{xintkernel}}%
           \fi
       \else
-        \aftergroup\endinput % xintkernel already loaded.
+        \def\z{\endgroup\endinput}% xintkernel already loaded.
       \fi
     \fi
   \fi
@@ -70,7 +68,7 @@
 \XINTsetupcatcodes% defined in xintkernel.sty
 \XINT_providespackage
 \ProvidesPackage{xintcore}%
-  [2022/05/18 v1.4k Expandable arithmetic on big integers (JFB)]%
+  [2022/05/29 v1.4l Expandable arithmetic on big integers (JFB)]%
 \csname XINT_Clamped_istrapped\endcsname
 \csname XINT_ConversionSyntax_istrapped\endcsname
 \csname XINT_DivisionByZero_istrapped\endcsname

Modified: trunk/Master/texmf-dist/tex/generic/xint/xintexpr.sty
===================================================================
--- trunk/Master/texmf-dist/tex/generic/xint/xintexpr.sty	2022-05-29 10:40:23 UTC (rev 63435)
+++ trunk/Master/texmf-dist/tex/generic/xint/xintexpr.sty	2022-05-29 20:36:02 UTC (rev 63436)
@@ -21,7 +21,7 @@
 %% same distribution. (The sources need not necessarily be
 %% in the same archive or directory.)
 %% ---------------------------------------------------------------
-%% The xint bundle 1.4k 2022/05/18
+%% The xint bundle 1.4l 2022/05/29
 %% Copyright (C) 2013-2022 by Jean-Francois Burnol
 %% xintexpr: Expandable expression parser
 %% ---------------------------------------------------------------
@@ -31,26 +31,25 @@
   \catcode123=1   % {
   \catcode125=2   % }
   \catcode64=11   % @
-  \catcode35=6    % #
   \catcode44=12   % ,
-  \catcode45=12   % -
   \catcode46=12   % .
   \catcode58=12   % :
-  \def\z {\endgroup}%
+  \catcode94=7    % ^
+  \def\empty{}\def\space{ }\newlinechar10
+  \def\z{\endgroup}%
   \expandafter\let\expandafter\x\csname ver at xintexpr.sty\endcsname
   \expandafter\let\expandafter\w\csname ver at xintfrac.sty\endcsname
   \expandafter\let\expandafter\t\csname ver at xinttools.sty\endcsname
-  \expandafter
-    \ifx\csname PackageInfo\endcsname\relax
-      \def\y#1#2{\immediate\write-1{Package #1 Info: #2.}}%
+  % I don't think engine exists providing \expanded but not \numexpr
+  \expandafter\ifx\csname expanded\endcsname\relax
+    \expandafter\ifx\csname PackageWarning\endcsname\relax
+      \immediate\write128{^^JPackage xintexpr Warning:^^J%
+                          \space\space\space\space
+                          \expanded not available, aborting input.^^J}%
     \else
-      \def\y#1#2{\PackageInfo{#1}{#2}}%
+      \PackageWarningNoLine{xintexpr}{\expanded not available, aborting input}%
     \fi
-  \expandafter
-  % I don't think engine exists providing \expanded but not \numexpr
-  \ifx\csname expanded\endcsname\relax
-     \y{xintexpr}{\expanded not available, aborting input}%
-     \aftergroup\endinput
+    \def\z{\endgroup\endinput}%
   \else
     \ifx\x\relax   % plain-TeX, first loading of xintexpr.sty
       \ifx\w\relax % but xintfrac.sty not yet loaded.
@@ -62,7 +61,6 @@
                     {\z\input xinttools.sty\relax}%
       \fi
     \else
-      \def\empty {}%
       \ifx\x\empty % LaTeX, first loading,
       % variable is initialized, but \ProvidesPackage not yet seen
           \ifx\w\relax % xintfrac.sty not yet loaded.
@@ -74,7 +72,7 @@
                            {\z\RequirePackage{xinttools}}%
           \fi
       \else
-        \aftergroup\endinput % xintexpr already loaded.
+        \def\z{\endgroup\endinput}% xintexpr already loaded.
       \fi
     \fi
   \fi
@@ -82,7 +80,7 @@
 \XINTsetupcatcodes%
 \XINT_providespackage
 \ProvidesPackage{xintexpr}%
-  [2022/05/18 v1.4k Expandable expression parser (JFB)]%
+  [2022/05/29 v1.4l Expandable expression parser (JFB)]%
 \catcode`! 11
 \let\XINT_Cmp \xintiiCmp
 \def\XINTfstop{\noexpand\XINTfstop}%
@@ -125,10 +123,12 @@
 <%
     pol([\XINT:expr:toblist_b #1!#3}^])\XINT:expr:toblist_c #1!}%
 >%
-\def\XINT:expr:toblist_b #1!#2}%
-<%
-    \if\relax#2\relax\xintexprEmptyItem\else#1<#2>\fi\XINT:expr:toblist_c #1!}%
->%
+\catcode`{ 1 \catcode`} 2
+\def\XINT:expr:toblist_b #1{%
+\def\XINT:expr:toblist_b ##1!##2#1%
+{%
+    \if\relax##2\relax\xintexprEmptyItem\else##1{##2}\fi\XINT:expr:toblist_c ##1!#1%
+}}\catcode`{ 12 \catcode`} 12 \XINT:expr:toblist_b<}>%
 \def\XINT:expr:toblist_c #1}#2%
 <%
     \if ^#2\xint_dothis<\xint_gob_til_^>\fi
@@ -224,7 +224,7 @@
     \if ^#2\expandafter\xint_gob_til_^\else\expandafter\XINT:expr:mapwithin_a\fi
     #1!#2%
 }%
-\begingroup % should I check lccode s generally if corrupted context at load?
+\begingroup
 \catcode`[ 1 \catcode`] 2 \lccode`[`{ \lccode`]`}
 \catcode`< 1 \catcode`> 2 \catcode`{ 12 \catcode`} 12
 \lowercase<\endgroup
@@ -412,69 +412,38 @@
 \def\xintifsgnexpr      #1{\romannumeral0\xintiiifsgn {\xinttheexpr #1\relax}}%
 \def\xintifsgnfloatexpr #1{\romannumeral0\xintiiifsgn {\xintthefloatexpr #1\relax}}%
 \def\xintifsgniiexpr    #1{\romannumeral0\xintiiifsgn {\xinttheiiexpr #1\relax}}%
-\def\xintFracToSci #1{\expandafter\XINT_FracToSci\romannumeral`&&@#1/\W[\R}%
-\def\XINT_FracToSci #1/#2#3[#4%
+\def\xint_FracToSci_x #1{\expandafter\XINT_FracToSci_x\romannumeral`&&@#1/\W[\R}%
+\def\XINT_FracToSci_x #1/#2#3[#4%
 {%
-    \xint_gob_til_W #2\XINT_FracToSci_noslash\W
-    \xint_gob_til_R #4\XINT_FracToSci_slash_noN\R
-    \XINT_FracToSci_slash_N #1/#2#3[#4%
+    \xint_gob_til_W #2\XINT_FracToSci_x_noslash\W
+    \xint_gob_til_R #4\XINT_FracToSci_x_slash_noN\R
+    \XINT_FracToSci_x_slash_N #1/#2#3[#4%
 }%
-\def\XINT_FracToSci_noslash#1\XINT_FracToSci_slash_N #2[#3%
+\def\XINT_FracToSci_x_noslash#1\XINT_FracToSci_x_slash_N #2[#3%
 {%
-    \xint_gob_til_R #3\XINT_FracToSci_noslash_noN\R
-    \XINT_FracToSci_noslash_N #2[#3%
+    \xint_gob_til_R #3\XINT_FracToSci_x_noslash_noN\R
+    \XINT_FracToSci_x_noslash_N #2[#3%
 }%
-\def\XINT_FracToSci_noslash_noN\R\XINT_FracToSci_noslash_N #1/\W[\R{#1}%
-\def\XINT_FracToSci_noslash_N #1[#2]/\W[\R%
+\def\XINT_FracToSci_x_noslash_noN\R\XINT_FracToSci_x_noslash_N #1/\W[\R{#1}%
+\def\XINT_FracToSci_x_noslash_N #1[#2]/\W[\R%
 {%
     \ifnum#2=\xint_c_ #1\else
-      \romannumeral0\expandafter\XINT_pfloat_keeptrimmed_fork\romannumeral0\xintrez{#1[#2]}%
+      \romannumeral0\expandafter\XINT_pfloat_a_fork\romannumeral0\xintrez{#1[#2]}%
     \fi
 }%
-\def\XINT_FracToSci_slash_noN\R\XINT_FracToSci_slash_N #1#2/#3/\W[\R%
+\def\XINT_FracToSci_x_slash_noN\R\XINT_FracToSci_x_slash_N #1#2/#3/\W[\R%
 {%
     #1\xint_gob_til_zero#1\expandafter\iffalse\xint_gobble_ii0\iftrue
     #2\if\XINT_isOne{#3}1\else/#3\fi\fi
 }%
-\def\XINT_FracToSci_slash_N #1#2/#3[#4]/\W[\R%
+\def\XINT_FracToSci_x_slash_N #1#2/#3[#4]/\W[\R%
 {%
     \ifnum#4=\xint_c_ #1#2\else
-      \romannumeral0\expandafter\XINT_pfloat_keeptrimmed_fork\romannumeral0\xintrez{#1#2[#4]}%
+      \romannumeral0\expandafter\XINT_pfloat_a_fork\romannumeral0\xintrez{#1#2[#4]}%
     \fi
     \if\XINT_isOne{#3}1\else\if#10\else/#3\fi\fi
 }%
-\let\xintexprPrintOne\xintFracToSci
-\def\xintFracToDecimal #1{\expandafter\XINT_FracToDecimal\romannumeral`&&@#1/\W[\R}%
-\def\XINT_FracToDecimal #1/#2#3[#4%
-{%
-    \xint_gob_til_W #2\XINT_FracToDecimal_noslash\W
-    \xint_gob_til_R #4\XINT_FracToDecimal_slash_noN\R
-    \XINT_FracToDecimal_slash_N #1/#2#3[#4%
-}%
-\def\XINT_FracToDecimal_noslash#1\XINT_FracToDecimal_slash_N #2[#3%
-{%
-    \xint_gob_til_R #3\XINT_FracToDecimal_noslash_noN\R
-    \XINT_FracToDecimal_noslash_N #2[#3%
-}%
-\def\XINT_FracToDecimal_noslash_noN\R\XINT_FracToDecimal_noslash_N #1/\W[\R{#1}%
-\def\XINT_FracToDecimal_noslash_N #1[#2]/\W[\R%
-{%
-    \ifnum#2=\xint_c_ #1\else
-      \romannumeral0\expandafter\XINT_dectostr\romannumeral0\xintrez{#1[#2]}%
-    \fi
-}%
-\def\XINT_FracToDecimal_slash_noN\R\XINT_FracToDecimal_slash_N #1#2/#3/\W[\R%
-{%
-    #1\xint_gob_til_zero#1\expandafter\iffalse\xint_gobble_ii0\iftrue
-    #2\if\XINT_isOne{#3}1\else/#3\fi\fi
-}%
-\def\XINT_FracToDecimal_slash_N #1#2/#3[#4]/\W[\R%
-{%
-    \ifnum#4=\xint_c_ #1#2\else
-      \romannumeral0\expandafter\XINT_dectostr\romannumeral0\xintrez{#1#2[#4]}%
-    \fi
-    \if\XINT_isOne{#3}1\else\if#10\else/#3\fi\fi
-}%
+\let\xintexprPrintOne\xint_FracToSci_x
 \def\XINT_embrace#1{{#1}}%
 \def\xint_gob_til_! #1!{}% ! with catcode 11
 \def\xintError:noopening
@@ -4579,12 +4548,21 @@
 }%
 \let\XINT_tmpa\undefined \let\XINT_tmpb\undefined \let\XINT_tmpc\undefined
 \let\XINT_tmpd\undefined \let\XINT_tmpe\undefined
-\ifdefined\RequirePackage\expandafter\xint_firstoftwo\else\expandafter\xint_secondoftwo\fi
-{\RequirePackage{xinttrig}%
-\RequirePackage{xintlog}}%
-{\input xinttrig.sty
-\input xintlog.sty
-}%
+\ifdefined\RequirePackage
+ \ifcsname ver at xinttrig.sty\endcsname
+    \@@input xinttrig.sty\relax
+ \else
+    \RequirePackage{xinttrig}%
+ \fi
+ \ifcsname ver at xintlog.sty\endcsname
+    \@@input xintlog.sty\relax
+ \else
+    \RequirePackage{xintlog}%
+ \fi
+\else
+  \input xinttrig.sty
+  \input xintlog.sty
+\fi
 \XINTrestorecatcodesendinput%
 \endinput
 %%

Modified: trunk/Master/texmf-dist/tex/generic/xint/xintfrac.sty
===================================================================
--- trunk/Master/texmf-dist/tex/generic/xint/xintfrac.sty	2022-05-29 10:40:23 UTC (rev 63435)
+++ trunk/Master/texmf-dist/tex/generic/xint/xintfrac.sty	2022-05-29 20:36:02 UTC (rev 63436)
@@ -21,7 +21,7 @@
 %% same distribution. (The sources need not necessarily be
 %% in the same archive or directory.)
 %% ---------------------------------------------------------------
-%% The xint bundle 1.4k 2022/05/18
+%% The xint bundle 1.4l 2022/05/29
 %% Copyright (C) 2013-2022 by Jean-Francois Burnol
 %% xintfrac: Expandable operations on fractions
 %% ---------------------------------------------------------------
@@ -31,24 +31,23 @@
   \catcode123=1   % {
   \catcode125=2   % }
   \catcode64=11   % @
-  \catcode35=6    % #
   \catcode44=12   % ,
-  \catcode45=12   % -
   \catcode46=12   % .
   \catcode58=12   % :
-  \let\z\endgroup
+  \catcode94=7    % ^
+  \def\empty{}\def\space{ }\newlinechar10
+  \def\z{\endgroup}%
   \expandafter\let\expandafter\x\csname ver at xintfrac.sty\endcsname
   \expandafter\let\expandafter\w\csname ver at xint.sty\endcsname
-  \expandafter
-    \ifx\csname PackageInfo\endcsname\relax
-      \def\y#1#2{\immediate\write-1{Package #1 Info: #2.}}%
+  \expandafter\ifx\csname numexpr\endcsname\relax
+    \expandafter\ifx\csname PackageWarning\endcsname\relax
+      \immediate\write128{^^JPackage xintfrac Warning:^^J%
+                          \space\space\space\space
+                          \numexpr not available, aborting input.^^J}%
     \else
-      \def\y#1#2{\PackageInfo{#1}{#2}}%
+      \PackageWarningNoLine{xintfrac}{\numexpr not available, aborting input}%
     \fi
-  \expandafter
-  \ifx\csname numexpr\endcsname\relax
-     \y{xintfrac}{\numexpr not available, aborting input}%
-     \aftergroup\endinput
+    \def\z{\endgroup\endinput}%
   \else
     \ifx\x\relax   % plain-TeX, first loading of xintfrac.sty
       \ifx\w\relax % but xint.sty not yet loaded.
@@ -55,7 +54,6 @@
          \def\z{\endgroup\input xint.sty\relax}%
       \fi
     \else
-      \def\empty {}%
       \ifx\x\empty % LaTeX, first loading,
       % variable is initialized, but \ProvidesPackage not yet seen
           \ifx\w\relax % xint.sty not yet loaded.
@@ -62,7 +60,7 @@
             \def\z{\endgroup\RequirePackage{xint}}%
           \fi
       \else
-        \aftergroup\endinput % xintfrac already loaded.
+        \def\z{\endgroup\endinput}% xintfrac already loaded.
       \fi
     \fi
   \fi
@@ -70,7 +68,7 @@
 \XINTsetupcatcodes% defined in xintkernel.sty
 \XINT_providespackage
 \ProvidesPackage{xintfrac}%
-  [2022/05/18 v1.4k Expandable operations on fractions (JFB)]%
+  [2022/05/29 v1.4l Expandable operations on fractions (JFB)]%
 \def\XINT_cntSgnFork #1%
 {%
     \ifcase #1\expandafter\xint_secondofthree
@@ -121,8 +119,8 @@
 {%
     \expandafter\XINT_outfrac_P\expandafter {#2}{#1}%
 }%
-\def\XINT_inFrac {\romannumeral0\XINT_infrac }%
-\def\XINT_infrac #1%
+\def\XINT_inFrac {\romannumeral0\XINT_infrac }% this one deprecated
+\def\XINT_infrac #1% this one is core xintfrac macro
 {%
     \expandafter\XINT_infrac_fork\romannumeral`&&@#1\xint:/\XINT_W[\XINT_W\XINT_T
 }%
@@ -397,6 +395,8 @@
     \expandafter\XINT_raw\romannumeral0\XINT_infrac
 }%
 \def\XINT_raw #1#2#3{ #2/#3[#1]}%
+\def\xintRawBraced {\romannumeral0\xintrawbraced }%
+\let\xintrawbraced \XINT_infrac
 \def\xintiLogTen {\the\numexpr\xintilogten}%
 \def\xintilogten
 {%
@@ -458,6 +458,22 @@
 \def\XINT_spraw #1[#2#3]{\xint_gob_til_W #2\XINT_spraw_a\W\XINT_spraw_p #1[#2#3]}%
 \def\XINT_spraw_a\W\XINT_spraw_p #1[\W]{ #1}%
 \def\XINT_spraw_p #1[\W]{\xintpraw {#1}}%
+\def\xintFracToSci{\romannumeral0\xintfractosci}%
+\def\xintfractosci#1{\expandafter\XINT_fractosci\romannumeral0\xintraw{#1}}%
+\def\XINT_fractosci#1#2/#3[#4]{\expanded{ %
+    \ifnum#4=\xint_c_ #1#2\else
+      \romannumeral0\expandafter\XINT_pfloat_a_fork\romannumeral0\xintrez{#1#2[#4]}%
+    \fi
+    \if\XINT_isOne{#3}1\else\if#10\else/#3\fi\fi}%
+}%
+\def\xintFracToDecimal{\romannumeral0\xintfractodecimal}%
+\def\xintfractodecimal#1{\expandafter\XINT_fractodecimal\romannumeral0\xintraw{#1}}%
+\def\XINT_fractodecimal #1#2/#3[#4]{\expanded{ %
+    \ifnum#4=\xint_c_ #1#2\else
+      \romannumeral0\expandafter\XINT_dectostr\romannumeral0\xintrez{#1#2[#4]}%
+    \fi
+    \if\XINT_isOne{#3}1\else\if#10\else/#3\fi\fi}%
+}%
 \def\xintRawWithZeros {\romannumeral0\xintrawwithzeros }%
 \def\xintrawwithzeros
 {%
@@ -606,15 +622,16 @@
 {%
     \expandafter-\romannumeral0\XINT_sgnfrac_P
 }%
-\def\xintTeXfromSci#1%
+\def\xintTeXfromSci{\xintfracTeXDeprecation\xintTeXfromSci\xintTeXFromSci}%
+\def\xintTeXFromSci#1%
 {%
-    \expanded{\expandafter\XINT_texfromsci\expanded{#1}/\relax/\xint:}%
+    \expandafter\XINT_texfromsci\expanded{#1}/\relax/\xint:
 }%
 \def\XINT_texfromsci #1/#2#3/#4\xint:
 {%
     \XINT_texfromsci_a #1e\relax e\xint:
     {\ifx\relax#2\xint_dothis\xint_firstofone\fi
-     \xint_orthat{\XINT_texfromsci_frac{#2#3}}}%
+     \xint_orthat{\xintTeXFromScifracmacro{#2#3}}}%
     {\unless\ifx\relax#2\cdot{#2#3}^{-1}\fi}%
 }%
 \def\XINT_texfromsci_a #1e#2#3e#4\xint:#5#6%
@@ -622,9 +639,9 @@
     \ifx\relax#2#5{#1}\else#1\cdot10^{#2#3}#6\fi
 }%
 \ifdefined\frac
-  \def\XINT_texfromsci_frac#1#2{\noexpand\frac{#2}{#1}}%
+  \protected\def\xintTeXFromScifracmacro#1#2{\frac{#2}{#1}}%
 \else
-  \def\XINT_texfromsci_frac#1#2{{#2\over#1}}%
+  \protected\def\xintTeXFromScifracmacro#1#2{{#2\over#1}}%
 \fi
 \def\xintFwOver {\xintfracTeXDeprecation\xintFwOver\xintTeXOver}%
 \def\xintTeXOver{\romannumeral0\xintfwover }%
@@ -1940,6 +1957,16 @@
 \def\XINT_inv_b #1.#2{ #2[#1]}%
 \def\xintSgn   {\romannumeral0\xintsgn }%
 \def\xintsgn #1{\expandafter\XINT_sgn\romannumeral0\xintraw {#1}\xint:}%
+\def\xintSignBit   {\romannumeral0\xintsignbit }%
+\def\xintsignbit #1{\expandafter\XINT_signbit\romannumeral0\xintraw {#1}\xint:}%
+\def\XINT_signbit #1#2\xint:
+{%
+    \xint_UDzerominusfork
+      #1-{ 0}%
+      0#1{ 1}%
+       0-{ 0}%
+    \krof
+}%
 \def\xintGCD {\romannumeral0\xintgcd}%
 \def\xintgcd #1%
 {%
@@ -2110,11 +2137,11 @@
     \expandafter\XINT_float_post
     \romannumeral0\XINTinfloat[\XINTdigits]{#1}\XINTdigits.%
 }%
-\def\XINT_float_opt [\xint:#1]%
+\def\XINT_float_opt [\xint:
 {%
-    \expandafter\XINT_float_opt_a\the\numexpr #1.%
+    \expandafter\XINT_float_opt_a\the\numexpr
 }%
-\def\XINT_float_opt_a #1.#2%
+\def\XINT_float_opt_a #1]#2%
 {%
     \expandafter\XINT_float_post
     \romannumeral0\XINTinfloat[#1]{#2}#1.%
@@ -2134,6 +2161,43 @@
     \expandafter\XINT_float_pos_done\the\numexpr#3+#4-\xint_c_i.#1.#2;%
 }%
 \def\XINT_float_pos_done #1.#2;{ #2e#1}%
+\def\xintFloatBraced{\romannumeral0\xintfloatbraced }%
+\def\xintfloatbraced#1{\XINT_floatbr_chkopt #1\xint:}%
+\def\XINT_floatbr_chkopt #1%
+{%
+    \ifx [#1\expandafter\XINT_floatbr_opt
+       \else\expandafter\XINT_floatbr_noopt
+    \fi  #1%
+}%
+\def\XINT_floatbr_noopt #1\xint:%
+{%
+    \expandafter\XINT_floatbr_post
+    \romannumeral0\XINTinfloat[\XINTdigits]{#1}\XINTdigits.%
+}%
+\def\XINT_floatbr_opt [\xint:
+{%
+    \expandafter\XINT_floatbr_opt_a\the\numexpr
+}%
+\def\XINT_floatbr_opt_a #1]#2%
+{%
+    \expandafter\XINT_floatbr_post
+    \romannumeral0\XINTinfloat[#1]{#2}#1.%
+}%
+\def\XINT_floatbr_post #1%
+{%
+    \xint_UDzerominusfork
+      #1-\XINT_floatbr_zero
+       0#1\XINT_floatbr_neg
+       0-\XINT_floatbr_pos
+    \krof #1%
+}%
+\def\XINT_floatbr_zero #1]#2.{\expanded{{0}{0}{0.\xintReplicate{#2-\xint_c_i}0}}}%
+\def\XINT_floatbr_neg-{\expandafter\XINT_floatbr_neg_a\romannumeral0\XINT_floatbr_pos}%
+\def\XINT_floatbr_neg_a#1{{1}}%
+\def\XINT_floatbr_pos #1#2[#3]#4.%
+{%
+    \expanded{{0}{\the\numexpr#3+#4-\xint_c_i}}{#1.#2}%
+}%
 \def\XINTinFloat {\romannumeral0\XINTinfloat }%
 \def\XINTinfloat
    {\expandafter\XINT_infloat_clean\romannumeral0\XINT_infloat}%
@@ -2152,10 +2216,10 @@
 \def\XINT_infloatS_clean #1%
    {\if #1!\xint_dothis\XINT_infloatS_clean_a\fi\xint_orthat{ }#1}%
 \def\XINT_infloatS_clean_a !#1.{ }%
-\def\XINT_infloat [#1]#2%
+\def\XINT_infloat [#1]%#2%
 {%
     \expandafter\XINT_infloat_a\the\numexpr #1\expandafter.%
-    \romannumeral0\XINT_infrac {#2}%
+    \romannumeral0\XINT_infrac% {#2}%
 }%
 \def\XINT_infloat_a #1.#2#3#4%
 {%
@@ -2345,66 +2409,8 @@
     \xint_orthat\XINT_floatilogten_b #1%
 }%
 \def\XINT_floatilogten_z 0[0]#1.{-"7FFF8000\relax}%
-\def\XINT_floatilogten_a !#1.#2[#3]#4.{#3-#1+#4-1\relax}%
-\def\XINT_floatilogten_b #1[#2]#3.{#2+#3-1\relax}%
-\def\xintFloatSciExp {\the\numexpr\xintfloatsciexp }%
-\def\xintpfloatsciexp #1{\XINT_floatsciexp_chkopt #1\xint:}%
-\def\XINT_floatsciexp_chkopt #1%
-{%
-    \ifx [#1\expandafter\XINT_floatsciexp_opt
-       \else\expandafter\XINT_floatsciexp_noopt
-    \fi  #1%
-}%
-\def\XINT_floatsciexp_noopt #1\xint:%
-{%
-    \expandafter\XINT_floatsciexp\romannumeral0\XINT_infloat[\XINTdigits]{#1}%
-    \XINTdigits.%
-}%
-\def\XINT_floatsciexp_opt [\xint:#1]#2%
-{%
-    \expandafter\XINT_floatsciexp\romannumeral0\XINT_infloat[#1]{#2}#1.%
-}%
-\def\XINT_floatsciexp #1{%
-    \if #10\xint_dothis\XINT_floatsciexp_z\fi
-    \if #1!\xint_dothis\XINT_floatsciexp_a\fi
-    \xint_orthat\XINT_floatsciexp_b #1%
-}%
-\def\XINT_floatsciexp_z 0[0]#1.{0\relax}%
-\def\XINT_floatsciexp_a !#1.#2[#3]#4.{#3-#1+#4-1\relax}%
-\def\XINT_floatsciexp_b #1[#2]#3.{#2+#3-1\relax}%
-\def\xintFloatSignificand {\romannumeral0\xintfloatsignificand}%
-\def\xintfloatsignificand #1{\XINT_floatsgf_chkopt #1\xint:}%
-\def\XINT_floatsgf_chkopt #1%
-{%
-    \ifx [#1\expandafter\XINT_floatsgf_opt
-       \else\expandafter\XINT_floatsgf_noopt
-    \fi  #1%
-}%
-\def\XINT_floatsgf_noopt #1\xint:%
-{%
-    \expandafter\XINT_floatsgf_post
-    \romannumeral0\XINTinfloat[\XINTdigits]{#1}\XINTdigits.%
-}%
-\def\XINT_floatsgf_opt [\xint:#1]%
-{%
-    \expandafter\XINT_floatsgf_opt_a\the\numexpr #1.%
-}%
-\def\XINT_floatsgf_opt_a #1.#2%
-{%
-    \expandafter\XINT_floatsgf_post
-    \romannumeral0\XINTinfloat[#1]{#2}#1.%
-}%
-\def\XINT_floatsgf_post #1%
-{%
-    \xint_UDzerominusfork
-      #1-\XINT_floatsgf_zero
-       0#1\XINT_floatsgf_neg
-       0-\XINT_floatsgf_pos
-    \krof #1%
-}%[
-\def\XINT_floatsgf_zero #1]#2.{\XINT_dsx_addzeros{#2};}%
-\def\XINT_floatsgf_neg-{\XINT_floatsgf_pos}%
-\def\XINT_floatsgf_pos #1[#2]#3.{ #1}%
+\def\XINT_floatilogten_a !#1.#2[#3]#4.{#3-#1+#4-\xint_c_i\relax}%
+\def\XINT_floatilogten_b #1[#2]#3.{#2+#3-\xint_c_i\relax}%
 \def\xintPFloatE{e}%
 \def\xintPFloatNoSciEmax{\xint_c_v}%   1e6  uses sci.not.
 \def\xintPFloatNoSciEmin{-\xint_c_iv}% 1e-5 uses sci.not.
@@ -2430,7 +2436,8 @@
     \expandafter\XINT_pfloat\romannumeral0\XINTinfloatS[\XINTdigits]{#1}%
     \XINTdigits.%
 }%
-\def\XINT_pfloat_opt [\xint:#1]#2%
+\def\XINT_pfloat_opt [\xint:{\expandafter\XINT_pfloat_opt_a\the\numexpr}%
+\def\XINT_pfloat_opt_a #1]#2%
 {%
     \expandafter\XINT_pfloat\romannumeral0\XINTinfloatS[#1]{#2}%
     #1.%
@@ -2454,40 +2461,42 @@
     \expandafter\XINT_pfloat_aa\the\numexpr\xintLength{#1}.%
     #3.#2.#1.%
 }%
-\def\XINT_pfloat_keeptrimmed_fork#1%
+\def\XINT_pfloat_aa #1.#2.%
 {%
+    \unless\ifnum\xintPFloatMinTrimmed>\numexpr#2-#1\relax
+           \xint_dothis\XINT_pfloat_a\fi
+    \ifnum#2>#1 \xint_dothis{\XINT_pfloat_i #2.}\fi
+    \xint_orthat\XINT_pfloat_a #1.%
+}%
+\def\XINT_pfloat_a_fork#1%
+{%
     \xint_UDzerominusfork
-       #1-\XINT_pfloat_keeptrimmed_zero
-       0#1\XINT_pfloat_keeptrimmed_neg
-        0-\XINT_pfloat_keeptrimmed_pos
+       #1-\XINT_pfloat_a_zero
+       0#1\XINT_pfloat_a_neg
+        0-\XINT_pfloat_a_pos
     \krof #1%
 }%
-\def\XINT_pfloat_keeptrimmed_zero#1]{\expanded{ \xintPFloatZero}}%
-\def\XINT_pfloat_keeptrimmed_neg-{\expandafter-\romannumeral0\XINT_pfloat_keeptrimmed_pos}%
-\def\XINT_pfloat_keeptrimmed_pos#1/1[#2]%
+\def\XINT_pfloat_a_zero#1]{\expanded{ \xintPFloatZero}}%
+\def\XINT_pfloat_a_neg-{\expandafter-\romannumeral0\XINT_pfloat_a_pos}%
+\def\XINT_pfloat_a_pos#1/1[#2]%
 {%
     \expandafter\XINT_pfloat_a\the\numexpr\xintLength{#1}.#2.#1.%
 }%
-\def\XINT_pfloat_aa #1.#2.%
+\def\XINT_pfloat_i #1.#2.%#3.#4.%
 {%
-    \unless\ifnum\xintPFloatMinTrimmed>\numexpr#2-#1\relax
-           \xint_dothis\XINT_pfloat_a\fi
-    \ifnum#2>#1 \xint_dothis{\XINT_pfloat_i #2.}\fi
-    \xint_orthat\XINT_pfloat_a #1.%
+    \expandafter\XINT_pfloat_j\romannumeral\xintreplicate{#1-#2}0.#2.%
 }%
-\def\XINT_pfloat_i #1.#2.#3.#4.%
+\def\XINT_pfloat_j #1.#2.#3#4.%#5.
 {%
-    \expandafter\XINT_pfloat_j
-    \the\numexpr#3+#2-#1\expandafter.%
-    \romannumeral0\XINT_dsx_addzerosnofuss{#1-#2}#4;.#1.%
+    \expandafter\XINT_pfloat_b\the\numexpr#2+#3#4-\xint_c_i.%
+    #3#2.#1.%
 }%
-\def\XINT_pfloat_j #1.#2.#3.{\XINT_pfloat_a#3.#1.#2.}%
-\def\XINT_pfloat_a #1.#2#3.%
+\def\XINT_pfloat_a #1.#2#3.%#4.
 {%
     \expandafter\XINT_pfloat_b\the\numexpr#1+#2#3-\xint_c_i.%
-    #2#1.%
+    #2#1..%
 }%
-\def\XINT_pfloat_b #1.#2%
+\def\XINT_pfloat_b #1.#2%#3.#4.#5.
 {%
     \ifnum \xintPFloatNoSciEmax<#1 \xint_dothis\XINT_pfloat_sci\fi
     \ifnum \xintPFloatNoSciEmin>#1 \xint_dothis\XINT_pfloat_sci\fi
@@ -2501,21 +2510,21 @@
     \ifnum#2=\xint_c_i\expandafter\XINT_pfloat_sci_i\expandafter\fi
     \expandafter\XINT_pfloat_sci_a\romannumeral`&&@\xintPFloatE #1.%
 }%
-\def\XINT_pfloat_sci_a #1.#2#3.{ #2.#3#1}%
-\def\XINT_pfloat_sci_i #1#2#3.#4.{\expanded{#1 #4\xintPFloatLengthOneSuffix}#3}%
-\def\XINT_pfloat_N#1.#2.#3.%
+\def\XINT_pfloat_sci_a #1.#2.#3#4.{ #3.#4#2#1}%
+\def\XINT_pfloat_sci_i #1#2#3.#4.#5.{\expanded{#1 #5\xintPFloatLengthOneSuffix}#3}%
+\def\XINT_pfloat_N#1.#2.#3.#4.%
 {%
-    \expandafter\XINT_pfloat_N_e\romannumeral\xintreplicate{-#1}{0}#3%
+    \expandafter\XINT_pfloat_N_e\romannumeral\xintreplicate{-#1}{0}#4#3%
 }%
 \def\XINT_pfloat_N_e 0{ 0.}%
-\def\XINT_pfloat_P #1.#2.#3.%
+\def\XINT_pfloat_P #1.#2.#3.#4.%
 {%
     \expandafter\XINT_split_fromleft_a
-    \the\numexpr\xint_c_vii-#1.#3\xint_bye2345678\xint_bye.%
+    \the\numexpr\xint_c_vii-#1.#4\xint_bye2345678\xint_bye.#3%
 }%
-\def\XINT_pfloat_Ps #1.#2.#3.%
+\def\XINT_pfloat_Ps #1.#2.#3.#4.%
 {%
-    \expanded{ #3%
+    \expanded{ #4%
     \romannumeral\xintreplicate{#1+\xint_c_i-#2}{0}\xintPFloatIntSuffix}%
 }%
 \def\xintFloatToDecimal {\romannumeral0\xintfloattodecimal }%

Modified: trunk/Master/texmf-dist/tex/generic/xint/xintgcd.sty
===================================================================
--- trunk/Master/texmf-dist/tex/generic/xint/xintgcd.sty	2022-05-29 10:40:23 UTC (rev 63435)
+++ trunk/Master/texmf-dist/tex/generic/xint/xintgcd.sty	2022-05-29 20:36:02 UTC (rev 63436)
@@ -21,7 +21,7 @@
 %% same distribution. (The sources need not necessarily be
 %% in the same archive or directory.)
 %% ---------------------------------------------------------------
-%% The xint bundle 1.4k 2022/05/18
+%% The xint bundle 1.4l 2022/05/29
 %% Copyright (C) 2013-2022 by Jean-Francois Burnol
 %% xintgcd: Euclidean algorithm with xint package
 %% ---------------------------------------------------------------
@@ -31,25 +31,24 @@
   \catcode123=1   % {
   \catcode125=2   % }
   \catcode64=11   % @
-  \catcode35=6    % #
   \catcode44=12   % ,
-  \catcode45=12   % -
   \catcode46=12   % .
   \catcode58=12   % :
+  \catcode94=7    % ^
+  \def\empty{}\def\space{ }\newlinechar10
   \def\z{\endgroup}%
   \expandafter\let\expandafter\x\csname ver at xintgcd.sty\endcsname
   \expandafter\let\expandafter\w\csname ver at xint.sty\endcsname
   \expandafter\let\expandafter\t\csname ver at xinttools.sty\endcsname
-  \expandafter
-    \ifx\csname PackageInfo\endcsname\relax
-      \def\y#1#2{\immediate\write-1{Package #1 Info: #2.}}%
+  \expandafter\ifx\csname numexpr\endcsname\relax
+    \expandafter\ifx\csname PackageWarning\endcsname\relax
+      \immediate\write128{^^JPackage xintgcd Warning:^^J%
+                          \space\space\space\space
+                          \numexpr not available, aborting input.^^J}%
     \else
-      \def\y#1#2{\PackageInfo{#1}{#2}}%
+      \PackageWarningNoLine{xintgcd}{\numexpr not available, aborting input}%
     \fi
-  \expandafter
-  \ifx\csname numexpr\endcsname\relax
-     \y{xintgcd}{\numexpr not available, aborting input}%
-     \aftergroup\endinput
+    \def\z{\endgroup\endinput}%
   \else
     \ifx\x\relax   % plain-TeX, first loading of xintgcd.sty
       \ifx\w\relax % but xint.sty not yet loaded.
@@ -59,7 +58,6 @@
          \expandafter\def\expandafter\z\expandafter{\z\input xinttools.sty\relax}%
       \fi
     \else
-      \def\empty {}%
       \ifx\x\empty % LaTeX, first loading,
       % variable is initialized, but \ProvidesPackage not yet seen
           \ifx\w\relax % xint.sty not yet loaded.
@@ -69,7 +67,7 @@
             \expandafter\def\expandafter\z\expandafter{\z\RequirePackage{xinttools}}%
           \fi
       \else
-        \aftergroup\endinput % xintgcd already loaded.
+        \def\z{\endgroup\endinput}% xintgcd already loaded.
       \fi
     \fi
   \fi
@@ -77,7 +75,7 @@
 \XINTsetupcatcodes% defined in xintkernel.sty
 \XINT_providespackage
 \ProvidesPackage{xintgcd}%
-  [2022/05/18 v1.4k Euclide algorithm with xint package (JFB)]%
+  [2022/05/29 v1.4l Euclide algorithm with xint package (JFB)]%
 \def\xintBezout {\romannumeral0\xintbezout }%
 \def\xintbezout #1%
 {%

Modified: trunk/Master/texmf-dist/tex/generic/xint/xintkernel.sty
===================================================================
--- trunk/Master/texmf-dist/tex/generic/xint/xintkernel.sty	2022-05-29 10:40:23 UTC (rev 63435)
+++ trunk/Master/texmf-dist/tex/generic/xint/xintkernel.sty	2022-05-29 20:36:02 UTC (rev 63436)
@@ -21,7 +21,7 @@
 %% same distribution. (The sources need not necessarily be
 %% in the same archive or directory.)
 %% ---------------------------------------------------------------
-%% The xint bundle 1.4k 2022/05/18
+%% The xint bundle 1.4l 2022/05/29
 %% Copyright (C) 2013-2022 by Jean-Francois Burnol
 %% xintkernel: Paraphernalia for the xint packages
 %% ---------------------------------------------------------------
@@ -30,71 +30,68 @@
   \endlinechar=13 %
   \catcode123=1   % {
   \catcode125=2   % }
-  \catcode35=6    % #
   \catcode44=12   % ,
-  \catcode45=12   % -
   \catcode46=12   % .
   \catcode58=12   % :
-  \catcode95=11   % _
-  \expandafter
-    \ifx\csname PackageInfo\endcsname\relax
-      \def\y#1#2{\immediate\write-1{Package #1 Info: #2.}}%
+  \catcode94=7    % ^
+  \def\space{ }\newlinechar10
+  \let\z\relax
+  \expandafter\ifx\csname numexpr\endcsname\relax
+    \expandafter\ifx\csname PackageWarning\endcsname\relax
+      \immediate\write128{^^JPackage xintkernel Warning:^^J%
+                          \space\space\space\space
+                          \numexpr not available, aborting input.^^J}%
     \else
-      \def\y#1#2{\PackageInfo{#1}{#2}}%
+      \PackageWarningNoLine{xintkernel}{\numexpr not available, aborting input}%
     \fi
-  \let\z\relax
-  \expandafter
-    \ifx\csname numexpr\endcsname\relax
-     \y{xintkernel}{\numexpr not available, aborting input}%
-     \def\z{\endgroup\endinput}%
+    \def\z{\endgroup\endinput}%
+  \else
+    \expandafter\ifx\csname XINTsetupcatcodes\endcsname\relax
     \else
-    \expandafter
-     \ifx\csname XINTsetupcatcodes\endcsname\relax
-      \else
-       \y{xintkernel}{I was already loaded, aborting input}%
        \def\z{\endgroup\endinput}%
-      \fi
     \fi
+  \fi
   \ifx\z\relax\else\expandafter\z\fi%
   \def\PrepareCatcodes
   {%
       \endgroup
       \def\XINTrestorecatcodes
-      {% takes care of all, to allow more economical code in modules
-           \catcode0=\the\catcode0 %
-           \catcode59=\the\catcode59   % ; xintexpr
-           \catcode126=\the\catcode126 % ~ xintexpr
-           \catcode39=\the\catcode39   % ' xintexpr
-           \catcode34=\the\catcode34   % " xintbinhex, and xintexpr
-           \catcode63=\the\catcode63   % ? xintexpr
-           \catcode124=\the\catcode124 % | xintexpr
-           \catcode38=\the\catcode38   % & xintexpr
-           \catcode64=\the\catcode64   % @ xintexpr
-           \catcode33=\the\catcode33   % ! xintexpr
-           \catcode93=\the\catcode93   % ] -, xintfrac, xintseries, xintcfrac
-           \catcode91=\the\catcode91   % [ -, xintfrac, xintseries, xintcfrac
-           \catcode36=\the\catcode36   % $ xintgcd only $
-           \catcode94=\the\catcode94   % ^
-           \catcode96=\the\catcode96   % `
-           \catcode47=\the\catcode47   % /
-           \catcode41=\the\catcode41   % )
-           \catcode40=\the\catcode40   % (
-           \catcode42=\the\catcode42   % *
-           \catcode43=\the\catcode43   % +
-           \catcode62=\the\catcode62   % >
-           \catcode60=\the\catcode60   % <
-           \catcode58=\the\catcode58   % :
-           \catcode46=\the\catcode46   % .
-           \catcode45=\the\catcode45   % -
-           \catcode44=\the\catcode44   % ,
-           \catcode35=\the\catcode35   % #
-           \catcode95=\the\catcode95   % _
-           \catcode125=\the\catcode125 % }
-           \catcode123=\the\catcode123 % {
-           \endlinechar=\the\endlinechar
-           \catcode13=\the\catcode13   % ^^M
-           \catcode32=\the\catcode32   %
-           \catcode61=\the\catcode61\relax   % =
+      {% prepared for use in \edef
+          \catcode0=\the\catcode0     % ^^@
+          \catcode1=\the\catcode1     % ^^A
+          \catcode13=\the\catcode13   % ^^M
+          \catcode32=\the\catcode32   % <space>
+          \catcode33=\the\catcode33   % !
+          \catcode34=\the\catcode34   % "
+          \catcode35=\the\catcode35   % #
+          \catcode36=\the\catcode36   % $
+          \catcode38=\the\catcode38   % &
+          \catcode39=\the\catcode39   % '
+          \catcode40=\the\catcode40   % (
+          \catcode41=\the\catcode41   % )
+          \catcode42=\the\catcode42   % *
+          \catcode43=\the\catcode43   % +
+          \catcode44=\the\catcode44   % ,
+          \catcode45=\the\catcode45   % -
+          \catcode46=\the\catcode46   % .
+          \catcode47=\the\catcode47   % /
+          \catcode58=\the\catcode58   % :
+          \catcode59=\the\catcode59   % ;
+          \catcode60=\the\catcode60   % <
+          \catcode61=\the\catcode61   % =
+          \catcode62=\the\catcode62   % >
+          \catcode63=\the\catcode63   % ?
+          \catcode64=\the\catcode64   % @
+          \catcode91=\the\catcode91   % [
+          \catcode93=\the\catcode93   % ]
+          \catcode94=\the\catcode94   % ^
+          \catcode95=\the\catcode95   % _
+          \catcode96=\the\catcode96   % `
+          \catcode123=\the\catcode123 % {
+          \catcode124=\the\catcode124 % |
+          \catcode125=\the\catcode125 % }
+          \catcode126=\the\catcode126 % ~
+          \endlinechar=\the\endlinechar\relax
       }%
       \edef\XINTrestorecatcodesendinput
       {%
@@ -101,45 +98,43 @@
            \XINTrestorecatcodes\noexpand\endinput %
       }%
       \def\XINTsetcatcodes
-      {%
-        \catcode61=12   % =
-        \catcode32=10   % space
-        \catcode13=5    % ^^M
-        \endlinechar=13 %
-        \catcode123=1   % {
-        \catcode125=2   % }
-        \catcode95=11   % _ LETTER
-        \catcode35=6    % #
-        \catcode44=12   % ,
-        \catcode45=12   % -
-        \catcode46=12   % .
-        \catcode58=11   % : LETTER
-        \catcode60=12   % <
-        \catcode62=12   % >
-        \catcode43=12   % +
-        \catcode42=12   % *
-        \catcode40=12   % (
-        \catcode41=12   % )
-        \catcode47=12   % /
-        \catcode96=12   % `
-        \catcode94=11   % ^ LETTER
-        \catcode36=3    % $
-        \catcode91=12   % [
-        \catcode93=12   % ]
-        \catcode33=12   % ! (xintexpr.sty will use catcode 11)
-        \catcode64=11   % @ LETTER
-        \catcode38=7    % & for \romannumeral`&&@ trick.
-        \catcode124=12  % |
-        \catcode63=11   % ? LETTER
-        \catcode34=12   % "
-        \catcode39=12   % '
-        \catcode126=3   % ~ MATH
-        \catcode59=12   % ;
-        \catcode0=12    % for \romannumeral`&&@ trick
-        \catcode1=3     % for ultra-safe séparateur &&A
+      {% standard settings with a few xint*sty specific ones
+          \catcode0=12    % for \romannumeral`&&@
+          \catcode1=3     % for safe separator &&A
+          \catcode13=5    % ^^M
+          \catcode32=10   % <space>
+          \catcode33=12   % ! but used as LETTER inside xintexpr.sty
+          \catcode34=12   % "
+          \catcode35=6    % #
+          \catcode36=3    % $
+          \catcode38=7    % & SUPERSCRIPT for && as replacement of ^^
+          \catcode39=12   % '
+          \catcode40=12   % (
+          \catcode41=12   % )
+          \catcode42=12   % *
+          \catcode43=12   % +
+          \catcode44=12   % ,
+          \catcode45=12   % -
+          \catcode46=12   % .
+          \catcode47=12   % /
+          \catcode58=11   % : LETTER
+          \catcode59=12   % ;
+          \catcode60=12   % <
+          \catcode61=12   % =
+          \catcode62=12   % >
+          \catcode63=11   % ? LETTER
+          \catcode64=11   % @ LETTER
+          \catcode91=12   % [
+          \catcode93=12   % ]
+          \catcode94=11   % ^ LETTER
+          \catcode95=11   % _ LETTER
+          \catcode96=12   % `
+          \catcode123=1   % {
+          \catcode124=12  % |
+          \catcode125=2   % }
+          \catcode126=3   % ~ MATH SHIFT
+          \endlinechar=13 %
       }%
-      \let\XINT_setcatcodes\XINTsetcatcodes
-      \let\XINT_restorecatcodes\XINTrestorecatcodes
       \XINTsetcatcodes
   }%
 \PrepareCatcodes
@@ -159,7 +154,7 @@
 \fi
 \XINT_providespackage
 \ProvidesPackage {xintkernel}%
-  [2022/05/18 v1.4k Paraphernalia for the xint packages (JFB)]%
+  [2022/05/29 v1.4l Paraphernalia for the xint packages (JFB)]%
 \chardef\xint_c_     0
 \chardef\xint_c_i    1
 \chardef\xint_c_ii   2

Modified: trunk/Master/texmf-dist/tex/generic/xint/xintlog.sty
===================================================================
--- trunk/Master/texmf-dist/tex/generic/xint/xintlog.sty	2022-05-29 10:40:23 UTC (rev 63435)
+++ trunk/Master/texmf-dist/tex/generic/xint/xintlog.sty	2022-05-29 20:36:02 UTC (rev 63436)
@@ -21,7 +21,7 @@
 %% same distribution. (The sources need not necessarily be
 %% in the same archive or directory.)
 %% ---------------------------------------------------------------
-%% The xint bundle 1.4k 2022/05/18
+%% The xint bundle 1.4l 2022/05/29
 %% Copyright (C) 2013-2022 by Jean-Francois Burnol
 %% xintlog: Logarithms and exponentials for xintexpr
 %% ---------------------------------------------------------------
@@ -33,48 +33,62 @@
   \catcode64=11   % @
   \catcode35=6    % #
   \catcode44=12   % ,
-  \catcode45=12   % -
   \catcode46=12   % .
   \catcode58=12   % :
   \catcode94=7    % ^
+  \def\empty{}\def\space{ }\newlinechar10
   \def\z{\endgroup}%
-  \def\empty{}\def\space{ }\newlinechar10
+  \expandafter\let\expandafter\x\csname ver at xintlog.sty\endcsname
   \expandafter\let\expandafter\w\csname ver at xintexpr.sty\endcsname
   \expandafter
-    \ifx\csname PackageInfo\endcsname\relax
-      \def\y#1#2{\immediate\write-1{Package #1 Info:^^J%
-                 \space\space\space\space#2.}}%
+    \ifx\csname PackageWarning\endcsname\relax
+      \def\y#1#2{\immediate\write128{^^JPackage #1 Warning:^^J%
+                 \space\space\space\space#2.^^J}}%
     \else
-      \def\y#1#2{\PackageInfo{#1}{#2}}%
+      \def\y#1#2{\PackageWarningNoLine{#1}{#2}}%
     \fi
   \expandafter
   \ifx\csname numexpr\endcsname\relax
      \y{xintlog}{\numexpr not available, aborting input}%
-     \aftergroup\endinput
+     \def\z{\endgroup\endinput}%
   \else
     \ifx\w\relax % xintexpr.sty not yet loaded.
+        \edef\MsgBrk{^^J\space\space\space\space}%
         \y{xintlog}%
-          {Loading should be via \ifx\x\empty\string\usepackage{xintexpr.sty}
-                          \else\string\input\space xintexpr.sty \fi
-           rather, aborting}%
-        \aftergroup\endinput
+          {\ifx\x\empty
+             xintlog should not be loaded directly\MessageBreak
+             The correct way is \string\usepackage{xintexpr}.\MessageBreak
+             Will try that now%
+           \else
+             First loading of xintlog.sty should be via
+             \string\input\space xintexpr.sty\relax\MsgBrk
+             Will try that now%
+           \fi
+          }%
+        \ifx\x\empty
+          \def\z{\endgroup\RequirePackage{xintexpr}\endinput}%
+        \else
+          \def\z{\endgroup\input xintexpr.sty\relax\endinput}%
+        \fi
+    \else
+      \def\z{\endgroup\edef\XINTlogendinput{\XINTrestorecatcodes\noexpand\endinput}}%
     \fi
   \fi
 \z%
-\edef\XINTendxintloginput{\XINTrestorecatcodes\noexpand\endinput}\XINTsetcatcodes%
+\XINTsetcatcodes%
 \ifcsname xintlibver at log\endcsname
   \expandafter\xint_firstoftwo
 \else
   \expandafter\xint_secondoftwo
 \fi
-{\immediate\write-1{Reloading xintlog library using Digits=\xinttheDigits.}}%
-{\expandafter\gdef\csname xintlibver at log\endcsname{2022/05/18 v1.4k}%
+{\immediate\write128{Reloading xintlog library using Digits=\xinttheDigits.}}%
+{\expandafter\gdef\csname xintlibver at log\endcsname{2022/05/29 v1.4l}%
 \XINT_providespackage
 \ProvidesPackage{xintlog}%
-[2022/05/18 v1.4k Logarithms and exponentials for xintexpr (JFB)]%
+[2022/05/29 v1.4l Logarithms and exponentials for xintexpr (JFB)]%
 }%
 \def\xintreloadxintlog{\input xintlog.sty }%
-\xintexprSafeCatcodes\catcode`_ 11
+\xintexprSafeCatcodes
 \unless\ifdefined\XINTinFloatPowTen
 \ifdefined\RequirePackage
   \RequirePackage{poormanlog}%
@@ -81,7 +95,7 @@
 \else
   \input poormanlog.tex
 \fi\fi
-\xintexprRestoreCatcodes\XINTsetcatcodes
+\xintexprRestoreCatcodes
 \def\PoorManLogBaseTen{\romannumeral0\poormanlogbaseten}%
 \def\poormanlogbaseten #1%
 {%
@@ -334,7 +348,7 @@
     \romannumeral`&&@\XINT:NEhook:f:one:from:two
     {\romannumeral`&&@\XINTinFloatSciPow#3}}%
 }%
-\ifnum\XINTdigits<9 \expandafter\XINTendxintloginput\fi%
+\ifnum\XINTdigits<9 \expandafter\XINTlogendinput\fi%
 \def\XINT_tmpa{1[0]}%
 \expandafter\let\csname XINT_c_1_0\endcsname\XINT_tmpa
 \expandafter\let\csname XINT_c_2_0\endcsname\XINT_tmpa
@@ -1392,7 +1406,7 @@
   \XINTinFloat[\XINTdigitsormax-43]{1/9[0]}.%
   }%
 \fi
-\XINTendxintloginput%
+\XINTlogendinput%
 \endinput
 %%
 %% End of file `xintlog.sty'.

Modified: trunk/Master/texmf-dist/tex/generic/xint/xintseries.sty
===================================================================
--- trunk/Master/texmf-dist/tex/generic/xint/xintseries.sty	2022-05-29 10:40:23 UTC (rev 63435)
+++ trunk/Master/texmf-dist/tex/generic/xint/xintseries.sty	2022-05-29 20:36:02 UTC (rev 63436)
@@ -21,7 +21,7 @@
 %% same distribution. (The sources need not necessarily be
 %% in the same archive or directory.)
 %% ---------------------------------------------------------------
-%% The xint bundle 1.4k 2022/05/18
+%% The xint bundle 1.4l 2022/05/29
 %% Copyright (C) 2013-2022 by Jean-Francois Burnol
 %% xintseries: Expandable partial sums with xint package
 %% ---------------------------------------------------------------
@@ -31,24 +31,23 @@
   \catcode123=1   % {
   \catcode125=2   % }
   \catcode64=11   % @
-  \catcode35=6    % #
   \catcode44=12   % ,
-  \catcode45=12   % -
   \catcode46=12   % .
   \catcode58=12   % :
-  \let\z\endgroup
+  \catcode94=7    % ^
+  \def\empty{}\def\space{ }\newlinechar10
+  \def\z{\endgroup}%
   \expandafter\let\expandafter\x\csname ver at xintseries.sty\endcsname
   \expandafter\let\expandafter\w\csname ver at xintfrac.sty\endcsname
-  \expandafter
-    \ifx\csname PackageInfo\endcsname\relax
-      \def\y#1#2{\immediate\write-1{Package #1 Info: #2.}}%
+  \expandafter\ifx\csname numexpr\endcsname\relax
+    \expandafter\ifx\csname PackageWarning\endcsname\relax
+      \immediate\write128{^^JPackage xintseries Warning:^^J%
+                          \space\space\space\space
+                          \numexpr not available, aborting input.^^J}%
     \else
-      \def\y#1#2{\PackageInfo{#1}{#2}}%
+      \PackageWarningNoLine{xintseries}{\numexpr not available, aborting input}%
     \fi
-  \expandafter
-  \ifx\csname numexpr\endcsname\relax
-     \y{xintseries}{\numexpr not available, aborting input}%
-     \aftergroup\endinput
+    \def\z{\endgroup\endinput}%
   \else
     \ifx\x\relax   % plain-TeX, first loading of xintseries.sty
       \ifx\w\relax % but xintfrac.sty not yet loaded.
@@ -55,7 +54,6 @@
          \def\z{\endgroup\input xintfrac.sty\relax}%
       \fi
     \else
-      \def\empty {}%
       \ifx\x\empty % LaTeX, first loading,
       % variable is initialized, but \ProvidesPackage not yet seen
           \ifx\w\relax % xintfrac.sty not yet loaded.
@@ -62,7 +60,7 @@
             \def\z{\endgroup\RequirePackage{xintfrac}}%
           \fi
       \else
-        \aftergroup\endinput % xintseries already loaded.
+        \def\z{\endgroup\endinput}% xintseries already loaded.
       \fi
     \fi
   \fi
@@ -70,7 +68,7 @@
 \XINTsetupcatcodes% defined in xintkernel.sty
 \XINT_providespackage
 \ProvidesPackage{xintseries}%
-  [2022/05/18 v1.4k Expandable partial sums with xint package (JFB)]%
+  [2022/05/29 v1.4l Expandable partial sums with xint package (JFB)]%
 \def\xintSeries {\romannumeral0\xintseries }%
 \def\xintseries #1#2%
 {%

Modified: trunk/Master/texmf-dist/tex/generic/xint/xinttools.sty
===================================================================
--- trunk/Master/texmf-dist/tex/generic/xint/xinttools.sty	2022-05-29 10:40:23 UTC (rev 63435)
+++ trunk/Master/texmf-dist/tex/generic/xint/xinttools.sty	2022-05-29 20:36:02 UTC (rev 63436)
@@ -21,7 +21,7 @@
 %% same distribution. (The sources need not necessarily be
 %% in the same archive or directory.)
 %% ---------------------------------------------------------------
-%% The xint bundle 1.4k 2022/05/18
+%% The xint bundle 1.4l 2022/05/29
 %% Copyright (C) 2013-2022 by Jean-Francois Burnol
 %% xinttools: Expandable and non-expandable utilities
 %% ---------------------------------------------------------------
@@ -31,24 +31,23 @@
   \catcode123=1   % {
   \catcode125=2   % }
   \catcode64=11   % @
-  \catcode35=6    % #
   \catcode44=12   % ,
-  \catcode45=12   % -
   \catcode46=12   % .
   \catcode58=12   % :
-  \let\z\endgroup
+  \catcode94=7    % ^
+  \def\empty{}\def\space{ }\newlinechar10
+  \def\z{\endgroup}%
   \expandafter\let\expandafter\x\csname ver at xinttools.sty\endcsname
   \expandafter\let\expandafter\w\csname ver at xintkernel.sty\endcsname
-  \expandafter
-    \ifx\csname PackageInfo\endcsname\relax
-      \def\y#1#2{\immediate\write-1{Package #1 Info: #2.}}%
+  \expandafter\ifx\csname numexpr\endcsname\relax
+    \expandafter\ifx\csname PackageWarning\endcsname\relax
+      \immediate\write128{^^JPackage xinttools Warning:^^J%
+                          \space\space\space\space
+                          \numexpr not available, aborting input.^^J}%
     \else
-      \def\y#1#2{\PackageInfo{#1}{#2}}%
+      \PackageWarningNoLine{xinttools}{\numexpr not available, aborting input}%
     \fi
-  \expandafter
-  \ifx\csname numexpr\endcsname\relax
-     \y{xinttools}{\numexpr not available, aborting input}%
-     \aftergroup\endinput
+    \def\z{\endgroup\endinput}%
   \else
     \ifx\x\relax   % plain-TeX, first loading of xinttools.sty
       \ifx\w\relax % but xintkernel.sty not yet loaded.
@@ -55,7 +54,6 @@
          \def\z{\endgroup\input xintkernel.sty\relax}%
       \fi
     \else
-      \def\empty {}%
       \ifx\x\empty % LaTeX, first loading,
       % variable is initialized, but \ProvidesPackage not yet seen
           \ifx\w\relax % xintkernel.sty not yet loaded.
@@ -62,7 +60,7 @@
             \def\z{\endgroup\RequirePackage{xintkernel}}%
           \fi
       \else
-        \aftergroup\endinput % xinttools already loaded.
+        \def\z{\endgroup\endinput}% xinttools already loaded.
       \fi
     \fi
   \fi
@@ -70,7 +68,7 @@
 \XINTsetupcatcodes% defined in xintkernel.sty
 \XINT_providespackage
 \ProvidesPackage{xinttools}%
-  [2022/05/18 v1.4k Expandable and non-expandable utilities (JFB)]%
+  [2022/05/29 v1.4l Expandable and non-expandable utilities (JFB)]%
 \newtoks\XINT_toks
 \xint_firstofone{\let\XINT_sptoken= } %<- space here!
 \def\xintgodef  {\global\xintodef }%

Modified: trunk/Master/texmf-dist/tex/generic/xint/xinttrig.sty
===================================================================
--- trunk/Master/texmf-dist/tex/generic/xint/xinttrig.sty	2022-05-29 10:40:23 UTC (rev 63435)
+++ trunk/Master/texmf-dist/tex/generic/xint/xinttrig.sty	2022-05-29 20:36:02 UTC (rev 63436)
@@ -21,7 +21,7 @@
 %% same distribution. (The sources need not necessarily be
 %% in the same archive or directory.)
 %% ---------------------------------------------------------------
-%% The xint bundle 1.4k 2022/05/18
+%% The xint bundle 1.4l 2022/05/29
 %% Copyright (C) 2013-2022 by Jean-Francois Burnol
 %% xinttrig: Trigonometry for the xintexpr package
 %% ---------------------------------------------------------------
@@ -33,35 +33,49 @@
   \catcode64=11   % @
   \catcode35=6    % #
   \catcode44=12   % ,
-  \catcode45=12   % -
   \catcode46=12   % .
   \catcode58=12   % :
   \catcode94=7    % ^
+  \def\empty{}\def\space{ }\newlinechar10
   \def\z{\endgroup}%
-  \def\empty{}\def\space{ }\newlinechar10
+  \expandafter\let\expandafter\x\csname ver at xinttrig.sty\endcsname
   \expandafter\let\expandafter\w\csname ver at xintexpr.sty\endcsname
   \expandafter
-    \ifx\csname PackageInfo\endcsname\relax
-      \def\y#1#2{\immediate\write-1{Package #1 Info:^^J%
-                 \space\space\space\space#2.}}%
+    \ifx\csname PackageWarning\endcsname\relax
+      \def\y#1#2{\immediate\write128{^^JPackage #1 Warning:^^J%
+                 \space\space\space\space#2.^^J}}%
     \else
-      \def\y#1#2{\PackageInfo{#1}{#2}}%
+      \def\y#1#2{\PackageWarningNoLine{#1}{#2}}%
     \fi
   \expandafter
   \ifx\csname numexpr\endcsname\relax
      \y{xinttrig}{\numexpr not available, aborting input}%
-     \aftergroup\endinput
+     \def\z{\endgroup\endinput}%
   \else
     \ifx\w\relax % xintexpr.sty not yet loaded.
+        \edef\MsgBrk{^^J\space\space\space\space}%
         \y{xinttrig}%
-          {Loading should be via \ifx\x\empty\string\usepackage{xintexpr.sty}
-                          \else\string\input\space xintexpr.sty \fi
-           rather, aborting}%
-         \aftergroup\endinput
+          {\ifx\x\empty
+             xinttrig should not be loaded directly\MessageBreak
+             The correct way is \string\usepackage{xintexpr}.\MessageBreak
+             Will try that now%
+           \else
+             First loading of xinttrig.sty should be via
+             \string\input\space xintexpr.sty\relax\MsgBrk
+             Will try that now%
+           \fi
+          }%
+        \ifx\x\empty
+          \def\z{\endgroup\RequirePackage{xintexpr}\endinput}%
+        \else
+          \def\z{\endgroup\input xintexpr.sty\relax\endinput}%
+        \fi
+    \else
+      \def\z{\endgroup\edef\XINTtrigendinput{\XINTrestorecatcodes\noexpand\endinput}}%
     \fi
   \fi
 \z%
-\edef\XINTtrigendinput{\XINTrestorecatcodes\noexpand\endinput}\XINTsetcatcodes%
+\XINTsetcatcodes%
 \catcode`? 12
 \ifcsname xintlibver at trig\endcsname
   \expandafter\xint_firstoftwo
@@ -68,11 +82,11 @@
 \else
   \expandafter\xint_secondoftwo
 \fi
-{\immediate\write-1{Reloading xinttrig library using Digits=\xinttheDigits.}}%
-{\expandafter\gdef\csname xintlibver at trig\endcsname{2022/05/18 v1.4k}%
+{\immediate\write128{Reloading xinttrig library using Digits=\xinttheDigits.}}%
+{\expandafter\gdef\csname xintlibver at trig\endcsname{2022/05/29 v1.4l}%
 \XINT_providespackage
 \ProvidesPackage{xinttrig}%
-[2022/05/18 v1.4k Trigonometrical functions for xintexpr (JFB)]%
+[2022/05/29 v1.4l Trigonometrical functions for xintexpr (JFB)]%
 }%
 \xintFor* #1 in {iDTVtuwxyzX}\do{\xintensuredummy{#1}}%
 \def\xintreloadxinttrig{\input xinttrig.sty }%



More information about the tex-live-commits mailing list.