summaryrefslogtreecommitdiff
path: root/macros/generic/xint/CHANGES.html
diff options
context:
space:
mode:
Diffstat (limited to 'macros/generic/xint/CHANGES.html')
-rw-r--r--macros/generic/xint/CHANGES.html3279
1 files changed, 2542 insertions, 737 deletions
diff --git a/macros/generic/xint/CHANGES.html b/macros/generic/xint/CHANGES.html
index eb355ab053..7055bf2e04 100644
--- a/macros/generic/xint/CHANGES.html
+++ b/macros/generic/xint/CHANGES.html
@@ -4,1099 +4,2904 @@
<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.4j" />
+ <meta name="author" content="xint 1.4k" />
<title>CHANGE LOG</title>
- <style type="text/css">
- code{white-space: pre-wrap;}
- span.smallcaps{font-variant: small-caps;}
- span.underline{text-decoration: underline;}
- div.column{display: inline-block; vertical-align: top; width: 50%;}
- </style>
- <style type="text/css">
- body{margin-left : 10%; margin-right : 15%; margin-top: 4ex; font-size: 12pt;}
- pre {white-space: pre-wrap;}
- code {white-space: pre-wrap;}
- #TOC {float: right; position: relative; top: 100px; margin-bottom: 100px;}
+ <style>
+ html {
+ line-height: 1.5;
+ font-family: Georgia, serif;
+ font-size: 20px;
+ color: #1a1a1a;
+ background-color: #fdfdfd;
+ }
+ body {
+ margin: 0 auto;
+ max-width: 36em;
+ padding-left: 50px;
+ padding-right: 50px;
+ padding-top: 50px;
+ padding-bottom: 50px;
+ hyphens: auto;
+ overflow-wrap: break-word;
+ text-rendering: optimizeLegibility;
+ font-kerning: normal;
+ }
+ @media (max-width: 600px) {
+ body {
+ font-size: 0.9em;
+ padding: 1em;
+ }
+ h1 {
+ font-size: 1.8em;
+ }
+ }
+ @media print {
+ body {
+ background-color: transparent;
+ color: black;
+ font-size: 12pt;
+ }
+ p, h2, h3 {
+ orphans: 3;
+ widows: 3;
+ }
+ h2, h3, h4 {
+ page-break-after: avoid;
+ }
+ }
+ p {
+ margin: 1em 0;
+ }
+ a {
+ color: #1a1a1a;
+ }
+ a:visited {
+ color: #1a1a1a;
+ }
+ img {
+ max-width: 100%;
+ }
+ h1, h2, h3, h4, h5, h6 {
+ margin-top: 1.4em;
+ }
+ h5, h6 {
+ font-size: 1em;
+ font-style: italic;
+ }
+ h6 {
+ font-weight: normal;
+ }
+ ol, ul {
+ padding-left: 1.7em;
+ margin-top: 1em;
+ }
+ li > ol, li > ul {
+ margin-top: 0;
+ }
+ blockquote {
+ margin: 1em 0 1em 1.7em;
+ padding-left: 1em;
+ border-left: 2px solid #e6e6e6;
+ color: #606060;
+ }
+ code {
+ font-family: Menlo, Monaco, 'Lucida Console', Consolas, monospace;
+ font-size: 85%;
+ margin: 0;
+ }
+ pre {
+ margin: 1em 0;
+ overflow: auto;
+ }
+ pre code {
+ padding: 0;
+ overflow: visible;
+ overflow-wrap: normal;
+ }
+ .sourceCode {
+ background-color: transparent;
+ overflow: visible;
+ }
+ hr {
+ background-color: #1a1a1a;
+ border: none;
+ height: 1px;
+ margin: 1em 0;
+ }
+ table {
+ margin: 1em 0;
+ border-collapse: collapse;
+ width: 100%;
+ overflow-x: auto;
+ display: block;
+ font-variant-numeric: lining-nums tabular-nums;
+ }
+ table caption {
+ margin-bottom: 0.75em;
+ }
+ tbody {
+ margin-top: 0.5em;
+ border-top: 1px solid #1a1a1a;
+ border-bottom: 1px solid #1a1a1a;
+ }
+ th {
+ border-top: 1px solid #1a1a1a;
+ padding: 0.25em 0.5em 0.25em 0.5em;
+ }
+ td {
+ padding: 0.125em 0.5em 0.25em 0.5em;
+ }
+ header {
+ margin-bottom: 4em;
+ text-align: center;
+ }
+ #TOC li {
+ list-style: none;
+ }
+ #TOC ul {
+ padding-left: 1.3em;
+ }
+ #TOC > ul {
+ padding-left: 0;
+ }
+ #TOC a:not(:hover) {
+ text-decoration: none;
+ }
+ code{white-space: pre-wrap;}
+ span.smallcaps{font-variant: small-caps;}
+ span.underline{text-decoration: underline;}
+ div.column{display: inline-block; vertical-align: top; width: 50%;}
+ div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
+ ul.task-list{list-style: none;}
+ body{margin: 0; margin-left : 10%; margin-right : 15%; margin-top: 4ex; font-size: 20px; font-family: serif; max-width: 100%; padding: 0; }
+ pre {white-space: pre-wrap;}
+ code {white-space: pre-wrap;}
+ a:link { color: blue; }
+ a:visited { color: green; }
+ a:hover { text-decoration: underline; color: hotpink }
+ a:active { color: brown; }
+ #TOC {float: right; position: relative; top: 100px; margin-bottom: 100px; margin-left: 20px;}
+ .display.math{display: block; text-align: center; margin: 0.5rem auto;}
</style>
<!--[if lt IE 9]>
<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
<![endif]-->
</head>
<body>
-<header>
+<header id="title-block-header">
<h1 class="title">CHANGE LOG</h1>
-<p class="author">xint 1.4j</p>
-<p class="date">2021/07/13</p>
+<p class="author">xint 1.4k</p>
+<p class="date">2022/05/18</p>
</header>
-<nav id="TOC">
+<nav id="TOC" role="doc-toc">
+<ul>
+<li><a href="#k-20220518"
+id="toc-k-20220518"><code>1.4k (2022/05/18)</code></a>
<ul>
-<li><a href="#j-20210713"><code>1.4j (2021/07/13)</code></a><ul>
-<li><a href="#bug-fixes">Bug fixes</a></li>
+<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>
</ul></li>
-<li><a href="#i-20210611"><code>1.4i (2021/06/11)</code></a><ul>
-<li><a href="#new-features">New features</a></li>
-<li><a href="#bug-fixes-1">Bug fixes</a></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>
</ul></li>
-<li><a href="#h-20210527"><code>1.4h (2021/05/27)</code></a><ul>
-<li><a href="#bug-fixes-2">Bug fixes</a></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
+features</a></li>
+<li><a href="#bug-fixes-2" id="toc-bug-fixes-2">Bug fixes</a></li>
</ul></li>
-<li><a href="#g-20210525"><code>1.4g (2021/05/25)</code></a><ul>
-<li><a href="#breaking-changes">Breaking changes</a></li>
-<li><a href="#deprecated">Deprecated</a></li>
-<li><a href="#new-features-1">New features</a></li>
-<li><a href="#bug-fixes-3">Bug fixes</a></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>
</ul></li>
-<li><a href="#f-20210510"><code>1.4f (2021/05/10)</code></a><ul>
-<li><a href="#breaking-changes-1">Breaking changes</a></li>
-<li><a href="#bug-fixes-4">Bug fixes</a></li>
+<li><a href="#g-20210525"
+id="toc-g-20210525"><code>1.4g (2021/05/25)</code></a>
+<ul>
+<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
+features</a></li>
+<li><a href="#bug-fixes-4" id="toc-bug-fixes-4">Bug fixes</a></li>
</ul></li>
-<li><a href="#e-20210505"><code>1.4e (2021/05/05)</code></a><ul>
-<li><a href="#breaking-changes-2">Breaking changes</a></li>
-<li><a href="#new-features-2">New features</a></li>
-<li><a href="#bug-fixes-5">Bug fixes</a></li>
+<li><a href="#f-20210510"
+id="toc-f-20210510"><code>1.4f (2021/05/10)</code></a>
+<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>
</ul></li>
-<li><a href="#d-20210329"><code>1.4d (2021/03/29)</code></a><ul>
-<li><a href="#breaking-changes-3">Breaking changes</a></li>
-<li><a href="#bug-fixes-6">Bug fixes</a></li>
+<li><a href="#e-20210505"
+id="toc-e-20210505"><code>1.4e (2021/05/05)</code></a>
+<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
+features</a></li>
+<li><a href="#bug-fixes-6" id="toc-bug-fixes-6">Bug fixes</a></li>
</ul></li>
-<li><a href="#c-20210220"><code>1.4c (2021/02/20)</code></a><ul>
-<li><a href="#bug-fixes-7">Bug fixes</a></li>
+<li><a href="#d-20210329"
+id="toc-d-20210329"><code>1.4d (2021/03/29)</code></a>
+<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>
</ul></li>
-<li><a href="#b-20200225"><code>1.4b (2020/02/25)</code></a><ul>
-<li><a href="#future">Future</a></li>
-<li><a href="#new-features-3">New features</a></li>
-<li><a href="#bug-fixes-8">Bug fixes</a></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>
</ul></li>
-<li><a href="#a-20200219"><code>1.4a (2020/02/19)</code></a><ul>
-<li><a href="#breaking-changes-4">Breaking changes</a></li>
-<li><a href="#new-features-4">New features</a></li>
-<li><a href="#bug-fixes-9">Bug fixes</a></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
+features</a></li>
+<li><a href="#bug-fixes-9" id="toc-bug-fixes-9">Bug fixes</a></li>
</ul></li>
-<li><a href="#section"><code>1.4 (2020/01/31)</code></a><ul>
-<li><a href="#breaking-changes-5">Breaking changes</a></li>
-<li><a href="#improvements-and-new-features">Improvements and new features</a></li>
-<li><a href="#bug-fixes-10">Bug fixes</a></li>
-<li><a href="#todo">TODO</a></li>
+<li><a href="#a-20200219"
+id="toc-a-20200219"><code>1.4a (2020/02/19)</code></a>
+<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
+features</a></li>
+<li><a href="#bug-fixes-10" id="toc-bug-fixes-10">Bug fixes</a></li>
</ul></li>
-<li><a href="#f-20190910"><code>1.3f (2019/09/10)</code></a><ul>
-<li><a href="#improvements-and-new-features-1">Improvements and new features</a></li>
-<li><a href="#bug-fixes-11">Bug fixes</a></li>
+<li><a href="#section"
+id="toc-section"><code>1.4 (2020/01/31)</code></a>
+<ul>
+<li><a href="#breaking-changes-6" id="toc-breaking-changes-6">Breaking
+changes</a></li>
+<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="#todo" id="toc-todo">TODO</a></li>
</ul></li>
-<li><a href="#e-20190405"><code>1.3e (2019/04/05)</code></a><ul>
-<li><a href="#breaking-changes-6">Breaking changes</a></li>
-<li><a href="#improvements-and-new-features-2">Improvements and new features</a></li>
-<li><a href="#bug-fixes-12">Bug fixes</a></li>
+<li><a href="#f-20190910"
+id="toc-f-20190910"><code>1.3f (2019/09/10)</code></a>
+<ul>
+<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>
</ul></li>
-<li><a href="#d-20190106"><code>1.3d (2019/01/06)</code></a><ul>
-<li><a href="#breaking-changes-7">Breaking changes</a></li>
-<li><a href="#improvements-and-new-features-3">Improvements and new features</a></li>
-<li><a href="#bug-fixes-13">Bug fixes</a></li>
+<li><a href="#e-20190405"
+id="toc-e-20190405"><code>1.3e (2019/04/05)</code></a>
+<ul>
+<li><a href="#breaking-changes-7" id="toc-breaking-changes-7">Breaking
+changes</a></li>
+<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>
</ul></li>
-<li><a href="#c-20180617"><code>1.3c (2018/06/17)</code></a><ul>
-<li><a href="#improvements-and-new-features-4">Improvements and new features</a></li>
-<li><a href="#bug-fixes-14">Bug fixes</a></li>
+<li><a href="#d-20190106"
+id="toc-d-20190106"><code>1.3d (2019/01/06)</code></a>
+<ul>
+<li><a href="#breaking-changes-8" id="toc-breaking-changes-8">Breaking
+changes</a></li>
+<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>
</ul></li>
-<li><a href="#b-20180518"><code>1.3b (2018/05/18)</code></a><ul>
-<li><a href="#improvements-and-new-features-5">Improvements and new features</a></li>
+<li><a href="#c-20180617"
+id="toc-c-20180617"><code>1.3c (2018/06/17)</code></a>
+<ul>
+<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>
</ul></li>
-<li><a href="#a-20180307"><code>1.3a (2018/03/07)</code></a><ul>
-<li><a href="#removed">Removed</a></li>
-<li><a href="#improvements-and-new-features-6">Improvements and new features</a></li>
-<li><a href="#bug-fixes-15">Bug fixes</a></li>
+<li><a href="#b-20180518"
+id="toc-b-20180518"><code>1.3b (2018/05/18)</code></a>
+<ul>
+<li><a href="#improvements-and-new-features-5"
+id="toc-improvements-and-new-features-5">Improvements and new
+features</a></li>
</ul></li>
-<li><a href="#section-1"><code>1.3 (2018/03/01)</code></a><ul>
-<li><a href="#breaking-changes-8">Breaking changes</a></li>
-<li><a href="#improvements-and-new-features-7">Improvements and new features</a></li>
+<li><a href="#a-20180307"
+id="toc-a-20180307"><code>1.3a (2018/03/07)</code></a>
+<ul>
+<li><a href="#removed" id="toc-removed">Removed</a></li>
+<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>
</ul></li>
-<li><a href="#q-20180206"><code>1.2q (2018/02/06)</code></a><ul>
-<li><a href="#improvements-and-new-features-8">Improvements and new features</a></li>
-<li><a href="#bug-fixes-16">Bug fixes</a></li>
+<li><a href="#section-1"
+id="toc-section-1"><code>1.3 (2018/03/01)</code></a>
+<ul>
+<li><a href="#breaking-changes-9" id="toc-breaking-changes-9">Breaking
+changes</a></li>
+<li><a href="#improvements-and-new-features-7"
+id="toc-improvements-and-new-features-7">Improvements and new
+features</a></li>
</ul></li>
-<li><a href="#p-20171205"><code>1.2p (2017/12/05)</code></a><ul>
-<li><a href="#breaking-changes-9">Breaking changes</a></li>
-<li><a href="#improvements-and-new-features-9">Improvements and new features</a></li>
-<li><a href="#bug-fixes-17">Bug fixes</a></li>
+<li><a href="#q-20180206"
+id="toc-q-20180206"><code>1.2q (2018/02/06)</code></a>
+<ul>
+<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>
</ul></li>
-<li><a href="#o-20170829"><code>1.2o (2017/08/29)</code></a><ul>
-<li><a href="#breaking-changes-10">Breaking changes</a></li>
-<li><a href="#deprecated-1">Deprecated</a></li>
+<li><a href="#p-20171205"
+id="toc-p-20171205"><code>1.2p (2017/12/05)</code></a>
+<ul>
+<li><a href="#breaking-changes-10" id="toc-breaking-changes-10">Breaking
+changes</a></li>
+<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>
</ul></li>
-<li><a href="#n-20170806"><code>1.2n (2017/08/06)</code></a><ul>
-<li><a href="#breaking-changes-11">Breaking changes</a></li>
-<li><a href="#improvements-and-new-features-10">Improvements and new features</a></li>
+<li><a href="#o-20170829"
+id="toc-o-20170829"><code>1.2o (2017/08/29)</code></a>
+<ul>
+<li><a href="#breaking-changes-11" id="toc-breaking-changes-11">Breaking
+changes</a></li>
+<li><a href="#deprecated-1" id="toc-deprecated-1">Deprecated</a></li>
</ul></li>
-<li><a href="#m-20170731"><code>1.2m (2017/07/31)</code></a><ul>
-<li><a href="#breaking-changes-12">Breaking changes</a></li>
-<li><a href="#improvements-and-new-features-11">Improvements and new features</a></li>
-<li><a href="#bug-fixes-18">Bug fixes</a></li>
+<li><a href="#n-20170806"
+id="toc-n-20170806"><code>1.2n (2017/08/06)</code></a>
+<ul>
+<li><a href="#breaking-changes-12" id="toc-breaking-changes-12">Breaking
+changes</a></li>
+<li><a href="#improvements-and-new-features-10"
+id="toc-improvements-and-new-features-10">Improvements and new
+features</a></li>
</ul></li>
-<li><a href="#l-20170726"><code>1.2l (2017/07/26)</code></a><ul>
-<li><a href="#removed-1">Removed</a></li>
-<li><a href="#improvements-and-new-features-12">Improvements and new features</a></li>
-<li><a href="#bug-fixes-19">Bug fixes</a></li>
+<li><a href="#m-20170731"
+id="toc-m-20170731"><code>1.2m (2017/07/31)</code></a>
+<ul>
+<li><a href="#breaking-changes-13" id="toc-breaking-changes-13">Breaking
+changes</a></li>
+<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>
</ul></li>
-<li><a href="#k-20170106"><code>1.2k (2017/01/06)</code></a><ul>
-<li><a href="#breaking-changes-13">Breaking changes</a></li>
-<li><a href="#improvements-and-new-features-13">Improvements and new features</a></li>
-<li><a href="#bug-fixes-20">Bug fixes</a></li>
+<li><a href="#l-20170726"
+id="toc-l-20170726"><code>1.2l (2017/07/26)</code></a>
+<ul>
+<li><a href="#removed-1" id="toc-removed-1">Removed</a></li>
+<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>
</ul></li>
-<li><a href="#j-20161222"><code>1.2j (2016/12/22)</code></a><ul>
-<li><a href="#improvements-and-new-features-14">Improvements and new features</a></li>
-<li><a href="#bug-fixes-21">Bug fixes</a></li>
+<li><a href="#k-20170106"
+id="toc-k-20170106"><code>1.2k (2017/01/06)</code></a>
+<ul>
+<li><a href="#breaking-changes-14" id="toc-breaking-changes-14">Breaking
+changes</a></li>
+<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>
+</ul></li>
+<li><a href="#j-20161222"
+id="toc-j-20161222"><code>1.2j (2016/12/22)</code></a>
+<ul>
+<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>
</ul></li>
-<li><a href="#i-20161213"><code>1.2i (2016/12/13)</code></a><ul>
-<li><a href="#breaking-changes-14">Breaking changes</a></li>
-<li><a href="#removed-2">Removed</a></li>
-<li><a href="#improvements-and-new-features-15">Improvements and new features</a></li>
-<li><a href="#bug-fixes-22">Bug fixes</a></li>
+<li><a href="#i-20161213"
+id="toc-i-20161213"><code>1.2i (2016/12/13)</code></a>
+<ul>
+<li><a href="#breaking-changes-15" id="toc-breaking-changes-15">Breaking
+changes</a></li>
+<li><a href="#removed-2" id="toc-removed-2">Removed</a></li>
+<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>
</ul></li>
-<li><a href="#h-20161120"><code>1.2h (2016/11/20)</code></a><ul>
-<li><a href="#improvements-and-new-features-16">Improvements and new features</a></li>
-<li><a href="#bug-fixes-23">Bug fixes</a></li>
+<li><a href="#h-20161120"
+id="toc-h-20161120"><code>1.2h (2016/11/20)</code></a>
+<ul>
+<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>
</ul></li>
-<li><a href="#g-20160319"><code>1.2g (2016/03/19)</code></a><ul>
-<li><a href="#breaking-changes-15">Breaking changes</a></li>
-<li><a href="#improvements-and-new-features-17">Improvements and new features</a></li>
+<li><a href="#g-20160319"
+id="toc-g-20160319"><code>1.2g (2016/03/19)</code></a>
+<ul>
+<li><a href="#breaking-changes-16" id="toc-breaking-changes-16">Breaking
+changes</a></li>
+<li><a href="#improvements-and-new-features-17"
+id="toc-improvements-and-new-features-17">Improvements and new
+features</a></li>
</ul></li>
-<li><a href="#f-20160312"><code>1.2f (2016/03/12)</code></a><ul>
-<li><a href="#breaking-changes-16">Breaking changes</a></li>
-<li><a href="#improvements-and-new-features-18">Improvements and new features</a></li>
-<li><a href="#bug-fixes-24">Bug fixes</a></li>
+<li><a href="#f-20160312"
+id="toc-f-20160312"><code>1.2f (2016/03/12)</code></a>
+<ul>
+<li><a href="#breaking-changes-17" id="toc-breaking-changes-17">Breaking
+changes</a></li>
+<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>
</ul></li>
-<li><a href="#e-20151122"><code>1.2e (2015/11/22)</code></a><ul>
-<li><a href="#improvements-and-new-features-19">Improvements and new features</a></li>
-<li><a href="#bug-fixes-25">Bug fixes</a></li>
+<li><a href="#e-20151122"
+id="toc-e-20151122"><code>1.2e (2015/11/22)</code></a>
+<ul>
+<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>
</ul></li>
-<li><a href="#d-20151118"><code>1.2d (2015/11/18)</code></a><ul>
-<li><a href="#improvements-and-new-features-20">Improvements and new features</a></li>
-<li><a href="#bug-fixes-26">Bug fixes</a></li>
+<li><a href="#d-20151118"
+id="toc-d-20151118"><code>1.2d (2015/11/18)</code></a>
+<ul>
+<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>
</ul></li>
-<li><a href="#c-20151116"><code>1.2c (2015/11/16)</code></a><ul>
-<li><a href="#improvements-and-new-features-21">Improvements and new features</a></li>
-<li><a href="#bug-fixes-27">Bug fixes</a></li>
+<li><a href="#c-20151116"
+id="toc-c-20151116"><code>1.2c (2015/11/16)</code></a>
+<ul>
+<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>
</ul></li>
-<li><a href="#b-20151029"><code>1.2b (2015/10/29)</code></a><ul>
-<li><a href="#bug-fixes-28">Bug fixes</a></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>
</ul></li>
-<li><a href="#a-20151019"><code>1.2a (2015/10/19)</code></a><ul>
-<li><a href="#improvements-and-new-features-22">Improvements and new features</a></li>
-<li><a href="#bug-fixes-29">Bug fixes</a></li>
+<li><a href="#a-20151019"
+id="toc-a-20151019"><code>1.2a (2015/10/19)</code></a>
+<ul>
+<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>
</ul></li>
-<li><a href="#section-2"><code>1.2 (2015/10/10)</code></a><ul>
-<li><a href="#removed-3">Removed</a></li>
-<li><a href="#improvements-and-new-features-23">Improvements and new features</a></li>
+<li><a href="#section-2"
+id="toc-section-2"><code>1.2 (2015/10/10)</code></a>
+<ul>
+<li><a href="#removed-3" id="toc-removed-3">Removed</a></li>
+<li><a href="#improvements-and-new-features-23"
+id="toc-improvements-and-new-features-23">Improvements and new
+features</a></li>
</ul></li>
-<li><a href="#c-20150912"><code>1.1c (2015/09/12)</code></a></li>
-<li><a href="#b-20150831"><code>1.1b (2015/08/31)</code></a></li>
-<li><a href="#a-20141107"><code>1.1a (2014/11/07)</code></a></li>
-<li><a href="#section-3"><code>1.1 (2014/10/28)</code></a><ul>
-<li><a href="#breaking-changes-17">Breaking changes</a></li>
-<li><a href="#removed-4">Removed</a></li>
-<li><a href="#deprecated-2">Deprecated</a></li>
-<li><a href="#improvements-and-new-features-24">Improvements and new features</a></li>
-<li><a href="#bug-fixes-30">Bug fixes</a></li>
+<li><a href="#c-20150912"
+id="toc-c-20150912"><code>1.1c (2015/09/12)</code></a></li>
+<li><a href="#b-20150831"
+id="toc-b-20150831"><code>1.1b (2015/08/31)</code></a></li>
+<li><a href="#a-20141107"
+id="toc-a-20141107"><code>1.1a (2014/11/07)</code></a></li>
+<li><a href="#section-3"
+id="toc-section-3"><code>1.1 (2014/10/28)</code></a>
+<ul>
+<li><a href="#breaking-changes-18" id="toc-breaking-changes-18">Breaking
+changes</a></li>
+<li><a href="#removed-4" id="toc-removed-4">Removed</a></li>
+<li><a href="#deprecated-2" id="toc-deprecated-2">Deprecated</a></li>
+<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>
</ul></li>
-<li><a href="#n-20140401"><code>1.09n (2014/04/01)</code></a></li>
-<li><a href="#m-20140226"><code>1.09m (2014/02/26)</code></a></li>
-<li><a href="#kb-20140213"><code>1.09kb (2014/02/13)</code></a></li>
-<li><a href="#k-20140121"><code>1.09k (2014/01/21)</code></a></li>
-<li><a href="#j-20140109"><code>1.09j (2014/01/09)</code></a></li>
-<li><a href="#i-20131218"><code>1.09i (2013/12/18)</code></a></li>
-<li><a href="#h-20131128"><code>1.09h (2013/11/28)</code></a></li>
-<li><a href="#g-20131122"><code>1.09g (2013/11/22)</code></a></li>
-<li><a href="#f-20131104"><code>1.09f (2013/11/04)</code></a></li>
-<li><a href="#e-20131029"><code>1.09e (2013/10/29)</code></a></li>
-<li><a href="#d-20131022"><code>1.09d (2013/10/22)</code></a></li>
-<li><a href="#c-20131009"><code>1.09c (2013/10/09)</code></a></li>
-<li><a href="#b-20131003"><code>1.09b (2013/10/03)</code></a></li>
-<li><a href="#a-20130924"><code>1.09a (2013/09/24)</code></a></li>
-<li><a href="#b-20130614"><code>1.08b (2013/06/14)</code></a></li>
-<li><a href="#a-20130611"><code>1.08a (2013/06/11)</code></a></li>
-<li><a href="#section-4"><code>1.08 (2013/06/07)</code></a></li>
-<li><a href="#section-5"><code>1.07 (2013/05/25)</code></a></li>
-<li><a href="#b-20130514"><code>1.06b (2013/05/14)</code></a></li>
-<li><a href="#section-6"><code>1.06 (2013/05/07)</code></a></li>
-<li><a href="#section-7"><code>1.05 (2013/05/01)</code></a></li>
-<li><a href="#section-8"><code>1.04 (2013/04/25)</code></a></li>
-<li><a href="#section-9"><code>1.03 (2013/04/14)</code></a></li>
-<li><a href="#section-10"><code>1.0 (2013/03/28)</code></a></li>
+<li><a href="#n-20140401"
+id="toc-n-20140401"><code>1.09n (2014/04/01)</code></a></li>
+<li><a href="#m-20140226"
+id="toc-m-20140226"><code>1.09m (2014/02/26)</code></a></li>
+<li><a href="#kb-20140213"
+id="toc-kb-20140213"><code>1.09kb (2014/02/13)</code></a></li>
+<li><a href="#k-20140121"
+id="toc-k-20140121"><code>1.09k (2014/01/21)</code></a></li>
+<li><a href="#j-20140109"
+id="toc-j-20140109"><code>1.09j (2014/01/09)</code></a></li>
+<li><a href="#i-20131218"
+id="toc-i-20131218"><code>1.09i (2013/12/18)</code></a></li>
+<li><a href="#h-20131128"
+id="toc-h-20131128"><code>1.09h (2013/11/28)</code></a></li>
+<li><a href="#g-20131122"
+id="toc-g-20131122"><code>1.09g (2013/11/22)</code></a></li>
+<li><a href="#f-20131104"
+id="toc-f-20131104"><code>1.09f (2013/11/04)</code></a></li>
+<li><a href="#e-20131029"
+id="toc-e-20131029"><code>1.09e (2013/10/29)</code></a></li>
+<li><a href="#d-20131022"
+id="toc-d-20131022"><code>1.09d (2013/10/22)</code></a></li>
+<li><a href="#c-20131009"
+id="toc-c-20131009"><code>1.09c (2013/10/09)</code></a></li>
+<li><a href="#b-20131003"
+id="toc-b-20131003"><code>1.09b (2013/10/03)</code></a></li>
+<li><a href="#a-20130924"
+id="toc-a-20130924"><code>1.09a (2013/09/24)</code></a></li>
+<li><a href="#b-20130614"
+id="toc-b-20130614"><code>1.08b (2013/06/14)</code></a></li>
+<li><a href="#a-20130611"
+id="toc-a-20130611"><code>1.08a (2013/06/11)</code></a></li>
+<li><a href="#section-4"
+id="toc-section-4"><code>1.08 (2013/06/07)</code></a></li>
+<li><a href="#section-5"
+id="toc-section-5"><code>1.07 (2013/05/25)</code></a></li>
+<li><a href="#b-20130514"
+id="toc-b-20130514"><code>1.06b (2013/05/14)</code></a></li>
+<li><a href="#section-6"
+id="toc-section-6"><code>1.06 (2013/05/07)</code></a></li>
+<li><a href="#section-7"
+id="toc-section-7"><code>1.05 (2013/05/01)</code></a></li>
+<li><a href="#section-8"
+id="toc-section-8"><code>1.04 (2013/04/25)</code></a></li>
+<li><a href="#section-9"
+id="toc-section-9"><code>1.03 (2013/04/14)</code></a></li>
+<li><a href="#section-10"
+id="toc-section-10"><code>1.0 (2013/03/28)</code></a></li>
</ul>
</nav>
-<pre><code>Source: xint.dtx 1.4j 2021/07/13 (doc 2021/07/13)
+<pre><code>Source: xint.dtx 1.4k 2022/05/18 (doc 2022/05/18)
Author: Jean-Francois Burnol
Info: Expandable operations on big integers, decimals, fractions
License: LPPL 1.3c</code></pre>
-<h2 id="j-20210713"><code>1.4j (2021/07/13)</code></h2>
+<h2 id="k-20220518"><code>1.4k (2022/05/18)</code></h2>
+<h3 id="breaking-changes">Breaking changes</h3>
+<ul>
+<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>\xintFloatZero</code>.</p></li>
+<li><p><strong>xintfrac</strong>/<strong>xintexpr</strong>: the
+behaviour of <code>\xintPFloat</code> (hence of
+<code>\xintfloateval</code>) has again changed: when the output is an
+integer (not using scientific notation) it does not get postfixed by
+<code>.0</code>. This applies in particular for the zero value, now
+printed <code>0</code>. Similarly, in the case of scientific notation
+with a single-digit (trimmed) mantissa, no <code>.0</code> is used.</p>
+<p>Customizable via <code>\xintPFloatIntSuffix</code>,
+<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>
+<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>
<ul>
-<li><strong>xinttools</strong>: a brace removal bug affected the venerable <code>\xintSeq</code> if producing a single number (e.g. <code>\xintSeq{10}{10}</code> expanded to <code>10</code> not <code>{10}</code>). Thanks to Christophe Poulain for report.</li>
+<li><p><strong>xintexpr</strong>: the
+<code>\xintexpr{Safe,Restore}Catcodes</code> were documented at user
+level, but also used by the package <code>\xintdefvar</code> or
+<code>\xintdeffunc</code>. This could result in some bad interaction due
+to the somewhat strange (but documented) behaviour of nested
+<code>\xintexpr{Safe,Restore}Catcodes</code> (which has now been
+modified).</p></li>
+<li><p><strong>xintexpr</strong>: ever since <code>1.4</code>,
+<code>\xintdefufunc</code> (but not <code>\xintdeffunc</code>) forgot to
+reset the catcodes to their status prior to the sanitization done by the
+macro at the start of its execution.</p></li>
</ul>
-<h2 id="i-20210611"><code>1.4i (2021/06/11)</code></h2>
<h3 id="new-features">New features</h3>
<ul>
-<li><p><strong>xintexpr</strong>: the concept of simultaneous assignments is extended: in case of more variables than values the extraneous variables do not cause an error message but are simply set to the <code>nil</code> value; in case of more values than variables, the last variable is defined to be the ople concatenating all the extra values.</p></li>
-<li><p><strong>xintexpr</strong>: built-in functions usable with arbitrarily many arguments such as <code>max()</code>, <code>gcd()</code>, or <code>len()</code> are now again usable with a single numeric argument: since <code>1.4</code> a lone argument had to be a <code>nutple</code> (which was automatically unpacked). It can now again be a number.</p></li>
+<li><p><strong>xintfrac</strong>: <code>\xintPFloatZero</code>,
+<code>\xintPFloatIntSuffix</code>,
+<code>\xintPFloatLengthOneSuffix</code>,
+<code>\xintPFloatNoSciEmax</code>, <code>\xintPFloatNoSciEmin</code> and
+<code>\xintPFloatMinTrimmed</code> customize the output of
+<code>\xintPFloat</code>, hence also of <code>\xintfloateval</code> (and
+of <code>\xinteval</code> when scientific notation was used in the
+expression). Also added <code>\xintFloatZero</code>.</p></li>
+<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
+<code>\xintexprPrintOne</code>.</p></li>
+<li><p><strong>xintexpr</strong>: long awaited syntax
+<code>\xintieval[D]{...}</code> and <code>\xintfloateval[Q]{...}</code>
+now implemented. The legacy syntax with <code>\xintieval{[D]...}</code>
+and <code>\xintfloateval{[Q]...}</code> is kept for backwards
+compatibility.</p></li>
</ul>
+<h2 id="j-20210713"><code>1.4j (2021/07/13)</code></h2>
<h3 id="bug-fixes-1">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 hand side was an ople (of length at least 10, as it had prior to this release to match the number of variables).</p></li>
-<li><p><strong>xintexpr</strong>: the mechanism which allows to define variables with names already in use for pre-existing functions was broken for some built-in functions: those handling syntax with dummy variables (currently <code>subs()</code>, <code>subsm()</code>, <code>subsn()</code>, <code>seq()</code>, <code>add()</code>, <code>mul()</code>, <code>ndseq()</code>, <code>ndmap()</code>, <code>ndfillraw()</code>) and the so-called “pseudo” functions (currently <code>bool()</code>, <code>togl()</code>, <code>protect()</code>, <code>qint()</code>, <code>qfrac()</code>, <code>qfloat()</code>, <code>qraw()</code>, <code>random()</code>, <code>qrand()</code>, <code>rbit()</code>). For example the function <code>seq()</code> was broken if the user had defined a variable <code>seq</code>.</p></li>
+<li><strong>xinttools</strong>: a brace removal bug affected the
+venerable <code>\xintSeq</code> if producing a single number
+(e.g. <code>\xintSeq{10}{10}</code> expanded to <code>10</code> not
+<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>
+<ul>
+<li><p><strong>xintexpr</strong>: the concept of simultaneous
+assignments is extended: in case of more variables than values the
+extraneous variables do not cause an error message but are simply set to
+the <code>nil</code> value; in case of more values than variables, the
+last variable is defined to be the ople concatenating all the extra
+values.</p></li>
+<li><p><strong>xintexpr</strong>: built-in functions usable with
+arbitrarily many arguments such as <code>max()</code>,
+<code>gcd()</code>, or <code>len()</code> are now again usable with a
+single numeric argument: since <code>1.4</code> a lone argument had to
+be a <code>nutple</code> (which was automatically unpacked). It can now
+again be a number.</p></li>
</ul>
-<h2 id="h-20210527"><code>1.4h (2021/05/27)</code></h2>
<h3 id="bug-fixes-2">Bug fixes</h3>
<ul>
-<li><p><strong>xintexpr</strong>: the recent <code>1.4g</code> introduced a bug breaking input of the type <code>&lt;operator&gt;&lt;space token&gt;&lt;macro&gt;</code>.</p></li>
-<li><p><strong>xintexpr</strong>: since <code>1.4</code> (<code>2020/01/31</code>) the <code>omit</code> and <code>abort</code> keywords were broken if used inside a substitution, itself nested in a <code>seq()</code> or similar construct.</p></li>
-<li><p><strong>xintexpr</strong>: since <code>1.4c</code> the <code>\xintthespaceseparated</code> (added at <code>1.4a</code>) inserted two, not one, spaces at one specific location near the end of its output. A bit cosmetic problem, fixed nevertheless.</p></li>
+<li><p><strong>xintexpr</strong>: simultaneous assignments via
+<code>\xintdefvar</code> to 10 or more variables was broken if the right
+hand side was an ople (of length at least 10, as it had prior to this
+release to match the number of variables).</p></li>
+<li><p><strong>xintexpr</strong>: the mechanism which allows to define
+variables with names already in use for pre-existing functions was
+broken for some built-in functions: those handling syntax with dummy
+variables (currently <code>subs()</code>, <code>subsm()</code>,
+<code>subsn()</code>, <code>seq()</code>, <code>add()</code>,
+<code>mul()</code>, <code>ndseq()</code>, <code>ndmap()</code>,
+<code>ndfillraw()</code>) and the so-called “pseudo” functions
+(currently <code>bool()</code>, <code>togl()</code>,
+<code>protect()</code>, <code>qint()</code>, <code>qfrac()</code>,
+<code>qfloat()</code>, <code>qraw()</code>, <code>random()</code>,
+<code>qrand()</code>, <code>rbit()</code>). For example the function
+<code>seq()</code> was broken if the user had defined a variable
+<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>
+<ul>
+<li><p><strong>xintexpr</strong>: the recent <code>1.4g</code>
+introduced a bug breaking input of the type
+<code>&lt;operator&gt;&lt;space token&gt;&lt;macro&gt;</code>.</p></li>
+<li><p><strong>xintexpr</strong>: since <code>1.4</code>
+(<code>2020/01/31</code>) the <code>omit</code> and <code>abort</code>
+keywords were broken if used inside a substitution, itself nested in a
+<code>seq()</code> or similar construct.</p></li>
+<li><p><strong>xintexpr</strong>: since <code>1.4c</code> the
+<code>\xintthespaceseparated</code> (added at <code>1.4a</code>)
+inserted two, not one, spaces at one specific location near the end of
+its output. A bit cosmetic problem, fixed nevertheless.</p></li>
</ul>
<h2 id="g-20210525"><code>1.4g (2021/05/25)</code></h2>
-<h3 id="breaking-changes">Breaking changes</h3>
+<h3 id="breaking-changes-1">Breaking changes</h3>
<ul>
-<li><p><strong>xintexpr</strong>: the parsing of power operators <code>**</code> and <code>^</code> now proceeds in a right associative way: <code>2^3^4==2^(3^4)</code>.</p></li>
-<li><p><strong>xintexpr</strong>: single-character operators <code>&amp;</code>, <code>|</code>, and <code>=</code> (deprecated since <code>1.1</code>) have been removed. Use <code>&amp;&amp;</code>, <code>||</code> and <code>==</code> respectively.</p></li>
+<li><p><strong>xintexpr</strong>: the parsing of power operators
+<code>**</code> and <code>^</code> now proceeds in a right associative
+way: <code>2^3^4==2^(3^4)</code>.</p></li>
+<li><p><strong>xintexpr</strong>: single-character operators
+<code>&amp;</code>, <code>|</code>, and <code>=</code> (deprecated since
+<code>1.1</code>) have been removed. Use <code>&amp;&amp;</code>,
+<code>||</code> and <code>==</code> respectively.</p></li>
</ul>
<h3 id="deprecated">Deprecated</h3>
<ul>
-<li><strong>xintfrac</strong>: old typesetting macros dating back to <code>1.03</code> and <code>1.04</code> releases <code>\xintFrac</code>, <code>\xintSignedFrac</code>, <code>\xintFwOver</code>, <code>\xintSignedFwOver</code> are deprecated. Please use the new names <code>\xintTeXFrac</code>, <code>\xintTeXsignedFrac</code>, <code>\xintTeXOver</code>, <code>\xintTeXsignedOver</code>. The old names will emit warnings.</li>
+<li><strong>xintfrac</strong>: old typesetting macros dating back to
+<code>1.03</code> and <code>1.04</code> releases <code>\xintFrac</code>,
+<code>\xintSignedFrac</code>, <code>\xintFwOver</code>,
+<code>\xintSignedFwOver</code> are deprecated. Please use the new names
+<code>\xintTeXFrac</code>, <code>\xintTeXsignedFrac</code>,
+<code>\xintTeXOver</code>, <code>\xintTeXsignedOver</code>. The old
+names will emit warnings.</li>
</ul>
-<h3 id="new-features-1">New features</h3>
+<h3 id="new-features-2">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 mode, the user is prompted only once, not thrice, to enter <code>&lt;return&gt;</code> for recovery and continued processing.</p></li>
-<li><p><strong>xintfrac</strong>: <code>\xintTeXfromSci</code> (added about 7 or 8 years too late) to help typesetting values output by <code>\xintfloateval</code> in a more useful way than <code>\xintTeXFrac</code> (formerly <code>\xintFrac</code>).</p></li>
+<li><p>Messages written to the terminal and log file during the handling
+of recovery from exceptions use a new mechanism; when in interactive
+mode, the user is prompted only once, not thrice, to enter
+<code>&lt;return&gt;</code> for recovery and continued
+processing.</p></li>
+<li><p><strong>xintfrac</strong>: <code>\xintTeXfromSci</code> (added
+about 7 or 8 years too late) to help typesetting values output by
+<code>\xintfloateval</code> in a more useful way than
+<code>\xintTeXFrac</code> (formerly <code>\xintFrac</code>).</p></li>
</ul>
-<h3 id="bug-fixes-3">Bug fixes</h3>
-<ul>
-<li><p><strong>xintexpr</strong>: with <strong>xintbinhex</strong> loaded, <code>&quot;</code> is recognized as prefix for hexadecimal input; but a bug (present ever since this support for hexadecimal input was added) caused syntax such as <code>&quot;\macro</code> to break the parser. Also, leading zeros such as in <code>&quot;0000A</code> where not properly trimmed since <code>1.2m</code>.</p></li>
-<li><p><strong>xintexpr</strong>: authorize <code>x! == y</code> without parentheses. Formerly the parser mis-interpreted <code>!</code> as first character of the <code>!=</code> not-equal-to comparison operator, subsequently causing breakage when finding the second <code>=</code>.</p></li>
-<li><strong>xintexpr</strong>: various error situations were badly handled.
+<h3 id="bug-fixes-4">Bug fixes</h3>
<ul>
-<li><code>\xinteval{1/0}</code> did not recover gracefully due to longstanding bug in <strong>xintfrac</strong>.</li>
-<li><code>\xintfloateval{1/0}</code> did not recover gracefully either… due to some other reason.</li>
-<li>recovery from encountering an unknown variable name was broken since <code>1.4</code>; also, with an unknown function name if in <code>\xintfloatexpr</code>.</li>
-<li><code>\xinteval{_4}</code> caused an infinite loop (with underscore <code>_</code> having its normal catcode). This was unexpected, as the <code>_</code> is documented to be ignored if in-between digits (and is ignored if last after some digits). It will be now ignored also if encountered upfront. A similar problem existed with variable names starting with a <code>_</code> (of normal catcode), which however are clearly not legal. The (normal catcode) <code>_</code> will then be ignored as well if encountered in front of a variable or function name (but not inside of course).</li>
-<li><code>\xinteval{\catcode`@}</code> crashed (one had to use an added <code>\the</code> or <code>\number</code>).</li>
-<li>illegal <code>\xinteval{/3}</code> was not intercepted and ultimately caused low-level errors (same with <code>^</code>).</li>
-</ul>
-<p>Surely, further situations remain where bad input will crash parser.</p></li>
+<li><p><strong>xintexpr</strong>: with <strong>xintbinhex</strong>
+loaded, <code>"</code> is recognized as prefix for hexadecimal input;
+but a bug (present ever since this support for hexadecimal input was
+added) caused syntax such as <code>"\macro</code> to break the parser.
+Also, leading zeros such as in <code>"0000A</code> where not properly
+trimmed since <code>1.2m</code>.</p></li>
+<li><p><strong>xintexpr</strong>: authorize <code>x! == y</code> without
+parentheses. Formerly the parser mis-interpreted <code>!</code> as first
+character of the <code>!=</code> not-equal-to comparison operator,
+subsequently causing breakage when finding the second
+<code>=</code>.</p></li>
+<li><p><strong>xintexpr</strong>: various error situations were badly
+handled.</p>
+<ul>
+<li><code>\xinteval{1/0}</code> did not recover gracefully due to
+longstanding bug in <strong>xintfrac</strong>.</li>
+<li><code>\xintfloateval{1/0}</code> did not recover gracefully either…
+due to some other reason.</li>
+<li>recovery from encountering an unknown variable name was broken since
+<code>1.4</code>; also, with an unknown function name if in
+<code>\xintfloatexpr</code>.</li>
+<li><code>\xinteval{_4}</code> caused an infinite loop (with underscore
+<code>_</code> having its normal catcode). This was unexpected, as the
+<code>_</code> is documented to be ignored if in-between digits (and is
+ignored if last after some digits). It will be now ignored also if
+encountered upfront. A similar problem existed with variable names
+starting with a <code>_</code> (of normal catcode), which however are
+clearly not legal. The (normal catcode) <code>_</code> will then be
+ignored as well if encountered in front of a variable or function name
+(but not inside of course).</li>
+<li><code>\xinteval{\catcode`@}</code> crashed (one had to use an added
+<code>\the</code> or <code>\number</code>).</li>
+<li>illegal <code>\xinteval{/3}</code> was not intercepted and
+ultimately caused low-level errors (same with <code>^</code>).</li>
+</ul>
+<p>Surely, further situations remain where bad input will crash
+parser.</p></li>
</ul>
<h2 id="f-20210510"><code>1.4f (2021/05/10)</code></h2>
-<h3 id="breaking-changes-1">Breaking changes</h3>
+<h3 id="breaking-changes-2">Breaking changes</h3>
<ul>
-<li><p><strong>xintexpr</strong>: <code>\xintieval{[-D]...}</code>, which rounds to a multiple of <code>1eD</code> for <code>D</code> positive now <em>does not insert the trailing zeros</em> (as done at <code>1.4e</code>) <em>nor a scientific part</em> <code>eD</code> (as prior to <code>1.4e</code>). The use case envisioned is for the quantized value to be used with an appropriate unit, for example <code>k</code> for <code>D=3</code> or <code>M</code> for <code>D=6</code> etc… Sorry for the very long process which was needed to reach this final decision.</p></li>
-<li><p><strong>xintexpr</strong>: for Digits beyond the officially supported range for accurate math functions, i.e. for <code>D&gt;62</code>, computations were still done and printed with full number of digits, but the extra digits were meaningless; they now operate on and output mantissas limited to <code>min(D,64)</code> digits.</p></li>
-<li><p><strong>xintexpr</strong>: for powers <code>a^b</code> with Digits at most <code>8</code>, the number <code>a</code> is now float-rounded to Digits before computation, as is done for <code>Digits&gt;8</code>; previously <code>9</code> significant digits were kept.</p></li>
-<li><p><strong>xintexpr</strong>: further changes in the computation of powers, see the bug fixes below.</p></li>
-<li><p><strong>xintexpr</strong>: the <code>float_()</code> function got renamed into <code>float_dgt()</code>.</p></li>
+<li><p><strong>xintexpr</strong>: <code>\xintieval{[-D]...}</code>,
+which rounds to a multiple of <code>1eD</code> for <code>D</code>
+positive now <em>does not insert the trailing zeros</em> (as done at
+<code>1.4e</code>) <em>nor a scientific part</em> <code>eD</code> (as
+prior to <code>1.4e</code>). The use case envisioned is for the
+quantized value to be used with an appropriate unit, for example
+<code>k</code> for <code>D=3</code> or <code>M</code> for
+<code>D=6</code> etc… Sorry for the very long process which was needed
+to reach this final decision.</p></li>
+<li><p><strong>xintexpr</strong>: for Digits beyond the officially
+supported range for accurate math functions, i.e. for
+<code>D&gt;62</code>, computations were still done and printed with full
+number of digits, but the extra digits were meaningless; they now
+operate on and output mantissas limited to <code>min(D,64)</code>
+digits.</p></li>
+<li><p><strong>xintexpr</strong>: for powers <code>a^b</code> with
+Digits at most <code>8</code>, the number <code>a</code> is now
+float-rounded to Digits before computation, as is done for
+<code>Digits&gt;8</code>; previously <code>9</code> significant digits
+were kept.</p></li>
+<li><p><strong>xintexpr</strong>: further changes in the computation of
+powers, see the bug fixes below.</p></li>
+<li><p><strong>xintexpr</strong>: the <code>float_()</code> function got
+renamed into <code>float_dgt()</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>: the documentation said <code>float_()</code> function had been renamed <code>float_dgt()</code> but actually that was not yet the case.</p></li>
-<li><p><strong>xintexpr</strong>: powers <code>a^b</code> (with exponent <code>b</code> neither integer nor half-integer) stopped being accurate regarding the last digits for <code>|b|</code> about <code>1000</code> and beyond. Except for <code>0.8&lt;a&lt;1.25</code> for which accuracy was maintained up to about <code>|b|=10^7</code>. Fixed via keeping the same suitable number of extra digits for internal computations of logarithms, independently of whether <code>a</code> is close to <code>1</code> or not.</p></li>
-<li><p><strong>xintexpr</strong>: powers <code>a^b</code> in <code>\xinteval</code> with <code>|b|</code> an integer at least <code>10000</code> were paradoxically computed with less accuracy than in <code>\xintfloateval</code>… although they were documented to be handled exactly the same in the two parsers.</p></li>
-<li><p><strong>xintexpr</strong>: powers <code>a^b</code> for Digits at most <code>8</code> unconditionally used <code>log10()/pow10()</code> approach but due to the limited accuracy of the poorman logarithm (<code>9</code> fractional digits) this was inaccurate already for <code>b</code> about <code>100</code>. So, the handling is now as for Digits at least <code>9</code>, i.e. integer and half-integer exponents are handled via the legacy <code>\xintFloatPower/\xintFloatSqrt</code> allowing arbitrarily big exponents. It is advised to split big powers with non integer non half integer exponents into a product; this is not done internally to avoid costly overhead for possibly rare use cases.</p></li>
-<li><p><strong>xintexpr</strong>: the invalid input <code>(-1)^2.5</code> triggered an undefined control sequence error if Digits was at most <code>8</code>.</p></li>
+<li><p><strong>xintexpr</strong>: the documentation said
+<code>float_()</code> function had been renamed <code>float_dgt()</code>
+but actually that was not yet the case.</p></li>
+<li><p><strong>xintexpr</strong>: powers <code>a^b</code> (with exponent
+<code>b</code> neither integer nor half-integer) stopped being accurate
+regarding the last digits for <code>|b|</code> about <code>1000</code>
+and beyond. Except for <code>0.8&lt;a&lt;1.25</code> for which accuracy
+was maintained up to about <code>|b|=10^7</code>. Fixed via keeping the
+same suitable number of extra digits for internal computations of
+logarithms, independently of whether <code>a</code> is close to
+<code>1</code> or not.</p></li>
+<li><p><strong>xintexpr</strong>: powers <code>a^b</code> in
+<code>\xinteval</code> with <code>|b|</code> an integer at least
+<code>10000</code> were paradoxically computed with less accuracy than
+in <code>\xintfloateval</code>… although they were documented to be
+handled exactly the same in the two parsers.</p></li>
+<li><p><strong>xintexpr</strong>: powers <code>a^b</code> for Digits at
+most <code>8</code> unconditionally used <code>log10()/pow10()</code>
+approach but due to the limited accuracy of the poorman logarithm
+(<code>9</code> fractional digits) this was inaccurate already for
+<code>b</code> about <code>100</code>. So, the handling is now as for
+Digits at least <code>9</code>, i.e. integer and half-integer exponents
+are handled via the legacy <code>\xintFloatPower/\xintFloatSqrt</code>
+allowing arbitrarily big exponents. It is advised to split big powers
+with non integer non half integer exponents into a product; this is not
+done internally to avoid costly overhead for possibly rare use
+cases.</p></li>
+<li><p><strong>xintexpr</strong>: the invalid input
+<code>(-1)^2.5</code> triggered an undefined control sequence error if
+Digits was at most <code>8</code>.</p></li>
</ul>
<h2 id="e-20210505"><code>1.4e (2021/05/05)</code></h2>
-<h3 id="breaking-changes-2">Breaking changes</h3>
+<h3 id="breaking-changes-3">Breaking changes</h3>
<ul>
-<li><p><strong>xintlog</strong>: <code>\poormanloghack</code> now a no-op.</p></li>
-<li><p><strong>xinttrig</strong>: loading the package does not define left-over variables holding the values of the inverse factorials used in the sine and cosine series.</p></li>
-<li><p><strong>xintexpr</strong>: the output format of <code>\xinteval</code>, which uses <code>\xintFracToSci,</code> has changed. In particular, if the number has a power of ten part, it is not output with an integer mantissa, but with a scientific mantissa <code>d.d...</code> with always at least one digit after the decimal mark (possibly <code>0</code>) and trailing zeros are trimmed out. This is the same output format as used for <code>\xintfloateval</code>, apart of course from the fact that the mantissa lengths are not limited.</p></li>
-<li><p><strong>xintexpr</strong>: the output format of <code>\xintfloateval</code>, which uses <code>\xintPFloat</code>, changed. The <code>\xintfloatexprPrintOne</code> macro has changed its signature to <code>[#1]{#2}</code> i.e. its first argument will be within brackets not braces.</p></li>
-<li><p><strong>xintexpr</strong>: when using <code>\xintieval{[D]...}</code> optional <code>[D]</code> with a negative <code>D</code>, which triggers quantization to a positive power of ten, the output (if not the zero value) will be an integer with <code>N=abs(D)</code> explicit trailing zeros, not an integer mantissa followed by <code>eN</code>.</p></li>
-<li><p><strong>xintexpr</strong>: <code>\xinteval</code> will not compute powers <code>a^N</code> exactly if <code>N</code> in absolute value is at least the (rounded) quotient of <code>10000</code> by the number of digits of <code>a</code>; it will then use the logarithm/exponential (in base 10) approach, according to the prevailing Digits setting (at <code>1.4f</code> this got modified again and integer exponents large enough to trigger floating point evaluation are handled exactly as in <code>\xintfloateval</code>, i.e. using the legacy <strong>xintfrac</strong> <code>\xintFloatPower</code>, not the logarithm/exponential approach which loses accuracy for exponents of the order of <code>100000000</code> and beyond).</p></li>
-<li><p><strong>xintexpr</strong>: <code>\xintdeffloatvar</code> now always rounds the assigned value to the target precision. Formerly, inputs actually involving no float operations, such as for example a sub-expression <code>\xintexpr1/20!\relax</code> (in contrast to <code>1/20!</code>), or an explicit single number having more digits than the precision, got stored “as is” in the defined variable, without pre-rounding to the Digits precision.</p></li>
-<li><p><strong>xintfrac</strong>:<code>\xintPFloat</code> and <code>\xintFracToSci</code> have both been modified. The macro <code>\xintFracToSciE</code> does not exist anymore, as <code>\xintFracToSci</code> in the case of scientific exponents hands over the process to <code>\xintPFloat</code> (without the rounding to Digits, of course).</p></li>
+<li><p><strong>xintlog</strong>: <code>\poormanloghack</code> now a
+no-op.</p></li>
+<li><p><strong>xinttrig</strong>: loading the package does not define
+left-over variables holding the values of the inverse factorials used in
+the sine and cosine series.</p></li>
+<li><p><strong>xintexpr</strong>: the output format of
+<code>\xinteval</code>, which uses <code>\xintFracToSci,</code> has
+changed. In particular, if the number has a power of ten part, it is not
+output with an integer mantissa, but with a scientific mantissa
+<code>d.d...</code> with always at least one digit after the decimal
+mark (possibly <code>0</code>) and trailing zeros are trimmed out. This
+is the same output format as used for <code>\xintfloateval</code>, apart
+of course from the fact that the mantissa lengths are not
+limited.</p></li>
+<li><p><strong>xintexpr</strong>: the output format of
+<code>\xintfloateval</code>, which uses <code>\xintPFloat</code>,
+changed. The <code>\xintfloatexprPrintOne</code> macro has changed its
+signature to <code>[#1]{#2}</code> i.e. its first argument will be
+within brackets not braces.</p></li>
+<li><p><strong>xintexpr</strong>: when using
+<code>\xintieval{[D]...}</code> optional <code>[D]</code> with a
+negative <code>D</code>, which triggers quantization to a positive power
+of ten, the output (if not the zero value) will be an integer with
+<code>N=abs(D)</code> explicit trailing zeros, not an integer mantissa
+followed by <code>eN</code>.</p></li>
+<li><p><strong>xintexpr</strong>: <code>\xinteval</code> will not
+compute powers <code>a^N</code> exactly if <code>N</code> in absolute
+value is at least the (rounded) quotient of <code>10000</code> by the
+number of digits of <code>a</code>; it will then use the
+logarithm/exponential (in base 10) approach, according to the prevailing
+Digits setting (at <code>1.4f</code> this got modified again and integer
+exponents large enough to trigger floating point evaluation are handled
+exactly as in <code>\xintfloateval</code>, i.e. using the legacy
+<strong>xintfrac</strong> <code>\xintFloatPower</code>, not the
+logarithm/exponential approach which loses accuracy for exponents of the
+order of <code>100000000</code> and beyond).</p></li>
+<li><p><strong>xintexpr</strong>: <code>\xintdeffloatvar</code> now
+always rounds the assigned value to the target precision. Formerly,
+inputs actually involving no float operations, such as for example a
+sub-expression <code>\xintexpr1/20!\relax</code> (in contrast to
+<code>1/20!</code>), or an explicit single number having more digits
+than the precision, got stored “as is” in the defined variable, without
+pre-rounding to the Digits precision.</p></li>
+<li><p><strong>xintfrac</strong>:<code>\xintPFloat</code> and
+<code>\xintFracToSci</code> have both been modified. The macro
+<code>\xintFracToSciE</code> does not exist anymore, as
+<code>\xintFracToSci</code> in the case of scientific exponents hands
+over the process to <code>\xintPFloat</code> (without the rounding to
+Digits, of course).</p></li>
</ul>
-<h3 id="new-features-2">New features</h3>
+<h3 id="new-features-3">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 for computations with Digits up to <code>8</code>. Fractional powers are now available both in <code>xinteval</code> and <code>xintfloateval</code>, per default.</p></li>
-<li><p><strong>xinttrig</strong>: now working up to <code>62</code> digits and with increased accuracy. Special faster (or not as slow if you prefer) mode at <code>8</code> digits or less.</p></li>
-<li><p><strong>xintexpr</strong>: the constraints on the <code>\xintexprPrintOne</code> replacement macro, which defaults to <code>\xintFracToSci</code>, have been much simplified.</p></li>
-<li><p><strong>xintexpr</strong>: <code>\xintiexprPrintOne</code> (defaults to <code>\xintDecToString</code>)</p></li>
-<li><p><strong>xintfrac</strong>: <code>\xintPFloatE</code> may be redefined as a macro which fetches the scientific exponent as a mandatory argument delimited with a dot, and outputs a suitable formatted result (f-expandably), also delimited with a dot which will be removed by internal processing. The default however simply expands to the letter <code>e</code>.</p></li>
-<li><p><strong>xintfrac</strong>: <code>\xintDecToStringREZ</code> is like <code>\xintDecToString</code> but starts by removing trailing zeroes.</p></li>
+<li><p><strong>xintlog</strong>: now working up to <code>62</code>
+digits. The legacy faster <code>poormanlog</code>-based macros are kept
+for computations with Digits up to <code>8</code>. Fractional powers are
+now available both in <code>xinteval</code> and
+<code>xintfloateval</code>, per default.</p></li>
+<li><p><strong>xinttrig</strong>: now working up to <code>62</code>
+digits and with increased accuracy. Special faster (or not as slow if
+you prefer) mode at <code>8</code> digits or less.</p></li>
+<li><p><strong>xintexpr</strong>: the constraints on the
+<code>\xintexprPrintOne</code> replacement macro, which defaults to
+<code>\xintFracToSci</code>, have been much simplified.</p></li>
+<li><p><strong>xintexpr</strong>: <code>\xintiexprPrintOne</code>
+(defaults to <code>\xintDecToString</code>)</p></li>
+<li><p><strong>xintfrac</strong>: <code>\xintPFloatE</code> may be
+redefined as a macro which fetches the scientific exponent as a
+mandatory argument delimited with a dot, and outputs a suitable
+formatted result (f-expandably), also delimited with a dot which will be
+removed by internal processing. The default however simply expands to
+the letter <code>e</code>.</p></li>
+<li><p><strong>xintfrac</strong>: <code>\xintDecToStringREZ</code> is
+like <code>\xintDecToString</code> but starts by removing trailing
+zeroes.</p></li>
</ul>
-<h3 id="bug-fixes-5">Bug fixes</h3>
+<h3 id="bug-fixes-6">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 <code>\xintDigits</code> assignment. For example: <code>\xintDigits*:=\numexpr\xinttheDigits+4;</code>. This is now allowed, and the same applies to the macro interface, for example <code>\xintSetDigits*{\xinttheDigits+4}</code>.</li>
+<li><strong>xintfrac</strong>, <strong>xintexpr</strong>: it was not
+possible to use <code>\xinttheDigits</code> in the right hand side of an
+<code>\xintDigits</code> assignment. For example:
+<code>\xintDigits*:=\numexpr\xinttheDigits+4;</code>. This is now
+allowed, and the same applies to the macro interface, for example
+<code>\xintSetDigits*{\xinttheDigits+4}</code>.</li>
</ul>
<h2 id="d-20210329"><code>1.4d (2021/03/29)</code></h2>
-<h3 id="breaking-changes-3">Breaking changes</h3>
+<h3 id="breaking-changes-4">Breaking changes</h3>
<ul>
-<li><p><code>quo()</code> and <code>rem()</code> in <code>\xintiiexpr/\xintiieval</code> renamed to <code>iquo()</code> and <code>irem()</code>.</p></li>
-<li><p>The output of <code>gcd()</code> and <code>lcm()</code> as applied to fractions is now always in lowest terms.</p></li>
-<li><p>The log message to report a variable creation (if <code>\xintverbosetrue</code>) does not use (double) quotes anymore around the name. By the way, quotes were never used for function names.</p></li>
+<li><p><code>quo()</code> and <code>rem()</code> in
+<code>\xintiiexpr/\xintiieval</code> renamed to <code>iquo()</code> and
+<code>irem()</code>.</p></li>
+<li><p>The output of <code>gcd()</code> and <code>lcm()</code> as
+applied to fractions is now always in lowest terms.</p></li>
+<li><p>The log message to report a variable creation (if
+<code>\xintverbosetrue</code>) does not use (double) quotes anymore
+around the name. By the way, quotes were never used for function
+names.</p></li>
</ul>
-<h3 id="bug-fixes-6">Bug fixes</h3>
+<h3 id="bug-fixes-7">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 <code>\xintiiexpr</code>) were broken as their (officially deprecated) support macros had been removed! They had somewhat useless definitions anyway. They have now been officially removed from the syntax. Their siblings in <code>\xintiieval</code> were renamed to <code>iquo()</code> and <code>irem()</code>.</p></li>
-<li><p>Sadly, <code>gcd()</code> was broken in <code>\xintexpr</code> since <code>1.4</code>, if the first argument vanished. And <code>gcd()</code> was broken in <code>\xintiiexpr</code> since <code>1.3d</code> if <em>any</em> argument vanished. I did have a unit test! (which obviously was too limited …)</p>
-<p>Further, the <code>\xintGCDof</code> and <code>\xintLCMof</code> <strong>xintfrac</strong> macros were added at <code>1.4</code> but did not behave like other <strong>xintfrac</strong> macros with respect to parsing their arguments: e.g. <code>\xintGCDof{2}{03}</code> gave an unexpected non-numeric result.</p></li>
-<li><p>The <code>first()</code> and <code>last()</code> functions, if used as arguments to numerical functions such as <code>sqr()</code> inside an <code>\xintdeffunc</code> caused the defined function to be broken.</p></li>
+<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
+<code>\xintiiexpr</code>) were broken as their (officially deprecated)
+support macros had been removed! They had somewhat useless definitions
+anyway. They have now been officially removed from the syntax. Their
+siblings in <code>\xintiieval</code> were renamed to <code>iquo()</code>
+and <code>irem()</code>.</p></li>
+<li><p>Sadly, <code>gcd()</code> was broken in <code>\xintexpr</code>
+since <code>1.4</code>, if the first argument vanished. And
+<code>gcd()</code> was broken in <code>\xintiiexpr</code> since
+<code>1.3d</code> if <em>any</em> argument vanished. I did have a unit
+test! (which obviously was too limited …)</p>
+<p>Further, the <code>\xintGCDof</code> and <code>\xintLCMof</code>
+<strong>xintfrac</strong> macros were added at <code>1.4</code> but did
+not behave like other <strong>xintfrac</strong> macros with respect to
+parsing their arguments: e.g. <code>\xintGCDof{2}{03}</code> gave an
+unexpected non-numeric result.</p></li>
+<li><p>The <code>first()</code> and <code>last()</code> functions, if
+used as arguments to numerical functions such as <code>sqr()</code>
+inside an <code>\xintdeffunc</code> caused the defined function to be
+broken.</p></li>
</ul>
<h2 id="c-20210220"><code>1.4c (2021/02/20)</code></h2>
-<h3 id="bug-fixes-7">Bug fixes</h3>
+<h3 id="bug-fixes-8">Bug fixes</h3>
<ul>
-<li>Fix <code>1.4</code> regression which broke syntax <code>varname(...)</code> which supposedly is allowed and inserts a tacit multiplication.</li>
+<li>Fix <code>1.4</code> regression which broke syntax
+<code>varname(...)</code> which supposedly is allowed and inserts a
+tacit multiplication.</li>
</ul>
<h2 id="b-20200225"><code>1.4b (2020/02/25)</code></h2>
<p>All changes regard the <strong>xintexpr</strong> module.</p>
<h3 id="future">Future</h3>
<ul>
-<li><p><code>&amp;</code>, <code>|</code>, (as Boolean operators) and <code>=</code> (as equality test) have long been deprecated in favour of <code>&amp;&amp;</code>, <code>||</code> and <code>==</code>. They will be removed at next major release.</p></li>
-<li><p>At next major release the power operators <code>**</code> and <code>^</code> will turn from left to right associative. I.e. <code>2**2**3</code> will give <code>256</code>, not <code>64</code>. This is to match with Python and l3fp.</p></li>
-<li><p><code>\thexintexpr</code> et al. (introduced at <code>1.2h</code> but not documented anymore for some time) will be removed at next major release. The original <code>\xinttheexpr</code> et al. have always been so much better names. Besides, since <code>1.4</code>, <code>\xintexpr</code> can be used directly in typesetting flow.</p></li>
+<li><p><code>&amp;</code>, <code>|</code>, (as Boolean operators) and
+<code>=</code> (as equality test) have long been deprecated in favour of
+<code>&amp;&amp;</code>, <code>||</code> and <code>==</code>. They will
+be removed at next major release.</p></li>
+<li><p>At next major release the power operators <code>**</code> and
+<code>^</code> will turn from left to right associative. I.e.
+<code>2**2**3</code> will give <code>256</code>, not <code>64</code>.
+This is to match with Python and l3fp.</p></li>
+<li><p><code>\thexintexpr</code> et al. (introduced at <code>1.2h</code>
+but not documented anymore for some time) will be removed at next major
+release. The original <code>\xinttheexpr</code> et al. have always been
+so much better names. Besides, since <code>1.4</code>,
+<code>\xintexpr</code> can be used directly in typesetting
+flow.</p></li>
</ul>
-<h3 id="new-features-3">New features</h3>
+<h3 id="new-features-4">New features</h3>
<ul>
-<li><p>Function <code>zip()</code> is modeled on Python’s function of the same name.</p></li>
-<li><p>Function <code>flat()</code> removes all nesting to produce a “one-dimensional” list having the exact same leaves (some possibly empty) as the original (in the same order).</p></li>
-<li><p>Chaining of comparison operators (e.g. <code>x&lt;y&lt;z</code>) as in Python (but all comparisons are done even if one is found false) and l3fp.</p></li>
-<li><p>It was possible since <code>1.4</code>’s <code>\xintFracToSciE</code> to configure the separator between mantissas and exponents in the output of <code>\xinteval</code> but strangely there was no way to customize the output of <code>\xintfloateval</code>. The added <code>\xintPFloatE</code> fixes this.</p></li>
+<li><p>Function <code>zip()</code> is modeled on Python’s function of
+the same name.</p></li>
+<li><p>Function <code>flat()</code> removes all nesting to produce a
+“one-dimensional” list having the exact same leaves (some possibly
+empty) as the original (in the same order).</p></li>
+<li><p>Chaining of comparison operators (e.g. <code>x&lt;y&lt;z</code>)
+as in Python (but all comparisons are done even if one is found false)
+and l3fp.</p></li>
+<li><p>It was possible since <code>1.4</code>’s
+<code>\xintFracToSciE</code> to configure the separator between
+mantissas and exponents in the output of <code>\xinteval</code> but
+strangely there was no way to customize the output of
+<code>\xintfloateval</code>. The added <code>\xintPFloatE</code> fixes
+this.</p></li>
</ul>
-<h3 id="bug-fixes-8">Bug fixes</h3>
+<h3 id="bug-fixes-9">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 <code>e</code> in output, which moreover remained immuned to the <code>\xintFracToSciE</code> setting.</li>
+<li><code>\xintieval{[D]...}</code> with a negative <code>D</code> (a
+feature added at <code>1.4a</code>) used erroneously a catcode 12
+<code>e</code> in output, which moreover remained immuned to the
+<code>\xintFracToSciE</code> setting.</li>
</ul>
<h2 id="a-20200219"><code>1.4a (2020/02/19)</code></h2>
<p>All changes regard the <strong>xintexpr</strong> module.</p>
-<h3 id="breaking-changes-4">Breaking changes</h3>
+<h3 id="breaking-changes-5">Breaking changes</h3>
<ul>
-<li>The macros implementing customization of <code>\xintthealign</code> have modified meanings and names.</li>
+<li>The macros implementing customization of <code>\xintthealign</code>
+have modified meanings and names.</li>
</ul>
-<h3 id="new-features-4">New features</h3>
+<h3 id="new-features-5">New features</h3>
<ul>
-<li><p><code>\xintthespaceseparated</code> (serves to provide suitable input to PS-Tricks <code>\listplot</code>).</p></li>
-<li><p>The optional argument <code>[D]</code> to <code>\xintieval/\xintiexpr</code> can be negative, with the same meaning as the non-negative case, i.e. rounding to an integer multiple of <code>10^(-D)</code>.</p>
-<p>The same applies to the functions <code>trunc()</code> and <code>round()</code>. And to the <code>\xintTrunc</code>, <code>\xintRound</code>, <code>\xintiTrunc</code>, and <code>\xintiRound</code> macros of <strong>xintfrac</strong>.</p></li>
+<li><p><code>\xintthespaceseparated</code> (serves to provide suitable
+input to PS-Tricks <code>\listplot</code>).</p></li>
+<li><p>The optional argument <code>[D]</code> to
+<code>\xintieval/\xintiexpr</code> can be negative, with the same
+meaning as the non-negative case, i.e. rounding to an integer multiple
+of <code>10^(-D)</code>.</p>
+<p>The same applies to the functions <code>trunc()</code> and
+<code>round()</code>. And to the <code>\xintTrunc</code>,
+<code>\xintRound</code>, <code>\xintiTrunc</code>, and
+<code>\xintiRound</code> macros of <strong>xintfrac</strong>.</p></li>
</ul>
-<h3 id="bug-fixes-9">Bug fixes</h3>
+<h3 id="bug-fixes-10">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>
-<li><p><code>add()</code> and <code>mul()</code> were supposedly accepting the <code>omit</code>, <code>abort</code> and <code>break()</code> keywords since <code>1.4</code> but this was broken.</p></li>
+<li><p>Usage of <code>round()</code> and <code>trunc()</code> within
+<code>\xintdeffunc</code> got broken at <code>1.4</code>.</p></li>
+<li><p><code>add()</code> and <code>mul()</code> were supposedly
+accepting the <code>omit</code>, <code>abort</code> and
+<code>break()</code> keywords since <code>1.4</code> but this was
+broken.</p></li>
</ul>
<h2 id="section"><code>1.4 (2020/01/31)</code></h2>
-<h3 id="breaking-changes-5">Breaking changes</h3>
-<p>Please note that this list may still be incomplete. If not otherly specified all items regard the <strong>xintexpr</strong> module.</p>
-<ul>
-<li><p>The <code>\expanded</code> primitive (TeXLive 2019) is <strong>required</strong>. This does not affect the macro layer <strong>xintcore</strong>, <strong>xint</strong>, <strong>xintfrac</strong>, <strong>xinttools</strong> (yet).</p></li>
-<li><p>Formerly square brackets <code>[...]</code> were, on their own, not different from parentheses (and thus disappeared from the output), but they are now a genuine constructor of nested lists. For example <code>\xinteval{1, [2, [3, 4]], 5}</code> produces <code>1, [2, [3, 4]], 5</code> (recall this is free bloatware).</p></li>
-<li><p>The output of <code>\xinteval</code> has changed (besides containing brackets). It does not use anymore the so-called <em>raw</em> <strong>xintfrac</strong> format, i.e. things such as <code>A/B[N]</code> (which can still be used in input but are discouraged in <strong>xintexpr</strong> context), but scientific notation <code>AeN/B</code>. As formerly, the denominator is printed only if <code>B&gt;1</code> and the scientific part is dropped if the exponent vanishes. In this way the output of <code>\xinteval</code> can be pasted to alternative software.</p></li>
-<li><p>The output format of <code>\xinthe\xintboolexpr</code> also has changed. It uses <code>True</code> and <code>False</code> (which are accepted on input), and this can easily be configured otherwise (also <code>true</code> and <code>false</code> are accepted on input).</p></li>
-<li><p>The “broadcasting” (as it turned out, à la <code>NumPy</code>) of scalar operations on one-dimensional “lists”, e.g <code>3*[1,3,5,7]+10</code> acting itemwise is <strong>dropped</strong>. It is hoped to implement such operations again in stronger form in future releases. Pre-existing alternative syntax is available, also to produce the bracketed (cf. next item) <code>[13,19,25,31]</code> which will be the output in future.</p></li>
-<li><p>The <code>divmod()</code> function now produces on output such a bracketed pair, but simultaneous assignment such as <code>\xintdefvar xq, xr = divmod(a,b);</code> will work transparently.</p></li>
-<li><p>The syntax for using conditionals in function declarations has changed. Now, one <em>must</em> use the <code>?</code> and <code>??</code> short-circuit boolean branching operators whereas in the past it was explained that the syntax had to use the <code>if()</code> and <code>ifsgn()</code> functions.</p></li>
-<li><p>Macros <code>\xintGCD</code>, <code>\xintLCM</code>, <code>\xintGCDof</code> and <code>\xintLCMof</code> formerly provided by <strong>xintgcd</strong> got moved to <strong>xintfrac</strong> (which is not loaded by <strong>xintgcd</strong>). Moreover, they were extended to handle general fractions on input but this also means that their output is now obiding by the raw <strong>xintfrac</strong> format. The integer only <code>\xintiiGCD</code>, <code>\xintiiLCM</code> also got moved out of <strong>xintgcd</strong>, but to <strong>xint</strong> which is now loaded automatically by <strong>xintgcd</strong>. The few remaining macros of <strong>xintgcd</strong> at least do not need other imports as <strong>xintgcd</strong> now loads also automatically <strong>xinttools</strong> which is a dependency for two of them.</p></li>
-</ul>
-<h3 id="improvements-and-new-features">Improvements and new features</h3>
-<p>Please note that this list is currently incomplete. For more information look at the user manual and the documented source code <code>sourcexint.pdf</code>.</p>
-<p>Unless otherwise specified all changes commented upon here regard <strong>xintexpr</strong>. Important: all the new syntax is to be considered experimental. The author may change some names in future release, or even the interface (whether to use semi-colons or colons etc…).</p>
-<ul>
-<li><p>The <code>\csname</code> encapsulation technique used since <strong>xintexpr</strong> initial release (<code>1.07 2013/05/25</code>) to move around possibly large data during expansion-only operations is replaced with methods based on the <code>\expanded</code> engine primitive. The latter is available in all major engines since TeXLive 2019.</p>
-<p>Formerly, and with default memory settings, one would typically saturate the string pool memory after about of the order of 50,000 independent floating point evaluations of expressions of average complexity on 16-digits numbers.</p>
-<p>There is thus no string pool memory impact at all but one can now hit TeX’s main memory limit (which typically stands at 5,000,000 words) from defining large variables or generating on the fly large data. TeX distributions have a configuration file allowing to enlarge TeX memory parameters and regenerate the (eTeX based) formats.</p></li>
-<li><p>The package supports input and output of arbitrarily <em>nested lists</em>, a.k.a. <em>oples</em> or <em>nlists</em>, with <code>[...]</code> as the constructor of <em>bracketed lists</em>, a.k.a <em>nut-ples</em>. Operations on these objects (as briefly surveyed in later items) are inspired from syntax and functionalities of <code>NumPy</code>’s <em>ndarrays</em>. Our <em>oples</em> (hence also their packaged form <em>nut-ples</em>) may have <em>leaves</em> at varying depths rather than obeying an N-dimensional hyperrectangular shape. But the syntax does provide specific constructors for <em>ndlists</em> (i.e. hyperrectangular <em>oples</em> or <em>nut-ples</em>).</p>
-<p>In a (distant?) future, perhaps <strong>xintexpr</strong> itself or a third-party package will provide an interface, say <code>\xintstorearray</code>, <code>\xintgetarray</code>, to store (which can not be expandable) and retrieve (which can be expandable and thus be embedded inside expressions parsed by <code>\xintexpr</code>, <code>\xintiiexpr</code> or <code>\xintfloatexpr</code>) such <em>ndlists</em> from TeX memory. This is why the package does not use the word <em>ndarray</em> and reserves it for such memory stored objects.</p></li>
-<li><p>The <code>*</code> serves as <em>unpacking</em> operator on <em>nut-ples</em>, i.e. reversing the <code>[]</code> bracketing of an <em>ople</em>.</p></li>
-<li><p><em>oples</em> have no exact equivalent in <code>Python</code>. For example <strong>xintexpr</strong> allows <code>foo(Var1, x)</code> if <code>foo</code> is a function of 4 variables and <code>Var1</code> is a variable producing a length 3 <em>ople</em>, or <code>foo(Var2)</code> if <code>Var2</code> is a variable producing a length 4 <em>ople</em>. Python would require here to use explicitly the <code>*</code>-unpacking notation on some “packed” objects.</p>
-<p>Variable and function values may be <em>oples</em> (even <em>nil</em>), but in function declarations variables must stand for <em>one-ples</em>, i.e. either <em>numbers</em> or <em>nut-ples</em> (as there is no non-ambiguous way to split e.g. 5 arguments into two separate <em>oples</em>).</p></li>
-<li><p>Simultaneous assignment to at least two variables via <code>\xintdefvar</code> et al. automatically unpacks the assigned value if it is a <em>one-ple</em>. If this value was in fact a <em>number</em>, low-level errors will result shortly afterwards as no check is done if the unpacking was illicit. (update: this last remark does not apply since the <code>1.4i</code> extension to the concept of simultaneous assignments)</p></li>
-<li><p>The <code>NumPy</code> concept and syntax for nested slicing and item selection are implemented. Currently <em>stepping</em> and the <em>Ellipsis object</em> are not yet available. Only so-called basic slicing is currently supported. (The author has not yet read the section of <code>NumPy</code> documentation on so-called <em>advanced indexing</em>).</p></li>
-<li><p>The <em>broadcasting</em> of scalar operations, such as itemwise addition or multiplication of <em>nut-ples</em> of the same shape is <strong>not yet implemented</strong>.</p></li>
-<li><p>Slicing and indexing apply also at top level to the <em>oples</em> with behaviour conforming to intuitive expectations (see user manual); if it turns out the <em>ople</em> is in fact a <em>nut-ple</em>, the top-level slicing/indexing switches to the <code>Python/NumPy</code> conventions, i.e. it operates inside the brackets for slicing and removes brackets if indexing.</p></li>
-<li><p>The syntax <code>ndseq(expression in x, y, ..., x = values; y = values; ...)</code> constructs a (bracketed) <em>ndlist</em> by evaluation the expression on all possible Cartesian n-uples, where the first variable indexes the first axis, the second the next, etc…</p></li>
-<li><p>The <code>ndmap(foo, values1; values2; ...; valuesN)</code> syntax constructs a (bracketed) <em>ndlist</em> by evaluating the function <code>foo</code> on all elements of the cartesian product of the given (one-dimensional) value lists.</p></li>
-<li><p>The two concepts of <code>\xintdeffunc</code> (for recursive definitions) and <code>\xintdefefunc</code> (for functions which expand immediately in other function declarations) have been merged. The <code>\xintdefefunc</code> et al. are deprecated and kept as aliases for <code>\xintdeffunc</code> et al.</p></li>
-<li><p><code>\xintdefufunc</code> allows to define so-called <em>universal functions</em>, i.e. functions <code>foo</code> such that <code>foo(myople)</code> will apply itemwise at arbitrary depth in the nested structure. The function <code>foo</code> is allowed to produce from a scalar an <em>ople</em>…</p></li>
-<li><p>The variables in function declarations can now be multi-letter words.</p></li>
-<li><p>The last positional variable in a function declaration can be prefixed with a <code>*</code> meaning exactly as in Python (<em>variadic</em> function argument) that it stands for a one-dimensional <em>nut-ple</em> receiving all remaining arguments from the function call beyond the first positional ones. It is thus an optional argument, but syntax for named optional arguments with default values is not yet implemented.</p></li>
-<li><p>Dummy variables used in constructors can also be multi-letter words, if they have been declared as such.</p></li>
-<li><p>In variable and function declarations, if the expression contains inner semi-colons, it is not needed anymore to brace them to avoid mis-interpretation as the final semi-colon which is mandated by the syntax to serve as expression terminator.</p></li>
-<li><p><code>subsm(expression, var1 = value1; var2 = value2; ...)</code> provides a leaner syntax for multiple substitutions; they must be independent, though.</p></li>
-<li><p><code>subsn(expression, var1 = value1; var2 = value2; ...)</code> provides a leaner syntax for nested substitutions, i.e., each <code>valueJ</code> may be an expression using the dummy variables <code>varK</code> with <code>K&gt;J</code>. And finally of course the evaluated expression can refer to all variables.</p></li>
-<li><p><code>\xintthealign\xintexpr...\relax</code> (or with <code>\xintfloatexpr</code> or <code>\xintiiexpr</code> or <code>\xintboolexpr</code>…) will use a TeX alignment to display <em>oples</em>. The output (for regular N-dimensional lists) looks very similar to what <code>Python/NumPy</code> produces in interactive session. This is entirely configurable and can also be set-up to be used for writing into external files.</p>
-<p>Attention that <code>\xintthealign</code> only works if followed by <code>\xintexpr</code> et al., not by <code>\xinteval{}</code>.</p></li>
-<li><p>It is now possible to use <code>\xintexpr...\relax</code> directly for typesetting. The syntax <code>\xinteval{...}</code> or <code>\xintthe\xintexpr...\relax</code> is needed only if one wants the expansion to give the explicit digits, but <code>\xintexpr...\relax</code> by itself will typeset as would have the other ones. Further it can be used in so-called moving arguments, because when output to an external file it uses only characters with standard catcodes (and produces the same protected and re-tokenizable result it would in an <code>\edef</code>.)</p>
-<p>As formerly, <code>\xintexpr...\relax</code> is the preferred way to include an expression into another one. Using <code>\xinteval</code> is a waste because it forces the outer parser to re-digest all the digits (or now also the square brackets).</p></li>
-<li><p>The output format of <code>\xintfloateval</code> with scientific notation has not changed (apart from possible presence of bracketed lists), but the author hesitates because the <em>prettifying</em> it does by default is not really adapted to display of arrays (see <code>\xintthealign</code>). Anyway, this is configurable by the user. It is possible to specify whether to use <code>e</code> or <code>E</code>.</p></li>
-<li><p>Function declarations are able to parse a much wider part of the syntax, but some severe limitations remain. Refer to the user manual for related information.</p></li>
-<li><p>We have made an effort on some error messages, and when working interactively in a shell it may even be sometimes possible to insert for example a correct variable or function name in place of the not recognized one. But don’t expect miracles when trying to intervene in the midst of a purely expandable expansion…</p></li>
+<h3 id="breaking-changes-6">Breaking changes</h3>
+<p>Please note that this list may still be incomplete. If not otherly
+specified all items regard the <strong>xintexpr</strong> module.</p>
+<ul>
+<li><p>The <code>\expanded</code> primitive (TeXLive 2019) is
+<strong>required</strong>. This does not affect the macro layer
+<strong>xintcore</strong>, <strong>xint</strong>,
+<strong>xintfrac</strong>, <strong>xinttools</strong> (yet).</p></li>
+<li><p>Formerly square brackets <code>[...]</code> were, on their own,
+not different from parentheses (and thus disappeared from the output),
+but they are now a genuine constructor of nested lists. For example
+<code>\xinteval{1, [2, [3, 4]], 5}</code> produces
+<code>1, [2, [3, 4]], 5</code> (recall this is free bloatware).</p></li>
+<li><p>The output of <code>\xinteval</code> has changed (besides
+containing brackets). It does not use anymore the so-called <em>raw</em>
+<strong>xintfrac</strong> format, i.e. things such as
+<code>A/B[N]</code> (which can still be used in input but are
+discouraged in <strong>xintexpr</strong> context), but scientific
+notation <code>AeN/B</code>. As formerly, the denominator is printed
+only if <code>B&gt;1</code> and the scientific part is dropped if the
+exponent vanishes. In this way the output of <code>\xinteval</code> can
+be pasted to alternative software.</p></li>
+<li><p>The output format of <code>\xinthe\xintboolexpr</code> also has
+changed. It uses <code>True</code> and <code>False</code> (which are
+accepted on input), and this can easily be configured otherwise (also
+<code>true</code> and <code>false</code> are accepted on
+input).</p></li>
+<li><p>The “broadcasting” (as it turned out, à la <code>NumPy</code>) of
+scalar operations on one-dimensional “lists”, e.g
+<code>3*[1,3,5,7]+10</code> acting itemwise is <strong>dropped</strong>.
+It is hoped to implement such operations again in stronger form in
+future releases. Pre-existing alternative syntax is available, also to
+produce the bracketed (cf. next item) <code>[13,19,25,31]</code> which
+will be the output in future.</p></li>
+<li><p>The <code>divmod()</code> function now produces on output such a
+bracketed pair, but simultaneous assignment such as
+<code>\xintdefvar xq, xr = divmod(a,b);</code> will work
+transparently.</p></li>
+<li><p>The syntax for using conditionals in function declarations has
+changed. Now, one <em>must</em> use the <code>?</code> and
+<code>??</code> short-circuit boolean branching operators whereas in the
+past it was explained that the syntax had to use the <code>if()</code>
+and <code>ifsgn()</code> functions.</p></li>
+<li><p>Macros <code>\xintGCD</code>, <code>\xintLCM</code>,
+<code>\xintGCDof</code> and <code>\xintLCMof</code> formerly provided by
+<strong>xintgcd</strong> got moved to <strong>xintfrac</strong> (which
+is not loaded by <strong>xintgcd</strong>). Moreover, they were extended
+to handle general fractions on input but this also means that their
+output is now obiding by the raw <strong>xintfrac</strong> format. The
+integer only <code>\xintiiGCD</code>, <code>\xintiiLCM</code> also got
+moved out of <strong>xintgcd</strong>, but to <strong>xint</strong>
+which is now loaded automatically by <strong>xintgcd</strong>. The few
+remaining macros of <strong>xintgcd</strong> at least do not need other
+imports as <strong>xintgcd</strong> now loads also automatically
+<strong>xinttools</strong> which is a dependency for two of
+them.</p></li>
+</ul>
+<h3 id="improvements-and-new-features">Improvements and new
+features</h3>
+<p>Please note that this list is currently incomplete. For more
+information look at the user manual and the documented source code
+<code>sourcexint.pdf</code>.</p>
+<p>Unless otherwise specified all changes commented upon here regard
+<strong>xintexpr</strong>. Important: all the new syntax is to be
+considered experimental. The author may change some names in future
+release, or even the interface (whether to use semi-colons or colons
+etc…).</p>
+<ul>
+<li><p>The <code>\csname</code> encapsulation technique used since
+<strong>xintexpr</strong> initial release (<code>1.07 2013/05/25</code>)
+to move around possibly large data during expansion-only operations is
+replaced with methods based on the <code>\expanded</code> engine
+primitive. The latter is available in all major engines since TeXLive
+2019.</p>
+<p>Formerly, and with default memory settings, one would typically
+saturate the string pool memory after about of the order of 50,000
+independent floating point evaluations of expressions of average
+complexity on 16-digits numbers.</p>
+<p>There is thus no string pool memory impact at all but one can now hit
+TeX’s main memory limit (which typically stands at 5,000,000 words) from
+defining large variables or generating on the fly large data. TeX
+distributions have a configuration file allowing to enlarge TeX memory
+parameters and regenerate the (eTeX based) formats.</p></li>
+<li><p>The package supports input and output of arbitrarily <em>nested
+lists</em>, a.k.a. <em>oples</em> or <em>nlists</em>, with
+<code>[...]</code> as the constructor of <em>bracketed lists</em>, a.k.a
+<em>nut-ples</em>. Operations on these objects (as briefly surveyed in
+later items) are inspired from syntax and functionalities of
+<code>NumPy</code>’s <em>ndarrays</em>. Our <em>oples</em> (hence also
+their packaged form <em>nut-ples</em>) may have <em>leaves</em> at
+varying depths rather than obeying an N-dimensional hyperrectangular
+shape. But the syntax does provide specific constructors for
+<em>ndlists</em> (i.e. hyperrectangular <em>oples</em> or
+<em>nut-ples</em>).</p>
+<p>In a (distant?) future, perhaps <strong>xintexpr</strong> itself or a
+third-party package will provide an interface, say
+<code>\xintstorearray</code>, <code>\xintgetarray</code>, to store
+(which can not be expandable) and retrieve (which can be expandable and
+thus be embedded inside expressions parsed by <code>\xintexpr</code>,
+<code>\xintiiexpr</code> or <code>\xintfloatexpr</code>) such
+<em>ndlists</em> from TeX memory. This is why the package does not use
+the word <em>ndarray</em> and reserves it for such memory stored
+objects.</p></li>
+<li><p>The <code>*</code> serves as <em>unpacking</em> operator on
+<em>nut-ples</em>, i.e. reversing the <code>[]</code> bracketing of an
+<em>ople</em>.</p></li>
+<li><p><em>oples</em> have no exact equivalent in <code>Python</code>.
+For example <strong>xintexpr</strong> allows <code>foo(Var1, x)</code>
+if <code>foo</code> is a function of 4 variables and <code>Var1</code>
+is a variable producing a length 3 <em>ople</em>, or
+<code>foo(Var2)</code> if <code>Var2</code> is a variable producing a
+length 4 <em>ople</em>. Python would require here to use explicitly the
+<code>*</code>-unpacking notation on some “packed” objects.</p>
+<p>Variable and function values may be <em>oples</em> (even
+<em>nil</em>), but in function declarations variables must stand for
+<em>one-ples</em>, i.e. either <em>numbers</em> or <em>nut-ples</em> (as
+there is no non-ambiguous way to split e.g. 5 arguments into two
+separate <em>oples</em>).</p></li>
+<li><p>Simultaneous assignment to at least two variables via
+<code>\xintdefvar</code> et al. automatically unpacks the assigned value
+if it is a <em>one-ple</em>. If this value was in fact a
+<em>number</em>, low-level errors will result shortly afterwards as no
+check is done if the unpacking was illicit. (update: this last remark
+does not apply since the <code>1.4i</code> extension to the concept of
+simultaneous assignments)</p></li>
+<li><p>The <code>NumPy</code> concept and syntax for nested slicing and
+item selection are implemented. Currently <em>stepping</em> and the
+<em>Ellipsis object</em> are not yet available. Only so-called basic
+slicing is currently supported. (The author has not yet read the section
+of <code>NumPy</code> documentation on so-called <em>advanced
+indexing</em>).</p></li>
+<li><p>The <em>broadcasting</em> of scalar operations, such as itemwise
+addition or multiplication of <em>nut-ples</em> of the same shape is
+<strong>not yet implemented</strong>.</p></li>
+<li><p>Slicing and indexing apply also at top level to the
+<em>oples</em> with behaviour conforming to intuitive expectations (see
+user manual); if it turns out the <em>ople</em> is in fact a
+<em>nut-ple</em>, the top-level slicing/indexing switches to the
+<code>Python/NumPy</code> conventions, i.e. it operates inside the
+brackets for slicing and removes brackets if indexing.</p></li>
+<li><p>The syntax
+<code>ndseq(expression in x, y, ..., x = values; y = values; ...)</code>
+constructs a (bracketed) <em>ndlist</em> by evaluation the expression on
+all possible Cartesian n-uples, where the first variable indexes the
+first axis, the second the next, etc…</p></li>
+<li><p>The <code>ndmap(foo, values1; values2; ...; valuesN)</code>
+syntax constructs a (bracketed) <em>ndlist</em> by evaluating the
+function <code>foo</code> on all elements of the cartesian product of
+the given (one-dimensional) value lists.</p></li>
+<li><p>The two concepts of <code>\xintdeffunc</code> (for recursive
+definitions) and <code>\xintdefefunc</code> (for functions which expand
+immediately in other function declarations) have been merged. The
+<code>\xintdefefunc</code> et al. are deprecated and kept as aliases for
+<code>\xintdeffunc</code> et al.</p></li>
+<li><p><code>\xintdefufunc</code> allows to define so-called
+<em>universal functions</em>, i.e. functions <code>foo</code> such that
+<code>foo(myople)</code> will apply itemwise at arbitrary depth in the
+nested structure. The function <code>foo</code> is allowed to produce
+from a scalar an <em>ople</em>…</p></li>
+<li><p>The variables in function declarations can now be multi-letter
+words.</p></li>
+<li><p>The last positional variable in a function declaration can be
+prefixed with a <code>*</code> meaning exactly as in Python
+(<em>variadic</em> function argument) that it stands for a
+one-dimensional <em>nut-ple</em> receiving all remaining arguments from
+the function call beyond the first positional ones. It is thus an
+optional argument, but syntax for named optional arguments with default
+values is not yet implemented.</p></li>
+<li><p>Dummy variables used in constructors can also be multi-letter
+words, if they have been declared as such.</p></li>
+<li><p>In variable and function declarations, if the expression contains
+inner semi-colons, it is not needed anymore to brace them to avoid
+mis-interpretation as the final semi-colon which is mandated by the
+syntax to serve as expression terminator.</p></li>
+<li><p><code>subsm(expression, var1 = value1; var2 = value2; ...)</code>
+provides a leaner syntax for multiple substitutions; they must be
+independent, though.</p></li>
+<li><p><code>subsn(expression, var1 = value1; var2 = value2; ...)</code>
+provides a leaner syntax for nested substitutions, i.e., each
+<code>valueJ</code> may be an expression using the dummy variables
+<code>varK</code> with <code>K&gt;J</code>. And finally of course the
+evaluated expression can refer to all variables.</p></li>
+<li><p><code>\xintthealign\xintexpr...\relax</code> (or with
+<code>\xintfloatexpr</code> or <code>\xintiiexpr</code> or
+<code>\xintboolexpr</code>…) will use a TeX alignment to display
+<em>oples</em>. The output (for regular N-dimensional lists) looks very
+similar to what <code>Python/NumPy</code> produces in interactive
+session. This is entirely configurable and can also be set-up to be used
+for writing into external files.</p>
+<p>Attention that <code>\xintthealign</code> only works if followed by
+<code>\xintexpr</code> et al., not by <code>\xinteval{}</code>.</p></li>
+<li><p>It is now possible to use <code>\xintexpr...\relax</code>
+directly for typesetting. The syntax <code>\xinteval{...}</code> or
+<code>\xintthe\xintexpr...\relax</code> is needed only if one wants the
+expansion to give the explicit digits, but
+<code>\xintexpr...\relax</code> by itself will typeset as would have the
+other ones. Further it can be used in so-called moving arguments,
+because when output to an external file it uses only characters with
+standard catcodes (and produces the same protected and re-tokenizable
+result it would in an <code>\edef</code>.)</p>
+<p>As formerly, <code>\xintexpr...\relax</code> is the preferred way to
+include an expression into another one. Using <code>\xinteval</code> is
+a waste because it forces the outer parser to re-digest all the digits
+(or now also the square brackets).</p></li>
+<li><p>The output format of <code>\xintfloateval</code> with scientific
+notation has not changed (apart from possible presence of bracketed
+lists), but the author hesitates because the <em>prettifying</em> it
+does by default is not really adapted to display of arrays (see
+<code>\xintthealign</code>). Anyway, this is configurable by the user.
+It is possible to specify whether to use <code>e</code> or
+<code>E</code>.</p></li>
+<li><p>Function declarations are able to parse a much wider part of the
+syntax, but some severe limitations remain. Refer to the user manual for
+related information.</p></li>
+<li><p>We have made an effort on some error messages, and when working
+interactively in a shell it may even be sometimes possible to insert for
+example a correct variable or function name in place of the not
+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-10">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, and our test suite although significantly enlarged is not yet extensive enough. Please report bugs by mail.</p>
+<h3 id="bug-fixes-11">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,
+and our test suite although significantly enlarged is not yet extensive
+enough. Please report bugs by mail.</p>
<h3 id="todo">TODO</h3>
<ul>
-<li><p>The long delayed overhaul of how floating point numbers are handled is delayed again. It has remained basically identical to its initial provisory version from <code>1.07 2013/05/25</code> (which was based upon what was originally only a set of expandable macros for computations with big integers), and suffers from the author lack of knowledge of the notion of “data type” in modern programming. Indeed, he never took a CS class, and disables JavaScript in his browser (or allows only select non-tracking scripts, a rare beast in modern days).</p></li>
-<li><p>Prior to integrating all of <code>NumPy</code>, it is envisioned to start with matrix algebra first.</p></li>
+<li><p>The long delayed overhaul of how floating point numbers are
+handled is delayed again. It has remained basically identical to its
+initial provisory version from <code>1.07 2013/05/25</code> (which was
+based upon what was originally only a set of expandable macros for
+computations with big integers), and suffers from the author lack of
+knowledge of the notion of “data type” in modern programming. Indeed, he
+never took a CS class, and disables JavaScript in his browser (or allows
+only select non-tracking scripts, a rare beast in modern days).</p></li>
+<li><p>Prior to integrating all of <code>NumPy</code>, it is envisioned
+to start with matrix algebra first.</p></li>
</ul>
<h2 id="f-20190910"><code>1.3f (2019/09/10)</code></h2>
-<h3 id="improvements-and-new-features-1">Improvements and new features</h3>
-<ul>
-<li><p><strong>xintfrac</strong>: <code>\xintDigits = P;</code> syntax (i.e. without a colon) is now accepted in addition to <code>\xintDigits := P;</code>.</p>
-<p>Document that the ending semi-colon can not be an active character and that it has always been allowed to use in its place a non-expanding token e.g. <code>\xintDigits := 32\relax</code>.</p>
+<h3 id="improvements-and-new-features-1">Improvements and new
+features</h3>
+<ul>
+<li><p><strong>xintfrac</strong>: <code>\xintDigits = P;</code> syntax
+(i.e. without a colon) is now accepted in addition to
+<code>\xintDigits := P;</code>.</p>
+<p>Document that the ending semi-colon can not be an active character
+and that it has always been allowed to use in its place a non-expanding
+token e.g. <code>\xintDigits := 32\relax</code>.</p>
<p>Add <code>\xintSetDigits</code>.</p></li>
-<li><p><strong>xintexpr</strong>: add starred variants <code>\xintDigits*</code> and <code>\xintSetDigits*</code> which execute <code>\xintreloadxinttrig</code>.</p>
-<p>Revert 1.3e ban on usage of <code>\xinteval</code> et al. inside expressions by <code>\xintdeffunc</code>. And make them usable also inside macro definitions via <code>\xintNewExpr</code>.</p></li>
+<li><p><strong>xintexpr</strong>: add starred variants
+<code>\xintDigits*</code> and <code>\xintSetDigits*</code> which execute
+<code>\xintreloadxinttrig</code>.</p>
+<p>Revert 1.3e ban on usage of <code>\xinteval</code> et al. inside
+expressions by <code>\xintdeffunc</code>. And make them usable also
+inside macro definitions via <code>\xintNewExpr</code>.</p></li>
</ul>
-<h3 id="bug-fixes-11">Bug fixes</h3>
+<h3 id="bug-fixes-12">Bug fixes</h3>
<ul>
-<li><p><strong>xintexpr</strong>: fix bug preventing usage of <code>\xintdefefunc</code> to define a function without variables.</p>
-<p>Fix some issue with <code>\xintfloatexpr[D]..\relax</code> if used inside an expression parsed by <code>\xintdeffunc</code> et al.</p></li>
+<li><p><strong>xintexpr</strong>: fix bug preventing usage of
+<code>\xintdefefunc</code> to define a function without variables.</p>
+<p>Fix some issue with <code>\xintfloatexpr[D]..\relax</code> if used
+inside an expression parsed by <code>\xintdeffunc</code> et al.</p></li>
</ul>
<h2 id="e-20190405"><code>1.3e (2019/04/05)</code></h2>
-<h3 id="breaking-changes-6">Breaking changes</h3>
-<ul>
-<li>(<em>reverted at 1.3f</em>) When defining functions, sub-expressions can only use the <code>\xint(float)expr...\relax</code> syntax. One can not use there the <code>\xint(float)eval</code> wrappers.</li>
-</ul>
-<h3 id="improvements-and-new-features-2">Improvements and new features</h3>
+<h3 id="breaking-changes-7">Breaking changes</h3>
<ul>
-<li><p>The <strong>xinttrig</strong> library is automatically loaded by <strong>xintexpr</strong>. It provides direct and inverse trigonometrical functions using either degrees or radians with a precision of up to (a bit less than) 60 digits. It is for the most part implemented using high level user interface, but will probably get some optimizations in future (and perhaps extension to more digits).</p></li>
-<li><p>The <strong>xintlog</strong> library is automatically loaded by <strong>xintexpr</strong>. It uses <a href="http://ctan.org/pkg/poormanlog">poormanlog</a> to provide logarithms and exponentials with almost 9 digits of precision. Extended precision is for a future release.</p></li>
-<li><p><strong>xintexpr</strong>: <code>\xintdefefunc</code>, <code>\xintdeffloatefunc</code>, <code>\xintdefiiefunc</code> define functions which are not protected against expansion in the definition of other functions; refer to <code>xint.pdf</code> for the related explanations.</p>
-<p>Notice that whole area of <code>\xintdef(e)func</code>, <code>\xintNewExpr</code>, <code>\xintNewFunction</code> is complex and to be considered still as work in progress as it has a number of shortcomings.</p></li>
-<li><p><strong>xintexpr</strong>: <code>inv()</code>, <code>ilog10()</code>, <code>sfloat()</code>, behaviour of <code>qfloat()</code> slightly modified.</p></li>
-<li><p><strong>xintexpr</strong>: <code>\xintensuredummy</code>, <code>\xintrestorelettervar</code>.</p></li>
-<li><p>The optional argument of <code>\xintfloatexpr</code> or <code>\xintfloateval</code> (it must be at start of braced argument) can be negative; it then means to trim (and round) from the output at float precision that many least significant digits.</p></li>
+<li>(<em>reverted at 1.3f</em>) When defining functions, sub-expressions
+can only use the <code>\xint(float)expr...\relax</code> syntax. One can
+not use there the <code>\xint(float)eval</code> wrappers.</li>
+</ul>
+<h3 id="improvements-and-new-features-2">Improvements and new
+features</h3>
+<ul>
+<li><p>The <strong>xinttrig</strong> library is automatically loaded by
+<strong>xintexpr</strong>. It provides direct and inverse
+trigonometrical functions using either degrees or radians with a
+precision of up to (a bit less than) 60 digits. It is for the most part
+implemented using high level user interface, but will probably get some
+optimizations in future (and perhaps extension to more digits).</p></li>
+<li><p>The <strong>xintlog</strong> library is automatically loaded by
+<strong>xintexpr</strong>. It uses <a
+href="http://ctan.org/pkg/poormanlog">poormanlog</a> to provide
+logarithms and exponentials with almost 9 digits of precision. Extended
+precision is for a future release.</p></li>
+<li><p><strong>xintexpr</strong>: <code>\xintdefefunc</code>,
+<code>\xintdeffloatefunc</code>, <code>\xintdefiiefunc</code> define
+functions which are not protected against expansion in the definition of
+other functions; refer to <code>xint.pdf</code> for the related
+explanations.</p>
+<p>Notice that whole area of <code>\xintdef(e)func</code>,
+<code>\xintNewExpr</code>, <code>\xintNewFunction</code> is complex and
+to be considered still as work in progress as it has a number of
+shortcomings.</p></li>
+<li><p><strong>xintexpr</strong>: <code>inv()</code>,
+<code>ilog10()</code>, <code>sfloat()</code>, behaviour of
+<code>qfloat()</code> slightly modified.</p></li>
+<li><p><strong>xintexpr</strong>: <code>\xintensuredummy</code>,
+<code>\xintrestorelettervar</code>.</p></li>
+<li><p>The optional argument of <code>\xintfloatexpr</code> or
+<code>\xintfloateval</code> (it must be at start of braced argument) can
+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-12">Bug fixes</h3>
+<h3 id="bug-fixes-13">Bug fixes</h3>
<ul>
-<li>Some bugfixes related to user functions with no variables at all; they were dysfunctional.</li>
+<li>Some bugfixes related to user functions with no variables at all;
+they were dysfunctional.</li>
</ul>
<h2 id="d-20190106"><code>1.3d (2019/01/06)</code></h2>
-<h3 id="breaking-changes-7">Breaking changes</h3>
-<ul>
-<li><p><strong>xintexpr</strong>: the <code>gcd()</code> and <code>lcm()</code> functions formerly converted their arguments to integers via <code>\xintNum</code>. They now handle general input with no such modification.</p></li>
-<li><p><strong>xintexpr</strong>: former <code>\xinteval</code>, <code>\xintieval</code>, <code>\xintiieval</code>, and <code>\xintfloateval</code> renamed to <code>\xintexpro</code>, <code>\xintiexpro</code>, <code>\xintiiexpro</code>, and <code>\xintfloatexpro</code>.</p></li>
-</ul>
-<h3 id="improvements-and-new-features-3">Improvements and new features</h3>
+<h3 id="breaking-changes-8">Breaking changes</h3>
<ul>
-<li><p><strong>xintexpr</strong>: the <code>gcd()</code> and <code>lcm()</code> multi-arguments functions have been refactored to handle general fractions. The dependency on <strong>xintgcd</strong> is removed.</p></li>
-<li><p><strong>xintexpr</strong>: three-way branching <code>\xintifsgnexpr</code>, <code>\xintifsgnfloatexpr</code>, <code>\xintifsgniiexpr</code> conditional macros.</p></li>
-<li><p><strong>xintexpr</strong>: <code>\xintunassignexprfunc</code>, <code>\xintunassigniiexprfunc</code>, <code>\xintunassignfloatexprfunc</code> to “undefine” functions.</p></li>
-<li><p><strong>xintexpr</strong>: <code>\xintunassignvar</code> really makes the (multi-letter) variable unknown (formerly, it only gave it value zero),</p></li>
-<li><p><strong>xintexpr</strong>: functions <code>isone()</code> and <code>isint()</code>.</p></li>
-<li><p><strong>xintexpr</strong>: <code>\xinteval</code>, <code>\xintieval</code>, <code>\xintiieval</code>, and <code>\xintfloateval</code> as synonyms to <code>\xinttheexpr...\relax</code> etc…, but with the (comma-separated) expression as a usual braced macro argument.</p></li>
+<li><p><strong>xintexpr</strong>: the <code>gcd()</code> and
+<code>lcm()</code> functions formerly converted their arguments to
+integers via <code>\xintNum</code>. They now handle general input with
+no such modification.</p></li>
+<li><p><strong>xintexpr</strong>: former <code>\xinteval</code>,
+<code>\xintieval</code>, <code>\xintiieval</code>, and
+<code>\xintfloateval</code> renamed to <code>\xintexpro</code>,
+<code>\xintiexpro</code>, <code>\xintiiexpro</code>, and
+<code>\xintfloatexpro</code>.</p></li>
+</ul>
+<h3 id="improvements-and-new-features-3">Improvements and new
+features</h3>
+<ul>
+<li><p><strong>xintexpr</strong>: the <code>gcd()</code> and
+<code>lcm()</code> multi-arguments functions have been refactored to
+handle general fractions. The dependency on <strong>xintgcd</strong> is
+removed.</p></li>
+<li><p><strong>xintexpr</strong>: three-way branching
+<code>\xintifsgnexpr</code>, <code>\xintifsgnfloatexpr</code>,
+<code>\xintifsgniiexpr</code> conditional macros.</p></li>
+<li><p><strong>xintexpr</strong>: <code>\xintunassignexprfunc</code>,
+<code>\xintunassigniiexprfunc</code>,
+<code>\xintunassignfloatexprfunc</code> to “undefine”
+functions.</p></li>
+<li><p><strong>xintexpr</strong>: <code>\xintunassignvar</code> really
+makes the (multi-letter) variable unknown (formerly, it only gave it
+value zero),</p></li>
+<li><p><strong>xintexpr</strong>: functions <code>isone()</code> and
+<code>isint()</code>.</p></li>
+<li><p><strong>xintexpr</strong>: <code>\xinteval</code>,
+<code>\xintieval</code>, <code>\xintiieval</code>, and
+<code>\xintfloateval</code> as synonyms to
+<code>\xinttheexpr...\relax</code> etc…, but with the (comma-separated)
+expression as a usual braced macro argument.</p></li>
</ul>
-<h3 id="bug-fixes-13">Bug fixes</h3>
+<h3 id="bug-fixes-14">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 divisor (e.g. <code>0//7</code>) since <code>1.2p</code> due to a bug in <code>\xintiiDivMod</code> for such arguments. The bug was signaled (thanks to Kpym for report) and fixed shortly after <code>1.3c</code> release but I then completely forgot to upload a bugfix release to CTAN at that time, apologies for that.</li>
+<li><strong>xintcore</strong>, <strong>xintexpr</strong> : division in
+<code>\xintiiexpr</code> was broken for a zero dividend and a one-digit
+divisor (e.g. <code>0//7</code>) since <code>1.2p</code> due to a bug in
+<code>\xintiiDivMod</code> for such arguments. The bug was signaled
+(thanks to Kpym for report) and fixed shortly after <code>1.3c</code>
+release but I then completely forgot to upload a bugfix release to CTAN
+at that time, apologies for that.</li>
</ul>
<h2 id="c-20180617"><code>1.3c (2018/06/17)</code></h2>
-<h3 id="improvements-and-new-features-4">Improvements and new features</h3>
-<ul>
-<li><p><strong>xintexpr</strong>: with <code>\xintglobaldefstrue</code>, <code>\xintdefvar</code>, <code>\xintdeffunc</code>, <code>\xintNewExpr</code> et al. make definitions with global scope.</p></li>
-<li><p><strong>xintexpr</strong>: <code>qraw()</code> for fast input of (very many) comma separated numbers (in suitable raw format).</p></li>
-<li><p><strong>xintexpr</strong>: the colon in the <code>:=</code> part of the syntax for <code>\xintdefvar</code> and variants is now optional; and if present it may be an active character or have any (reasonable) catcode.</p></li>
-<li><p><strong>xintexpr</strong>: <code>\xintdefvar</code>, <code>\xintdeffunc</code> and their variants try to set the catcode of the semi-colon which delimits their arguments; of course this will not work if that catcode is already frozen.</p></li>
-<li><p><code>\xintUniformDeviate</code> is better documented and <code>sourcexint.pdf</code> is better hyperlinked and includes indices for the macros defined by each package.</p></li>
+<h3 id="improvements-and-new-features-4">Improvements and new
+features</h3>
+<ul>
+<li><p><strong>xintexpr</strong>: with <code>\xintglobaldefstrue</code>,
+<code>\xintdefvar</code>, <code>\xintdeffunc</code>,
+<code>\xintNewExpr</code> et al. make definitions with global
+scope.</p></li>
+<li><p><strong>xintexpr</strong>: <code>qraw()</code> for fast input of
+(very many) comma separated numbers (in suitable raw format).</p></li>
+<li><p><strong>xintexpr</strong>: the colon in the <code>:=</code> part
+of the syntax for <code>\xintdefvar</code> and variants is now optional;
+and if present it may be an active character or have any (reasonable)
+catcode.</p></li>
+<li><p><strong>xintexpr</strong>: <code>\xintdefvar</code>,
+<code>\xintdeffunc</code> and their variants try to set the catcode of
+the semi-colon which delimits their arguments; of course this will not
+work if that catcode is already frozen.</p></li>
+<li><p><code>\xintUniformDeviate</code> is better documented and
+<code>sourcexint.pdf</code> is better hyperlinked and includes indices
+for the macros defined by each package.</p></li>
</ul>
-<h3 id="bug-fixes-14">Bug fixes</h3>
+<h3 id="bug-fixes-15">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 (hence also <strong>xintexpr</strong> loaded <strong>xintgcd</strong> automatically). There is no actual dependency so the loading is removed for now.</li>
+<li><strong>xintfrac</strong>: since <code>1.3</code> release, it loaded
+<strong>xintgcd</strong> in contradiction to what the documentation says
+(hence also <strong>xintexpr</strong> loaded <strong>xintgcd</strong>
+automatically). There is no actual dependency so the loading is removed
+for now.</li>
</ul>
<h2 id="b-20180518"><code>1.3b (2018/05/18)</code></h2>
-<h3 id="improvements-and-new-features-5">Improvements and new features</h3>
-<p>All additions related to randomness are marked as work-in-progress. They require an engine providing the <code>\(pdf)uniformdeviate</code> primitive.</p>
-<ul>
-<li><p><strong>xintkernel</strong>: <code>\xintUniformDeviate</code>.</p></li>
-<li><p><strong>xint</strong>: <code>\xintRandomDigits</code>, <code>\xintXRandomDigits</code>, <code>\xintiiRandRange</code>, <code>\xintiiRandRangeAtoB</code>.</p></li>
-<li><p><strong>xintfrac</strong>: support macros (not public, mainly because internal format for floats is surely not final) for <code>random()</code> and <code>qrand()</code>.</p></li>
-<li><p><strong>xintexpr</strong>: <code>random()</code>, <code>qrand()</code>, and <code>randrange(A[, B])</code>.</p></li>
-<li><p><strong>xintexpr</strong>: when a function <code>foo()</code> is declared via <code>\xintdeffunc</code> (et al.) to be parameter-less, it can be used as <code>foo()</code>; formerly <code>foo(nil)</code> syntax was required.</p></li>
+<h3 id="improvements-and-new-features-5">Improvements and new
+features</h3>
+<p>All additions related to randomness are marked as work-in-progress.
+They require an engine providing the <code>\(pdf)uniformdeviate</code>
+primitive.</p>
+<ul>
+<li><p><strong>xintkernel</strong>:
+<code>\xintUniformDeviate</code>.</p></li>
+<li><p><strong>xint</strong>: <code>\xintRandomDigits</code>,
+<code>\xintXRandomDigits</code>, <code>\xintiiRandRange</code>,
+<code>\xintiiRandRangeAtoB</code>.</p></li>
+<li><p><strong>xintfrac</strong>: support macros (not public, mainly
+because internal format for floats is surely not final) for
+<code>random()</code> and <code>qrand()</code>.</p></li>
+<li><p><strong>xintexpr</strong>: <code>random()</code>,
+<code>qrand()</code>, and <code>randrange(A[, B])</code>.</p></li>
+<li><p><strong>xintexpr</strong>: when a function <code>foo()</code> is
+declared via <code>\xintdeffunc</code> (et al.) to be parameter-less, it
+can be used as <code>foo()</code>; formerly <code>foo(nil)</code> syntax
+was required.</p></li>
<li><p>The usual provision of user manual “improvements”.</p></li>
</ul>
<h2 id="a-20180307"><code>1.3a (2018/03/07)</code></h2>
<h3 id="removed">Removed</h3>
<ul>
-<li><strong>xintcore</strong>, <strong>xint</strong>, <strong>xintfrac</strong>: removal of the internal macros which were used at <code>1.2o</code> to add a deprecation mechanism; all deprecated macros have been removed at <code>1.3</code> so there was no reason to keep the code used for deprecating them.</li>
+<li><strong>xintcore</strong>, <strong>xint</strong>,
+<strong>xintfrac</strong>: removal of the internal macros which were
+used at <code>1.2o</code> to add a deprecation mechanism; all deprecated
+macros have been removed at <code>1.3</code> so there was no reason to
+keep the code used for deprecating them.</li>
</ul>
-<h3 id="improvements-and-new-features-6">Improvements and new features</h3>
+<h3 id="improvements-and-new-features-6">Improvements and new
+features</h3>
<ul>
-<li><p><strong>xintexpr</strong>: new conditionals <code>ifone()</code> and <code>ifint()</code>.</p></li>
-<li><p><strong>xintfrac</strong>: <code>\xintREZ</code> is faster on inputs having one hundred digits or more.</p></li>
-<li><p>Added to the user manual mention of macros such as <code>\xintDivFloor</code>, <code>\xintMod</code>, <code>\xintModTrunc</code>, which had been left out so far.</p></li>
+<li><p><strong>xintexpr</strong>: new conditionals <code>ifone()</code>
+and <code>ifint()</code>.</p></li>
+<li><p><strong>xintfrac</strong>: <code>\xintREZ</code> is faster on
+inputs having one hundred digits or more.</p></li>
+<li><p>Added to the user manual mention of macros such as
+<code>\xintDivFloor</code>, <code>\xintMod</code>,
+<code>\xintModTrunc</code>, which had been left out so far.</p></li>
</ul>
-<h3 id="bug-fixes-15">Bug fixes</h3>
+<h3 id="bug-fixes-16">Bug fixes</h3>
<ul>
-<li><strong>xintexpr</strong>: the mechanism for adjunction to the expression parsers of user defined functions was refactored and improved at previous release <code>1.3</code>: in particular recursive definitions became possible. But an oversight made these recursive functions quite inefficient (to remain polite.) This release fixes the problem.</li>
+<li><strong>xintexpr</strong>: the mechanism for adjunction to the
+expression parsers of user defined functions was refactored and improved
+at previous release <code>1.3</code>: in particular recursive
+definitions became possible. But an oversight made these recursive
+functions quite inefficient (to remain polite.) This release fixes the
+problem.</li>
</ul>
<h2 id="section-1"><code>1.3 (2018/03/01)</code></h2>
-<h3 id="breaking-changes-8">Breaking changes</h3>
-<ul>
-<li><p><strong>xintcore</strong>, <strong>xint</strong>, <strong>xintfrac</strong>: all macros deprecated at <code>1.2o</code> got removed.</p></li>
-<li><p><strong>xintfrac</strong>: addition and subtraction of <code>a/b</code> and <code>c/d</code> now use the l.c.m. of the denominators. Similarly the macro supporting the modulo operator <code>/:</code> uses a l.c.m. for the denominator of the result.</p></li>
-<li><p><strong>xintexpr</strong>: the addition, subtraction, modulo <code>/:</code>, and the <code>mod()</code> and <code>divmod()</code> functions produce generally smaller denominators (see previous item).</p></li>
-<li><p><strong>xintexpr</strong>: formerly, the internal macros which are internally associated to user-declared functions were using comma separated parameter texts. They now do not use such commas (their meanings, which may again change in future, are written for information to the log under <code>\xintverbosetrue</code>).</p></li>
-</ul>
-<h3 id="improvements-and-new-features-7">Improvements and new features</h3>
+<h3 id="breaking-changes-9">Breaking changes</h3>
<ul>
-<li><p><strong>xintexpr</strong>: user-defined functions may now be of a recursive nature. This was made possible by a refactoring of the <code>\xintNewExpr</code> mechanism. It became both leaner and more extensive than formerly.</p></li>
-<li><p><strong>xintfrac</strong>: new macros <code>\xintPIrr</code> and <code>\xintDecToString</code>. The latter is a backport of a <code>polexpr 0.4</code> utility, and it is to be considered unstable.</p></li>
-<li><p><strong>xintexpr</strong>: new function <code>preduce()</code> associated with <code>\xintPIrr</code>.</p></li>
+<li><p><strong>xintcore</strong>, <strong>xint</strong>,
+<strong>xintfrac</strong>: all macros deprecated at <code>1.2o</code>
+got removed.</p></li>
+<li><p><strong>xintfrac</strong>: addition and subtraction of
+<code>a/b</code> and <code>c/d</code> now use the l.c.m. of the
+denominators. Similarly the macro supporting the modulo operator
+<code>/:</code> uses a l.c.m. for the denominator of the
+result.</p></li>
+<li><p><strong>xintexpr</strong>: the addition, subtraction, modulo
+<code>/:</code>, and the <code>mod()</code> and <code>divmod()</code>
+functions produce generally smaller denominators (see previous
+item).</p></li>
+<li><p><strong>xintexpr</strong>: formerly, the internal macros which
+are internally associated to user-declared functions were using comma
+separated parameter texts. They now do not use such commas (their
+meanings, which may again change in future, are written for information
+to the log under <code>\xintverbosetrue</code>).</p></li>
+</ul>
+<h3 id="improvements-and-new-features-7">Improvements and new
+features</h3>
+<ul>
+<li><p><strong>xintexpr</strong>: user-defined functions may now be of a
+recursive nature. This was made possible by a refactoring of the
+<code>\xintNewExpr</code> mechanism. It became both leaner and more
+extensive than formerly.</p></li>
+<li><p><strong>xintfrac</strong>: new macros <code>\xintPIrr</code> and
+<code>\xintDecToString</code>. The latter is a backport of a
+<code>polexpr 0.4</code> utility, and it is to be considered
+unstable.</p></li>
+<li><p><strong>xintexpr</strong>: new function <code>preduce()</code>
+associated with <code>\xintPIrr</code>.</p></li>
</ul>
<h2 id="q-20180206"><code>1.2q (2018/02/06)</code></h2>
-<h3 id="improvements-and-new-features-8">Improvements and new features</h3>
+<h3 id="improvements-and-new-features-8">Improvements and new
+features</h3>
<ul>
-<li><strong>xintexpr</strong>: tacit multiplication extended to cases such as <code>3!4!5!</code> or <code>(1+2)3</code>.</li>
+<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-16">Bug fixes</h3>
+<h3 id="bug-fixes-17">Bug fixes</h3>
<ul>
-<li><strong>xintcore</strong>: sadly, refactoring at <code>1.2l</code> of subtraction left an extra character in an inner macro causing breakage in some rare circumstances. This should not have escaped our test suite!</li>
+<li><strong>xintcore</strong>: sadly, refactoring at <code>1.2l</code>
+of subtraction left an extra character in an inner macro causing
+breakage in some rare circumstances. This should not have escaped our
+test suite!</li>
</ul>
<h2 id="p-20171205"><code>1.2p (2017/12/05)</code></h2>
-<h3 id="breaking-changes-9">Breaking changes</h3>
-<ul>
-<li><p><strong>xintgcd</strong>: <code>\xintBezout{a}{b}</code>’s output consists of <code>{u}{v}{d}</code> with <code>u*a+v*b==d</code>, with <code>d</code> the GCD. Formerly it was <code>{a}{b}{u}{v}{d}</code>, and with <code>u*a-v*b==d</code>.</p></li>
-<li><p><strong>xintgcd</strong>: <code>\xintBezout{0}{0}</code> expands to <code>{0}{0}{0}</code>. Formerly (since <code>1.2l</code>) it raised <code>InvalidOperation</code>.</p></li>
-<li><p><strong>xintcore</strong>: <code>\xintiiMod</code> is now associated with floored division. The former meaning (associated with truncated division) is available as <code>\xintiiModTrunc</code>.</p></li>
-<li><p><strong>xintfrac</strong>: <code>\xintMod</code> is now associated with floored division. The former meaning is available as <code>\xintModTrunc</code>.</p></li>
-<li><p><strong>xintexpr</strong>: the <code>//</code> operator and its associated modulo <code>'mod'</code> (or <code>/:</code>) now correspond to floored division, like the Python language <code>//</code>, <code>%</code>, and <code>divmod(x, y)</code>. Formerly they had been associated to truncated division. This is breaking change for operands of opposite signs.</p></li>
-</ul>
-<h3 id="improvements-and-new-features-9">Improvements and new features</h3>
+<h3 id="breaking-changes-10">Breaking changes</h3>
<ul>
-<li><p><strong>xinttools</strong>: <code>\xintListWithSep</code>, which had remained unchanged since its introduction at <code>1.04 (2013/04/25)</code>, was rewritten for increased speed.</p></li>
-<li><p><strong>xintexpr</strong>: <code>\xintdefvar</code>’s syntax is extended to allow simultaneous assignments. Examples: <code>\xintdefvar x1, x2, x3 := 1, 3**10, 3**20;</code> or <code>\xintdefiivar A, B := B, A 'mod' B;</code> for already defined variables <code>A</code> and <code>B</code>.</p></li>
-<li><p><strong>xintexpr</strong>: added <code>divmod()</code> to the built-in functions. It is associated with floored division, like the Python language <code>divmod()</code>. Related support macros added to <strong>xintcore</strong>, and <strong>xintfrac</strong>.</p></li>
+<li><p><strong>xintgcd</strong>: <code>\xintBezout{a}{b}</code>’s output
+consists of <code>{u}{v}{d}</code> with <code>u*a+v*b==d</code>, with
+<code>d</code> the GCD. Formerly it was <code>{a}{b}{u}{v}{d}</code>,
+and with <code>u*a-v*b==d</code>.</p></li>
+<li><p><strong>xintgcd</strong>: <code>\xintBezout{0}{0}</code> expands
+to <code>{0}{0}{0}</code>. Formerly (since <code>1.2l</code>) it raised
+<code>InvalidOperation</code>.</p></li>
+<li><p><strong>xintcore</strong>: <code>\xintiiMod</code> is now
+associated with floored division. The former meaning (associated with
+truncated division) is available as
+<code>\xintiiModTrunc</code>.</p></li>
+<li><p><strong>xintfrac</strong>: <code>\xintMod</code> is now
+associated with floored division. The former meaning is available as
+<code>\xintModTrunc</code>.</p></li>
+<li><p><strong>xintexpr</strong>: the <code>//</code> operator and its
+associated modulo <code>'mod'</code> (or <code>/:</code>) now correspond
+to floored division, like the Python language <code>//</code>,
+<code>%</code>, and <code>divmod(x, y)</code>. Formerly they had been
+associated to truncated division. This is breaking change for operands
+of opposite signs.</p></li>
+</ul>
+<h3 id="improvements-and-new-features-9">Improvements and new
+features</h3>
+<ul>
+<li><p><strong>xinttools</strong>: <code>\xintListWithSep</code>, which
+had remained unchanged since its introduction at
+<code>1.04 (2013/04/25)</code>, was rewritten for increased
+speed.</p></li>
+<li><p><strong>xintexpr</strong>: <code>\xintdefvar</code>’s syntax is
+extended to allow simultaneous assignments. Examples:
+<code>\xintdefvar x1, x2, x3 := 1, 3**10, 3**20;</code> or
+<code>\xintdefiivar A, B := B, A 'mod' B;</code> for already defined
+variables <code>A</code> and <code>B</code>.</p></li>
+<li><p><strong>xintexpr</strong>: added <code>divmod()</code> to the
+built-in functions. It is associated with floored division, like the
+Python language <code>divmod()</code>. Related support macros added to
+<strong>xintcore</strong>, and <strong>xintfrac</strong>.</p></li>
</ul>
-<h3 id="bug-fixes-17">Bug fixes</h3>
+<h3 id="bug-fixes-18">Bug fixes</h3>
<ul>
-<li><p><strong>xintgcd</strong>: <code>\xintBezout{6}{3}</code> (for example) expanded to <code>{6}{3}{-0}{-1}{3}</code>, but the <code>-0</code> should have been <code>0</code>.</p></li>
-<li><p><strong>xintgcd</strong>: it still used macro <code>\xintiAbs</code> although the latter had been deprecated from <strong>xintcore</strong>.</p></li>
-<li><p><strong>xintexpr</strong>: in float expressions the <code>//</code> and <code>/:</code> (aka <code>'mod'</code>) operators did not round their operands to the float precision prior to computing with them, contrarily to other infix arithmetic operators and to the <code>mod(f,g)</code> function; thus, <code>mod(f,g)</code> and <code>f 'mod' g</code> were not completely equivalent.</p></li>
-<li><p>various documentation fixes; in particular, the partial dependency of <strong>xintcfrac</strong> on <strong>xinttools</strong> had not been mentioned.</p></li>
+<li><p><strong>xintgcd</strong>: <code>\xintBezout{6}{3}</code> (for
+example) expanded to <code>{6}{3}{-0}{-1}{3}</code>, but the
+<code>-0</code> should have been <code>0</code>.</p></li>
+<li><p><strong>xintgcd</strong>: it still used macro
+<code>\xintiAbs</code> although the latter had been deprecated from
+<strong>xintcore</strong>.</p></li>
+<li><p><strong>xintexpr</strong>: in float expressions the
+<code>//</code> and <code>/:</code> (aka <code>'mod'</code>) operators
+did not round their operands to the float precision prior to computing
+with them, contrarily to other infix arithmetic operators and to the
+<code>mod(f,g)</code> function; thus, <code>mod(f,g)</code> and
+<code>f 'mod' g</code> were not completely equivalent.</p></li>
+<li><p>various documentation fixes; in particular, the partial
+dependency of <strong>xintcfrac</strong> on <strong>xinttools</strong>
+had not been mentioned.</p></li>
</ul>
<h2 id="o-20170829"><code>1.2o (2017/08/29)</code></h2>
-<h3 id="breaking-changes-10">Breaking changes</h3>
+<h3 id="breaking-changes-11">Breaking changes</h3>
<ul>
-<li><strong>xint</strong>: <code>\xintAND</code>, <code>\xintOR</code>, … and similar Boolean logic macros do not apply anymore <code>\xintNum</code> (or <code>\xintRaw</code> if <strong>xintfrac</strong> is loaded), to their arguments (often, from internal usage of <code>\xintSgn</code>), but only f-expand them (using e.g. <code>\xintiiSgn</code>). This is kept un-modified even if loading <strong>xintfrac</strong>.</li>
+<li><strong>xint</strong>: <code>\xintAND</code>, <code>\xintOR</code>,
+… and similar Boolean logic macros do not apply anymore
+<code>\xintNum</code> (or <code>\xintRaw</code> if
+<strong>xintfrac</strong> is loaded), to their arguments (often, from
+internal usage of <code>\xintSgn</code>), but only f-expand them (using
+e.g. <code>\xintiiSgn</code>). This is kept un-modified even if loading
+<strong>xintfrac</strong>.</li>
</ul>
<h3 id="deprecated-1">Deprecated</h3>
-<p>Deprecated macros raise an error but, generally, then expand as in former releases. They will all get removed at some future release.</p>
-<ul>
-<li><p><strong>xintcore</strong>: <code>\xintiOpp</code>, <code>\xintiAbs</code>, <code>\xintiAdd</code>, <code>\xintiSub</code>, <code>\xintiMul</code>, <code>\xintiDivision</code>, <code>\xintiQuo</code>, <code>\xintiRem</code>, <code>\xintiDivRound</code>, <code>\xintiDivTrunc</code>, <code>\xintiMod</code>, <code>\xintiSqr</code>, <code>\xintiPow</code>, and <code>\xintiFac</code> are deprecated. Only the <code>ii</code>-named variants get defined.</p></li>
-<li><p><strong>xintcore</strong>: <code>\xintCmp</code> and <code>\xintSgn</code> are deprecated from <strong>xintcore</strong> (which only defines <code>\xintiiCmp</code> and <code>\xintiiSgn</code>) as they actually belong to <strong>xintfrac</strong>.</p></li>
-<li><p><strong>xintcore</strong>: <code>\xintiiFDg</code>, resp. <code>\xintiiLDg</code>, are renamed <code>\xintFDg</code>, resp. <code>\xintLDg</code>. Former denominations are deprecated.</p></li>
-<li><p><strong>xint</strong>: <code>\xintMON</code>, <code>\xintMMON</code>, <code>\xintiMax</code>, <code>\xintiMin</code>, <code>\xintiMaxof</code>, <code>\xintiMinof</code>, <code>\xintiSquareRoot</code>, <code>\xintiSqrt</code>, <code>\xintiSqrtR</code>, <code>\xintiBinomial</code>, and <code>\xintiPFactorial</code> are deprecated. Only <code>ii</code>-named variants get defined.</p></li>
-<li><p><strong>xint</strong>: <code>\xintEq</code>, <code>\xintGeq</code>, <code>\xintGt</code>, <code>\xintLt</code>, <code>\xintGtorEq</code>, <code>\xintLtorEq</code>, <code>\xintIsZero</code>, <code>\xintIsNotZero</code>, <code>\xintIsOne</code>, <code>\xintOdd</code>, <code>\xintEven</code>, <code>\xintifSgn</code>, <code>\xintifCmp</code>, <code>\xintifEq</code>, <code>\xintifGt</code>, <code>\xintifLt</code>, <code>\xintifZero</code>, <code>\xintifNotZero</code>, <code>\xintifOne</code>, <code>\xintifOdd</code>, are deprecated. These macros belong to <strong>xintfrac</strong>. Package <strong>xint</strong> defines only the <code>ii</code>-named variants.</p></li>
-<li><p><strong>xint</strong>: <code>\xintNeq</code> was renamed to <code>\xintNotEq</code> which however is only provided by <strong>xintfrac</strong>. Package <strong>xint</strong> defines <code>\xintiiNotEq</code>, and <code>\xintNeq</code> is deprecated.</p></li>
-<li><p><strong>xint</strong>: <code>\xintNot</code> was renamed to <code>\xintNOT</code>, former denomination is deprecated. See also item about Boolean logic macros in the <em>Incompatible Changes</em> section.</p></li>
+<p>Deprecated macros raise an error but, generally, then expand as in
+former releases. They will all get removed at some future release.</p>
+<ul>
+<li><p><strong>xintcore</strong>: <code>\xintiOpp</code>,
+<code>\xintiAbs</code>, <code>\xintiAdd</code>, <code>\xintiSub</code>,
+<code>\xintiMul</code>, <code>\xintiDivision</code>,
+<code>\xintiQuo</code>, <code>\xintiRem</code>,
+<code>\xintiDivRound</code>, <code>\xintiDivTrunc</code>,
+<code>\xintiMod</code>, <code>\xintiSqr</code>, <code>\xintiPow</code>,
+and <code>\xintiFac</code> are deprecated. Only the
+<code>ii</code>-named variants get defined.</p></li>
+<li><p><strong>xintcore</strong>: <code>\xintCmp</code> and
+<code>\xintSgn</code> are deprecated from <strong>xintcore</strong>
+(which only defines <code>\xintiiCmp</code> and <code>\xintiiSgn</code>)
+as they actually belong to <strong>xintfrac</strong>.</p></li>
+<li><p><strong>xintcore</strong>: <code>\xintiiFDg</code>, resp.
+<code>\xintiiLDg</code>, are renamed <code>\xintFDg</code>, resp.
+<code>\xintLDg</code>. Former denominations are deprecated.</p></li>
+<li><p><strong>xint</strong>: <code>\xintMON</code>,
+<code>\xintMMON</code>, <code>\xintiMax</code>, <code>\xintiMin</code>,
+<code>\xintiMaxof</code>, <code>\xintiMinof</code>,
+<code>\xintiSquareRoot</code>, <code>\xintiSqrt</code>,
+<code>\xintiSqrtR</code>, <code>\xintiBinomial</code>, and
+<code>\xintiPFactorial</code> are deprecated. Only <code>ii</code>-named
+variants get defined.</p></li>
+<li><p><strong>xint</strong>: <code>\xintEq</code>,
+<code>\xintGeq</code>, <code>\xintGt</code>, <code>\xintLt</code>,
+<code>\xintGtorEq</code>, <code>\xintLtorEq</code>,
+<code>\xintIsZero</code>, <code>\xintIsNotZero</code>,
+<code>\xintIsOne</code>, <code>\xintOdd</code>, <code>\xintEven</code>,
+<code>\xintifSgn</code>, <code>\xintifCmp</code>,
+<code>\xintifEq</code>, <code>\xintifGt</code>, <code>\xintifLt</code>,
+<code>\xintifZero</code>, <code>\xintifNotZero</code>,
+<code>\xintifOne</code>, <code>\xintifOdd</code>, are deprecated. These
+macros belong to <strong>xintfrac</strong>. Package
+<strong>xint</strong> defines only the <code>ii</code>-named
+variants.</p></li>
+<li><p><strong>xint</strong>: <code>\xintNeq</code> was renamed to
+<code>\xintNotEq</code> which however is only provided by
+<strong>xintfrac</strong>. Package <strong>xint</strong> defines
+<code>\xintiiNotEq</code>, and <code>\xintNeq</code> is
+deprecated.</p></li>
+<li><p><strong>xint</strong>: <code>\xintNot</code> was renamed to
+<code>\xintNOT</code>, former denomination is deprecated. See also item
+about Boolean logic macros in the <em>Incompatible Changes</em>
+section.</p></li>
</ul>
<h2 id="n-20170806"><code>1.2n (2017/08/06)</code></h2>
-<h3 id="breaking-changes-11">Breaking changes</h3>
+<h3 id="breaking-changes-12">Breaking changes</h3>
<ul>
-<li><strong>xintbinhex</strong> does not load package <strong>xintcore</strong> anymore, but only <strong>xintkernel</strong>.</li>
+<li><strong>xintbinhex</strong> does not load package
+<strong>xintcore</strong> anymore, but only
+<strong>xintkernel</strong>.</li>
</ul>
-<h3 id="improvements-and-new-features-10">Improvements and new features</h3>
+<h3 id="improvements-and-new-features-10">Improvements and new
+features</h3>
<ul>
-<li><p><strong>xintbinhex</strong> has only <strong>xintkernel</strong> as dependency.</p></li>
-<li><p>Macros of <strong>xintbinhex</strong> have been improved for speed and increased maximal sizes of allowable inputs.</p></li>
+<li><p><strong>xintbinhex</strong> has only <strong>xintkernel</strong>
+as dependency.</p></li>
+<li><p>Macros of <strong>xintbinhex</strong> have been improved for
+speed and increased maximal sizes of allowable inputs.</p></li>
</ul>
<h2 id="m-20170731"><code>1.2m (2017/07/31)</code></h2>
-<h3 id="breaking-changes-12">Breaking changes</h3>
+<h3 id="breaking-changes-13">Breaking changes</h3>
<ul>
-<li><p><strong>xintbinhex</strong>: the length of the input is now limited. The maximum size depends on the macro and ranges from about <code>4000</code> to about <code>19900</code> digits.</p></li>
-<li><p><strong>xintbinhex</strong>: <code>\xintCHexToBin</code> is now the variant of <code>\xintHexToBin</code> which does not remove leading binary zeroes: <code>N</code> hex-digits give on output exactly <code>4N</code> binary digits.</p></li>
+<li><p><strong>xintbinhex</strong>: the length of the input is now
+limited. The maximum size depends on the macro and ranges from about
+<code>4000</code> to about <code>19900</code> digits.</p></li>
+<li><p><strong>xintbinhex</strong>: <code>\xintCHexToBin</code> is now
+the variant of <code>\xintHexToBin</code> which does not remove leading
+binary zeroes: <code>N</code> hex-digits give on output exactly
+<code>4N</code> binary digits.</p></li>
</ul>
-<h3 id="improvements-and-new-features-11">Improvements and new features</h3>
+<h3 id="improvements-and-new-features-11">Improvements and new
+features</h3>
<ul>
-<li><strong>xintbinhex</strong>: all macros have been rewritten using techniques from the 1.2 release (they had remained unmodified since <code>1.08</code> of <code>2013/06/07</code>.) The new macros are faster but limited to a few thousand digits. The <code>1.08</code> routines could handle tens of thousands of digits, but not in a reasonable time.</li>
+<li><strong>xintbinhex</strong>: all macros have been rewritten using
+techniques from the 1.2 release (they had remained unmodified since
+<code>1.08</code> of <code>2013/06/07</code>.) The new macros are faster
+but limited to a few thousand digits. The <code>1.08</code> routines
+could handle tens of thousands of digits, but not in a reasonable
+time.</li>
</ul>
-<h3 id="bug-fixes-18">Bug fixes</h3>
+<h3 id="bug-fixes-19">Bug fixes</h3>
<ul>
-<li><p>user manual: the <code>Changes</code> section wrongly stated at <code>1.2l</code> that the macros of <strong>xintbinhex</strong> had been made robust against non terminated input such as <code>\number\mathcode`\-</code>. Unfortunately the author fell into the trap of believing his own documentation and he forgot to actually implement the change. Now done.</p></li>
+<li><p>user manual: the <code>Changes</code> section wrongly stated at
+<code>1.2l</code> that the macros of <strong>xintbinhex</strong> had
+been made robust against non terminated input such as
+<code>\number\mathcode`\-</code>. Unfortunately the author fell into the
+trap of believing his own documentation and he forgot to actually
+implement the change. Now done.</p></li>
<li><p>user manual: the PDF bookmarks were messed up.</p></li>
-<li><p><strong>xint</strong>, <strong>xintfrac</strong>: <code>\xintGeq</code>, <code>\xintMax</code>, <code>\xintMin</code>, suffered from some extra overhead. This was caused by use of some auxiliaries from the very early days which got redefined at some stage. This is fixed here with some additional efficiency improvements and pruning of old code.</p></li>
+<li><p><strong>xint</strong>, <strong>xintfrac</strong>:
+<code>\xintGeq</code>, <code>\xintMax</code>, <code>\xintMin</code>,
+suffered from some extra overhead. This was caused by use of some
+auxiliaries from the very early days which got redefined at some stage.
+This is fixed here with some additional efficiency improvements and
+pruning of old code.</p></li>
</ul>
<h2 id="l-20170726"><code>1.2l (2017/07/26)</code></h2>
<h3 id="removed-1">Removed</h3>
<ul>
-<li><p><code>\xintiiSumExpr</code>, <code>\xintiiPrdExpr</code> (<strong>xint</strong>) and <code>\xintSumExpr</code>, <code>\xintPrdExpr</code> (<strong>xintfrac</strong>). They had not been formally deprecated, but had been left un-documented since <code>1.09d (2013/10/22)</code>.</p></li>
-<li><p>internal macro <code>\xint_gob_til_xint_relax</code> removed.</p></li>
+<li><p><code>\xintiiSumExpr</code>, <code>\xintiiPrdExpr</code>
+(<strong>xint</strong>) and <code>\xintSumExpr</code>,
+<code>\xintPrdExpr</code> (<strong>xintfrac</strong>). They had not been
+formally deprecated, but had been left un-documented since
+<code>1.09d (2013/10/22)</code>.</p></li>
+<li><p>internal macro <code>\xint_gob_til_xint_relax</code>
+removed.</p></li>
+</ul>
+<h3 id="improvements-and-new-features-12">Improvements and new
+features</h3>
+<ul>
+<li><p>the underscore character <code>_</code> is accepted by the
+<strong>xintexpr</strong> parsers as a digit separator (the space
+character already could be used for improved readability of big
+numbers). It is not allowed as <em>first</em> character of a number, as
+it would then be mis-interpreted as the start of a possible variable
+name.</p></li>
+<li><p>some refactoring in <strong>xintcore</strong> auxiliary routines
+and in <code>\xintiiSub</code> and <code>\xintiiCmp</code> for some
+small efficiency gains.</p></li>
+<li><p>code comments in <strong>xintcore</strong> are better formatted,
+but remain sparse.</p></li>
+<li><p><strong>xintcore</strong>, <strong>xint</strong>,
+<strong>xintfrac</strong>, … : some macros were not robust against
+arguments whose expansion looks forward for some termination
+(e.g. <code>\number\mathcode`\-</code>), and particularly, most were
+fragile against inputs using non-terminated <code>\numexpr</code> (such
+as <code>\xintiiAdd{\the\numexpr1}{2}</code> or
+<code>\xintRaw{\numexpr1}</code>). This was not a bug per se, as the
+user manual did not claim such inputs were legal, but it was slightly
+inconvenient. Most macros (particularly those of
+<strong>xintfrac</strong>) have now been made robust against such
+inputs. Some macros from <strong>xintcore</strong> primarily destined to
+internal usage still accept only properly terminated arguments such as
+<code>\the\mathcode`\-&lt;space&gt;</code> or
+<code>\the\numexpr1\relax</code>.</p>
+<p>The situation with expressions is unchanged: syntax such as
+<code>\xintexpr \numexpr1+2\relax</code> is illegal as the ending
+<code>\relax</code> token will get swallowed by the
+<code>\numexpr</code>; but it is needed by the
+<code>xintexpr</code>-ession parser, hence the parser will expand
+forward and presumably end with in an “illegal token” error, or provoke
+some low-level TeX error (N.B.: a closing brace <code>}</code> for
+example can not terminate an <code>xintexpr</code>-ession, the parser
+must find a <code>\relax</code> token at some point). Thus there must be
+in this example a second <code>\relax</code>.</p></li>
+<li><p>experimental code for error conditions; there is no complete user
+interface yet, it is done in preparation for next major release and is
+completely unstable and undocumented.</p></li>
</ul>
-<h3 id="improvements-and-new-features-12">Improvements and new features</h3>
-<ul>
-<li><p>the underscore character <code>_</code> is accepted by the <strong>xintexpr</strong> parsers as a digit separator (the space character already could be used for improved readability of big numbers). It is not allowed as <em>first</em> character of a number, as it would then be mis-interpreted as the start of a possible variable name.</p></li>
-<li><p>some refactoring in <strong>xintcore</strong> auxiliary routines and in <code>\xintiiSub</code> and <code>\xintiiCmp</code> for some small efficiency gains.</p></li>
-<li><p>code comments in <strong>xintcore</strong> are better formatted, but remain sparse.</p></li>
-<li><p><strong>xintcore</strong>, <strong>xint</strong>, <strong>xintfrac</strong>, … : some macros were not robust against arguments whose expansion looks forward for some termination (e.g. <code>\number\mathcode`\-</code>), and particularly, most were fragile against inputs using non-terminated <code>\numexpr</code> (such as <code>\xintiiAdd{\the\numexpr1}{2}</code> or <code>\xintRaw{\numexpr1}</code>). This was not a bug per se, as the user manual did not claim such inputs were legal, but it was slightly inconvenient. Most macros (particularly those of <strong>xintfrac</strong>) have now been made robust against such inputs. Some macros from <strong>xintcore</strong> primarily destined to internal usage still accept only properly terminated arguments such as <code>\the\mathcode`\-&lt;space&gt;</code> or <code>\the\numexpr1\relax</code>.</p>
-<p>The situation with expressions is unchanged: syntax such as <code>\xintexpr \numexpr1+2\relax</code> is illegal as the ending <code>\relax</code> token will get swallowed by the <code>\numexpr</code>; but it is needed by the <code>xintexpr</code>-ession parser, hence the parser will expand forward and presumably end with in an “illegal token” error, or provoke some low-level TeX error (N.B.: a closing brace <code>}</code> for example can not terminate an <code>xintexpr</code>-ession, the parser must find a <code>\relax</code> token at some point). Thus there must be in this example a second <code>\relax</code>.</p></li>
-<li><p>experimental code for error conditions; there is no complete user interface yet, it is done in preparation for next major release and is completely unstable and undocumented.</p></li>
-</ul>
-<h3 id="bug-fixes-19">Bug fixes</h3>
+<h3 id="bug-fixes-20">Bug fixes</h3>
<ul>
-<li><p><strong>xintbinhex</strong>: since <code>1.2 (2015/10/10)</code>, <code>\xintHexToDec</code> was broken due to an undefined macro (it was in <code>xint.sty</code>, but the module by itself is supposedly dependent only upon <code>xintcore.sty</code>).</p></li>
-<li><p><strong>xintgcd</strong>: macro <code>\xintBezout</code> produced partially wrong output if one of its two arguments was zero.</p></li>
-<li><p><strong>xintfrac</strong>: the manual said one could use directly <code>\numexpr</code> compatible expressions in arithmetic macros (without even a <code>\numexpr</code> encapsulation) if they were expressed with up to 8 tokens. There was a bug if these 8 tokens evaluated to zero. The bug has been fixed, and up to 9 tokens are now accepted. But it is simpler to use <code>\the\numexpr</code> prefix and not to worry about the token count… The ending <code>\relax</code> is now un-needed.</p></li>
+<li><p><strong>xintbinhex</strong>: since <code>1.2 (2015/10/10)</code>,
+<code>\xintHexToDec</code> was broken due to an undefined macro (it was
+in <code>xint.sty</code>, but the module by itself is supposedly
+dependent only upon <code>xintcore.sty</code>).</p></li>
+<li><p><strong>xintgcd</strong>: macro <code>\xintBezout</code> produced
+partially wrong output if one of its two arguments was zero.</p></li>
+<li><p><strong>xintfrac</strong>: the manual said one could use directly
+<code>\numexpr</code> compatible expressions in arithmetic macros
+(without even a <code>\numexpr</code> encapsulation) if they were
+expressed with up to 8 tokens. There was a bug if these 8 tokens
+evaluated to zero. The bug has been fixed, and up to 9 tokens are now
+accepted. But it is simpler to use <code>\the\numexpr</code> prefix and
+not to worry about the token count… The ending <code>\relax</code> is
+now un-needed.</p></li>
</ul>
<h2 id="k-20170106"><code>1.2k (2017/01/06)</code></h2>
-<h3 id="breaking-changes-13">Breaking changes</h3>
-<ul>
-<li><p>macro <code>\xintFloat</code> which rounds its input to a floating point number does <em>not</em> print anymore <code>10.0...0eN</code> to signal an upwards rounding to the next power of ten. The mantissa has in all cases except the zero input exactly one digit before the decimal mark.</p></li>
-<li><p>some floating point computations may differ in the least significant digits, due to a change in the rounding algorithm applied to macro arguments expressed as fractions and to an improvement in precision regarding half-integer powers in expressions. See next.</p></li>
-</ul>
-<h3 id="improvements-and-new-features-13">Improvements and new features</h3>
+<h3 id="breaking-changes-14">Breaking changes</h3>
<ul>
-<li><p>the initial rounding to the target precision <code>P</code> which is applied by the floating point macros from <strong>xintfrac</strong> to their arguments achieves the <em>exact (aka correct) rounding</em> even for inputs which are fractions with more than <code>P+2</code> digits in their numerators and denominators (<code>&gt;1</code>.) Hence the computed values depend only on the arguments as rational numbers and not upon their representatives. This is not relevant to <em>expressions</em> (<strong>xintexpr</strong>), because the <code>\xintfloatexpr</code> parser sees there <code>/</code> as an operator and does not (apart from special constructs) get to manipulate fractions as such.</p></li>
-<li><p><code>\xintnewdummy</code> is public interface to a <code>1.2e</code> macro which serves to declare any given catcode 11 character as a dummy variable for expressions (<strong>xintexpr</strong>). This is useful for Unicode engines (the Latin letters being already all pre-declared as dummy variables.)</p></li>
-<li><p>added <code>\xintiSqrtR</code>, there was only <code>\xintiiSqrtR</code> alongside <code>\xintiSqrt</code> and <code>\xintiiSqrt</code> (<strong>xint</strong>).</p></li>
-<li><p>added non public <code>\xintLastItem:f:csv</code> to <strong>xinttools</strong> for faster <code>last()</code> function, and improved <code>\xintNewExpr</code> compatibility. Also <code>\xintFirstItem:f:csv</code>.</p></li>
+<li><p>macro <code>\xintFloat</code> which rounds its input to a
+floating point number does <em>not</em> print anymore
+<code>10.0...0eN</code> to signal an upwards rounding to the next power
+of ten. The mantissa has in all cases except the zero input exactly one
+digit before the decimal mark.</p></li>
+<li><p>some floating point computations may differ in the least
+significant digits, due to a change in the rounding algorithm applied to
+macro arguments expressed as fractions and to an improvement in
+precision regarding half-integer powers in expressions. See
+next.</p></li>
+</ul>
+<h3 id="improvements-and-new-features-13">Improvements and new
+features</h3>
+<ul>
+<li><p>the initial rounding to the target precision <code>P</code> which
+is applied by the floating point macros from <strong>xintfrac</strong>
+to their arguments achieves the <em>exact (aka correct) rounding</em>
+even for inputs which are fractions with more than <code>P+2</code>
+digits in their numerators and denominators (<code>&gt;1</code>.) Hence
+the computed values depend only on the arguments as rational numbers and
+not upon their representatives. This is not relevant to
+<em>expressions</em> (<strong>xintexpr</strong>), because the
+<code>\xintfloatexpr</code> parser sees there <code>/</code> as an
+operator and does not (apart from special constructs) get to manipulate
+fractions as such.</p></li>
+<li><p><code>\xintnewdummy</code> is public interface to a
+<code>1.2e</code> macro which serves to declare any given catcode 11
+character as a dummy variable for expressions
+(<strong>xintexpr</strong>). This is useful for Unicode engines (the
+Latin letters being already all pre-declared as dummy
+variables.)</p></li>
+<li><p>added <code>\xintiSqrtR</code>, there was only
+<code>\xintiiSqrtR</code> alongside <code>\xintiSqrt</code> and
+<code>\xintiiSqrt</code> (<strong>xint</strong>).</p></li>
+<li><p>added non public <code>\xintLastItem:f:csv</code> to
+<strong>xinttools</strong> for faster <code>last()</code> function, and
+improved <code>\xintNewExpr</code> compatibility. Also
+<code>\xintFirstItem:f:csv</code>.</p></li>
</ul>
-<h3 id="bug-fixes-20">Bug fixes</h3>
+<h3 id="bug-fixes-21">Bug fixes</h3>
<ul>
-<li><p>the <code>1.2f</code> half-integer powers computed within <code>\xintfloatexpr</code> had a silly rounding to the target precision just <em>before</em> the final square-root extraction, thus possibly losing some precision. The <code>1.2k</code> implementation keeps guard digits for this final square root extraction. As for integer exponents, it is guaranteed that the computed value differs from the exact one by less than <code>0.52 ulp</code> (for inputs having at most <code>\xinttheDigits</code> digits.)</p></li>
-<li><p>more regressions from <code>1.2i</code> were fixed: <code>\xintLen</code> (<strong>xint</strong>, <strong>xintfrac</strong>) and <code>\xintDouble</code> (<strong>xintcore</strong>) had forgotten that their argument was allowed to be negative. A regression test suite is now in place and is being slowly expanded to cover more macros.</p></li>
-<li><p><code>\xintiiSquareRoot{0}</code> now produces <code>{1}{1}</code>, which fits better the general documented behaviour of this macro than <code>11</code>.</p></li>
+<li><p>the <code>1.2f</code> half-integer powers computed within
+<code>\xintfloatexpr</code> had a silly rounding to the target precision
+just <em>before</em> the final square-root extraction, thus possibly
+losing some precision. The <code>1.2k</code> implementation keeps guard
+digits for this final square root extraction. As for integer exponents,
+it is guaranteed that the computed value differs from the exact one by
+less than <code>0.52 ulp</code> (for inputs having at most
+<code>\xinttheDigits</code> digits.)</p></li>
+<li><p>more regressions from <code>1.2i</code> were fixed:
+<code>\xintLen</code> (<strong>xint</strong>, <strong>xintfrac</strong>)
+and <code>\xintDouble</code> (<strong>xintcore</strong>) had forgotten
+that their argument was allowed to be negative. A regression test suite
+is now in place and is being slowly expanded to cover more
+macros.</p></li>
+<li><p><code>\xintiiSquareRoot{0}</code> now produces
+<code>{1}{1}</code>, which fits better the general documented behaviour
+of this macro than <code>11</code>.</p></li>
</ul>
<h2 id="j-20161222"><code>1.2j (2016/12/22)</code></h2>
-<h3 id="improvements-and-new-features-14">Improvements and new features</h3>
+<h3 id="improvements-and-new-features-14">Improvements and new
+features</h3>
<ul>
<li><p><strong>xinttools</strong> and <strong>xintexpr</strong>:</p>
<ol type="1">
<li><p>slightly improves the speed of <code>\xintTrim</code>.</p></li>
-<li><p>speed gains for the handlers of comma separated lists implementing Python-like slicing and item extraction. Relevant non (user) documented macros better documented in <code>sourcexint.pdf</code>.</p></li>
+<li><p>speed gains for the handlers of comma separated lists
+implementing Python-like slicing and item extraction. Relevant non
+(user) documented macros better documented in
+<code>sourcexint.pdf</code>.</p></li>
</ol></li>
-<li><p>significant documentations tweaks (inclusive of suppressing things!), and among them two beautiful hyperlinked tables with both horizontal and vertical rules which bring the documentation of the <strong>xintexpr</strong> syntax to a kind of awe-inspiring perfection… except that implementation of some math functions is still lacking.</p></li>
+<li><p>significant documentations tweaks (inclusive of suppressing
+things!), and among them two beautiful hyperlinked tables with both
+horizontal and vertical rules which bring the documentation of the
+<strong>xintexpr</strong> syntax to a kind of awe-inspiring perfection…
+except that implementation of some math functions is still
+lacking.</p></li>
</ul>
-<h3 id="bug-fixes-21">Bug fixes</h3>
+<h3 id="bug-fixes-22">Bug fixes</h3>
<ul>
-<li>fix two <code>1.2i</code> regressions caused by undefined macros (<code>\xintNthElt</code> in certain branches and <code>[list][N]</code> item extraction in certain cases.) The test files existed but were not executed prior to release. Automation in progress.</li>
+<li>fix two <code>1.2i</code> regressions caused by undefined macros
+(<code>\xintNthElt</code> in certain branches and <code>[list][N]</code>
+item extraction in certain cases.) The test files existed but were not
+executed prior to release. Automation in progress.</li>
</ul>
<h2 id="i-20161213"><code>1.2i (2016/12/13)</code></h2>
-<h3 id="breaking-changes-14">Breaking changes</h3>
+<h3 id="breaking-changes-15">Breaking changes</h3>
<ul>
-<li><code>\xintDecSplit</code> second argument must have no sign (former code replaced it with its absolute value, a sign now may cause an error.)</li>
+<li><code>\xintDecSplit</code> second argument must have no sign (former
+code replaced it with its absolute value, a sign now may cause an
+error.)</li>
</ul>
<h3 id="removed-2">Removed</h3>
<ul>
-<li>deprecated macros <code>\xintifTrue</code>, <code>\xintifTrueFalse</code>, <code>\xintQuo</code>, <code>\xintRem</code>, <code>\xintquo</code>, <code>\xintrem</code>.</li>
+<li>deprecated macros <code>\xintifTrue</code>,
+<code>\xintifTrueFalse</code>, <code>\xintQuo</code>,
+<code>\xintRem</code>, <code>\xintquo</code>,
+<code>\xintrem</code>.</li>
</ul>
-<h3 id="improvements-and-new-features-15">Improvements and new features</h3>
+<h3 id="improvements-and-new-features-15">Improvements and new
+features</h3>
<ul>
-<li><p><strong>xintkernel</strong>: <code>\xintLength</code> is faster. New macros:</p>
+<li><p><strong>xintkernel</strong>: <code>\xintLength</code> is faster.
+New macros:</p>
<ul>
-<li><p><code>\xintLastItem</code> to fetch the last item from its argument,</p></li>
-<li><p><code>\romannumeral\xintgobble</code> for gobbling many (up to 531440) upstream braced items or tokens.</p></li>
-<li><p><code>\romannumeral\xintreplicate</code> which is copied over from the expl3 <code>\prg_replicate:nn</code> with some minor changes.</p></li>
+<li><p><code>\xintLastItem</code> to fetch the last item from its
+argument,</p></li>
+<li><p><code>\romannumeral\xintgobble</code> for gobbling many (up to
+531440) upstream braced items or tokens.</p></li>
+<li><p><code>\romannumeral\xintreplicate</code> which is copied over
+from the expl3 <code>\prg_replicate:nn</code> with some minor
+changes.</p></li>
</ul></li>
-<li><p><strong>xinttools</strong>: general token list handling routines <code>\xintKeep</code>, <code>\xintTrim</code> and <code>\xintNthElt</code> are faster; but the novel <code>\xintTrim</code> can only remove up to a maximum of 531440 items.</p>
-<p>Also, <code>\xintFor</code> partially improves on some issues which are reported upon in the documentation.</p></li>
-<li><p>some old macros have been rewritten entirely or partially using techniques which <strong>xint</strong> started using in release <code>1.2</code>:</p>
-<ul>
-<li><p><strong>xintcore</strong>: <code>\xintDouble</code>, <code>\xintHalf</code>, <code>\xintInc</code>, <code>\xintDec</code>, <code>\xintiiLDg</code>, <code>\xintDSR</code> (originally from <strong>xint</strong>), a novel <code>\xintDSRr</code>.</p></li>
-<li><p><strong>xint</strong>: <code>\xintDSH</code>, <code>\xintDSx</code>, <code>\xintDecSplit</code>, <code>\xintiiE</code>.</p></li>
-<li><p><strong>xintfrac</strong>: as a result of the above <code>\xintTrunc</code>, <code>\xintRound</code> and <code>\xintXTrunc</code> got faster. But the main improvement for them is with decimal inputs which formerly had not been treated separately from the general fraction case. Also, <code>\xintXTrunc</code> does not anymore create a dependency of <strong>xintfrac</strong> on <strong>xinttools</strong>.</p></li>
+<li><p><strong>xinttools</strong>: general token list handling routines
+<code>\xintKeep</code>, <code>\xintTrim</code> and
+<code>\xintNthElt</code> are faster; but the novel
+<code>\xintTrim</code> can only remove up to a maximum of 531440
+items.</p>
+<p>Also, <code>\xintFor</code> partially improves on some issues which
+are reported upon in the documentation.</p></li>
+<li><p>some old macros have been rewritten entirely or partially using
+techniques which <strong>xint</strong> started using in release
+<code>1.2</code>:</p>
+<ul>
+<li><p><strong>xintcore</strong>: <code>\xintDouble</code>,
+<code>\xintHalf</code>, <code>\xintInc</code>, <code>\xintDec</code>,
+<code>\xintiiLDg</code>, <code>\xintDSR</code> (originally from
+<strong>xint</strong>), a novel <code>\xintDSRr</code>.</p></li>
+<li><p><strong>xint</strong>: <code>\xintDSH</code>,
+<code>\xintDSx</code>, <code>\xintDecSplit</code>,
+<code>\xintiiE</code>.</p></li>
+<li><p><strong>xintfrac</strong>: as a result of the above
+<code>\xintTrunc</code>, <code>\xintRound</code> and
+<code>\xintXTrunc</code> got faster. But the main improvement for them
+is with decimal inputs which formerly had not been treated separately
+from the general fraction case. Also, <code>\xintXTrunc</code> does not
+anymore create a dependency of <strong>xintfrac</strong> on
+<strong>xinttools</strong>.</p></li>
</ul></li>
-<li><p>the documentation has again been (slightly) re-organized; it has a new sub-section on the Miller-Rabin primality test, to illustrate some use of <code>\xintNewFunction</code> for recursive definitions.</p></li>
-<li><p>the documentation has dropped the LaTeX “command” terminology (which had been used initially in 2013 for some forgotten reasons and should have been removed long ago) and uses only the more apt “macro”, as after all, all of <strong>xint</strong> is about expansion of macros (plus the use of <code>\numexpr</code>).</p></li>
+<li><p>the documentation has again been (slightly) re-organized; it has
+a new sub-section on the Miller-Rabin primality test, to illustrate some
+use of <code>\xintNewFunction</code> for recursive definitions.</p></li>
+<li><p>the documentation has dropped the LaTeX “command” terminology
+(which had been used initially in 2013 for some forgotten reasons and
+should have been removed long ago) and uses only the more apt “macro”,
+as after all, all of <strong>xint</strong> is about expansion of macros
+(plus the use of <code>\numexpr</code>).</p></li>
</ul>
-<h3 id="bug-fixes-22">Bug fixes</h3>
+<h3 id="bug-fixes-23">Bug fixes</h3>
<ul>
-<li><code>\xintDecSplitL</code> and <code>\xintDecSplitR</code> from <strong>xint</strong> produced their output in a spurious brace pair (bug introduced in <code>1.2f</code>).</li>
+<li><code>\xintDecSplitL</code> and <code>\xintDecSplitR</code> from
+<strong>xint</strong> produced their output in a spurious brace pair
+(bug introduced in <code>1.2f</code>).</li>
</ul>
<h2 id="h-20161120"><code>1.2h (2016/11/20)</code></h2>
-<h3 id="improvements-and-new-features-16">Improvements and new features</h3>
-<ul>
-<li><p>new macro <code>\xintNewFunction</code> in <strong>xintexpr</strong> which allows to extend the parser syntax with functions in situations where <code>\xintdeffunc</code> is not usable (typically, because dummy variables are used over a not yet determined range of values because it depends on the variables).</p></li>
-<li><p>after three years of strict obedience to <code>xint</code> prefix, now <code>\thexintexpr</code>, <code>\thexintiexpr</code>, <code>\thexintfloatexpr</code>, and <code>\thexintiiexpr</code> are provided as synonyms to <code>\xinttheexpr</code>, etc…</p></li>
+<h3 id="improvements-and-new-features-16">Improvements and new
+features</h3>
+<ul>
+<li><p>new macro <code>\xintNewFunction</code> in
+<strong>xintexpr</strong> which allows to extend the parser syntax with
+functions in situations where <code>\xintdeffunc</code> is not usable
+(typically, because dummy variables are used over a not yet determined
+range of values because it depends on the variables).</p></li>
+<li><p>after three years of strict obedience to <code>xint</code>
+prefix, now <code>\thexintexpr</code>, <code>\thexintiexpr</code>,
+<code>\thexintfloatexpr</code>, and <code>\thexintiiexpr</code> are
+provided as synonyms to <code>\xinttheexpr</code>, etc…</p></li>
</ul>
-<h3 id="bug-fixes-23">Bug fixes</h3>
+<h3 id="bug-fixes-24">Bug fixes</h3>
<ul>
-<li><p>the <code>(cond)?{foo}{bar}</code> operator from <strong>xintexpr</strong> mis-behaved in certain circumstances (such as an empty <code>foo</code>).</p></li>
-<li><p>the <strong>xintexpr</strong> <code>1.2f</code> <code>binomial</code> function (which uses <code>\xintiiBinomial</code> from <strong>xint.sty</strong> or <code>\xintFloatBinomial</code> from <strong>xintfrac.sty</strong>) deliberately raised an error for <code>binomial(x,y)</code> with <code>y&lt;0</code> or <code>x&lt;y</code>. This was unfortunate, and it now simply evaluates to zero in such cases.</p></li>
-<li><p>similarly the <code>pfactorial</code> function was very strict and <code>pfactorial(x,y)</code> deliberately raised an out-of-range error if not used with non-negative integers with <code>x</code> less than <code>y</code>. It now avoids doing that and allows negative arguments.</p></li>
-<li><p>the <code>add</code> and <code>mul</code> from <strong>xintexpr</strong>, which work with dummy variables since <code>1.1</code>, raised an error since <code>1.2c 2015/11/16</code> when the dummy variable was given an empty range (or list) of values, rather than producing respectively <code>0</code> and <code>1</code> as formerly.</p></li>
+<li><p>the <code>(cond)?{foo}{bar}</code> operator from
+<strong>xintexpr</strong> mis-behaved in certain circumstances (such as
+an empty <code>foo</code>).</p></li>
+<li><p>the <strong>xintexpr</strong> <code>1.2f</code>
+<code>binomial</code> function (which uses <code>\xintiiBinomial</code>
+from <strong>xint.sty</strong> or <code>\xintFloatBinomial</code> from
+<strong>xintfrac.sty</strong>) deliberately raised an error for
+<code>binomial(x,y)</code> with <code>y&lt;0</code> or
+<code>x&lt;y</code>. This was unfortunate, and it now simply evaluates
+to zero in such cases.</p></li>
+<li><p>similarly the <code>pfactorial</code> function was very strict
+and <code>pfactorial(x,y)</code> deliberately raised an out-of-range
+error if not used with non-negative integers with <code>x</code> less
+than <code>y</code>. It now avoids doing that and allows negative
+arguments.</p></li>
+<li><p>the <code>add</code> and <code>mul</code> from
+<strong>xintexpr</strong>, which work with dummy variables since
+<code>1.1</code>, raised an error since <code>1.2c 2015/11/16</code>
+when the dummy variable was given an empty range (or list) of values,
+rather than producing respectively <code>0</code> and <code>1</code> as
+formerly.</p></li>
</ul>
<h2 id="g-20160319"><code>1.2g (2016/03/19)</code></h2>
-<h3 id="breaking-changes-15">Breaking changes</h3>
-<ul>
-<li><p>inside expressions, list item selector <code>[L][n]</code> counts starting at zero, not at one. This is more coherent with <code>[L][a:b]</code> which was already exactly like in Python since its introduction. A function len(L) replaces earlier <code>[L][0]</code>.</p></li>
-<li><p>former <code>iter</code> keyword now called <code>iterr</code>. Indeed it matched with <code>rrseq</code>, the new <code>iter</code> (which was somehow missing from <code>1.1</code>) is the one matching <code>rseq</code>. Allows to iterate more easily with a “list” variable.</p></li>
-</ul>
-<h3 id="improvements-and-new-features-17">Improvements and new features</h3>
-<ul>
-<li><p>in <strong>xintexpr.sty</strong>: list selectors <code>[L][n]</code> and <code>[L][a:b]</code> are more efficient: the earlier <code>1.1</code> routines did back and forth conversions from comma separated values to braced tokens, the <code>1.2g</code> routines use macros from <strong>xinttools.sty</strong> handling directly the encountered lists of comma separated values.</p></li>
-<li><p>in <strong>xinttools.sty</strong>: slight improvements in the efficiency of the <code>\xintNthElt</code>, <code>\xintKeep</code>, <code>\xintTrim</code> routines and new routines handling directly comma separated values. The latter are not included in the user manual (they are not <code>\long</code>, they don’t make efforts to preserve some braces, do not worry about spaces, all those worries being irrelevant to the use in expressions for list selectors).</p></li>
-<li><p>a slight speed improvement to <code>\xintFloatSqrt</code> in its quest of correct rounding.</p></li>
-<li><p>float multiplication and division handle more swiftly operands (non-fractional) with few digits, when the float precision is large.</p></li>
-<li><p>the syntax of expressions is described in a devoted chapter of the documentation; an example shows how to implement (expandably) the Brent-Salamin algorithm for computation of Pi using <code>iter</code> in a float expression.</p></li>
-</ul>
-<h2 id="f-20160312"><code>1.2f (2016/03/12)</code></h2>
<h3 id="breaking-changes-16">Breaking changes</h3>
<ul>
-<li>no more <code>\xintFac</code> macro but <code>\xintiFac/\xintiiFac/\xintFloatFac</code>.</li>
+<li><p>inside expressions, list item selector <code>[L][n]</code> counts
+starting at zero, not at one. This is more coherent with
+<code>[L][a:b]</code> which was already exactly like in Python since its
+introduction. A function len(L) replaces earlier
+<code>[L][0]</code>.</p></li>
+<li><p>former <code>iter</code> keyword now called <code>iterr</code>.
+Indeed it matched with <code>rrseq</code>, the new <code>iter</code>
+(which was somehow missing from <code>1.1</code>) is the one matching
+<code>rseq</code>. Allows to iterate more easily with a “list”
+variable.</p></li>
+</ul>
+<h3 id="improvements-and-new-features-17">Improvements and new
+features</h3>
+<ul>
+<li><p>in <strong>xintexpr.sty</strong>: list selectors
+<code>[L][n]</code> and <code>[L][a:b]</code> are more efficient: the
+earlier <code>1.1</code> routines did back and forth conversions from
+comma separated values to braced tokens, the <code>1.2g</code> routines
+use macros from <strong>xinttools.sty</strong> handling directly the
+encountered lists of comma separated values.</p></li>
+<li><p>in <strong>xinttools.sty</strong>: slight improvements in the
+efficiency of the <code>\xintNthElt</code>, <code>\xintKeep</code>,
+<code>\xintTrim</code> routines and new routines handling directly comma
+separated values. The latter are not included in the user manual (they
+are not <code>\long</code>, they don’t make efforts to preserve some
+braces, do not worry about spaces, all those worries being irrelevant to
+the use in expressions for list selectors).</p></li>
+<li><p>a slight speed improvement to <code>\xintFloatSqrt</code> in its
+quest of correct rounding.</p></li>
+<li><p>float multiplication and division handle more swiftly operands
+(non-fractional) with few digits, when the float precision is
+large.</p></li>
+<li><p>the syntax of expressions is described in a devoted chapter of
+the documentation; an example shows how to implement (expandably) the
+Brent-Salamin algorithm for computation of Pi using <code>iter</code> in
+a float expression.</p></li>
</ul>
-<h3 id="improvements-and-new-features-18">Improvements and new features</h3>
+<h2 id="f-20160312"><code>1.2f (2016/03/12)</code></h2>
+<h3 id="breaking-changes-17">Breaking changes</h3>
<ul>
-<li><p>functions <code>binomial</code>, <code>pfactorial</code> and <code>factorial</code> in both integer and float versions.</p></li>
-<li><p>macros <code>\xintiiBinomial</code>, <code>\xintiiPFactorial</code> (<strong>xint.sty</strong>) and <code>\xintFloatBinomial</code>, <code>\xintFloatPFactorial</code> (<strong>xintfrac.sty</strong>). Improvements to <code>\xintFloatFac</code>.</p></li>
-<li><p>faster implementation and increased accuracy of float power macros. Half-integer exponents are now accepted inside float expressions.</p></li>
-<li><p>faster implementation of both integral and float square root macros.</p></li>
-<li><p>the float square root achieves <em>correct</em> (aka <em>exact</em>) rounding in arbitrary precision.</p></li>
-<li><p>modified behaviour for the <code>\xintPFloat</code> macro, used by <code>\xintthefloatexpr</code> to prettify its output. It now opts for decimal notation if and only if scientific notation would use an exponent between <code>-5</code> and <code>5</code> inclusive. The zero value is printed <code>0.</code> with a dot.</p></li>
-<li><p>the float macros for addition, subtraction, multiplication, division now first round their two operands to P, not P+2, significant places before doing the actual computation (P being the target precision). The same applies to the power macros and to the square root macro.</p></li>
-<li><p>the documentation offers a more precise (and accurate) discussion of floating point issues.</p></li>
-<li><p>various under-the-hood code improvements; the floatexpr operations are chained in a faster way, from skipping some unneeded parsing on results of earlier computations. The absence of a real inner data structure for floats (incorporating their precisions, for one) is however still a bit hair raising: currently the lengths of the mantissas of the operands are computed again by each float macro or expression operation.</p></li>
-<li><p>(TeXperts only) the macros defined (internally) from <code>\xintdeffunc</code> et al. constructs do not incorporate an initial <code>\romannumeral</code> anymore.</p></li>
-<li><p>renewed desperate efforts at improving the documentation by random shuffling of sections and well thought additions; cuts were considered and even performed.</p></li>
+<li>no more <code>\xintFac</code> macro but
+<code>\xintiFac/\xintiiFac/\xintFloatFac</code>.</li>
+</ul>
+<h3 id="improvements-and-new-features-18">Improvements and new
+features</h3>
+<ul>
+<li><p>functions <code>binomial</code>, <code>pfactorial</code> and
+<code>factorial</code> in both integer and float versions.</p></li>
+<li><p>macros <code>\xintiiBinomial</code>,
+<code>\xintiiPFactorial</code> (<strong>xint.sty</strong>) and
+<code>\xintFloatBinomial</code>, <code>\xintFloatPFactorial</code>
+(<strong>xintfrac.sty</strong>). Improvements to
+<code>\xintFloatFac</code>.</p></li>
+<li><p>faster implementation and increased accuracy of float power
+macros. Half-integer exponents are now accepted inside float
+expressions.</p></li>
+<li><p>faster implementation of both integral and float square root
+macros.</p></li>
+<li><p>the float square root achieves <em>correct</em> (aka
+<em>exact</em>) rounding in arbitrary precision.</p></li>
+<li><p>modified behaviour for the <code>\xintPFloat</code> macro, used
+by <code>\xintthefloatexpr</code> to prettify its output. It now opts
+for decimal notation if and only if scientific notation would use an
+exponent between <code>-5</code> and <code>5</code> inclusive. The zero
+value is printed <code>0.</code> with a dot.</p></li>
+<li><p>the float macros for addition, subtraction, multiplication,
+division now first round their two operands to P, not P+2, significant
+places before doing the actual computation (P being the target
+precision). The same applies to the power macros and to the square root
+macro.</p></li>
+<li><p>the documentation offers a more precise (and accurate) discussion
+of floating point issues.</p></li>
+<li><p>various under-the-hood code improvements; the floatexpr
+operations are chained in a faster way, from skipping some unneeded
+parsing on results of earlier computations. The absence of a real inner
+data structure for floats (incorporating their precisions, for one) is
+however still a bit hair raising: currently the lengths of the mantissas
+of the operands are computed again by each float macro or expression
+operation.</p></li>
+<li><p>(TeXperts only) the macros defined (internally) from
+<code>\xintdeffunc</code> et al. constructs do not incorporate an
+initial <code>\romannumeral</code> anymore.</p></li>
+<li><p>renewed desperate efforts at improving the documentation by
+random shuffling of sections and well thought additions; cuts were
+considered and even performed.</p></li>
</ul>
-<h3 id="bug-fixes-24">Bug fixes</h3>
+<h3 id="bug-fixes-25">Bug fixes</h3>
<ul>
-<li><p>squaring macro <code>\xintSqr</code> from <strong>xintfrac.sty</strong> was broken due to a misspelled sub-macro name. Dates back to <code>1.1</code> release of <code>2014/10/28</code> <code>:-((</code>.</p></li>
-<li><p><code>1.2c</code>’s fix to the subtraction bug from <code>1.2</code> introduced another bug, which in some cases could create leading zeroes in the output, or even worse. This could invalidate other routines using subtractions, like <code>\xintiiSquareRoot</code>.</p></li>
-<li><p>the comparison operators were not recognized by <code>\xintNewIIExpr</code> and <code>\xintdefiifunc</code> constructs.</p></li>
+<li><p>squaring macro <code>\xintSqr</code> from
+<strong>xintfrac.sty</strong> was broken due to a misspelled sub-macro
+name. Dates back to <code>1.1</code> release of <code>2014/10/28</code>
+<code>:-((</code>.</p></li>
+<li><p><code>1.2c</code>’s fix to the subtraction bug from
+<code>1.2</code> introduced another bug, which in some cases could
+create leading zeroes in the output, or even worse. This could
+invalidate other routines using subtractions, like
+<code>\xintiiSquareRoot</code>.</p></li>
+<li><p>the comparison operators were not recognized by
+<code>\xintNewIIExpr</code> and <code>\xintdefiifunc</code>
+constructs.</p></li>
</ul>
<h2 id="e-20151122"><code>1.2e (2015/11/22)</code></h2>
-<h3 id="improvements-and-new-features-19">Improvements and new features</h3>
+<h3 id="improvements-and-new-features-19">Improvements and new
+features</h3>
<ul>
<li><p>macro <code>\xintunassignvar</code>.</p></li>
-<li><p>slight modifications of the logged messages in case of <code>\xintverbosetrue</code>.</p></li>
-<li><p>a space in <code>\xintdeffunc f(x)&lt;space&gt;:= expression ;</code> is now accepted.</p></li>
-<li><p>documentation enhancements: the <em>Quick Sort</em> section with its included code samples has been entirely re-written; the <em>Commands of the xintexpr package</em> section has been extended and reviewed entirely.</p></li>
+<li><p>slight modifications of the logged messages in case of
+<code>\xintverbosetrue</code>.</p></li>
+<li><p>a space in
+<code>\xintdeffunc f(x)&lt;space&gt;:= expression ;</code> is now
+accepted.</p></li>
+<li><p>documentation enhancements: the <em>Quick Sort</em> section with
+its included code samples has been entirely re-written; the <em>Commands
+of the xintexpr package</em> section has been extended and reviewed
+entirely.</p></li>
</ul>
-<h3 id="bug-fixes-25">Bug fixes</h3>
+<h3 id="bug-fixes-26">Bug fixes</h3>
<ul>
-<li><p>in <strong>xintfrac</strong>: the <code>\xintFloatFac</code> from release <code>1.2</code> parsed its argument only through <code>\numexpr</code> but it should have used <code>\xintNum</code>.</p></li>
-<li><p>in <strong>xintexpr</strong>: release <code>1.2d</code> had broken the recognition of sub-expressions immediately after variable names (with tacit multiplication).</p></li>
-<li><p>in <strong>xintexpr</strong>: contrarily to what <code>1.2d</code> documentation said, tacit multiplication was not yet always done with enhanced precedence. Now yes.</p></li>
+<li><p>in <strong>xintfrac</strong>: the <code>\xintFloatFac</code> from
+release <code>1.2</code> parsed its argument only through
+<code>\numexpr</code> but it should have used
+<code>\xintNum</code>.</p></li>
+<li><p>in <strong>xintexpr</strong>: release <code>1.2d</code> had
+broken the recognition of sub-expressions immediately after variable
+names (with tacit multiplication).</p></li>
+<li><p>in <strong>xintexpr</strong>: contrarily to what
+<code>1.2d</code> documentation said, tacit multiplication was not yet
+always done with enhanced precedence. Now yes.</p></li>
</ul>
<h2 id="d-20151118"><code>1.2d (2015/11/18)</code></h2>
-<h3 id="improvements-and-new-features-20">Improvements and new features</h3>
-<ul>
-<li><p>the function definitions done by <code>\xintdeffunc</code> et al., as well as the macro declarations by <code>\xintNewExpr</code> et al. now have only local scope.</p></li>
-<li><p>tacit multiplication applies to more cases, for example (x+y)z, and always ties more than standard * infix operator, e.g. x/2y is like x/(2*y).</p></li>
-<li><p>some documentation enhancements, particularly in the chapter on xintexpr.sty, and also in the code source comments.</p></li>
+<h3 id="improvements-and-new-features-20">Improvements and new
+features</h3>
+<ul>
+<li><p>the function definitions done by <code>\xintdeffunc</code> et
+al., as well as the macro declarations by <code>\xintNewExpr</code> et
+al. now have only local scope.</p></li>
+<li><p>tacit multiplication applies to more cases, for example (x+y)z,
+and always ties more than standard * infix operator, e.g. x/2y is like
+x/(2*y).</p></li>
+<li><p>some documentation enhancements, particularly in the chapter on
+xintexpr.sty, and also in the code source comments.</p></li>
</ul>
-<h3 id="bug-fixes-26">Bug fixes</h3>
+<h3 id="bug-fixes-27">Bug fixes</h3>
<ul>
-<li>in <strong>xintcore</strong>: release <code>1.2c</code> had inadvertently broken the <code>\xintiiDivRound</code> macro.</li>
+<li>in <strong>xintcore</strong>: release <code>1.2c</code> had
+inadvertently broken the <code>\xintiiDivRound</code> macro.</li>
</ul>
<h2 id="c-20151116"><code>1.2c (2015/11/16)</code></h2>
-<h3 id="improvements-and-new-features-21">Improvements and new features</h3>
+<h3 id="improvements-and-new-features-21">Improvements and new
+features</h3>
<ul>
-<li><p>macros <code>\xintdeffunc</code>, <code>\xintdefiifunc</code>, <code>\xintdeffloatfunc</code> and boolean <code>\ifxintverbose</code>.</p></li>
-<li><p>on-going code improvements and documentation enhancements, but stopped in order to issue this bugfix release.</p></li>
+<li><p>macros <code>\xintdeffunc</code>, <code>\xintdefiifunc</code>,
+<code>\xintdeffloatfunc</code> and boolean
+<code>\ifxintverbose</code>.</p></li>
+<li><p>on-going code improvements and documentation enhancements, but
+stopped in order to issue this bugfix release.</p></li>
</ul>
-<h3 id="bug-fixes-27">Bug fixes</h3>
+<h3 id="bug-fixes-28">Bug fixes</h3>
<ul>
-<li>in <strong>xintcore</strong>: recent release <code>1.2</code> introduced a bug in the subtraction (happened when 00000001 was found under certain circumstances at certain mod 8 locations).</li>
+<li>in <strong>xintcore</strong>: recent release <code>1.2</code>
+introduced a bug in the subtraction (happened when 00000001 was found
+under certain circumstances at certain mod 8 locations).</li>
</ul>
<h2 id="b-20151029"><code>1.2b (2015/10/29)</code></h2>
-<h3 id="bug-fixes-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 division macros, causing a crash when the divisor started with 99999999 (it was attempted to use with 1+99999999 a subroutine expecting only 8-digits numbers).</li>
+<li>in <strong>xintcore</strong>: recent release <code>1.2</code>
+introduced a bug in the division macros, causing a crash when the
+divisor started with 99999999 (it was attempted to use with 1+99999999 a
+subroutine expecting only 8-digits numbers).</li>
</ul>
<h2 id="a-20151019"><code>1.2a (2015/10/19)</code></h2>
-<h3 id="improvements-and-new-features-22">Improvements and new features</h3>
-<ul>
-<li><p>added <code>\xintKeepUnbraced</code>, <code>\xintTrimUnbraced</code> (<strong>xinttools</strong>) and fixed documentation of <code>\xintKeep</code> and <code>\xintTrim</code> regarding brace stripping.</p></li>
-<li><p>added <code>\xintiiMaxof/\xintiiMinof</code> (<strong>xint</strong>).</p></li>
-<li><p>TeX hackers only: replaced all code uses of <code>\romannumeral-`0</code> by the quicker <code>\romannumeral`&amp;&amp;@</code> (<code>^</code> being used as letter, had to find another character usable with catcode 7).</p></li>
+<h3 id="improvements-and-new-features-22">Improvements and new
+features</h3>
+<ul>
+<li><p>added <code>\xintKeepUnbraced</code>,
+<code>\xintTrimUnbraced</code> (<strong>xinttools</strong>) and fixed
+documentation of <code>\xintKeep</code> and <code>\xintTrim</code>
+regarding brace stripping.</p></li>
+<li><p>added <code>\xintiiMaxof/\xintiiMinof</code>
+(<strong>xint</strong>).</p></li>
+<li><p>TeX hackers only: replaced all code uses of
+<code>\romannumeral-`0</code> by the quicker
+<code>\romannumeral`&amp;&amp;@</code> (<code>^</code> being used as
+letter, had to find another character usable with catcode 7).</p></li>
</ul>
-<h3 id="bug-fixes-29">Bug fixes</h3>
+<h3 id="bug-fixes-30">Bug fixes</h3>
<ul>
-<li>in <strong>xintexpr</strong>: recent release <code>1.2</code> introduced a bad bug in the parsing of decimal numbers and as a result <code>\xinttheexpr 0.01\relax</code> expanded to <code>0</code> ! (sigh…)</li>
+<li>in <strong>xintexpr</strong>: recent release <code>1.2</code>
+introduced a bad bug in the parsing of decimal numbers and as a result
+<code>\xinttheexpr 0.01\relax</code> expanded to <code>0</code> !
+(sigh…)</li>
</ul>
<h2 id="section-2"><code>1.2 (2015/10/10)</code></h2>
<h3 id="removed-3">Removed</h3>
<ul>
-<li>the macros <code>\xintAdd</code>, <code>\xintSub</code>, <code>\xintMul</code>, <code>\xintMax</code>, <code>\xintMin</code>, <code>\xintMaxof</code>, <code>\xintMinof</code> are removed from package <strong>xint</strong>, and only exist in the versions from <strong>xintfrac</strong>. With only <strong>xintcore</strong> or <strong>xint</strong> loaded, one <em>must</em> use <code>\xintiiAdd</code>, <code>\xintiiSub</code>, …, or <code>\xintiAdd</code>, <code>\xintiSub</code>, etc…</li>
-</ul>
-<h3 id="improvements-and-new-features-23">Improvements and new features</h3>
-<ul>
-<li><p>the basic arithmetic implemented in <strong>xintcore</strong> has been entirely rewritten. The mathematics remains the elementary school one, but the <code>TeX</code> implementation achieves higher speed (except, regarding addition/subtraction, for numbers up to about thirty digits), the gains becoming quite significant for numbers with hundreds of digits.</p></li>
-<li><p>the inputs must have less than 19959 digits. But computations with thousands of digits take time.</p></li>
-<li><p>a previously standing limitation of <code>\xintexpr</code>, <code>\xintiiexpr</code>, and of <code>\xintfloatexpr</code> to numbers of less than 5000 digits has been lifted.</p></li>
-<li><p>a <em>qint</em> function is provided to help the parser gather huge integers in one-go, as an exception to its normal mode of operation which expands token by token.</p></li>
-<li><p><code>\xintFloatFac</code> macro for computing the factorials of integers as floating point numbers to a given precision. The <code>!</code> postfix operator inside <code>\xintfloatexpr</code> maps to this new macro rather than to the exact factorial as used by <code>\xintexpr</code> and <code>\xintiiexpr</code>.</p></li>
-<li><p>there is more flexibility in the parsing done by the macros from <strong>xintfrac</strong> on fractional input: the decimal parts of both the numerator and the denominator may arise from a separate expansion via <code>\romannumeral-`0</code>. Also the strict <code>A/B[N]</code> format is a bit relaxed: <code>N</code> may be anything understood by <code>\numexpr</code> (it could even be empty but that possibility has been removed by later <code>1.2f</code> release.)</p></li>
-<li><p>on the other hand an isolated dot <code>.</code> is not legal syntax anymore inside the expression parsers: there must be digits either before or after. It remains legal input for the macros of <strong>xintfrac</strong>.</p></li>
-<li><p>added <code>\ht</code>, <code>\dp</code>, <code>\wd</code>, <code>\fontcharht</code>, etc… to the tokens recognized by the parsers and expanded by <code>\number</code>.</p></li>
-<li><p>an obscure bug in package <strong>xintkernel</strong> has been fixed, regarding the sanitization of catcodes: under certain circumstances (which could not occur in a normal <code>LaTeX</code> context), unusual catcodes could end up being propagated to the external world.</p></li>
-<li><p>an effort at randomly shuffling around various pieces of the documentation has been done.</p></li>
+<li>the macros <code>\xintAdd</code>, <code>\xintSub</code>,
+<code>\xintMul</code>, <code>\xintMax</code>, <code>\xintMin</code>,
+<code>\xintMaxof</code>, <code>\xintMinof</code> are removed from
+package <strong>xint</strong>, and only exist in the versions from
+<strong>xintfrac</strong>. With only <strong>xintcore</strong> or
+<strong>xint</strong> loaded, one <em>must</em> use
+<code>\xintiiAdd</code>, <code>\xintiiSub</code>, …, or
+<code>\xintiAdd</code>, <code>\xintiSub</code>, etc…</li>
+</ul>
+<h3 id="improvements-and-new-features-23">Improvements and new
+features</h3>
+<ul>
+<li><p>the basic arithmetic implemented in <strong>xintcore</strong> has
+been entirely rewritten. The mathematics remains the elementary school
+one, but the <code>TeX</code> implementation achieves higher speed
+(except, regarding addition/subtraction, for numbers up to about thirty
+digits), the gains becoming quite significant for numbers with hundreds
+of digits.</p></li>
+<li><p>the inputs must have less than 19959 digits. But computations
+with thousands of digits take time.</p></li>
+<li><p>a previously standing limitation of <code>\xintexpr</code>,
+<code>\xintiiexpr</code>, and of <code>\xintfloatexpr</code> to numbers
+of less than 5000 digits has been lifted.</p></li>
+<li><p>a <em>qint</em> function is provided to help the parser gather
+huge integers in one-go, as an exception to its normal mode of operation
+which expands token by token.</p></li>
+<li><p><code>\xintFloatFac</code> macro for computing the factorials of
+integers as floating point numbers to a given precision. The
+<code>!</code> postfix operator inside <code>\xintfloatexpr</code> maps
+to this new macro rather than to the exact factorial as used by
+<code>\xintexpr</code> and <code>\xintiiexpr</code>.</p></li>
+<li><p>there is more flexibility in the parsing done by the macros from
+<strong>xintfrac</strong> on fractional input: the decimal parts of both
+the numerator and the denominator may arise from a separate expansion
+via <code>\romannumeral-`0</code>. Also the strict <code>A/B[N]</code>
+format is a bit relaxed: <code>N</code> may be anything understood by
+<code>\numexpr</code> (it could even be empty but that possibility has
+been removed by later <code>1.2f</code> release.)</p></li>
+<li><p>on the other hand an isolated dot <code>.</code> is not legal
+syntax anymore inside the expression parsers: there must be digits
+either before or after. It remains legal input for the macros of
+<strong>xintfrac</strong>.</p></li>
+<li><p>added <code>\ht</code>, <code>\dp</code>, <code>\wd</code>,
+<code>\fontcharht</code>, etc… to the tokens recognized by the parsers
+and expanded by <code>\number</code>.</p></li>
+<li><p>an obscure bug in package <strong>xintkernel</strong> has been
+fixed, regarding the sanitization of catcodes: under certain
+circumstances (which could not occur in a normal <code>LaTeX</code>
+context), unusual catcodes could end up being propagated to the external
+world.</p></li>
+<li><p>an effort at randomly shuffling around various pieces of the
+documentation has been done.</p></li>
</ul>
<h2 id="c-20150912"><code>1.1c (2015/09/12)</code></h2>
<ul>
-<li><p>bugfix regarding macro <code>\xintAssign</code> from <strong>xinttools</strong> which did not behave correctly in some circumstances (if there was a space before <code>\to</code>, in particular).</p></li>
-<li><p>very minor code improvements, and correction of some issues regarding the source code formatting in <code>sourcexint.pdf</code>, and minor issues in <code>Makefile.mk</code>.</p></li>
+<li><p>bugfix regarding macro <code>\xintAssign</code> from
+<strong>xinttools</strong> which did not behave correctly in some
+circumstances (if there was a space before <code>\to</code>, in
+particular).</p></li>
+<li><p>very minor code improvements, and correction of some issues
+regarding the source code formatting in <code>sourcexint.pdf</code>, and
+minor issues in <code>Makefile.mk</code>.</p></li>
</ul>
<h2 id="b-20150831"><code>1.1b (2015/08/31)</code></h2>
<ul>
-<li><p>bugfix: some macros needed by the integer division routine from <strong>xintcore</strong> had been left in <strong>xint.sty</strong> since release <code>1.1</code>. This for example broke the <code>\xintGCD</code> from <strong>xintgcd</strong> if package <strong>xint</strong> was not loaded.</p></li>
-<li><p>Slight enhancements to the documentation, particularly in the <code>Read this first</code> section.</p></li>
+<li><p>bugfix: some macros needed by the integer division routine from
+<strong>xintcore</strong> had been left in <strong>xint.sty</strong>
+since release <code>1.1</code>. This for example broke the
+<code>\xintGCD</code> from <strong>xintgcd</strong> if package
+<strong>xint</strong> was not loaded.</p></li>
+<li><p>Slight enhancements to the documentation, particularly in the
+<code>Read this first</code> section.</p></li>
</ul>
<h2 id="a-20141107"><code>1.1a (2014/11/07)</code></h2>
<ul>
-<li><p>fixed a bug which prevented <code>\xintNewExpr</code> from producing correctly working macros from a comma separated replacement text.</p></li>
-<li><p><code>\xintiiSqrtR</code> for rounded integer square root; former <code>\xintiiSqrt</code> already produced truncated integer square root; corresponding function <code>sqrtr</code> added to <code>\xintiiexpr..\relax</code> syntax.</p></li>
-<li><p>use of straight quotes in the documentation for better legibility.</p></li>
-<li><p>added <code>\xintiiIsOne</code>, <code>\xintiiifOne</code>, <code>\xintiiifCmp</code>, <code>\xintiiifEq</code>, <code>\xintiiifGt</code>, <code>\xintiiifLt</code>, <code>\xintiiifOdd</code>, <code>\xintiiCmp</code>, <code>\xintiiEq</code>, <code>\xintiiGt</code>, <code>\xintiiLt</code>, <code>\xintiiLtorEq</code>, <code>\xintiiGtorEq</code>, <code>\xintiiNeq</code>, mainly for efficiency of <code>\xintiiexpr</code>.</p></li>
-<li><p>for the same reason, added <code>\xintiiGCD</code> and <code>\xintiiLCM</code>.</p></li>
-<li><p>added the previously mentioned <code>ii</code> macros, and some others from <code>1.1</code>, to the user manual. But their main usage is internal to <code>\xintiiexpr</code>, to skip unnecessary overheads.</p></li>
-<li><p>various typographical fixes throughout the documentation, and a bit of clean up of the code comments. Improved <code>\Factors</code> example of nested <code>subs</code>, <code>rseq</code>, <code>iter</code> in <code>\xintiiexpr</code>.</p></li>
+<li><p>fixed a bug which prevented <code>\xintNewExpr</code> from
+producing correctly working macros from a comma separated replacement
+text.</p></li>
+<li><p><code>\xintiiSqrtR</code> for rounded integer square root; former
+<code>\xintiiSqrt</code> already produced truncated integer square root;
+corresponding function <code>sqrtr</code> added to
+<code>\xintiiexpr..\relax</code> syntax.</p></li>
+<li><p>use of straight quotes in the documentation for better
+legibility.</p></li>
+<li><p>added <code>\xintiiIsOne</code>, <code>\xintiiifOne</code>,
+<code>\xintiiifCmp</code>, <code>\xintiiifEq</code>,
+<code>\xintiiifGt</code>, <code>\xintiiifLt</code>,
+<code>\xintiiifOdd</code>, <code>\xintiiCmp</code>,
+<code>\xintiiEq</code>, <code>\xintiiGt</code>, <code>\xintiiLt</code>,
+<code>\xintiiLtorEq</code>, <code>\xintiiGtorEq</code>,
+<code>\xintiiNeq</code>, mainly for efficiency of
+<code>\xintiiexpr</code>.</p></li>
+<li><p>for the same reason, added <code>\xintiiGCD</code> and
+<code>\xintiiLCM</code>.</p></li>
+<li><p>added the previously mentioned <code>ii</code> macros, and some
+others from <code>1.1</code>, to the user manual. But their main usage
+is internal to <code>\xintiiexpr</code>, to skip unnecessary
+overheads.</p></li>
+<li><p>various typographical fixes throughout the documentation, and a
+bit of clean up of the code comments. Improved <code>\Factors</code>
+example of nested <code>subs</code>, <code>rseq</code>,
+<code>iter</code> in <code>\xintiiexpr</code>.</p></li>
</ul>
<h2 id="section-3"><code>1.1 (2014/10/28)</code></h2>
-<h3 id="breaking-changes-17">Breaking changes</h3>
-<ul>
-<li><p>in <code>\xintiiexpr</code>, <code>/</code> does <em>rounded</em> division, rather than the Euclidean division (for positive arguments, this is truncated division). The <code>//</code> operator does truncated division,</p></li>
-<li><p>the <code>:</code> operator for three-way branching is gone, replaced with <code>??</code>,</p></li>
-<li><p><code>1e(3+5)</code> is now illegal. The number parser identifies <code>e</code> and <code>E</code> in the same way it does for the decimal mark, earlier versions treated <code>e</code> as <code>E</code> rather as infix operators of highest precedence,</p></li>
-<li><p>the <code>add</code> and <code>mul</code> have a new syntax, old syntax is with <code>`+`</code> and <code>`*`</code> (left quotes mandatory), <code>sum</code> and <code>prd</code> are gone,</p></li>
-<li><p>no more special treatment for encountered brace pairs <code>{..}</code> by the number scanner, <code>a/b[N]</code> notation can be used without use of braces (the <code>N</code> will end up as is in a <code>\numexpr</code>, it is not parsed by the <code>\xintexpr</code>-ession scanner),</p></li>
-<li><p>in earlier releases, place holders for <code>\xintNewExpr</code> could either be denoted <code>#1</code>, <code>#2</code>, … or also <code>$1</code>, <code>$2</code>, … Only the usual <code>#</code> form is now accepted and the special cases previously treated via the second form are now managed via a <code>protect(...)</code> function.</p></li>
-<li><p><strong>xintfrac</strong>: <code>\xintFloor</code> and <code>\xintCeil</code> add a trailing <code>/1[0]</code> to their (integer) output. New <code>\xintiFloor</code> and <code>\xintiCeil</code> do not.</p></li>
+<h3 id="breaking-changes-18">Breaking changes</h3>
+<ul>
+<li><p>in <code>\xintiiexpr</code>, <code>/</code> does <em>rounded</em>
+division, rather than the Euclidean division (for positive arguments,
+this is truncated division). The <code>//</code> operator does truncated
+division,</p></li>
+<li><p>the <code>:</code> operator for three-way branching is gone,
+replaced with <code>??</code>,</p></li>
+<li><p><code>1e(3+5)</code> is now illegal. The number parser identifies
+<code>e</code> and <code>E</code> in the same way it does for the
+decimal mark, earlier versions treated <code>e</code> as <code>E</code>
+rather as infix operators of highest precedence,</p></li>
+<li><p>the <code>add</code> and <code>mul</code> have a new syntax, old
+syntax is with <code>`+`</code> and <code>`*`</code> (left quotes
+mandatory), <code>sum</code> and <code>prd</code> are gone,</p></li>
+<li><p>no more special treatment for encountered brace pairs
+<code>{..}</code> by the number scanner, <code>a/b[N]</code> notation
+can be used without use of braces (the <code>N</code> will end up as is
+in a <code>\numexpr</code>, it is not parsed by the
+<code>\xintexpr</code>-ession scanner),</p></li>
+<li><p>in earlier releases, place holders for <code>\xintNewExpr</code>
+could either be denoted <code>#1</code>, <code>#2</code>, … or also
+<code>$1</code>, <code>$2</code>, … Only the usual <code>#</code> form
+is now accepted and the special cases previously treated via the second
+form are now managed via a <code>protect(...)</code> function.</p></li>
+<li><p><strong>xintfrac</strong>: <code>\xintFloor</code> and
+<code>\xintCeil</code> add a trailing <code>/1[0]</code> to their
+(integer) output. New <code>\xintiFloor</code> and
+<code>\xintiCeil</code> do not.</p></li>
</ul>
<h3 id="removed-4">Removed</h3>
<ul>
-<li><code>\xintnumexpr</code>, <code>\xintthenumexpr</code>, <code>\xintNewNumExpr</code>: use <code>\xintiexpr</code>, <code>\xinttheiexpr</code>, <code>\xintNewIExpr</code>.</li>
+<li><code>\xintnumexpr</code>, <code>\xintthenumexpr</code>,
+<code>\xintNewNumExpr</code>: use <code>\xintiexpr</code>,
+<code>\xinttheiexpr</code>, <code>\xintNewIExpr</code>.</li>
</ul>
<h3 id="deprecated-2">Deprecated</h3>
<ul>
-<li><p><code>\xintDivision</code>, <code>\xintQuo</code>, <code>\xintRem</code>: use <code>\xintiDivision</code>, <code>\xintiQuo</code>, <code>\xintiRem</code>.</p></li>
-<li><p><code>\xintMax</code>, <code>\xintMin</code>, <code>\xintAdd</code>, <code>\xintSub</code>, <code>\xintMul</code> (<strong>xint</strong>): their usage without <strong>xintfrac</strong> is deprecated; use <code>\xintiMax</code>, <code>\xintiMin</code>, <code>\xintiAdd</code>, <code>\xintiSub</code>, <code>\xintiMul</code>.</p></li>
-<li><p>the <code>&amp;</code> and <code>|</code> as Boolean operators in <code>xintexpr</code>-essions are deprecated in favour of <code>&amp;&amp;</code> and <code>||</code>. The single letter operators might be assigned some other meaning in some later release (bitwise operations, perhaps). Do not use them.</p></li>
-</ul>
-<h3 id="improvements-and-new-features-24">Improvements and new features</h3>
-<ul>
-<li><p>new package <strong>xintcore</strong> has been split off <strong>xint</strong>. It contains the core arithmetic macros (it is loaded by LaTeX package <strong>bnumexpr</strong>),</p></li>
-<li><p>neither <strong>xint</strong> nor <strong>xintfrac</strong> load <strong>xinttools</strong>. Only <strong>xintexpr</strong> does,</p></li>
-<li><p>whenever some portion of code has been revised, often use has been made of the <code>\xint_dothis</code> and <code>\xint_orthat</code> pair of macros for expandably branching,</p></li>
-<li><p>these tiny helpful macros, and a few others are in package <strong>xintkernel</strong> which contains also the catcode and loading order management code, initially inspired by code found in Heiko Oberdiek’s packages,</p></li>
-<li><p>the source code, which was suppressed from <code>xint.pdf</code> in release <code>1.09n</code>, is now compiled into a separate file <code>sourcexint.pdf</code>,</p></li>
-<li><p>faster handling by <code>\xintAdd</code>, <code>\xintSub</code>, <code>\xintMul</code>, … of the case where one of the arguments is zero,</p></li>
-<li><p>the <code>\xintAdd</code> and <code>\xintSub</code> macros from package <strong>xintfrac</strong> check if one of the denominators is a multiple of the other, and only if this is not the case do they multiply the denominators. But systematic reduction would be too costly,</p></li>
-<li><p>this naturally will be also the case for the <code>+</code> and <code>-</code> operations in <code>\xintexpr</code>,</p></li>
-<li><p><strong>xint</strong> added <code>\xintiiDivRound</code>, <code>\xintiiDivTrunc</code>, <code>\xintiiMod</code> for rounded and truncated division of big integers (next to <code>\xintiiQuo</code> and <code>\xintiiRem</code>),</p></li>
-<li><p>with <strong>xintfrac</strong> loaded, the <code>\xintNum</code> macro does <code>\xintTTrunc</code> (which is truncation to an integer, same as <code>\xintiTrunc {0}</code>),</p></li>
-<li><p>added <code>\xintMod</code> to <strong>xintfrac</strong> for modulo operation with fractional numbers,</p></li>
-<li><p>added <code>\xintiFloor</code> and <code>\xintiCeil</code> to <strong>xintfrac</strong>,</p></li>
-<li><p><code>\xintiexpr</code>, <code>\xinttheiexpr</code> admit an optional argument within brackets <code>[d]</code>, they round the computation result (or results, if comma separated) to <code>d</code> digits after decimal mark, (the whole computation is done exactly, as in <code>xintexpr</code>),</p></li>
-<li><p><code>\xintfloatexpr</code>, <code>\xintthefloatexpr</code> similarly admit an optional argument which serves to keep only <code>d</code> digits of precision, getting rid of cumulated uncertainties in the last digits (the whole computation is done according to the precision set via <code>\xintDigits</code>),</p></li>
-<li><p><code>\xinttheexpr</code> and <code>\xintthefloatexpr</code> <em>pretty-print</em> if possible, the former removing unit denominator or <code>[0]</code> brackets, the latter avoiding scientific notation if decimal notation is practical,</p></li>
-<li><p>the <code>//</code> does truncated division and <code>/:</code> is the associated modulo,</p></li>
-<li><p>multi-character operators <code>&amp;&amp;</code>, <code>||</code>, <code>==</code>, <code>&lt;=</code>, <code>&gt;=</code>, <code>!=</code>, <code>**</code>,</p></li>
-<li><p>multi-letter infix binary words <code>'and'</code>, <code>'or'</code>, <code>'xor'</code>, <code>'mod'</code> (straight quotes mandatory),</p></li>
+<li><p><code>\xintDivision</code>, <code>\xintQuo</code>,
+<code>\xintRem</code>: use <code>\xintiDivision</code>,
+<code>\xintiQuo</code>, <code>\xintiRem</code>.</p></li>
+<li><p><code>\xintMax</code>, <code>\xintMin</code>,
+<code>\xintAdd</code>, <code>\xintSub</code>, <code>\xintMul</code>
+(<strong>xint</strong>): their usage without <strong>xintfrac</strong>
+is deprecated; use <code>\xintiMax</code>, <code>\xintiMin</code>,
+<code>\xintiAdd</code>, <code>\xintiSub</code>,
+<code>\xintiMul</code>.</p></li>
+<li><p>the <code>&amp;</code> and <code>|</code> as Boolean operators in
+<code>xintexpr</code>-essions are deprecated in favour of
+<code>&amp;&amp;</code> and <code>||</code>. The single letter operators
+might be assigned some other meaning in some later release (bitwise
+operations, perhaps). Do not use them.</p></li>
+</ul>
+<h3 id="improvements-and-new-features-24">Improvements and new
+features</h3>
+<ul>
+<li><p>new package <strong>xintcore</strong> has been split off
+<strong>xint</strong>. It contains the core arithmetic macros (it is
+loaded by LaTeX package <strong>bnumexpr</strong>),</p></li>
+<li><p>neither <strong>xint</strong> nor <strong>xintfrac</strong> load
+<strong>xinttools</strong>. Only <strong>xintexpr</strong>
+does,</p></li>
+<li><p>whenever some portion of code has been revised, often use has
+been made of the <code>\xint_dothis</code> and <code>\xint_orthat</code>
+pair of macros for expandably branching,</p></li>
+<li><p>these tiny helpful macros, and a few others are in package
+<strong>xintkernel</strong> which contains also the catcode and loading
+order management code, initially inspired by code found in Heiko
+Oberdiek’s packages,</p></li>
+<li><p>the source code, which was suppressed from <code>xint.pdf</code>
+in release <code>1.09n</code>, is now compiled into a separate file
+<code>sourcexint.pdf</code>,</p></li>
+<li><p>faster handling by <code>\xintAdd</code>, <code>\xintSub</code>,
+<code>\xintMul</code>, … of the case where one of the arguments is
+zero,</p></li>
+<li><p>the <code>\xintAdd</code> and <code>\xintSub</code> macros from
+package <strong>xintfrac</strong> check if one of the denominators is a
+multiple of the other, and only if this is not the case do they multiply
+the denominators. But systematic reduction would be too costly,</p></li>
+<li><p>this naturally will be also the case for the <code>+</code> and
+<code>-</code> operations in <code>\xintexpr</code>,</p></li>
+<li><p><strong>xint</strong> added <code>\xintiiDivRound</code>,
+<code>\xintiiDivTrunc</code>, <code>\xintiiMod</code> for rounded and
+truncated division of big integers (next to <code>\xintiiQuo</code> and
+<code>\xintiiRem</code>),</p></li>
+<li><p>with <strong>xintfrac</strong> loaded, the <code>\xintNum</code>
+macro does <code>\xintTTrunc</code> (which is truncation to an integer,
+same as <code>\xintiTrunc {0}</code>),</p></li>
+<li><p>added <code>\xintMod</code> to <strong>xintfrac</strong> for
+modulo operation with fractional numbers,</p></li>
+<li><p>added <code>\xintiFloor</code> and <code>\xintiCeil</code> to
+<strong>xintfrac</strong>,</p></li>
+<li><p><code>\xintiexpr</code>, <code>\xinttheiexpr</code> admit an
+optional argument within brackets <code>[d]</code>, they round the
+computation result (or results, if comma separated) to <code>d</code>
+digits after decimal mark, (the whole computation is done exactly, as in
+<code>xintexpr</code>),</p></li>
+<li><p><code>\xintfloatexpr</code>, <code>\xintthefloatexpr</code>
+similarly admit an optional argument which serves to keep only
+<code>d</code> digits of precision, getting rid of cumulated
+uncertainties in the last digits (the whole computation is done
+according to the precision set via <code>\xintDigits</code>),</p></li>
+<li><p><code>\xinttheexpr</code> and <code>\xintthefloatexpr</code>
+<em>pretty-print</em> if possible, the former removing unit denominator
+or <code>[0]</code> brackets, the latter avoiding scientific notation if
+decimal notation is practical,</p></li>
+<li><p>the <code>//</code> does truncated division and <code>/:</code>
+is the associated modulo,</p></li>
+<li><p>multi-character operators <code>&amp;&amp;</code>,
+<code>||</code>, <code>==</code>, <code>&lt;=</code>,
+<code>&gt;=</code>, <code>!=</code>, <code>**</code>,</p></li>
+<li><p>multi-letter infix binary words <code>'and'</code>,
+<code>'or'</code>, <code>'xor'</code>, <code>'mod'</code> (straight
+quotes mandatory),</p></li>
<li><p>functions <code>even</code>, <code>odd</code>,</p></li>
-<li><p><code>\xintdefvar A3:=3.1415;</code> for variable definitions (non expandable, naturally), usable in subsequent expressions; variable names may contain letters, digits, underscores. They should not start with a digit, the <code>@</code> is reserved, and single lowercase and uppercase Latin letters are predefined to work as dummy variables (see next),</p></li>
-<li><p>generation of comma separated lists <code>a..b</code>, <code>a..[d]..b</code>,</p></li>
-<li><p>Python syntax-like list extractors <code>[list][n:]</code>, <code>[list][:n]</code>, <code>[list][a:b]</code> allowing negative indices, but no optional step argument, and <code>[list][n]</code> (<code>n=0</code> for the number of items in the list),</p></li>
-<li><p>functions <code>first</code>, <code>last</code>, <code>reversed</code>,</p></li>
-<li><p>itemwise operations on comma separated lists <code>a*[list]</code>, etc.., possible on both sides <code>a*[list]^b</code>, and obeying the same precedence rules as with numbers,</p></li>
-<li><p><code>add</code> and <code>mul</code> must use a dummy variable: <code>add(x(x+1)(x-1), x=-10..10)</code>,</p></li>
-<li><p>variable substitutions with <code>subs</code>: <code>subs(subs(add(x^2+y^2,x=1..y),y=t),t=20)</code>,</p></li>
-<li><p>sequence generation using <code>seq</code> with a dummy variable: <code>seq(x^3, x=-10..10)</code>,</p></li>
-<li><p>simple recursive lists with <code>rseq</code>, with <code>@</code> given the last value, <code>rseq(1;2@+1,i=1..10)</code>,</p></li>
-<li><p>higher recursion with <code>rrseq</code>, <code>@1</code>, <code>@2</code>, <code>@3</code>, <code>@4</code>, and <code>@@(n)</code> for earlier values, up to <code>n=K</code> where <code>K</code> is the number of terms of the initial stretch <code>rrseq(0,1;@1+@2,i=2..100)</code>,</p></li>
-<li><p>iteration with <code>iter</code> which is like <code>rrseq</code> but outputs only the last <code>K</code> terms, where <code>K</code> was the number of initial terms,</p></li>
-<li><p>inside <code>seq</code>, <code>rseq</code>, <code>rrseq</code>, <code>iter</code>, possibility to use <code>omit</code>, <code>abort</code> and <code>break</code> to control termination,</p></li>
-<li><p><code>n++</code> potentially infinite index generation for <code>seq</code>, <code>rseq</code>, <code>rrseq</code>, and <code>iter</code>, it is advised to use <code>abort</code> or <code>break(..)</code> at some point,</p></li>
-<li><p>the <code>add</code>, <code>mul</code>, <code>seq</code>, … are nestable,</p></li>
-<li><p><code>\xintthecoords</code> converts a comma separated list of an even number of items to the format expected by the <code>TikZ</code> <code>coordinates</code> syntax,</p></li>
-<li><p>completely new version <code>\xintNewExpr</code>, <code>protect</code> function to handle external macros. The dollar sign <code>$</code> for place holders is not accepted anymore, only the standard macro parameter <code>#</code>. Not all constructs are compatible with <code>\xintNewExpr</code>.</p></li>
-</ul>
-<h3 id="bug-fixes-30">Bug fixes</h3>
-<ul>
-<li><p><code>\xintZapFirstSpaces</code> hence also <code>\xintZapSpaces</code> from package <strong>xinttools</strong> were buggy when used with an argument either empty or containing only space tokens.</p></li>
-<li><p><code>\xintiiexpr</code> did not strip leading zeroes, hence <code>\xinttheiiexpr 001+1\relax</code> did not obtain the expected result …</p></li>
-<li><p><code>\xinttheexpr \xintiexpr 1.23\relax\relax</code> should have produced <code>1</code>, but it produced <code>1.23</code></p></li>
-<li><p>the catcode of <code>;</code> was not set at package launching time.</p></li>
-<li><p>the <code>\XINTinFloatPrd:csv</code> macro name had a typo, hence <code>prd</code> was non-functional in <code>\xintfloatexpr</code>.</p></li>
+<li><p><code>\xintdefvar A3:=3.1415;</code> for variable definitions
+(non expandable, naturally), usable in subsequent expressions; variable
+names may contain letters, digits, underscores. They should not start
+with a digit, the <code>@</code> is reserved, and single lowercase and
+uppercase Latin letters are predefined to work as dummy variables (see
+next),</p></li>
+<li><p>generation of comma separated lists <code>a..b</code>,
+<code>a..[d]..b</code>,</p></li>
+<li><p>Python syntax-like list extractors <code>[list][n:]</code>,
+<code>[list][:n]</code>, <code>[list][a:b]</code> allowing negative
+indices, but no optional step argument, and <code>[list][n]</code>
+(<code>n=0</code> for the number of items in the list),</p></li>
+<li><p>functions <code>first</code>, <code>last</code>,
+<code>reversed</code>,</p></li>
+<li><p>itemwise operations on comma separated lists
+<code>a*[list]</code>, etc.., possible on both sides
+<code>a*[list]^b</code>, and obeying the same precedence rules as with
+numbers,</p></li>
+<li><p><code>add</code> and <code>mul</code> must use a dummy variable:
+<code>add(x(x+1)(x-1), x=-10..10)</code>,</p></li>
+<li><p>variable substitutions with <code>subs</code>:
+<code>subs(subs(add(x^2+y^2,x=1..y),y=t),t=20)</code>,</p></li>
+<li><p>sequence generation using <code>seq</code> with a dummy variable:
+<code>seq(x^3, x=-10..10)</code>,</p></li>
+<li><p>simple recursive lists with <code>rseq</code>, with
+<code>@</code> given the last value,
+<code>rseq(1;2@+1,i=1..10)</code>,</p></li>
+<li><p>higher recursion with <code>rrseq</code>, <code>@1</code>,
+<code>@2</code>, <code>@3</code>, <code>@4</code>, and
+<code>@@(n)</code> for earlier values, up to <code>n=K</code> where
+<code>K</code> is the number of terms of the initial stretch
+<code>rrseq(0,1;@1+@2,i=2..100)</code>,</p></li>
+<li><p>iteration with <code>iter</code> which is like <code>rrseq</code>
+but outputs only the last <code>K</code> terms, where <code>K</code> was
+the number of initial terms,</p></li>
+<li><p>inside <code>seq</code>, <code>rseq</code>, <code>rrseq</code>,
+<code>iter</code>, possibility to use <code>omit</code>,
+<code>abort</code> and <code>break</code> to control
+termination,</p></li>
+<li><p><code>n++</code> potentially infinite index generation for
+<code>seq</code>, <code>rseq</code>, <code>rrseq</code>, and
+<code>iter</code>, it is advised to use <code>abort</code> or
+<code>break(..)</code> at some point,</p></li>
+<li><p>the <code>add</code>, <code>mul</code>, <code>seq</code>, … are
+nestable,</p></li>
+<li><p><code>\xintthecoords</code> converts a comma separated list of an
+even number of items to the format expected by the <code>TikZ</code>
+<code>coordinates</code> syntax,</p></li>
+<li><p>completely new version <code>\xintNewExpr</code>,
+<code>protect</code> function to handle external macros. The dollar sign
+<code>$</code> for place holders is not accepted anymore, only the
+standard macro parameter <code>#</code>. Not all constructs are
+compatible with <code>\xintNewExpr</code>.</p></li>
+</ul>
+<h3 id="bug-fixes-31">Bug fixes</h3>
+<ul>
+<li><p><code>\xintZapFirstSpaces</code> hence also
+<code>\xintZapSpaces</code> from package <strong>xinttools</strong> were
+buggy when used with an argument either empty or containing only space
+tokens.</p></li>
+<li><p><code>\xintiiexpr</code> did not strip leading zeroes, hence
+<code>\xinttheiiexpr 001+1\relax</code> did not obtain the expected
+result …</p></li>
+<li><p><code>\xinttheexpr \xintiexpr 1.23\relax\relax</code> should have
+produced <code>1</code>, but it produced <code>1.23</code></p></li>
+<li><p>the catcode of <code>;</code> was not set at package launching
+time.</p></li>
+<li><p>the <code>\XINTinFloatPrd:csv</code> macro name had a typo, hence
+<code>prd</code> was non-functional in
+<code>\xintfloatexpr</code>.</p></li>
</ul>
<h2 id="n-20140401"><code>1.09n (2014/04/01)</code></h2>
<ul>
-<li><p>the user manual does not include by default the source code anymore: the <code>\NoSourceCode</code> toggle in file <code>xint.tex</code> has to be set to 0 before compilation to get source code inclusion (later release <code>1.1</code> made source code available as <code>sourcexint.pdf</code>).</p></li>
-<li><p>bug fix (<strong>xinttools</strong>) in <code>\XINT_nthelt_finish</code> (this bug was introduced in <code>1.09i</code> of <code>2013/12/18</code> and showed up when the index <code>N</code> was larger than the number of elements of the list).</p></li>
+<li><p>the user manual does not include by default the source code
+anymore: the <code>\NoSourceCode</code> toggle in file
+<code>xint.tex</code> has to be set to 0 before compilation to get
+source code inclusion (later release <code>1.1</code> made source code
+available as <code>sourcexint.pdf</code>).</p></li>
+<li><p>bug fix (<strong>xinttools</strong>) in
+<code>\XINT_nthelt_finish</code> (this bug was introduced in
+<code>1.09i</code> of <code>2013/12/18</code> and showed up when the
+index <code>N</code> was larger than the number of elements of the
+list).</p></li>
</ul>
<h2 id="m-20140226"><code>1.09m (2014/02/26)</code></h2>
<ul>
-<li><p>new in <strong>xinttools</strong>: <code>\xintKeep</code> keeps the first <code>N</code> or last <code>N</code> elements of a list (sequence of braced items); <code>\xintTrim</code> cuts out either the first <code>N</code> or the last <code>N</code> elements from a list.</p></li>
-<li><p>new in <strong>xintcfrac</strong>: <code>\xintFGtoC</code> finds the initial partial quotients common to two numbers or fractions <code>f</code> and <code>g</code>; <code>\xintGGCFrac</code> is a clone of <code>\xintGCFrac</code> which however does not assume that the coefficients of the generalized continued fraction are numeric quantities. Some other minor changes.</p></li>
+<li><p>new in <strong>xinttools</strong>: <code>\xintKeep</code> keeps
+the first <code>N</code> or last <code>N</code> elements of a list
+(sequence of braced items); <code>\xintTrim</code> cuts out either the
+first <code>N</code> or the last <code>N</code> elements from a
+list.</p></li>
+<li><p>new in <strong>xintcfrac</strong>: <code>\xintFGtoC</code> finds
+the initial partial quotients common to two numbers or fractions
+<code>f</code> and <code>g</code>; <code>\xintGGCFrac</code> is a clone
+of <code>\xintGCFrac</code> which however does not assume that the
+coefficients of the generalized continued fraction are numeric
+quantities. Some other minor changes.</p></li>
</ul>
<h2 id="kb-20140213"><code>1.09kb (2014/02/13)</code></h2>
<ul>
-<li><p>bug fix (<strong>xintexpr</strong>): an aloof modification done by <code>1.09i</code> to <code>\xintNewExpr</code> had resulted in a spurious trailing space present in the outputs of all macros created by <code>\xintNewExpr</code>, making nesting of such macros impossible.</p></li>
-<li><p>bug fix (<strong>xinttools</strong>): <code>\xintBreakFor</code> and <code>\xintBreakForAndDo</code> were buggy when used in the last iteration of an <code>\xintFor</code> loop.</p></li>
-<li><p>bug fix (<strong>xinttools</strong>): <code>\xintSeq</code> from <code>1.09k</code> needed a <code>\chardef</code> which was missing from <code>xinttools.sty</code>, it was in <code>xint.sty</code>.</p></li>
+<li><p>bug fix (<strong>xintexpr</strong>): an aloof modification done
+by <code>1.09i</code> to <code>\xintNewExpr</code> had resulted in a
+spurious trailing space present in the outputs of all macros created by
+<code>\xintNewExpr</code>, making nesting of such macros
+impossible.</p></li>
+<li><p>bug fix (<strong>xinttools</strong>): <code>\xintBreakFor</code>
+and <code>\xintBreakForAndDo</code> were buggy when used in the last
+iteration of an <code>\xintFor</code> loop.</p></li>
+<li><p>bug fix (<strong>xinttools</strong>): <code>\xintSeq</code> from
+<code>1.09k</code> needed a <code>\chardef</code> which was missing from
+<code>xinttools.sty</code>, it was in <code>xint.sty</code>.</p></li>
</ul>
<h2 id="k-20140121"><code>1.09k (2014/01/21)</code></h2>
<ul>
-<li><p>inside <code>\xintexpr..\relax</code> (and its variants) tacit multiplication is implied when a number or operand is followed directly with an opening parenthesis,</p></li>
-<li><p>the <code>&quot;</code> for denoting (arbitrarily big) hexadecimal numbers is recognized by <code>\xintexpr</code> and its variants (package <strong>xintbinhex</strong> is required); a fractional hexadecimal part introduced by a dot <code>.</code> is allowed.</p></li>
-<li><p>re-organization of the first sections of the user manual.</p></li>
-<li><p>bug fix (<strong>xinttools</strong>, <strong>xint</strong>, …): forgotten catcode check of <code>&quot;</code> at loading time has been added.</p></li>
+<li><p>inside <code>\xintexpr..\relax</code> (and its variants) tacit
+multiplication is implied when a number or operand is followed directly
+with an opening parenthesis,</p></li>
+<li><p>the <code>"</code> for denoting (arbitrarily big) hexadecimal
+numbers is recognized by <code>\xintexpr</code> and its variants
+(package <strong>xintbinhex</strong> is required); a fractional
+hexadecimal part introduced by a dot <code>.</code> is allowed.</p></li>
+<li><p>re-organization of the first sections of the user
+manual.</p></li>
+<li><p>bug fix (<strong>xinttools</strong>, <strong>xint</strong>, …):
+forgotten catcode check of <code>"</code> at loading time has been
+added.</p></li>
</ul>
<h2 id="j-20140109"><code>1.09j (2014/01/09)</code></h2>
<ul>
-<li><p>(<strong>xint</strong>) the core division routines have been re-written for some (limited) efficiency gain, more pronounced for small divisors. As a result the <em>computation of one thousand digits of <span class="math inline"><em>π</em></span></em> is close to three times faster than with earlier releases.</p></li>
-<li><p>some various other small improvements, particularly in the power routines.</p></li>
-<li><p>(<strong>xintfrac</strong>) a macro <code>\xintXTrunc</code> is designed to produce thousands or even tens of thousands of digits of the decimal expansion of a fraction. Although completely expandable it has its use limited to inside an <code>\edef</code>, <code>\write</code>, <code>\message</code>, . It can thus not be nested as argument to another package macro.</p></li>
-<li><p>(<strong>xintexpr</strong>) the tacit multiplication done in <code>\xintexpr..\relax</code> on encountering a count register or variable, or a <code>\numexpr</code>, while scanning a (decimal) number, is extended to the case of a sub <code>\xintexpr</code>-ession.</p></li>
-<li><p><code>\xintexpr</code> can now be used in an <code>\edef</code> with no <code>\xintthe</code> prefix; it will execute completely the computation, and the error message about a missing <code>\xintthe</code> will be inhibited. Previously, in the absence of <code>\xintthe</code>, expansion could only be a full one (with <code>\romannumeral-`0</code>), not a complete one (with <code>\edef</code>). Note that this differs from the behavior of the non-expandable <code>\numexpr</code>: <code>\the</code> or <code>\number</code> (or <code>\romannumeral</code>) are needed not only to print but also to trigger the computation, whereas <code>\xintthe</code> is mandatory only for the printing step.</p></li>
-<li><p>the default behavior of <code>\xintAssign</code> is changed, it now does not do any further expansion beyond the initial full-expansion which provided the list of items to be assigned to macros.</p></li>
-<li><p>bug fix (<strong>xintfrac</strong>): <code>1.09i</code> did an unexplainable change to <code>\XINT_infloat_zero</code> which broke the floating point routines for vanishing operands =:(((</p></li>
-<li><p>bug fix: the <code>1.09i</code> <code>xint.ins</code> file produced a buggy <code>xint.tex</code> file.</p></li>
+<li><p>(<strong>xint</strong>) the core division routines have been
+re-written for some (limited) efficiency gain, more pronounced for small
+divisors. As a result the <em>computation of one thousand digits of
+<span class="math inline"><em>π</em></span></em> is close to three times
+faster than with earlier releases.</p></li>
+<li><p>some various other small improvements, particularly in the power
+routines.</p></li>
+<li><p>(<strong>xintfrac</strong>) a macro <code>\xintXTrunc</code> is
+designed to produce thousands or even tens of thousands of digits of the
+decimal expansion of a fraction. Although completely expandable it has
+its use limited to inside an <code>\edef</code>, <code>\write</code>,
+<code>\message</code>, . It can thus not be nested as argument to
+another package macro.</p></li>
+<li><p>(<strong>xintexpr</strong>) the tacit multiplication done in
+<code>\xintexpr..\relax</code> on encountering a count register or
+variable, or a <code>\numexpr</code>, while scanning a (decimal) number,
+is extended to the case of a sub <code>\xintexpr</code>-ession.</p></li>
+<li><p><code>\xintexpr</code> can now be used in an <code>\edef</code>
+with no <code>\xintthe</code> prefix; it will execute completely the
+computation, and the error message about a missing <code>\xintthe</code>
+will be inhibited. Previously, in the absence of <code>\xintthe</code>,
+expansion could only be a full one (with <code>\romannumeral-`0</code>),
+not a complete one (with <code>\edef</code>). Note that this differs
+from the behavior of the non-expandable <code>\numexpr</code>:
+<code>\the</code> or <code>\number</code> (or
+<code>\romannumeral</code>) are needed not only to print but also to
+trigger the computation, whereas <code>\xintthe</code> is mandatory only
+for the printing step.</p></li>
+<li><p>the default behavior of <code>\xintAssign</code> is changed, it
+now does not do any further expansion beyond the initial full-expansion
+which provided the list of items to be assigned to macros.</p></li>
+<li><p>bug fix (<strong>xintfrac</strong>): <code>1.09i</code> did an
+unexplainable change to <code>\XINT_infloat_zero</code> which broke the
+floating point routines for vanishing operands =:(((</p></li>
+<li><p>bug fix: the <code>1.09i</code> <code>xint.ins</code> file
+produced a buggy <code>xint.tex</code> file.</p></li>
</ul>
<h2 id="i-20131218"><code>1.09i (2013/12/18)</code></h2>
<ul>
-<li><p>(<strong>xintexpr</strong>) <code>\xintiiexpr</code> is a variant of <code>\xintexpr</code> which is optimized to deal only with (long) integers, <code>/</code> does a euclidean quotient.</p></li>
-<li><p><em>deprecated</em>: <code>\xintnumexpr</code>, <code>\xintthenumexpr</code>, <code>\xintNewNumExpr</code> are renamed, respectively, <code>\xintiexpr</code>, <code>\xinttheiexpr</code>, <code>\xintNewIExpr</code>. The earlier denominations are kept but are to be removed at some point.</p></li>
-<li><p>it is now possible within <code>\xintexpr...\relax</code> and its variants to use count, dimen, and skip registers or variables without explicit <code>\the/\number</code>: the parser inserts automatically <code>\number</code> and a tacit multiplication is implied when a register or variable immediately follows a number or fraction. Regarding dimensions and <code>\number</code>, see the further discussion in <em>Dimensions</em>.</p></li>
-<li><p>(<strong>xintfrac</strong>) conditional <code>\xintifOne</code>; <code>\xintifTrueFalse</code> renamed to <code>\xintifTrueAelseB</code>; macros <code>\xintTFrac</code> (<code>fractional part</code>, mapped to function <code>frac</code> in <code>\xintexpr</code>-essions), <code>\xintFloatE</code>.</p></li>
-<li><p>(<strong>xinttools</strong>) <code>\xintAssign</code> admits an optional argument to specify the expansion type to be used: <code>[]</code> (none, default), <code>[o]</code> (once), <code>[oo]</code> (twice), <code>[f]</code> (full), <code>[e]</code> (<code>\edef</code>),… to define the macros</p></li>
-<li><p><strong>xinttools</strong> defines <code>\odef</code>, <code>\oodef</code>, <code>\fdef</code> (if the names have already been assigned, it uses <code>\xintoodef</code> etc…). These tools are provided for the case one uses the package macros in a non-expandable context. <code>\oodef</code> expands twice the macro replacement text, and <code>\fdef</code> applies full expansion. They are useful in situations where one does not want a full <code>\edef</code>. <code>\fdef</code> appears to be faster than <code>\oodef</code> in almost all cases (with less than thousand digits in the result), and even faster than <code>\edef</code> for expanding the package macros when the result has a few dozens of digits. <code>\oodef</code> needs that expansion ends up in thousands of digits to become competitive with the other two.</p></li>
-<li><p>some across the board slight efficiency improvement as a result of modifications of various types to <em>fork macros</em> and <em>branching conditionals</em> which are used internally.</p></li>
-<li><p>bug fix (<strong>xint</strong>): <code>\xintAND</code> and <code>\xintOR</code> inserted a space token in some cases and did not expand as promised in two steps <code>:-((</code> (bug dating back to <code>1.09a</code> I think; this bug was without consequences when using <code>&amp;</code> and <code>|</code> in <code>\xintexpr-essions</code>, it affected only the macro form).</p></li>
-<li><p>bug fix (<strong>xintcfrac</strong>): <code>\xintFtoCCv</code> still ended fractions with the <code>[0]</code>’s which were supposed to have been removed since release <code>1.09b</code>.</p></li>
-<li><p><em>deprecated</em>: <code>\xintifTrueFalse</code>, <code>\xintifTrue</code>; use <code>\xintifTrueAelseB</code>.</p></li>
+<li><p>(<strong>xintexpr</strong>) <code>\xintiiexpr</code> is a variant
+of <code>\xintexpr</code> which is optimized to deal only with (long)
+integers, <code>/</code> does a euclidean quotient.</p></li>
+<li><p><em>deprecated</em>: <code>\xintnumexpr</code>,
+<code>\xintthenumexpr</code>, <code>\xintNewNumExpr</code> are renamed,
+respectively, <code>\xintiexpr</code>, <code>\xinttheiexpr</code>,
+<code>\xintNewIExpr</code>. The earlier denominations are kept but are
+to be removed at some point.</p></li>
+<li><p>it is now possible within <code>\xintexpr...\relax</code> and its
+variants to use count, dimen, and skip registers or variables without
+explicit <code>\the/\number</code>: the parser inserts automatically
+<code>\number</code> and a tacit multiplication is implied when a
+register or variable immediately follows a number or fraction. Regarding
+dimensions and <code>\number</code>, see the further discussion in
+<em>Dimensions</em>.</p></li>
+<li><p>(<strong>xintfrac</strong>) conditional <code>\xintifOne</code>;
+<code>\xintifTrueFalse</code> renamed to <code>\xintifTrueAelseB</code>;
+macros <code>\xintTFrac</code> (<code>fractional part</code>, mapped to
+function <code>frac</code> in <code>\xintexpr</code>-essions),
+<code>\xintFloatE</code>.</p></li>
+<li><p>(<strong>xinttools</strong>) <code>\xintAssign</code> admits an
+optional argument to specify the expansion type to be used:
+<code>[]</code> (none, default), <code>[o]</code> (once),
+<code>[oo]</code> (twice), <code>[f]</code> (full), <code>[e]</code>
+(<code>\edef</code>),… to define the macros</p></li>
+<li><p><strong>xinttools</strong> defines <code>\odef</code>,
+<code>\oodef</code>, <code>\fdef</code> (if the names have already been
+assigned, it uses <code>\xintoodef</code> etc…). These tools are
+provided for the case one uses the package macros in a non-expandable
+context. <code>\oodef</code> expands twice the macro replacement text,
+and <code>\fdef</code> applies full expansion. They are useful in
+situations where one does not want a full <code>\edef</code>.
+<code>\fdef</code> appears to be faster than <code>\oodef</code> in
+almost all cases (with less than thousand digits in the result), and
+even faster than <code>\edef</code> for expanding the package macros
+when the result has a few dozens of digits. <code>\oodef</code> needs
+that expansion ends up in thousands of digits to become competitive with
+the other two.</p></li>
+<li><p>some across the board slight efficiency improvement as a result
+of modifications of various types to <em>fork macros</em> and
+<em>branching conditionals</em> which are used internally.</p></li>
+<li><p>bug fix (<strong>xint</strong>): <code>\xintAND</code> and
+<code>\xintOR</code> inserted a space token in some cases and did not
+expand as promised in two steps <code>:-((</code> (bug dating back to
+<code>1.09a</code> I think; this bug was without consequences when using
+<code>&amp;</code> and <code>|</code> in <code>\xintexpr-essions</code>,
+it affected only the macro form).</p></li>
+<li><p>bug fix (<strong>xintcfrac</strong>): <code>\xintFtoCCv</code>
+still ended fractions with the <code>[0]</code>’s which were supposed to
+have been removed since release <code>1.09b</code>.</p></li>
+<li><p><em>deprecated</em>: <code>\xintifTrueFalse</code>,
+<code>\xintifTrue</code>; use <code>\xintifTrueAelseB</code>.</p></li>
</ul>
<h2 id="h-20131128"><code>1.09h (2013/11/28)</code></h2>
<ul>
-<li><p>parts of the documentation have been re-written or re-organized, particularly the discussion of expansion issues and of input and output formats.</p></li>
-<li><p>the expansion types of macro arguments are documented in the margin of the macro descriptions, with conventions mainly taken over from those in the <code>LaTeX3</code> documentation.</p></li>
-<li><p>a dependency of <strong>xinttools</strong> on <strong>xint</strong> (inside <code>\xintSeq</code>) has been removed.</p></li>
-<li><p>(<strong>xintgcd</strong>) <code>\xintTypesetEuclideAlgorithm</code> and <code>\xintTypesetBezoutAlgorithm</code> have been slightly modified (regarding indentation).</p></li>
-<li><p>(<strong>xint</strong>) macros <code>xintiSum</code> and <code>xintiPrd</code> are renamed to <code>\xintiiSum</code> and <code>\xintiiPrd</code>.</p></li>
-<li><p>(<strong>xinttools</strong>) a count register used in <code>1.09g</code> in the <code>\xintFor</code> loops for parsing purposes has been removed and replaced by use of a <code>\numexpr</code>.</p></li>
-<li><p>the few uses of <code>\loop</code> have been replaced by <code>\xintloop/\xintiloop</code>.</p></li>
-<li><p>all macros of <strong>xinttools</strong> for which it makes sense are now declared <code>\long</code>.</p></li>
+<li><p>parts of the documentation have been re-written or re-organized,
+particularly the discussion of expansion issues and of input and output
+formats.</p></li>
+<li><p>the expansion types of macro arguments are documented in the
+margin of the macro descriptions, with conventions mainly taken over
+from those in the <code>LaTeX3</code> documentation.</p></li>
+<li><p>a dependency of <strong>xinttools</strong> on
+<strong>xint</strong> (inside <code>\xintSeq</code>) has been
+removed.</p></li>
+<li><p>(<strong>xintgcd</strong>)
+<code>\xintTypesetEuclideAlgorithm</code> and
+<code>\xintTypesetBezoutAlgorithm</code> have been slightly modified
+(regarding indentation).</p></li>
+<li><p>(<strong>xint</strong>) macros <code>xintiSum</code> and
+<code>xintiPrd</code> are renamed to <code>\xintiiSum</code> and
+<code>\xintiiPrd</code>.</p></li>
+<li><p>(<strong>xinttools</strong>) a count register used in
+<code>1.09g</code> in the <code>\xintFor</code> loops for parsing
+purposes has been removed and replaced by use of a
+<code>\numexpr</code>.</p></li>
+<li><p>the few uses of <code>\loop</code> have been replaced by
+<code>\xintloop/\xintiloop</code>.</p></li>
+<li><p>all macros of <strong>xinttools</strong> for which it makes sense
+are now declared <code>\long</code>.</p></li>
</ul>
<h2 id="g-20131122"><code>1.09g (2013/11/22)</code></h2>
<ul>
-<li><p>a package <strong>xinttools</strong> is detached from <strong>xint</strong>, to make tools such as <code>\xintFor</code>, <code>\xintApplyUnbraced</code>, and <code>\xintiloop</code> available without the <strong>xint</strong> overhead.</p></li>
-<li><p>expandable nestable loops <code>\xintloop</code> and <code>\xintiloop</code>.</p></li>
-<li><p>bugfix: <code>\xintFor</code> and <code>\xintFor*</code> do not modify anymore the value of <code>\count 255</code>.</p></li>
+<li><p>a package <strong>xinttools</strong> is detached from
+<strong>xint</strong>, to make tools such as <code>\xintFor</code>,
+<code>\xintApplyUnbraced</code>, and <code>\xintiloop</code> available
+without the <strong>xint</strong> overhead.</p></li>
+<li><p>expandable nestable loops <code>\xintloop</code> and
+<code>\xintiloop</code>.</p></li>
+<li><p>bugfix: <code>\xintFor</code> and <code>\xintFor*</code> do not
+modify anymore the value of <code>\count 255</code>.</p></li>
</ul>
<h2 id="f-20131104"><code>1.09f (2013/11/04)</code></h2>
<ul>
-<li><p>(<strong>xint</strong>) <code>\xintZapFirstSpaces</code>, <code>\xintZapLastSpaces</code>, <code>\xintZapSpaces</code>, <code>\xintZapSpacesB</code>, for expandably stripping away leading and/or ending spaces.</p></li>
-<li><p><code>\xintCSVtoList</code> by default uses <code>\xintZapSpacesB</code> to strip away spaces around commas (or at the start and end of the comma separated list).</p></li>
-<li><p>also the <code>\xintFor</code> loop will strip out all spaces around commas and at the start and the end of its list argument; and similarly for <code>\xintForpair</code>, <code>\xintForthree</code>, <code>\xintForfour</code>.</p></li>
-<li><p><code>\xintFor</code> <em>et al.</em> accept all macro parameters from <code>#1</code> to <code>#9</code>.</p></li>
-<li><p>for reasons of inner coherence some macros previously with one extra <code>i</code> in their names (e.g. <code>\xintiMON</code>) now have a doubled <code>ii</code> (<code>\xintiiMON</code>) to indicate that they skip the overhead of parsing their inputs via <code>\xintNum</code>. Macros with a <em>single</em> <code>i</code> such as <code>\xintiAdd</code> are those which maintain the non-<strong>xintfrac</strong> output format for big integers, but do parse their inputs via <code>\xintNum</code> (since release <code>1.09a</code>). They too may have doubled-<code>i</code> variants for matters of programming optimization when working only with (big) integers and not fractions or decimal numbers.</p></li>
+<li><p>(<strong>xint</strong>) <code>\xintZapFirstSpaces</code>,
+<code>\xintZapLastSpaces</code>, <code>\xintZapSpaces</code>,
+<code>\xintZapSpacesB</code>, for expandably stripping away leading
+and/or ending spaces.</p></li>
+<li><p><code>\xintCSVtoList</code> by default uses
+<code>\xintZapSpacesB</code> to strip away spaces around commas (or at
+the start and end of the comma separated list).</p></li>
+<li><p>also the <code>\xintFor</code> loop will strip out all spaces
+around commas and at the start and the end of its list argument; and
+similarly for <code>\xintForpair</code>, <code>\xintForthree</code>,
+<code>\xintForfour</code>.</p></li>
+<li><p><code>\xintFor</code> <em>et al.</em> accept all macro parameters
+from <code>#1</code> to <code>#9</code>.</p></li>
+<li><p>for reasons of inner coherence some macros previously with one
+extra <code>i</code> in their names (e.g. <code>\xintiMON</code>) now
+have a doubled <code>ii</code> (<code>\xintiiMON</code>) to indicate
+that they skip the overhead of parsing their inputs via
+<code>\xintNum</code>. Macros with a <em>single</em> <code>i</code> such
+as <code>\xintiAdd</code> are those which maintain the
+non-<strong>xintfrac</strong> output format for big integers, but do
+parse their inputs via <code>\xintNum</code> (since release
+<code>1.09a</code>). They too may have doubled-<code>i</code> variants
+for matters of programming optimization when working only with (big)
+integers and not fractions or decimal numbers.</p></li>
</ul>
<h2 id="e-20131029"><code>1.09e (2013/10/29)</code></h2>
<ul>
-<li><p>(<strong>xint</strong>) <code>\xintintegers</code>, <code>\xintdimensions</code>, <code>\xintrationals</code> for infinite <code>\xintFor</code> loops, interrupted with <code>\xintBreakFor</code> and <code>\xintBreakForAndDo</code>.</p></li>
-<li><p><code>\xintifForFirst</code>, <code>\xintifForLast</code> for the <code>\xintFor</code> and <code>\xintFor*</code> loops,</p></li>
-<li><p>the <code>\xintFor</code> and <code>xintFor*</code> loops are now <code>\long</code>, the replacement text and the items may contain explicit <code>\par</code>’s.</p></li>
-<li><p>conditionals <code>\xintifCmp</code>, <code>\xintifInt</code>, <code>\xintifOdd</code>.</p></li>
-<li><p>bug fix (<strong>xint</strong>): the <code>\xintFor</code> loop (not <code>\xintFor*</code>) did not correctly detect an empty list.</p></li>
-<li><p>bug fix (<strong>xint</strong>): <code>\xintiSqrt {0}</code> crashed. <code>:-((</code></p></li>
-<li><p>the documentation has been enriched with various additional examples, such as the <em>the quick sort algorithm illustrated</em> or the various ways of <em>computing prime numbers</em>.</p></li>
-<li><p>the documentation explains with more details various expansion related issues, particularly in relation to conditionals.</p></li>
+<li><p>(<strong>xint</strong>) <code>\xintintegers</code>,
+<code>\xintdimensions</code>, <code>\xintrationals</code> for infinite
+<code>\xintFor</code> loops, interrupted with <code>\xintBreakFor</code>
+and <code>\xintBreakForAndDo</code>.</p></li>
+<li><p><code>\xintifForFirst</code>, <code>\xintifForLast</code> for the
+<code>\xintFor</code> and <code>\xintFor*</code> loops,</p></li>
+<li><p>the <code>\xintFor</code> and <code>xintFor*</code> loops are now
+<code>\long</code>, the replacement text and the items may contain
+explicit <code>\par</code>’s.</p></li>
+<li><p>conditionals <code>\xintifCmp</code>, <code>\xintifInt</code>,
+<code>\xintifOdd</code>.</p></li>
+<li><p>bug fix (<strong>xint</strong>): the <code>\xintFor</code> loop
+(not <code>\xintFor*</code>) did not correctly detect an empty
+list.</p></li>
+<li><p>bug fix (<strong>xint</strong>): <code>\xintiSqrt {0}</code>
+crashed. <code>:-((</code></p></li>
+<li><p>the documentation has been enriched with various additional
+examples, such as the <em>the quick sort algorithm illustrated</em> or
+the various ways of <em>computing prime numbers</em>.</p></li>
+<li><p>the documentation explains with more details various expansion
+related issues, particularly in relation to conditionals.</p></li>
</ul>
<h2 id="d-20131022"><code>1.09d (2013/10/22)</code></h2>
<ul>
-<li><p>bug fix (<strong>xint</strong>): <code>\xintFor*</code> is modified to gracefully handle a space token (or more than one) located at the very end of its list argument (as the space before <code>\do</code> in <code>\xintFor* #1 in {{a}{b}{c}&lt;space&gt;} \do {stuff}</code>; spaces at other locations were already harmless). Furthermore this new version <em>f-expands</em> the un-braced list items. After <code>\def\x{{1}{2}}</code> and <code>\def\y{{a}\x {b}{c}\x }</code>, <code>\y</code> will appear to <code>\xintFor*</code> exactly as if it had been defined as <code>\def\y{{a}{1}{2}{b}{c}{1}{2}}</code>.</p></li>
+<li><p>bug fix (<strong>xint</strong>): <code>\xintFor*</code> is
+modified to gracefully handle a space token (or more than one) located
+at the very end of its list argument (as the space before
+<code>\do</code> in
+<code>\xintFor* #1 in {{a}{b}{c}&lt;space&gt;} \do {stuff}</code>;
+spaces at other locations were already harmless). Furthermore this new
+version <em>f-expands</em> the un-braced list items. After
+<code>\def\x{{1}{2}}</code> and
+<code>\def\y{{a}\x {b}{c}\x }</code>, <code>\y</code> will appear to
+<code>\xintFor*</code> exactly as if it had been defined as
+<code>\def\y{{a}{1}{2}{b}{c}{1}{2}}</code>.</p></li>
<li><p>same bug fix for <code>\xintApplyInline</code>.</p></li>
</ul>
<h2 id="c-20131009"><code>1.09c (2013/10/09)</code></h2>
<ul>
-<li><p>(<strong>xintexpr</strong>) added <code>bool</code> and <code>togl</code> to the <code>\xintexpr</code> syntax; also added <code>\xintboolexpr</code> and <code>\xintifboolexpr</code>.</p></li>
+<li><p>(<strong>xintexpr</strong>) added <code>bool</code> and
+<code>togl</code> to the <code>\xintexpr</code> syntax; also added
+<code>\xintboolexpr</code> and <code>\xintifboolexpr</code>.</p></li>
<li><p>added <code>\xintNewNumExpr</code>.</p></li>
-<li><p>the factorial <code>!</code> and branching <code>?</code>, <code>:</code>, operators (in <code>\xintexpr...\relax</code>) have now less precedence than a function name located just before,</p></li>
-<li><p>(<strong>xint</strong>) <code>\xintFor</code> is a new type of loop, whose replacement text inserts the comma separated values or list items via macro parameters, rather than encapsulated in macros; the loops are nestable up to four levels (nine levels since <code>1.09f</code>) and their replacement texts are allowed to close groups as happens with the tabulation in alignments,</p></li>
-<li><p><code>\xintForpair</code>, <code>\xintForthree</code>, <code>\xintForfour</code> are experimental variants of <code>\xintFor</code>,</p></li>
-<li><p><code>\xintApplyInline</code> has been enhanced in order to be usable for generating rows (partially or completely) in an alignment,</p></li>
-<li><p>command <code>\xintSeq</code> to generate (expandably) arithmetic sequences of (short) integers,</p></li>
-<li><p>again various improvements and changes in the documentation.</p></li>
+<li><p>the factorial <code>!</code> and branching <code>?</code>,
+<code>:</code>, operators (in <code>\xintexpr...\relax</code>) have now
+less precedence than a function name located just before,</p></li>
+<li><p>(<strong>xint</strong>) <code>\xintFor</code> is a new type of
+loop, whose replacement text inserts the comma separated values or list
+items via macro parameters, rather than encapsulated in macros; the
+loops are nestable up to four levels (nine levels since
+<code>1.09f</code>) and their replacement texts are allowed to close
+groups as happens with the tabulation in alignments,</p></li>
+<li><p><code>\xintForpair</code>, <code>\xintForthree</code>,
+<code>\xintForfour</code> are experimental variants of
+<code>\xintFor</code>,</p></li>
+<li><p><code>\xintApplyInline</code> has been enhanced in order to be
+usable for generating rows (partially or completely) in an
+alignment,</p></li>
+<li><p>command <code>\xintSeq</code> to generate (expandably) arithmetic
+sequences of (short) integers,</p></li>
+<li><p>again various improvements and changes in the
+documentation.</p></li>
</ul>
<h2 id="b-20131003"><code>1.09b (2013/10/03)</code></h2>
<ul>
<li><p>various improvements in the documentation,</p></li>
-<li><p>more economical catcode management and re-loading handling,</p></li>
-<li><p>removal of all those <code>[0]</code>’s previously forcefully added at the end of fractions by various macros of <strong>xintcfrac</strong>,</p></li>
-<li><p><code>\xintNthElt</code> with a negative index returns from the tail of the list,</p></li>
-<li><p>macro <code>\xintPRaw</code> to have something like what <code>\xintFrac</code> does in math mode; i.e. a <code>\xintRaw</code> which does not print the denominator if it is one.</p></li>
+<li><p>more economical catcode management and re-loading
+handling,</p></li>
+<li><p>removal of all those <code>[0]</code>’s previously forcefully
+added at the end of fractions by various macros of
+<strong>xintcfrac</strong>,</p></li>
+<li><p><code>\xintNthElt</code> with a negative index returns from the
+tail of the list,</p></li>
+<li><p>macro <code>\xintPRaw</code> to have something like what
+<code>\xintFrac</code> does in math mode; i.e. a <code>\xintRaw</code>
+which does not print the denominator if it is one.</p></li>
</ul>
<h2 id="a-20130924"><code>1.09a (2013/09/24)</code></h2>
<ul>
-<li><p>(<strong>xintexpr</strong>) <code>\xintexpr..\relax</code> and <code>\xintfloatexpr..\relax</code> admit functions in their syntax, with comma separated values as arguments, among them <code>reduce, sqr, sqrt, abs, sgn, floor, ceil, quo, rem, round, trunc, float, gcd, lcm, max, min, sum, prd, add, mul, not, all, any, xor</code>.</p></li>
-<li><p>comparison (<code>&lt;</code>, <code>&gt;</code>, <code>=</code>) and logical (<code>|</code>, <code>&amp;</code>) operators.</p></li>
-<li><p>the command <code>\xintthe</code> which converts <code>\xintexpr</code>essions into printable format (like <code>\the</code> with <code>\numexpr</code>) is more efficient, for example one can do <code>\xintthe\x</code> if <code>\x</code> was defined to be an <code>\xintexpr..\relax</code>:</p>
+<li><p>(<strong>xintexpr</strong>) <code>\xintexpr..\relax</code> and
+<code>\xintfloatexpr..\relax</code> admit functions in their syntax,
+with comma separated values as arguments, among them
+<code>reduce, sqr, sqrt, abs, sgn, floor, ceil, quo, rem, round, trunc, float, gcd, lcm, max, min, sum, prd, add, mul, not, all, any, xor</code>.</p></li>
+<li><p>comparison (<code>&lt;</code>, <code>&gt;</code>, <code>=</code>)
+and logical (<code>|</code>, <code>&amp;</code>) operators.</p></li>
+<li><p>the command <code>\xintthe</code> which converts
+<code>\xintexpr</code>essions into printable format (like
+<code>\the</code> with <code>\numexpr</code>) is more efficient, for
+example one can do <code>\xintthe\x</code> if <code>\x</code> was
+defined to be an <code>\xintexpr..\relax</code>:</p>
<pre><code>\def\x{\xintexpr 3^57\relax}
\def\y{\xintexpr \x^(-2)\relax}
\def\z{\xintexpr \y-3^-114\relax}
\xintthe\z</code></pre></li>
-<li><p><code>\xintnumexpr .. \relax</code> (now renamed <code>\xintiexpr</code>) is <code>\xintexpr round( .. ) \relax</code>.</p></li>
-<li><p><code>\xintNewExpr</code> now works with the standard macro parameter character <code>#</code>.</p></li>
-<li><p>both regular <code>\xintexpr</code>-essions and commands defined by <code>\xintNewExpr</code> will work with comma separated lists of expressions,</p></li>
-<li><p>commands <code>\xintFloor</code>, <code>\xintCeil</code>, <code>\xintMaxof</code>, <code>\xintMinof</code> (package <strong>xintfrac</strong>), <code>\xintGCDof</code>, <code>\xintLCM</code>, <code>\xintLCMof</code> (package <strong>xintgcd</strong>), <code>\xintifLt</code>, <code>\xintifGt</code>, <code>\xintifSgn</code>, <code>\xintANDof</code>, …</p></li>
-<li><p>The arithmetic macros from package <strong>xint</strong> now filter their operands via <code>\xintNum</code> which means that they may use directly count registers and <code>\numexpr</code>-essions without having to prefix them by <code>\the</code>. This is thus similar to the situation holding previously already when <strong>xintfrac</strong> was loaded.</p></li>
-<li><p>a bug (<strong>xintfrac</strong>) introduced in <code>1.08b</code> made <code>\xintCmp</code> crash when one of its arguments was zero. <code>:-((</code></p></li>
+<li><p><code>\xintnumexpr .. \relax</code> (now renamed
+<code>\xintiexpr</code>) is
+<code>\xintexpr round( .. ) \relax</code>.</p></li>
+<li><p><code>\xintNewExpr</code> now works with the standard macro
+parameter character <code>#</code>.</p></li>
+<li><p>both regular <code>\xintexpr</code>-essions and commands defined
+by <code>\xintNewExpr</code> will work with comma separated lists of
+expressions,</p></li>
+<li><p>commands <code>\xintFloor</code>, <code>\xintCeil</code>,
+<code>\xintMaxof</code>, <code>\xintMinof</code> (package
+<strong>xintfrac</strong>), <code>\xintGCDof</code>,
+<code>\xintLCM</code>, <code>\xintLCMof</code> (package
+<strong>xintgcd</strong>), <code>\xintifLt</code>,
+<code>\xintifGt</code>, <code>\xintifSgn</code>,
+<code>\xintANDof</code>, …</p></li>
+<li><p>The arithmetic macros from package <strong>xint</strong> now
+filter their operands via <code>\xintNum</code> which means that they
+may use directly count registers and <code>\numexpr</code>-essions
+without having to prefix them by <code>\the</code>. This is thus similar
+to the situation holding previously already when
+<strong>xintfrac</strong> was loaded.</p></li>
+<li><p>a bug (<strong>xintfrac</strong>) introduced in
+<code>1.08b</code> made <code>\xintCmp</code> crash when one of its
+arguments was zero. <code>:-((</code></p></li>
</ul>
<h2 id="b-20130614"><code>1.08b (2013/06/14)</code></h2>
<ul>
-<li><p>(<strong>xintexpr</strong>) Correction of a problem with spaces inside <code>\xintexpr</code>-essions.</p></li>
-<li><p>(<strong>xintfrac</strong>) Additional improvements to the handling of floating point numbers.</p></li>
-<li><p>section <em>Use of count registers</em> documenting how count registers may be directly used in arguments to the macros of <strong>xintfrac</strong>.</p></li>
+<li><p>(<strong>xintexpr</strong>) Correction of a problem with spaces
+inside <code>\xintexpr</code>-essions.</p></li>
+<li><p>(<strong>xintfrac</strong>) Additional improvements to the
+handling of floating point numbers.</p></li>
+<li><p>section <em>Use of count registers</em> documenting how count
+registers may be directly used in arguments to the macros of
+<strong>xintfrac</strong>.</p></li>
</ul>
<h2 id="a-20130611"><code>1.08a (2013/06/11)</code></h2>
<ul>
-<li><p>(<strong>xintfrac</strong>) Improved efficiency of the basic conversion from exact fractions to floating point numbers, with ensuing speed gains especially for the power function macros <code>\xintFloatPow</code> and <code>\xintFloatPower</code>,</p></li>
-<li><p>Better management by <code>\xintCmp</code>, <code>\xintMax</code>, <code>\xintMin</code> and <code>\xintGeq</code> of inputs having big powers of ten in them.</p></li>
-<li><p>Macros for floating point numbers added to the <strong>xintseries</strong> package.</p></li>
+<li><p>(<strong>xintfrac</strong>) Improved efficiency of the basic
+conversion from exact fractions to floating point numbers, with ensuing
+speed gains especially for the power function macros
+<code>\xintFloatPow</code> and <code>\xintFloatPower</code>,</p></li>
+<li><p>Better management by <code>\xintCmp</code>,
+<code>\xintMax</code>, <code>\xintMin</code> and <code>\xintGeq</code>
+of inputs having big powers of ten in them.</p></li>
+<li><p>Macros for floating point numbers added to the
+<strong>xintseries</strong> package.</p></li>
</ul>
<h2 id="section-4"><code>1.08 (2013/06/07)</code></h2>
<ul>
-<li><p>(<strong>xint</strong> and <strong>xintfrac</strong>) Macros for extraction of square roots, for floating point numbers (<code>\xintFloatSqrt</code>), and integers (<code>\xintiSqrt</code>).</p></li>
-<li><p>new package <strong>xintbinhex</strong> providing <em>conversion routines</em> to and from binary and hexadecimal bases.</p></li>
+<li><p>(<strong>xint</strong> and <strong>xintfrac</strong>) Macros for
+extraction of square roots, for floating point numbers
+(<code>\xintFloatSqrt</code>), and integers
+(<code>\xintiSqrt</code>).</p></li>
+<li><p>new package <strong>xintbinhex</strong> providing <em>conversion
+routines</em> to and from binary and hexadecimal bases.</p></li>
</ul>
<h2 id="section-5"><code>1.07 (2013/05/25)</code></h2>
<ul>
-<li><p>The <strong>xintexpr</strong> package is a new core constituent (which loads automatically <strong>xintfrac</strong> and <strong>xint</strong>) and implements the expandable expanding parser</p>
+<li><p>The <strong>xintexpr</strong> package is a new core constituent
+(which loads automatically <strong>xintfrac</strong> and
+<strong>xint</strong>) and implements the expandable expanding
+parser</p>
<pre><code>\xintexpr . . . \relax,</code></pre>
<p>and its variant</p>
<pre><code>\xintfloatexpr . . . \relax</code></pre>
-<p>allowing on input formulas using the infix operators <code>+</code>, <code>-</code>, <code>*</code>, <code>/</code>, and <code>^</code>, and arbitrary levels of parenthesizing. Within a float expression the operations are executed according to the current value set by <code>\xintDigits</code>. Within an <code>\xintexpr</code>-ession the binary operators are computed exactly.</p>
-<p>To write the <code>\xintexpr</code> parser I benefited from the commented source of the <code>l3fp</code> parser; the <code>\xintexpr</code> parser has its own features and peculiarities. <em>See its documentation</em>.</p></li>
-<li><p>The floating point precision <code>D</code> is set (this is a local assignment to a <code>\mathchar</code> variable) with <code>\xintDigits := D;</code> and queried with <code>\xinttheDigits</code>. It may be set to anything up to <code>32767</code>.<a href="#fn1" class="footnote-ref" id="fnref1"><sup>1</sup></a> The macro incarnations of the binary operations admit an optional argument which will replace pointwise <code>D</code>; this argument may exceed the <code>32767</code> bound.</p></li>
-<li><p>The <strong>xintfrac</strong> macros now accept numbers written in scientific notation, the <code>\xintFloat</code> command serves to output its argument with a given number <code>D</code> of significant figures. The value of <code>D</code> is either given as optional argument to <code>\xintFloat</code> or set with <code>\xintDigits := D;</code>. The default value is <code>16</code>.</p></li>
+<p>allowing on input formulas using the infix operators <code>+</code>,
+<code>-</code>, <code>*</code>, <code>/</code>, and <code>^</code>, and
+arbitrary levels of parenthesizing. Within a float expression the
+operations are executed according to the current value set by
+<code>\xintDigits</code>. Within an <code>\xintexpr</code>-ession the
+binary operators are computed exactly.</p>
+<p>To write the <code>\xintexpr</code> parser I benefited from the
+commented source of the <code>l3fp</code> parser; the
+<code>\xintexpr</code> parser has its own features and peculiarities.
+<em>See its documentation</em>.</p></li>
+<li><p>The floating point precision <code>D</code> is set (this is a
+local assignment to a <code>\mathchar</code> variable) with
+<code>\xintDigits := D;</code> and queried with
+<code>\xinttheDigits</code>. It may be set to anything up to
+<code>32767</code>.<a href="#fn1" class="footnote-ref" id="fnref1"
+role="doc-noteref"><sup>1</sup></a> The macro incarnations of the binary
+operations admit an optional argument which will replace pointwise
+<code>D</code>; this argument may exceed the <code>32767</code>
+bound.</p></li>
+<li><p>The <strong>xintfrac</strong> macros now accept numbers written
+in scientific notation, the <code>\xintFloat</code> command serves to
+output its argument with a given number <code>D</code> of significant
+figures. The value of <code>D</code> is either given as optional
+argument to <code>\xintFloat</code> or set with
+<code>\xintDigits := D;</code>. The default value is
+<code>16</code>.</p></li>
</ul>
<h2 id="b-20130514"><code>1.06b (2013/05/14)</code></h2>
<ul>
-<li>Minor code and documentation improvements. Everywhere in the source code, a more modern underscore has replaced the @ sign.</li>
+<li>Minor code and documentation improvements. Everywhere in the source
+code, a more modern underscore has replaced the @ sign.</li>
</ul>
<h2 id="section-6"><code>1.06 (2013/05/07)</code></h2>
<ul>
-<li><p>Some code improvements, particularly for macros of <strong>xint</strong> doing loops.</p></li>
-<li><p>New utilities in <strong>xint</strong> for expandable manipulations of lists:</p>
+<li><p>Some code improvements, particularly for macros of
+<strong>xint</strong> doing loops.</p></li>
+<li><p>New utilities in <strong>xint</strong> for expandable
+manipulations of lists:</p>
<pre><code>\xintNthElt, \xintCSVtoList, \xintRevWithBraces</code></pre></li>
-<li><p>The macros did only a double expansion of their arguments. They now fully expand them (using <code>\romannumeral-`0</code>). Furthermore, in the case of arguments constrained to obey the TeX bounds they will be inserted inside a <code>\numexpr..\relax</code>, hence completely expanded, one may use count registers, even infix arithmetic operations, etc…</p></li>
+<li><p>The macros did only a double expansion of their arguments. They
+now fully expand them (using <code>\romannumeral-`0</code>).
+Furthermore, in the case of arguments constrained to obey the TeX bounds
+they will be inserted inside a <code>\numexpr..\relax</code>, hence
+completely expanded, one may use count registers, even infix arithmetic
+operations, etc…</p></li>
</ul>
<h2 id="section-7"><code>1.05 (2013/05/01)</code></h2>
-<p>Minor changes and additions to <strong>xintfrac</strong> and <strong>xintcfrac</strong>.</p>
+<p>Minor changes and additions to <strong>xintfrac</strong> and
+<strong>xintcfrac</strong>.</p>
<h2 id="section-8"><code>1.04 (2013/04/25)</code></h2>
<ul>
-<li><p>New component <strong>xintcfrac</strong> devoted to continued fractions.</p></li>
+<li><p>New component <strong>xintcfrac</strong> devoted to continued
+fractions.</p></li>
<li><p><strong>xint</strong>: faster division.</p></li>
-<li><p><strong>xint</strong>: added expandable macros <code>\xintListWithSep</code> and <code>\xintApply</code> to handle token lists.</p></li>
-<li><p><strong>xintfrac</strong>: added <code>\xintRound</code>.</p></li>
-<li><p><strong>xintseries</strong> has a new implementation of <code>\xintPowerSeries</code> based on a Horner scheme, and new macro <code>\xintRationalSeries</code>. Both to help deal with the <em>denominator buildup</em> plague.</p></li>
-<li><p><code>tex xint.dtx</code> extracts style files (no need for a <code>xint.ins</code>).</p></li>
-<li><p>Bug fix (<strong>xintfrac</strong>): <code>\xintIrr {0}</code> crashed.</p></li>
+<li><p><strong>xint</strong>: added expandable macros
+<code>\xintListWithSep</code> and <code>\xintApply</code> to handle
+token lists.</p></li>
+<li><p><strong>xintfrac</strong>: added
+<code>\xintRound</code>.</p></li>
+<li><p><strong>xintseries</strong> has a new implementation of
+<code>\xintPowerSeries</code> based on a Horner scheme, and new macro
+<code>\xintRationalSeries</code>. Both to help deal with the
+<em>denominator buildup</em> plague.</p></li>
+<li><p><code>tex xint.dtx</code> extracts style files (no need for a
+<code>xint.ins</code>).</p></li>
+<li><p>Bug fix (<strong>xintfrac</strong>): <code>\xintIrr {0}</code>
+crashed.</p></li>
</ul>
<h2 id="section-9"><code>1.03 (2013/04/14)</code></h2>
<ul>
-<li><p>New modules <strong>xintfrac</strong> (expandable operations on fractions) and <strong>xintseries</strong> (expandable partial sums with xint package).</p></li>
-<li><p>Slightly improved division and faster multiplication (the best ordering of the arguments is chosen automatically).</p></li>
-<li><p>Added illustration of Machin algorithm to the documentation.</p></li>
+<li><p>New modules <strong>xintfrac</strong> (expandable operations on
+fractions) and <strong>xintseries</strong> (expandable partial sums with
+xint package).</p></li>
+<li><p>Slightly improved division and faster multiplication (the best
+ordering of the arguments is chosen automatically).</p></li>
+<li><p>Added illustration of Machin algorithm to the
+documentation.</p></li>
</ul>
<h2 id="section-10"><code>1.0 (2013/03/28)</code></h2>
<p>Initial announcement:</p>
<blockquote>
-<p>The <strong>xint</strong> package implements with expandable TeX macros the basic arithmetic operations of addition, subtraction, multiplication and division, as applied to arbitrarily long numbers represented as chains of digits with an optional minus sign.</p>
+<p>The <strong>xint</strong> package implements with expandable TeX
+macros the basic arithmetic operations of addition, subtraction,
+multiplication and division, as applied to arbitrarily long numbers
+represented as chains of digits with an optional minus sign.</p>
</blockquote>
<blockquote>
-<p>The <strong>xintgcd</strong> package provides implementations of the Euclidean algorithm and of its typesetting.</p>
+<p>The <strong>xintgcd</strong> package provides implementations of the
+Euclidean algorithm and of its typesetting.</p>
</blockquote>
<blockquote>
<p>The packages may be used with Plain and with LaTeX.</p>
</blockquote>
-<section class="footnotes">
+<section class="footnotes footnotes-end-of-document"
+role="doc-endnotes">
<hr />
<ol>
-<li id="fn1"><p>but values higher than 100 or 200 will presumably give too slow evaluations.<a href="#fnref1" class="footnote-back">↩</a></p></li>
+<li id="fn1" role="doc-endnote"><p>but values higher than 100 or 200
+will presumably give too slow evaluations.<a href="#fnref1"
+class="footnote-back" role="doc-backlink">↩︎</a></p></li>
</ol>
</section>
</body>