diff options
author | Karl Berry <karl@freefriends.org> | 2013-11-24 00:00:29 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2013-11-24 00:00:29 +0000 |
commit | c9f8bd8bf029f005f02efea2a67dade996df2515 (patch) | |
tree | 671b749f2efa72f532d714a47ea4d3d79be5b4ce /Master/texmf-dist/source | |
parent | 42b82c7597e89fadde85939a364fa8d8aa24f2fa (diff) |
xint (23nov13)
git-svn-id: svn://tug.org/texlive/trunk@32224 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source')
-rw-r--r-- | Master/texmf-dist/source/generic/xint/xint.dtx | 2981 | ||||
-rw-r--r-- | Master/texmf-dist/source/generic/xint/xint.ins | 8 |
2 files changed, 1876 insertions, 1113 deletions
diff --git a/Master/texmf-dist/source/generic/xint/xint.dtx b/Master/texmf-dist/source/generic/xint/xint.dtx index 2f7cd536ac0..65c15c30343 100644 --- a/Master/texmf-dist/source/generic/xint/xint.dtx +++ b/Master/texmf-dist/source/generic/xint/xint.dtx @@ -1,13 +1,14 @@ % -*- coding: iso-latin-1; -*- %<*doc> -\def\lasttimestamp{Time-stamp <04-11-2013 13:50:22 CET *>} +\def\lasttimestamp{Time-stamp <23-11-2013 12:26:51 CET *>} %</doc> -% xint.dtx, 1.09f (2013/11/04) +% xint.dtx, 1.09g (2013/11/22) % % Copyright (C) 2013 by Jean-François Burnol % % Style files which will self-extract from xint.dtx: -% (base) xint.sty Expandable operations on long numbers +% xinttools.sty Expandable and non expandable utilities +% xint.sty Expandable operations on long numbers % xintfrac.sty Expandable operations on fractions % xintexpr.sty Expandable expression parser % xintbinhex.sty Expandable binary and hexadecimal conversions @@ -20,9 +21,9 @@ % ======= % % This work consists of the source file xint.dtx and of its derived files: -% xint.sty, xintfrac.sty, xintexpr.sty, xintbinhex.sty, xintgcd.sty, -% xintseries.sty, xintcfrac.sty, as well as xint.ins and the documentation -% xint.pdf (or xint.dvi). +% xinttools.sty xint.sty, xintfrac.sty, xintexpr.sty, xintbinhex.sty, +% xintgcd.sty, xintseries.sty, xintcfrac.sty, as well as xint.ins and the +% documentation xint.pdf (or xint.dvi). % % This work may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either @@ -54,10 +55,11 @@ % % To get xint.pdf run pdflatex thrice on xint.dtx % +% xinttools.sty | % xint.sty | % xintfrac.sty | -% xintexpr.sty | -% xintbinhex.sty | --> TDS:tex/generic/xint/ +% xintexpr.sty | --> TDS:tex/generic/xint/ +% xintbinhex.sty | % xintgcd.sty | % xintseries.sty | % xintcfrac.sty | @@ -67,7 +69,8 @@ % It may be necessary to then refresh the TeX installation filename % database. % -% Usage with LaTeX: \usepackage{xint} +% Usage with LaTeX: \usepackage{xinttools} +% \usepackage{xint} % (loads xinttools) % \usepackage{xintfrac} % (loads xint) % \usepackage{xintexpr} % (loads xintfrac) % @@ -76,7 +79,8 @@ % \usepackage{xintseries} % (loads xintfrac) % \usepackage{xintcfrac} % (loads xintfrac) % -% Usage with TeX: \input xint.sty\relax +% Usage with TeX: \input xinttools.sty\relax +% \input xint.sty\relax % (loads xinttools) % \input xintfrac.sty\relax % (loads xint) % \input xintexpr.sty\relax % (loads xintfrac) % @@ -87,7 +91,8 @@ % %% %%---------------------------------------------------------------- -%% The xint bundle (version 1.09f of November 4, 2013) +%% The xint bundle (version 1.09g of November 22, 2013) +%<xinttools>%% xinttools: Expandable and non-expandable utilities %<xint>%% xint: Expandable operations on long numbers %<xintfrac>%% xintfrac: Expandable operations on fractions %<xintexpr>%% xintexpr: Expandable expression parser @@ -99,8 +104,8 @@ %%---------------------------------------------------------------- %% %<*doc> -\def\pkgversion{1.09f} -\def\pkgdate{2013/11/04} +\def\pkgversion{1.09g} +\def\pkgdate{2013/11/22} \def\striptimestamp #1 <#2 #3 #4 #5>{#2 at #3 #4} \def\getdocdate #1 <#2-#3-#4 #5>{#4/#3/#2} \edef\docdate{\expandafter\getdocdate\lasttimestamp} @@ -111,6 +116,7 @@ \generate{\nopreamble \file{xint.ins}{\from{xint.dtx}{ins}} \usepreamble\defaultpreamble +\file{xinttools.sty}{\from{xint.dtx}{xinttools}} \file{xint.sty}{\from{xint.dtx}{xint}} \file{xintbinhex.sty}{\from{xint.dtx}{xintbinhex}} \file{xintgcd.sty}{\from{xint.dtx}{xintgcd}} @@ -125,8 +131,9 @@ %----------- to .ins file ---------------------------------------- %% %% This is a generated file. Run tex or latex on this file to -%% extract xint.sty, xintfrac.sty, xintexpr.sty, xintbinhex.sty, -%% xintgcd.sty, xintseries.sty and xintcfrac.sty from xint.dtx +%% extract xinttools.sty, xint.sty, xintfrac.sty, xintexpr.sty, +%% xintbinhex.sty, xintgcd.sty, xintseries.sty and xintcfrac.sty +%% from xint.dtx %% %% See xint.dtx for the copyright and the conditions for %% distribution and/or modification of this work. @@ -134,6 +141,7 @@ \input docstrip.tex \askforoverwritefalse \generate{\usepreamble\defaultpreamble +\file{xinttools.sty}{\from{xint.dtx}{xinttools}} \file{xint.sty}{\from{xint.dtx}{xint}} \file{xintbinhex.sty}{\from{xint.dtx}{xintbinhex}} \file{xintgcd.sty}{\from{xint.dtx}{xintgcd}} @@ -185,11 +193,12 @@ \def\sectioncouleur{{cyan}} -% attention à ce 22 hard codé. 23 maintenant,... +% attention à ce 22 hard codé. 23 maintenant,... 24; et 31 non 32... \etocsetstyle{section}{} {} - {\ifnum\etocthenumber=23 \gdef\sectioncouleur{{joli}}\fi + {\ifnum\etocthenumber=24 \gdef\sectioncouleur{{joli}}\fi + \ifnum\etocthenumber=32 \gdef\sectioncouleur{[named]{RoyalPurple}}\fi \savedsectionline{\numberline{\expandafter\textcolor\sectioncouleur {\etocnumber}}\etocname} {{\mdseries\etocpage}}% @@ -490,12 +499,22 @@ pdfpagemode=UseOutlines} \newcommand\csbh[1]{\texorpdfstring{\csbnolk{#1}}{\textbackslash #1}} % emploi de \xintFor à partir de 1.09c -\xintFor #1 in {xint,xintbinhex,xintgcd,xintfrac,xintseries,xintcfrac,xintexpr} +\xintForpair #1#2 in +{(xinttools,tools),(xint,xint),(xintbinhex,binhex),(xintgcd,gcd),% + (xintfrac,frac),(xintseries,series),(xintcfrac,cfrac),(xintexpr,expr)} \do {% \expandafter\def\csname #1name\endcsname {\texorpdfstring - {{\color{joli}\ttfamily\hyphenchar\font45 \bfseries #1}} + {\hyperref[sec:#2]% + {\color{joli}\bfseries\ttfamily\hyphenchar\font45 #1}} + {#1}% + \xspace }% + \expandafter\def\csname #1nameimp\endcsname + {\texorpdfstring + {\hyperref[sec:#2imp]% + {\color[named]{RoyalPurple}% + \bfseries\ttfamily\hyphenchar\font45 #1}} {#1}% \xspace }% }% @@ -557,32 +576,57 @@ pdfpagemode=UseOutlines} {\centering \textsc{Jean-François Burnol}\par \footnotesize \ttfamily - jfbu (at) free (dot) fr\\ - Package version: \pkgversion\ (\pkgdate)\\ - Documentation generated from the source file\\ - with timestamp ``\dtxtimestamp''\par + jfbu (at) free (dot) fr\par + Package version: \pkgversion\ (\pkgdate)% + \let\thefootnote\empty + \footnote{Documentation generated from the + source file with timestamp ``\dtxtimestamp''.}\par } +\setcounter{footnote}{0} + +\bigskip +\begin{addmargin}{1cm}\footnotesize +\makeatletter +\renewenvironment{description} + {\list{}{\topsep\z@ \parsep\z@ \labelwidth\z@ \itemindent-\leftmargin + \let\makelabel\descriptionlabel}} + {\endlist} +\makeatother +\begin{description} +\item[\xinttoolsname] is loaded by \xintname (hence by all other packages of the + bundle, too): it provides utilities of independent interest such as expandable + and non-expandable loops. + +\item[\xintname] implements with expandable \TeX{} macros additions, + subtractions, multiplications, divisions and powers with arbitrarily long + numbers. + +\item[\xintfracname] extends the scope of \xintname to decimal numbers, to + numbers in scientific notation and also to fractions with arbitrarily + long such numerators and denominators separated by a forward slash. + +\item[\xintexprname] extends \xintfracname with an expandable parser |\xintexpr + . . . \relax| of expressions involving arithmetic operations in infix notation + on decimal numbers, fractions, numbers in scientific notation, with + parentheses, factorial symbol, function names, comparison operators, logic + operators, twofold and threefold way conditionals, sub-expressions, macros + expanding to the previous items. +\end{description} + +\noindent Further modules: +% +\begin{description} +\item[\xintbinhexname] is for conversions to and from binary and + hexadecimal bases. -\begin{abstract} -The \xintname package implements with expandable \TeX{} macros the basic - arithmetic operations of addition, subtraction, multiplication and division, - applied to arbitrarily long numbers. The \xintfracname package extends the - scope of \xintname to fractional numbers with arbitrarily long numerators and - denominators. - - \xintexprname provides an expandable parser |\xintexpr . . . \relax| - of expressions involving arithmetic operations in infix notation on - decimal numbers, fractions, numbers in scientific notation, with - parentheses, factorial symbol, function names, comparison operators, - logic operators, twofold and threefold way conditionals, - sub-expressions, macros expanding to the previous items. - - The \xintbinhexname package is for conversions to and from binary and - hexadecimal bases, \xintseriesname provides some basic functionality for - computing in an expandable manner partial sums of series and power series with - fractional coefficients, \xintgcdname implements the Euclidean algorithm and - its typesetting, and \xintcfracname deals with the computation of continued - fractions. +\item[\xintseriesname] provides some basic functionality for computing in an + expandable manner partial sums of series and power series with fractional + coefficients. + +\item[\xintgcdname] implements the Euclidean algorithm and its typesetting. + +\item[\xintcfracname] deals with the computation of continued fractions. +\end{description} Most macros, and all of those doing computations, work purely by expansion without assignments, and may thus be used almost everywhere in \TeX{}. @@ -590,8 +634,9 @@ The \xintname package implements with expandable \TeX{} macros the basic The packages may be used with any flavor of \TeX{} supporting the \eTeX{} extensions. \LaTeX{} users will use |\usepackage| and others |\input| to load the package components. -\end{abstract} +\end{addmargin} +\bigskip % 18 octobre 2013, je remets la TOC ici. % je ne veux pas non plus que la main toc se liste elle-même donc je passe pour @@ -599,6 +644,9 @@ The \xintname package implements with expandable \TeX{} macros the basic \etocsetlevel{toctobookmark}{6} % 9 octobre 2013, je fais des petits tricks. +% 18 novembre 2013, je n'inclus plus la TOC détaillée de +% xintexpr. Je reconfigure la TOC + \etocsettocdepth {subsection} \renewcommand*{\etocbelowtocskip}{0pt} @@ -609,41 +657,24 @@ The \xintname package implements with expandable \TeX{} macros the basic \phantomsection\section* {Contents} \etoctoccontentsline*{toctobookmark}{Contents}{1}% } + \etocsettagdepth {description}{section} - \etocsettagdepth {commandsA} {section} - \etocsettagdepth {xintexpr} {none} - \etocsettagdepth {commandsB} {none} - \etocsettagdepth {implementation}{none} -\tableofcontents - \etocsettagdepth {description}{none} \etocsettagdepth {commandsA} {none} - \etocsettagdepth {xintexpr} {subsection} + \etocsettagdepth {xintexpr} {none} \etocsettagdepth {commandsB} {none} \etocsettagdepth {implementation}{none} -\etocsettocstyle {}{} \tableofcontents +\etocmulticolstyle [2]{\raggedcolumns}{} \etocsettagdepth {description}{none} - \etocsettagdepth {commandsA} {none} - \etocsettagdepth {xintexpr} {none} + \etocsettagdepth {commandsA} {section} + \etocsettagdepth {xintexpr} {section} \etocsettagdepth {commandsB} {section} - \etocsettagdepth {implementation}{none} -\etocmulticolstyle [2]{}{} -\tableofcontents - \etocsettagdepth {description}{none} - \etocsettagdepth {commandsA} {none} - \etocsettagdepth {xintexpr} {none} - \etocsettagdepth {commandsB} {none} \etocsettagdepth {implementation}{section} - \etocsettocstyle {}{} -\def\sectioncouleur{[named]{RoyalPurple}} -\begin{addmargin}{3cm} - \tableofcontents -\end{addmargin} +\tableofcontents \medskip % pour la suite: \etocignoredepthtags - \etocmulticolstyle [1]{% \phantomsection\section* {Contents} \etoctoccontentsline*{toctobookmark}{Contents}{2}% @@ -654,23 +685,34 @@ The \xintname package implements with expandable \TeX{} macros the basic \section{Quick introduction}\label{sec:quickintro} -The \xintname bundle consists of three principal components \xintname, +The \xintname bundle consists of the three principal components \xintname, \xintfracname (which loads \xintname), and \xintexprname (which loads -\xintfracname), and four additional modules. They may be used with Plain \TeX{}, -\LaTeX{} or any other format based on \TeX{}. The package requires the -\eTeX{} extensions which in modern distributions are made available by default, -except if you invoke \TeX{} under the name |tex| in command line. +\xintfracname), and four additional modules. Release |1.09g| has moved the +macros of \xintname not dealing with the manipulation of big numbers to a +separate package \xinttoolsname (which is automatically loaded by \xintname), of +independent interest. + +All components may be used as regular packages with \LaTeX{} or loaded directly +via \string\input{} (e.g. |\input xint.sty\relax|) in any other format based on +\TeX. Each of them automatically loads those not alreadly loaded it depends +on. + +The \eTeX{} extensions must be enabled; this is the case in modern distributions +by default, except if you invoke \TeX{} under the name |tex| in command line +(|etex| should be used then, or |pdftex| in |DVI| output mode). The goal is too compute \emph{exactly}, purely by expansion, without count registers nor assignments nor definitions, with arbitrarily big -numbers and fractions. As will be commented upon more later, this works -fine when the data has dozens of digits, but multiplying out two @1000@ -digits numbers under this constraint of expandability is expensive; so -in many situations the package will be used for fixed point (rounding or -truncating each intermediate result) or floating point computations. The -``floating point'' macros work with a given arbitrary precision (default -is @16@ digits; from the remark made above, beyond @100@ digits things -will start becoming too slow if hundreds of computations are needed). The only +numbers and fractions. +% As will be commented upon more later, this works +% fine when the data has dozens of digits, but multiplying out two @1000@ +% digits numbers under this constraint of expandability is expensive; so +% in many situations the package will be used for fixed point (rounding or +% truncating each intermediate result) or floating point computations. The +% ``floating point'' macros work with a given arbitrary precision (default +% is @16@ digits; from the remark made above, beyond @100@ digits things +% will start becoming too slow if hundreds of computations are needed). +The only non-algebraic operation which is currently implemented is the extraction of square roots. @@ -678,12 +720,12 @@ The package macros expand their arguments\footnote{see in \autoref{sec:expansions} the related explanations.}; as they are themselves completely expandable, this means that one may nest them arbitrarily deep to construct complicated (and still completely expandable) formulas. - But one will presumably prefer to use the (expandable!) \csbxint{expr}| ... \relax| parser as it allows infix notations, function names (corresponding to some of the package macros), comparison operators, boolean operators, 2way and 3way conditionals. +\footnotesize When producing very long numbers there is the question of printing them on the page, without going beyond the page limits. In this document, I have most of the time made use of these macros (not provided by the package:) @@ -693,8 +735,7 @@ When producing very long numbers there is the question of printing them on \def\allowsplits #1% {\ifx #1\relax \else #1\hskip 0pt plus 1pt\relax\expandafter\allowsplits\fi}% \def\printnumber #1{\expandafter\expandafter\expandafter\allowsplits #1\relax }% -%% expands twice before printing (all macros from the xint bundle expand in two steps -%% to their final output).|\par\endgroup +%% (all macros from the xint bundle expand in two steps to their final output).|\par\endgroup An alternative (\autoref{fn:np}) is to suitably configure the thousand separator with the \href{http://ctan.org/pkg/numprint}{numprint} package (does not work in math mode; I also tried \href{http://ctan.org/pkg/siunitx}{siunitx} but even in @@ -705,23 +746,35 @@ package\footnote{\url{http://ctan.org/pkg/seqsplit}} which can be used to achieve this splitting accross lines, and does work in inline math mode. -The package \xintname also provides utilities (\autoref{sec:utilsxint}), some -completely expandable, others not, of independent interest. Their use is +\normalsize +The utilities provided by \xinttoolsname (\autoref{sec:tools}), some +completely expandable, others not, are of independent interest. Their use is illustrated through various examples: among those, it is shown in \autoref{ssec:quicksort} how to implement in a completely expandable way the quick sort algorithm and also how to illustrate it graphically. Other examples -include some dynamically constructed alignments with cells giving the prime -numbers (\autoref{ssec:primesI}, \autoref{ssec:primesII}). +include some dynamically constructed alignments with automatically computed +prime number cells (\autoref{ssec:primesI}, \autoref{ssec:primesII}). -Some other traditional computational examples are \hyperref[ssec:Machin]{the - computations of $\pi$ and $\log 2$} and the computation of the -\hyperlink{e-convergents}{convergents of $e$} with the help of the +Some other computational examples are \hyperref[ssec:Machin]{the + computations of $\pi$ and $\log 2$} using \xintname and the computation of the +\hyperlink{e-convergents}{convergents of $e$} with the further help of the \xintcfracname package. \section{Recent changes} \footnotesize + +\noindent Release |1.09g| (|[2013/11/22]|): +\begin{itemize} +\item package \xinttoolsname is detached from \xintname, to make tools such as + \csbxint{For}, \csbxint{ApplyUnbraced}, and \csbxint{iloop} available without + the \xintname overhead. +\item new expandable nestable loops \csbxint{loop} and \csbxint{iloop}. +\item bugfix: \csbxint{For} and \csbxint{For*} do not modify anymore the value + of |\count 255|. +\end{itemize} + \noindent Release |1.09f| (|[2013/11/04]|): \begin{itemize} \item new \csbxint{ZapFirstSpaces}, \csbxint{ZapLastSpaces}, @@ -748,6 +801,8 @@ Some other traditional computational examples are \hyperref[ssec:Machin]{the % changing outputs) to some inner macros. \end{itemize} +\clearpage + \noindent Release |1.09e| (|[2013/10/29]|): \begin{itemize} \item new \csbxint{integers}, \csbxint{dimensions}, \csbxint{rationals} for @@ -880,7 +935,7 @@ version \fexpan ds the un-braced list items. After \item Extraction of square roots, for floating point numbers (\csbxint{FloatSqrt}), and also in a version adapted to integers (\csbxint{iSqrt}). -\item New package \xintbinhexname providing \hyperref[sec:combinhex]{conversion +\item New package \xintbinhexname providing \hyperref[sec:binhex]{conversion routines} to and from binary and hexadecimal bases. \end{itemize} @@ -910,7 +965,7 @@ will replace pointwise |D|; this argument may exceed the |32767| bound. \item To write the |\xintexpr| parser I benefited from the commented source of the \LaTeX3 parser; the |\xintexpr| parser has its own features and peculiarities. -See \hyperref[sec:comexpr]{its documentation}. +See \hyperref[sec:expr]{its documentation}. \end{itemize} % The |\xintexpr..\relax| and |\xintfloatexpr..\relax| are usable as @@ -1084,7 +1139,7 @@ with @8@ digits after the decimal mark, and printed. with the inherent difficulty of keeping up with braces and everything... \item if such a formula is used thousands of times in a document (for plots?), this could impact some parts of the \TeX{} program memory (for technical - reasons explained in \autoref{sec:comexpr}). So, a utility \csbxint{NewExpr} + reasons explained in \autoref{sec:expr}). So, a utility \csbxint{NewExpr} is provided to do the work of translating an |\xintexpr|-ession with parameters into a chain of macro evaluations.\footnote{As its makes some macro definitions, it is not an expandable command. It does not need protection @@ -1999,7 +2054,7 @@ where spaces could break havoc. So the best is to avoid them entirely. This is entirely otherwise inside an |\xintexpr|-ession, where spaces are expected to, as a general rule (with possible exceptions related to the allowed use of braces, see the -\hyperref[sec:comexpr]{documentation}) be completely +\hyperref[sec:expr]{documentation}) be completely harmless, and even recommended for making the source more legible. Syntax such as |\xintMul\A\B| is accepted and equivalent\footnote{see however @@ -2329,13 +2384,16 @@ for typesetting: this is just an example of one way to do it. \section{Utilities for expandable manipulations} -The package now has more utilities to deal -expandably with `lists of things', which were treated un-expandably in the -previous section with \csa{xintAssign} and \csa{xintAssignArray}: -\csbxint{ReverseOrder} and \csbxint{Length} since the first -release, \csbxint{Apply} and \csbxint{ListWithSep} since |1.04|, -\csbxint{RevWithBraces}, \csbxint{CSVtoList}, \csbxint{NthElt} since |1.06|, and -\csbxint{ApplyUnbraced}, since |1.06b|. +The package now has more utilities to deal expandably with `lists of things', +which were treated un-expandably in the previous section with \csa{xintAssign} +and \csa{xintAssignArray}: \csbxint{ReverseOrder} and \csbxint{Length} since the +first release, \csbxint{Apply} and \csbxint{ListWithSep} since |1.04|, +\csbxint{RevWithBraces}, \csbxint{CSVtoList}, \csbxint{NthElt} since |1.06|, +\csbxint{ApplyUnbraced}, since |1.06b|, \csbxint{loop} and \csbxint{iloop} since +|1.09g|.\footnote{All these utilities, as well as \csbxint{Assign}, + \csbxint{AssignArray} and the \csbxint{For} loops are now available from the + \xinttoolsname package, independently of the big integers facilities of + \xintname.} \edef\z{\xintiPow {2}{100}} @@ -2370,10 +2428,16 @@ Expandably computing primes is done in \autoref{xintSeq}. \section{A new kind of for loop} -As part of the \hyperref[sec:utilsxint]{utilities} coming with the \xintname +As part of the \hyperref[sec:tools]{utilities} coming with the \xinttoolsname package, there is a new kind of for loop, \csbxint{For}. Check it out (\autoref{xintFor}). +\section{A new kind of expandable loop} + +Also included in \xinttoolsname, \csbxint{iloop} is an expandable loop giving +access to an iteration index, without using count registers. Check it out +(\autoref{xintiloop}). + \section{Exceptions (error messages)} In situations such as division by zero, the package will insert in the @@ -2525,6 +2589,7 @@ Lastly, the macros \csa{xintRelaxArray} (of \xintname) and compatible. \csa{xintTypesetBezoutAlgorithm} also uses the \csa{endgraf} macro. +\enlargethispage{\baselineskip} \section{Installation} @@ -2557,753 +2622,20 @@ It may be necessary to then refresh the TeX installation filename database. + -\etocdepthtag.toc {commandsA} - -\section{Commands of the \xintname package}\label{sec:comxint} - -\def\n{\string{N\string}} -\def\m{\string{M\string}} -\def\x{\string{x\string}} - -In the description of the macros \texttt{\n} (or also \texttt{\m}) stands -(except if mentioned otherwise) for a (long) number within braces or for a -control sequence possibly within braces and \hyperref[sec:expansions]{\fexpan - ding} to such a number -(without the braces!), or for material within braces which \fexpan ds to such -a number, as is acceptable on input by the \csbxint{Num} macro: a sequence of -plus and minus signs, followed by some string of zeros, followed by digits. - -The letter \texttt{x} stands for something which will be inserted in-between a -|\numexpr| and a |\relax|. It will thus be completely expanded and must give an -integer obeying the \TeX{} bounds. Thus, it may be for example a count register, -or itself a \csa{numexpr} expression, or just a number written explicitely with -digits or something like |4*\count 255 + 17|, etc... - -For the rules regarding direct use of count registers or \csa{numexpr} -expression, in the argument to the package macros, see the -\hyperlink{useofcount}{use of count section} in \autoref{sec:inputs}. - -Some of these macros are extended by \xintfracname to accept fractions on input, -and, generally, to output a fraction. But this means that additions, -subtractions, multiplications output fractions and not integers; to guarantee -the integer format on output when the inputs are integers, the original -integer-only macros \csa{xintAdd}, \csa{xintSub}, \csa{xintMul} remain available -under the names \csa{xintiAdd}, \csa{xintiSub}, \csa{xintiMul}. Even the -original integer-only macros may now accept fractions on input as long as they -are integers in disguise; they still produce on output integers without any -forward slash mark nor trailing |[n]|. On the other hand macros such as -|\xintAdd| will output fractions |A/B[n]|, with |B| present even if its value is -one. To remove this unit denominator and convert the |[n]| part into explicit -zeros, one has \csbxint{Num} (if one is certain to deal with an integer; see -also \csbxint{PRaw}). This is mandatory when the computation result is fetched -into a context where \TeX{} expects a number (assuming it does not exceed -@2^31@). See the also the \xintfracname \hyperref[sec:comfrac]{documentation} -for more information on how macros of \xintname are modified after loading -\xintfracname (or \xintexprname). - - -Package \xintname also provides some general macro programming or token -manipulation utilities (expandable as well as non-expandable), which are -described in the next section (\autoref{sec:utilsxint}). - -\localtableofcontents - -\subsection{\csbh{xintRev}} \label{xintRev} - -\csa{xintRev\n} will revert the order of the digits of the number, -keeping the optional sign. Leading zeros -resulting from the operation are not removed (see the -\csa{xintNum} macro for this). This macro and all other -macros dealing with numbers first expand `fully' their arguments. -\centeredline{|\xintRev{-123000}|\digitstt{=\xintRev{-123000}}} -\centeredline{|\xintNum{\xintRev{-123000}}|% - \digitstt{=\xintNum{\xintRev{-123000}}}} - - -\subsection{\csbh{xintLen}}\label{xintiLen} - -\csa{xintLen\n} returns the length of the number, not counting the sign. -\centeredline{|\xintLen{-12345678901234567890123456789}|\digitstt - {=\xintLen{-12345678901234567890123456789}}} Extended by \xintfracname to -fractions: the length of |A/B[n]| is the length of |A| plus the length of |B| -plus the absolute value of |n| and minus one (an integer input as |N| is -internally represented in a form equivalent to |N/1[0]| so the minus one means -that the extended \csa{xintLen} -behaves the same as the original for integers). -\centeredline{|\xintLen{-1e3/5.425}|\digitstt - {=\xintLen{-1e3/5.425}}} -The length is computed on the |A/B[n]| which would have been returned by -\csbxint{Raw}: |\xintRaw {-1e3/5.425}|\digitstt{=\xintRaw {-1e3/5.425}}. - -Let's point out that the whole thing should sum up to -less than circa @2^{31}@, but this is a bit theoretical. - -|\xintLen| is only for numbers or fractions. See \csbxint{Length} for counting -tokens (or rather braced groups), more generally. - -\subsection{\csbh{xintDigitsOf}}\label{xintDigitsOf} - -This is a synonym for \csbxint{AssignArray}, to be used to define -an array giving all the digits of a given (positive, else the minus sign will -be treated as first item) number. -\begingroup\xintDigitsOf\xintiPow {7}{500}\to\digits -\centeredline{|\xintDigitsOf\xintiPow {7}{500}\to\digits|} -\noindent @7^500@ has |\digits{0}=|\digits{0} digits, and the 123rd among them -(starting from the most significant) is -|\digits{123}=|\digits{123}. -\endgroup - -\subsection{\csbh{xintNum}}\label{xintiNum} - -\csa{xintNum\n} removes chains of plus or minus signs, followed by zeros. -\centeredline{|\xintNum{+---++----+--000000000367941789479}|\digitstt - {=\xintNum{+---++----+--000000000367941789479}}} Extended by \xintfracname to -accept also a fraction on input, as long as it reduces to an integer after -division of the numerator by the denominator. -\centeredline{|\xintNum{123.48/-0.03}|\digitstt{=\xintNum{123.48/-0.03}}} - - -\subsection{\csbh{xintSgn}}\label{xintiSgn} - -\csa{xintSgn\n} returns 1 if the number is positive, 0 if it is -zero and -1 if it is negative. Extended by \xintfracname to fractions. - -\subsection{\csbh{xintOpp}}\label{xintiOpp} - -\csa{xintOpp\n} returns the opposite |-N| of the number |N|. -Extended by \xintfracname to fractions. - - -\subsection{\csbh{xintAbs}}\label{xintiAbs} - -\csa{xintAbs\n} returns the absolute value of the number. Extended -by \xintfracname to fractions. - -\subsection{\csbh{xintAdd}}\label{xintiAdd} - -\csa{xintAdd\n\m} returns the sum of the two numbers. Extended by -\xintfracname to fractions. - -\subsection{\csbh{xintSub}}\label{xintiSub} - -\csa{xintSub\n\m} returns the difference |N-M|. Extended by -\xintfracname to fractions. - -\subsection{\csbh{xintCmp}}\label{xintiCmp} - -\csa{xintCmp\n\m} returns 1 if |N>M|, 0 if |N=M|, and -1 if |N<M|. -Extended by \xintfracname to fractions. - -\subsection{\csbh{xintEq}}\label{xintEq} -{\small New with release |1.09a|.\par} - -\csa{xintEq\n\m} returns 1 if |N=M|, 0 otherwise. -Extended by \xintfracname to fractions. - -\subsection{\csbh{xintGt}}\label{xintGt} -{\small New with release |1.09a|.\par} - -% attention dans la doc du 9 octobre j'avais écrit \geq au lieu de > - -\csa{xintGt\n\m} returns 1 if |N|$>$|M|, 0 otherwise. -Extended by \xintfracname to fractions. - -\subsection{\csbh{xintLt}}\label{xintLt} -{\small New with release |1.09a|.\par} - -% attention dans la doc du 9 octobre j'avais écrit \leq au lieu de < - -\csa{xintLt\n\m} returns 1 if |N|$<$|M|, 0 otherwise. -Extended by \xintfracname to fractions. - -\subsection{\csbh{xintIsZero}}\label{xintIsZero} -{\small New with release |1.09a|.\par} - -\csa{xintIsZero\n} returns 1 if |N=0|, 0 otherwise. -Extended by \xintfracname to fractions. - -\subsection{\csbh{xintNot}}\label{xintNot} -{\small New with release |1.09c|.\par} - -\csa{xintNot} is a synonym for \csa{xintIsZero}. - -\subsection{\csbh{xintIsNotZero}}\label{xintIsNotZero} -{\small New with release |1.09a|.\par} - -\csa{xintIsNotZero\n} returns 1 if |N<>0|, 0 otherwise. -Extended by \xintfracname to fractions. - -\subsection{\csbh{xintIsOne}}\label{xintIsOne} -{\small New with release |1.09a|.\par} - -\csa{xintIsOne\n} returns 1 if |N=1|, 0 otherwise. -Extended by \xintfracname to fractions. - -\subsection{\csbh{xintAND}}\label{xintAND} -{\small New with release |1.09a|.\par} - -\csa{xintAND\n\m} returns 1 if |N<>0| and |M<>0| and zero otherwise. - Extended by \xintfracname to fractions. +%\clearpage -\subsection{\csbh{xintOR}}\label{xintOR} -{\small New with release |1.09a|.\par} - -\csa{xintOR\n\m} returns 1 if |N<>0| or |M<>0| and zero otherwise. - Extended by \xintfracname to fractions. - - -\subsection{\csbh{xintXOR}}\label{xintXOR} -{\small New with release |1.09a|.\par} - -\csa{xintXOR\n\m} returns 1 if exactly one of |N| or |M| is true (i.e. -non-zero). - Extended by \xintfracname to fractions. - -\subsection{\csbh{xintANDof}}\label{xintANDof} -{\small New with release |1.09a|.\par} - -\csa{xintANDof}|{{a}{b}{c}...}| returns 1 if all are true (i.e. non -zero) and zero otherwise. The list argument -may be a macro, it (or rather its first token) is \fexpan ded first (each -item also is \fexpan ded). Extended by \xintfracname to fractions. - - -\subsection{\csbh{xintORof}}\label{xintORof} -{\small New with release |1.09a|.\par} - -\csa{xintORof}|{{a}{b}{c}...}| returns 1 if at least one is true -(i.e. does not vanish). The list argument -may be a macro, it is \fexpan ded first. Extended by \xintfracname to fractions. - - -\subsection{\csbh{xintXORof}}\label{xintXORof} -{\small New with release |1.09a|.\par} - -\csa{xintXORof}|{{a}{b}{c}...}| returns 1 if an odd number of them are -true (i.e. does not vanish). The list argument may be a macro, it is -\fexpan ded first. Extended by \xintfracname to fractions. - - -\subsection{\csbh{xintGeq}}\label{xintiGeq} - -\csa{xintGeq\n\m} returns 1 if the \emph{absolute value} of the first number is -at least equal to the absolute value of the second number. If \verb+|N|<|M|+ it -returns 0. Extended by \xintfracname to fractions (starting with release -|1.07|). Please note that the macro compares \emph{absolute values}. - -\subsection{\csbh{xintMax}}\label{xintiMax} - -\csa{xintMax\n\m} returns the largest of the two in the sense of the order -structure on the relative integers (\emph{i.e.} the right-most number if they -are put on a line with positive numbers on the right): |\xintiMax -{-5}{-6}|\digitstt{=\xintiMax{-5}{-6}}. Extended by \xintfracname to fractions. - -\subsection{\csbh{xintMaxof}}\label{xintMaxof} -{\small New with release |1.09a|.\par} - -\csa{xintMaxof}|{{a}{b}{c}...}| returns the maximum. The list argument -may be a macro, it is \fexpan ded first. Extended by \xintfracname to -fractions. - - -\subsection{\csbh{xintMin}}\label{xintiMin} - -\csa{xintMin\n\m} returns the smallest of the two in the sense of the order -structure on the relative integers (\emph{i.e.} the left-most number if they are -put on a line with positive numbers on the right): |\xintiMin -{-5}{-6}|\digitstt{=\xintiMin{-5}{-6}}. Extended by \xintfracname to fractions. - -\subsection{\csbh{xintMinof}}\label{xintMinof} -{\small New with release |1.09a|.\par} - -\csa{xintMinof}|{{a}{b}{c}...}| returns the minimum. The list argument -may be a macro, it is \fexpan ded first. Extended by \xintfracname to -fractions. - -\subsection{\csbh{xintSum}}\label{xintiSum} - -\csa{xintSum}\marg{braced things} after expanding its argument -expects to find a sequence of tokens (or braced material). -Each is expanded (with the usual meaning), and the sum of all these numbers is -returned. -\centeredline{% - \csa{xintiSum}|{{123}{-98763450}{\xintFac{7}}{\xintiMul{3347}{591}}}|% - \digitstt{=\xintiSum{{123}{-98763450}{\xintFac{7}}{\xintiMul{3347}{591}}}}} -\centeredline{\csa{xintiSum}|{1234567890}|\digitstt{=\xintiSum{1234567890}}} -An empty sum is no error and returns zero: |\xintiSum -{}|\digitstt{=\xintiSum {}}. A sum with only one -term returns that number: |\xintiSum {{-1234}}|\digitstt{=\xintiSum - {{-1234}}}. Attention that |\xintiSum {-1234}| is not legal input -and will make the \TeX{} run fail. On the other hand |\xintiSum -{1234}|\digitstt{=\xintiSum{1234}}. Extended by \xintfracname -to fractions. - -% retiré de la doc le 22 octobre 2013 - -% \subsection{\csbh{xintSumExpr}}\label{xintiSumExpr} - -% \csa{xintSumExpr}\meta{braced things}\csa{relax} is to what \csa{xintSum} -% expands. The argument is then expanded (with the usual meaning) and should give -% a list of braced quantities or macros, each one will be expanded in turn. -% \centeredline{% -% \csa{xintiSumExpr}| {123}{-98763450}|% -% |{\xintFac{7}}{\xintiMul{3347}{591}}\relax|\digitstt{=% -% \xintiSumExpr {123}{-98763450}{\xintFac{7}}{\xintiMul{3347}{591}}\relax}} - -% Note: I am not so happy with the name which seems to suggest that the -% |+| sign should be used instead of braces. Perhaps this will change -% in the future. - -% Extended by \xintfracname to fractions. - -\subsection{\csbh{xintMul}}\label{xintiMul} -{\small Modified in release |1.03|.\par} - -\csa{xintMul\n\m} returns the product of the two numbers. Starting -with release |1.03| of \xintname, the macro checks the lengths of -the two numbers and then activates its algorithm with the best (or -at least, hoped-so) choice of which one to put first. This makes -the macro a bit slower for numbers up to 50 digits, but may give -substantial speed gain when one of the number has 100 digits or more. -Extended by \xintfracname to fractions. - -\subsection{\csbh{xintSqr}}\label{xintiSqr} - -\csa{xintSqr\n} returns the square. Extended by \xintfracname to fractions. - -\subsection{\csbh{xintPrd}}\label{xintiPrd} - -\csa{xintPrd}\marg{braced things} after expanding its argument expects to find a -sequence of tokens (or braced material). Each is expanded (with the usual -meaning), and the product of all these numbers is returned. -\centeredline{% - \csa{xintiPrd}|{{-9876}{\xintFac{7}}{\xintiMul{3347}{591}}}|% - \digitstt{=% - \xintiPrd{{-9876}{\xintFac{7}}{\xintiMul{3347}{591}}}}} -\centeredline{\csa{xintiPrd}|{123456789123456789}|\digitstt{=% - \xintiPrd{123456789123456789}}} An empty product is no error and returns 1: -|\xintiPrd {}|\digitstt{=\xintiPrd {}}. A product reduced to a single term returns -this number: |\xintiPrd {{-1234}}|\digitstt{=\xintiPrd {{-1234}}}. Attention that -|\xintiPrd {-1234}| is not legal input and will make the \TeX{} compilation -fail. On the other hand |\xintiPrd {1234}|\digitstt{=\xintiPrd {1234}}. -\centeredline{$\displaystyle 2^{200}3^{100}7^{100}$} \centeredline{|=\xintiPrd - {{\xintiPow {2}{200}}{\xintiPow {3}{100}}{\xintiPow {7}{100}}}|} -\digitstt{=\printnumber{\xintNum {\xinttheexpr 2^200*3^100*7^100\relax }}} - -Extended by \xintfracname to fractions. - -With \xintexprname, the above would be coded simply as \centeredline -{|\xintthenumexpr 2^200*3^100*7^100\relax |} - -% I temporarily remove mention of \xintPrdExpr from the documentation; I -% really dislike the name now. - -% \subsection{\csbh{xintPrdExpr}}\label{xintiPrdExpr} - -% {\small Name change in |1.06a|! I apologize, but I suddenly decided that -% \csa{xintProductExpr} was a bad choice; so I just replaced it by the current -% name. \par} - -% \csa{xintPrdExpr}\marg{argument}\csa{relax} is to what \csa{xintPrd} expands -% ; its argument is expanded (with the usual meaning) and should give a list of -% braced numbers or macros. Each will be expanded when it is its turn. -% \centeredline{\csa{xintiPrdExpr}| 123456789123456789\relax|\digitstt{=% -% \xintiPrdExpr 123456789123456789\relax}} - -% Note: I am not so happy with the name which seems to suggest that the -% |*| sign should be used instead of braces. Perhaps this will change -% in the future. - -% Extended by \xintfracname to fractions. - -\subsection{\csbh{xintPow}}\label{xintiPow} - -\csa{xintPow\n\x} returns |N^x|. When |x| is zero, this is 1. If |N| is zero and -|x<0|, if \verb+|N|>1+ and |x<0| negative, or if \verb+|N|>1+ and |x>999999999|, -then an error is raised. |2^999999999| has \np{301029996} digits; each exact -multiplication of two one thousand digits numbers already takes a few seconds, -so needless to say this bound is completely irrealistic. Already |2^9999| has -\np{3010} digits,\footnote{on my laptop |\string\xintiPow \{2\}\{9999\}| - obtains all |3010| digits in about ten or eleven seconds. In contrast, the - float versions for - |8|, |16|, |24|, or even more significant figures, do their jobs in circa one - hundredth of a second (|1.08b|). This is done without |log|/|exp| which are - not (yet?) implemented in \xintfracname. The \LaTeX3 - \href{http://www.ctan.org/tex-archive/macros/latex/contrib/l3kernel}{l3fp} - does this with |log|/|exp| and is ten times faster (|16| figures only).} so I -should perhaps lower the bound to |99999|. - -Extended by \xintfracname to fractions (\csbxint{Pow}) and also to floats -(\csbxint{FloatPow}). Negative -exponents do not then cause errors anymore. The float version is able to deal -with things such as -|2^999999999| without any problem. For example -|\xintFloatPow[4]{2}{9999}|\digitstt{=\xintFloatPow[4]{2}{9999}} and -|\xintFloatPow[4]{2}{999999999}| -\digitstt{=\xintFloatPow[4]{2}{999999999}}. - -\subsection{\csbh{xintSgnFork}}\label{xintSgnFork} -{\small New with release |1.07|. See also \csbxint{ifSgn}.\par} - -\csa{xintSgnFork}\verb+{-1|0|1}+\marg{A}\marg{B}\marg{C} expandably -chooses to execute either the \meta{A}, \meta{B} or \meta{C} code, -depending on its first argument. This first argument should be anything -expanding to either |-1|, |0| or |1| (a count register should be -prefixed by |\the| and a |\numexpr...\relax| also should be prefixed by -|\the|). This utility is provided to help construct expandable macros -choosing depending on a condition which one of the package macros to -use, or which values to confer to their arguments. - -\subsection{\csbh{xintifSgn}}\label{xintifSgn} -{\small New with release |1.09a|.\par} - -Similar to \csa{xintSgnFork} except that the first argument may expand to a -(big) integer (or a fraction if \xintfracname is loaded), and it is its sign -which decides which of the three branches is taken. Furthermore this first -argument may be a count register, with no |\the| or |\number| prefix. - -\subsection{\csbh{xintifZero}}\label{xintifZero} -{\small New with release |1.09a|.\par} - -\csa{xintifZero}\marg{N}\marg{IsZero}\marg{IsNotZero} expandably checks -if the first mandatory argument |N| (a number, possibly a fraction if -\xintfracname is loaded, or a macro expanding to one such) is zero or -not. It then either executes the first or the second branch. - -\subsection{\csbh{xintifNotZero}}\label{xintifNotZero} -{\small New with release |1.09a|.\par} - -\csa{xintifNotZero}\marg{N}\marg{IsNotZero}\marg{IsZero} expandably checks -if the first mandatory argument |N| (a number, possibly a fraction if -\xintfracname is loaded, or a macro expanding to one such) is not zero or -is zero. It then either executes the first or the second branch. - -\subsection{\csbh{xintifTrueFalse}}\label{xintifTrueFalse} -{\small New with release |1.09c|, renamed in |1.09e|.\par} - -\csa{xintifTrueFalse}\marg{N}\marg{true branch}\marg{false branch} is a synonym -for \csbxint{ifNotZero}. It is also available as \csa{xintifTrue} but this later -name is a bit misleading as the macro must always have a |false| branch, -possibly an empty brace pair |{}|. - -\subsection{\csbh{xintifCmp}}\label{xintifCmp} -{\small New with release |1.09e|.\par} - -\csa{xintifCmp}\marg{A}\marg{B}\marg{if A<B}\marg{if A=B}\marg{if A>B} compares -its arguments and chooses accordingly the correct branch. - -\subsection{\csbh{xintifEq}}\label{xintifEq} -{\small New with release |1.09a|.\par} - -\csa{xintifEq}\marg{A}\marg{B}\marg{YES}\marg{NO} checks equality of its -two first arguments (numbers, or fractions if \xintfracname is loaded) and does the |YES| or the |NO| branch. - -\subsection{\csbh{xintifGt}}\label{xintifGt} -{\small New with release |1.09a|.\par} - -% attention dans la doc du 9 octobre j'avais écrit \geq au lieu de < -\csa{xintifGt}\marg{A}\marg{B}\marg{YES}\marg{NO} checks if $A>B$ and in that -case executes the |YES| branch. Extended to fractions (in particular decimal -numbers) by \xintfracname. - -\subsection{\csbh{xintifLt}}\label{xintifLt} -{\small New with release |1.09a|.\par} - -% attention dans la doc du 9 octobre j'avais écrit \leq au lieu de < -\csa{xintifLt}\marg{A}\marg{B}\marg{YES}\marg{NO} checks if $A<B$ and in that -case executes the |YES| branch. Extended to fractions (in particular decimal -numbers) by \xintfracname. - -\begin{framed} - The macros described next are all integer-only on input. With \xintfracname - loaded their argument is first given to \csbxint{Num} and may thus be - a fraction, as long as it is in fact an integer in disguise. -\end{framed} - -\subsection{\csbh{xintifOdd}}\label{xintifOdd} -{\small New with release |1.09e|.\par} - -\csa{xintifOdd}\marg{A}\marg{YES}\marg{NO} checks if $A$ is and odd integer -and in that case executes the |YES| branch. - - -\subsection{\csbh{xintFac}}\label{xintiFac} - -\csa{xintFac\x} returns the factorial. It is an error if the -argument is negative or at least @10^6@. It is not recommended to -launch the computation of things such as @100000!@, if you need -your computer for other tasks. Note that the argument is of the |x| type, it -must obey the \TeX{} bounds, but on the other hand may involve count registers -and even arithmetic operations as it will be completely expanded inside a -|\numexpr|. - -With \xintfracname loaded, the macro also -accepts a fraction as argument, as long as this fraction turns out to be an -integer: |\xintFac {66/3}|\digitstt{=\xintFac {66/3}}. - -% the construct |\xintFac{\xintAdd {2}{3}}| will fail, -% use either |\xintFac{\xintiAdd {2}{3}}| or |\xintFac{\xintNum{\xintAdd -% {2}{3}}}|. - -% temps obsolètes, mettre à jour -% On my laptop @1000!@ (2568 digits) -% is computed in a little less than ten seconds, @2000!@ (5736 -% digits) is computed in a little less than one hundred seconds, and -% @3000!@ (which has 9131 digits) needs close to seven minutes\dots -% I have no idea how much time @10000!@ would need (do rather -% @9999!@ if you can, the algorithm has some overhead at the -% transition from @N=9999@ to @10000@ and higher; @10000!@ has 35660 -% digits). Not to mention @100000!@ which, from the Stirling formula, -% should have 456574 digits. - -\subsection{\csbh{xintDivision}}\label{xintDivision} - -\csa{xintDivision\n\m} returns |{quotient Q}{remainder R}|. This -is euclidean division: |N = QM + R|, |0|${}\leq{}$\verb+R < |M|+. So the -remainder is always non-negative and the formula |N = QM + R| -always holds independently of the signs of |N| or |M|. Division by -zero is an error (even if |N| vanishes) and returns |{0}{0}|. - -This macro is integer only (with \xintfracname loaded it accepts -fractions on input, but they must be integers in disguise) and not to be -confused with the \xintfracname macro \csbxint{Div} which divides one -fraction by another. - -\subsection{\csbh{xintQuo}}\label{xintQuo} - -\csa{xintQuo\n\m} returns the quotient from the euclidean division. When -both |N| and |M| are positive one has \csa{xintQuo\n\m}|=\xintiTrunc -{0}{N/M}| (using package \xintfracname). With \xintfracname loaded it -accepts fractions on input, but they must be integers in disguise. - -\subsection{\csbh{xintRem}}\label{xintRem} - -\csa{xintRem\n\m} returns the remainder from the euclidean division. -With \xintfracname loaded it accepts fractions on input, but they must -be integers in disguise. - - - -\subsection{\csbh{xintFDg}}\label{xintFDg} - -\csa{xintFDg\n} returns the first digit (most significant) of the -decimal expansion. - -\subsection{\csbh{xintLDg}}\label{xintLDg} - -\csa{xintLDg\n} returns the least significant digit. When the -number is positive, this is the same as the remainder in the -euclidean division by ten. - -\subsection{\csbh{xintMON}, \csbh{xintMMON}}\label{xintMON}\label{xintMMON} -{\small New in version |1.03|.\par} - -\csa{xintMON\n} returns |(-1)^N| and \csa{xintMMON\n} returns -|(-1)^{N-1}|. \centeredline{|\xintMON {-280914019374101929}|\digitstt{=\xintMON - {280914019374101929}}, |\xintMMON -{-280914019374101929}|\digitstt{=\xintMMON {280914019374101929}}} - -\subsection{\csbh{xintOdd}}\label{xintOdd} - -\csa{xintOdd\n} is 1 if the number is odd and 0 otherwise. - - -\subsection{\csbh{xintiSqrt}, \csbh{xintiSquareRoot}}\label{xintiSqrt} -\label{xintiSquareRoot} -{\small New with |1.08|.\par} -\xintAssign\xintiSquareRoot {17000000000000000000000000}\to\A\B - -\noindent\csa{xintiSqrt\n} returns the largest integer whose square is -at most equal to |N|. -\centeredline{|\xintiSqrt {2000000000000000000000000000000000000}=|% -\digitstt{\xintiSqrt{2000000000000000000000000000000000000}}} -\centeredline{|\xintiSqrt {3000000000000000000000000000000000000}=|% -\digitstt{\xintiSqrt{3000000000000000000000000000000000000}}} -\centeredline{|\xintiSqrt {\xintDSH {-120}{2}}=|}% -\centeredline{\digitstt{\xintiSqrt {\xintDSH {-120}{2}}}} -\csa{xintiSquareRoot\n} returns |{M}{d}| with |d>0|, |M^2-d=N| and |M| -smallest (hence |=1+|\csa{xint\-iSqrt}|{N}|). -\centeredline{|\xintAssign\xintiSquareRoot - {17000000000000000000000000}\to\A\B|}% -\centeredline{|\xintiSub{\xintiSqr\A}\B=\A^2-\B|}% -\centeredline{\digitstt{\xintiSub{\xintiSqr\A}\B=\A\string^2-\B}} -A rational approximation to -$\sqrt{|N|}$ is $|M|-\frac{|d|}{|2M|}$ (this is a majorant and the error is at -most |1/2M|; if |N| is a perfect square |k^2| then |M=k+1| and this gives -|k+1/(2k+2)|, not |k|). - -Package \xintfracname has \csbxint{FloatSqrt} for square -roots of floating point numbers. - - -\begin{framed} - The macros described next are strictly for integer-only arguments. These - arguments are \emph{not} filtered via \csbxint{Num}. -\end{framed} - -\subsection{\csbh{xintInc}, \csbh{xintDec}} -\label{xintInc} -\label{xintDec} -{\small New with |1.08|.\par} - -\csa{xintInc\n} is |N+1| and \csa{xintDec\n} is |N-1|. These macros remain -integer-only, even with \xintfracname loaded. - -\subsection{\csbh{xintDouble}, \csbh{xintHalf}} -\label{xintDouble} -\label{xintHalf} -{\small New with |1.08|.\par} - -\csa{xintDouble\n} returns |2N| and \csa{xintHalf\n} is |N/2| rounded -towards zero. These macros remain integer-only, even with \xintfracname loaded. - -\subsection{\csbh{xintDSL}}\label{xintDSL} - -\csa{xintDSL\n} is decimal shift left, \emph{i.e.} multiplication -by ten. - -\subsection{\csbh{xintDSR}}\label{xintDSR} - -\csa{xintDSR\n} is decimal shift right, \emph{i.e.} it removes the last digit -(keeping the sign), equivalently it is the closest integer to |N/10| when -starting at zero. - -\subsection{\csbh{xintDSH}}\label{xintDSH} - -\csa{xintDSH\x\n} is parametrized decimal shift. When |x| is -negative, it is like iterating \csa{xintDSL} \verb+|x|+ times -(\emph{i.e.} multiplication by @10^{-@|x|@}@). When |x| positive, -it is like iterating \csa{DSR} |x| times (and is more efficient), and for a -non-negative |N| this is thus the same as the -quotient from the euclidean division by |10^x|. - -\subsection{\csbh{xintDSHr}, \csbh{xintDSx}}\label{xintDSHr}\label{xintDSx} -{\small New in release |1.01|.\par} - -\csa{xintDSHr\x\n} expects |x| to be zero or positive and it returns -then a value |R| which is correlated to the value |Q| returned by -\csa{xintDSH\x\n} in the following manner: -\begin{itemize} -\item if |N| is - positive or zero, |Q| and |R| are the quotient and remainder in - the euclidean division by |10^x| (obtained in a more efficient - manner than using \csa{xintDivision}), -\item if |N| is negative let - |Q1| and |R1| be the quotient and remainder in the euclidean - division by |10^x| of the absolute value of |N|. If |Q1| - does not vanish, then |Q=-Q1| and |R=R1|. If |Q1| vanishes, then - |Q=0| and |R=-R1|. -\item for |x=0|, |Q=N| and |R=0|. -\end{itemize} -So one has |N = 10^x Q + R| if |Q| turns out to be zero or -positive, and |N = 10^x Q - R| if |Q| turns out to be negative, -which is exactly the case when |N| is at most |-10^x|. - - -\csa{xintDSx\x\n} for |x| negative is exactly as -\csa{xintDSH\x\n}, \emph{i.e.} multiplication by @10^{-@|x|@}@. -For |x| zero or positive it returns the two numbers |{Q}{R}| -described above, each one within braces. So |Q| is -\csa{xintDSH\x\n}, and |R| is \csa{xintDSHr\x\n}, but computed -simultaneously. - -\begin{flushleft} - \xintAssign\xintDSx {-1}{-123456789}\to\M - \noindent{|\xintAssign\xintDSx {-1}{-123456789}\to\M|}\\ - |\meaning\M: |\digitstt{\meaning\M}.\\ - \xintAssign\xintDSx {-20}{1234567689}\to\M - {|\xintAssign\xintDSx {-20}{123456789}\to\M|}\\ - |\meaning\M: |\digitstt{\meaning\M}.\\ - \xintAssign\xintDSx{0}{-123004321}\to\Q\R - {|\xintAssign\xintDSx {0}{-123004321}\to\Q\R|}\\ - \noindent|\meaning\Q: |\digitstt{\meaning\Q}, |\meaning\R: - |\digitstt{\meaning\R.}\\ - |\xintDSH {0}{-123004321}|\digitstt{=\xintDSH {0}{-123004321}}, - |\xintDSHr {0}{-123004321}|\digitstt{=\xintDSHr {0}{-123004321}}\\ - \xintAssign\xintDSx {6}{-123004321}\to\Q\R - {|\xintAssign\xintDSx {6}{-123004321}\to\Q\R|}\\ - |\meaning\Q: |\digitstt{\meaning\Q}, - |\meaning\R: |\digitstt{\meaning\R.}\\ - |\xintDSH {6}{-123004321}|\digitstt{=\xintDSH {6}{-123004321}}, - |\xintDSHr {6}{-123004321}|\digitstt{=\xintDSHr {6}{-123004321}}\\ - \xintAssign\xintDSx {8}{-123004321}\to\Q\R - {|\xintAssign\xintDSx {8}{-123004321}\to\Q\R|}\\ - |\meaning\Q: |\digitstt{\meaning\Q}, - |\meaning\R: |\digitstt{\meaning\R.} \\ - |\xintDSH {8}{-123004321}|\digitstt{=\xintDSH {8}{-123004321}}, - |\xintDSHr {8}{-123004321}|\digitstt{=\xintDSHr {8}{-123004321}}\\ - \xintAssign\xintDSx {9}{-123004321}\to\Q\R - {|\xintAssign\xintDSx {9}{-123004321}\to\Q\R|}\\ - |\meaning\Q: |\digitstt{\meaning\Q}, - |\meaning\R: |\digitstt{\meaning\R.}\\ - |\xintDSH {9}{-123004321}|\digitstt{=\xintDSH {9}{-123004321}}, - |\xintDSHr {9}{-123004321}|\digitstt{=\xintDSHr {9}{-123004321}}\\ -\end{flushleft} - -\subsection{\csbh{xintDecSplit}}\label{xintDecSplit} - -{\small This has been modified in release |1.01|.\par} - -\csa{xintDecSplit\x\n} cuts the number into two pieces (each one within a -pair of enclosing braces). First the sign if present is \emph{removed}. -Then, for |x| positive or null, the second piece contains the |x| least -significant digits (\emph{empty} if |x=0|) and the first piece the remaining -digits (\emph{empty} when |x| equals or exceeds the length of |N|). -Leading zeros in the second piece are not removed. When |x| is negative -the first piece contains the \verb+|x|+ most significant digits and the -second piece the remaining digits (\emph{empty} if @|x|@ equals or exceeds -the length of |N|). Leading zeros in this second piece are not removed. -So the absolute value of the original number is always the concatenation -of the first and second piece. - -{\footnotesize This macro's behavior for |N| non-negative is final and will not - change. I am still hesitant about what to do with the sign of a - negative |N|.\par} - - -\xintAssign\xintDecSplit {0}{-123004321}\to\L\R -\centeredline{|\xintAssign\xintDecSplit {0}{-123004321}\to\L\R|} -\noindent|\meaning\L: |\digitstt{\meaning\L}, |\meaning\R: |\digitstt{\meaning\R.} -\xintAssign\xintDecSplit {5}{-123004321}\to\L\R -\centeredline{|\xintAssign\xintDecSplit {5}{-123004321}\to\L\R|} -|\meaning\L: |\digitstt{\meaning\L}, |\meaning\R: |\digitstt{\meaning\R.} -\xintAssign\xintDecSplit {9}{-123004321}\to\L\R -\centeredline{|\xintAssign\xintDecSplit {9}{-123004321}\to\L\R|} -|\meaning\L: |\digitstt{\meaning\L}, |\meaning\R: |\digitstt{\meaning\R.} -\xintAssign\xintDecSplit {10}{-123004321}\to\L\R -\centeredline{|\xintAssign\xintDecSplit {10}{-123004321}\to\L\R|} -|\meaning\L: |\digitstt{\meaning\L}, |\meaning\R: |\digitstt{\meaning\R.} -\xintAssign\xintDecSplit {-5}{-12300004321}\to\L\R -\centeredline{|\xintAssign\xintDecSplit {-5}{-12300004321}\to\L\R|} -|\meaning\L: |\digitstt{\meaning\L}, |\meaning\R: |\digitstt{\meaning\R.} -\xintAssign\xintDecSplit {-11}{-12300004321}\to\L\R -\centeredline{|\xintAssign\xintDecSplit {-11}{-12300004321}\to\L\R|} -|\meaning\L: |\digitstt{\meaning\L}, |\meaning\R: |\digitstt{\meaning\R.} -\xintAssign\xintDecSplit {-15}{-12300004321}\to\L\R -\centeredline{|\xintAssign\xintDecSplit {-15}{-12300004321}\to\L\R|} -|\meaning\L: |\digitstt{\meaning\L}, |\meaning\R: |\digitstt{\meaning\R.} - -\subsection{\csbh{xintDecSplitL}}\label{xintDecSplitL} - -\csa{xintDecSplitL\x\n} returns the first piece after the action -of \csa{xintDecSplit}. - -\subsection{\csbh{xintDecSplitR}}\label{xintDecSplitR} - -\csa{xintDecSplitR\x\n} returns the second piece after the action -of \csa{xintDecSplit}. +\etocdepthtag.toc {commandsA} +\section{Commands of the \xinttoolsname package} +\label{sec:tools} -\section{Commands (utilities) of the \xintname package} -\label{sec:utilsxint} +These utilities used to be provided within the \xintname package; since |1.09g| +they have been moved to an independently usable package \xinttoolsname, which +has none of the \xintname facilities regarding big numbers. -The completely expandable utilities come first, up to and including -\csbxint{Seq} (which is listed here because it generates sequences of short -integers using |\numexpr|, thus does not make use of the big integers macros of -\xintname). +The first listed are the completely expandable utilities up to \csbxint{iloop}. -This section contains various concrete examples of use of these utilities (such -as \csbxint{ApplyUnbraced}, \csbxint{ApplyInline} and \csbxint{For*}), and ends with a +This section contains various concrete examples and ends with a \hyperref[ssec:quicksort]{completely expandable implementation of the Quick Sort algorithm} together with a graphical illustration of its action. @@ -3377,7 +2709,7 @@ anyway apart from stripping away all \emph{leading} spaces. This macro will be mostly of interest to programmers who will know what I will now be talking about. \emph{The essential points, naturally, are the complete - expandability and the fact that no brace removal or any other alteration is + expandability and the fact that no brace removal nor any other alteration is done to the input.} \TeX's input scanner already converts consecutive blanks into single space @@ -3845,7 +3177,7 @@ many ways, we use again |\xintApplyUnbraced| but with a macro which gobbles its argument and replaces it with a tabulation character. The \csbxint{For*} macro would be more elegant here. % -\dverb?@ +\dverb?@ \newcounter{primecount} \newcounter{cellcount} \newcommand{\NbOfColumns}{13} @@ -3916,6 +3248,493 @@ empty sequence when the row turns out to already have all its cells. \centeredline{There are \arabic{primecount} prime numbers up to 1000.} \end{figure*} +\subsection{\csbh{xintloop}, \csbh{xintbreakloop}, \csbh{xintbreakloopanddo}, \csbh{xintloopskiptonext}} +\label{xintloop} +\label{xintbreakloop} +\label{xintbreakloopanddo} +\label{xintloopskiptonext} +{\small New with release |1.09g|.\par} + +|\xintloop|\meta{stuff}|\iftest ... \repeat| is an expandable loop compatible +with nesting. If a sub-loop is to be used all the material from the start and up +to the complete subloop inclusive should be braced; these braces will be removed +and do not create a group. + +As this loop and \csbxint{iloop} will primarily be of interest to experienced +\TeX{} macro programmers, my description will assume that the user is +knowledgeable enough. The loop and its various constituents are declared short, +they can not handle |\par| tokens or empty lines. + +One can abort the loop with \csbxint{breakloop}; this should not be used in the +final test, and one should expand the |\fi| from the corresponding test before. +One has also \csbxint{breakloopanddo} whose first argument will be inserted in +the token stream after the loop; one may need a macro such as |\xint_afterfi| to +move the whole thing after the |\fi|, as a simple |\expandafter| will not be +enough. + +One will usually employ some count registers to manage the exit test from the +loop; this breaks expandability, see \csbxint{iloop} for an expandable integer +indexed loop. Use in alignments will be complicated by the fact that cells +create groups, and also from the fact that any encountered unexpandable material +will cause the \TeX{} input scanner to insert |\endtemplate| on each encountered +|&| or |\cr|; thus |\xintbreakloop| may not work as expected, but the situation +can be resolved via |\xint_firstofone{&}| or use of |\TAB| with |\def\TAB{&}|. +It is thus simpler for alignments to use rather than \csbxint{loop} either the +expandable \csbxint{ApplyUnbraced} or the non-expandable but alignment +compatible \csbxint{ApplyInline}, \csbxint{For} or \csbxint{For*}. + +As an example, let us suppose we have two macros |\A|\marg{i}\marg{j} and +|\B|\marg{i}\marg{j} behaving like (small) integer valued matrix entries, and we +want to define a macro |\C|\marg{i}\marg{j} giving the matrix product (|i| and +|j| may be count registers). We will assume that |\A[I]| expands to the number +of rows, |\A[J]| to the number of columns and want the produced |\C| to act in +the same manner. The code is very dispendious in use of |\count| registers, not +optimized in any way, not made very robust (the defined macro can not have the +same name as the first two matrices for example), we just wanted to quickly +illustrate use of the nesting capabilities of |\xintloop|.\footnote{for a more sophisticated implementation of matrix multiplication, inclusive of determinants, inverses, and display utilities, with entries big integers or decimal numbers or even fractions see \url{http://tex.stackexchange.com/a/143035/4686} from November 11, 2013.} +\begingroup +\makeatother +\begin{verbatim} +\newcount\rowmax \newcount\colmax \newcount\summax +\newcount\rowindex \newcount\colindex \newcount\sumindex +\newcount\tmpcount +\makeatletter +\def\MatrixMultiplication #1#2#3{% + \rowmax #1[I]\relax + \colmax #2[J]\relax + \summax #1[J]\relax + \rowindex 1 + \xintloop % loop over row index i + {\colindex 1 + \xintloop % loop over col index k + {\tmpcount 0 + \sumindex 1 + \xintloop % loop over intermediate index j + \advance\tmpcount \numexpr #1\rowindex\sumindex*#2\sumindex\colindex\relax + \ifnum\sumindex<\summax + \advance\sumindex 1 + \repeat }% + \expandafter\edef\csname\string#3{\the\rowindex.\the\colindex}\endcsname + {\the\tmpcount}% + \ifnum\colindex<\colmax + \advance\colindex 1 + \repeat }% + \ifnum\rowindex<\rowmax + \advance\rowindex 1 + \repeat + \expandafter\edef\csname\string#3{I}\endcsname{\the\rowmax}% + \expandafter\edef\csname\string#3{J}\endcsname{\the\colmax}% + \def #3##1{\ifx[##1\expandafter\Matrix@helper@size + \else\expandafter\Matrix@helper@entry\fi #3{##1}}% +}% +\def\Matrix@helper@size #1#2#3]{\csname\string#1{#3}\endcsname }% +\def\Matrix@helper@entry #1#2#3% + {\csname\string#1{\the\numexpr#2.\the\numexpr#3}\endcsname }% +\def\A #1{\ifx[#1\expandafter\A@size + \else\expandafter\A@entry\fi {#1}}% +\def\A@size #1#2]{\ifx I#23\else4\fi}% 3rows, 4columns +\def\A@entry #1#2{\the\numexpr #1+#2-1\relax}% not pre-computed... +\def\B #1{\ifx[#1\expandafter\B@size + \else\expandafter\B@entry\fi {#1}}% +\def\B@size #1#2]{\ifx I#24\else3\fi}% 4rows, 3columns +\def\B@entry #1#2{\the\numexpr #1-#2\relax}% not pre-computed... +\makeatother +\MatrixMultiplication\A\B\C \MatrixMultiplication\C\C\D % etc... +\[\begin{pmatrix} + \A11&\A12&\A13&\A14\\ + \A21&\A22&\A23&\A24\\ + \A31&\A32&\A33&\A34 + \end{pmatrix} +\times + \begin{pmatrix} + \B11&\B12&\B13\\ + \B21&\B22&\B23\\ + \B31&\B32&\B33\\ + \B41&\B42&\B43 + \end{pmatrix} += +\begin{pmatrix} + \C11&\C12&\C13\\ + \C21&\C22&\C23\\ + \C31&\C32&\C33 +\end{pmatrix}\] +\[\begin{pmatrix} + \C11&\C12&\C13\\ + \C21&\C22&\C23\\ + \C31&\C32&\C33 +\end{pmatrix}^2 = \begin{pmatrix} + \D11&\D12&\D13\\ + \D21&\D22&\D23\\ + \D31&\D32&\D33 +\end{pmatrix}\] +\end{verbatim} +\newcount\rowmax \newcount\colmax \newcount\summax +\newcount\rowindex \newcount\colindex \newcount\sumindex +\newcount\tmpcount +\makeatletter +\def\MatrixMultiplication #1#2#3{% + \rowmax #1[I]\relax + \colmax #2[J]\relax + \summax #1[J]\relax + \rowindex 1 + \xintloop % loop over row index i + {\colindex 1 + \xintloop % loop over col index k + {\tmpcount 0 + \sumindex 1 + \xintloop % loop over intermediate index j + \advance\tmpcount \numexpr #1\rowindex\sumindex*#2\sumindex\colindex\relax + \ifnum\sumindex<\summax + \advance\sumindex 1 + \repeat }% + \expandafter\edef\csname\string#3{\the\rowindex.\the\colindex}\endcsname + {\the\tmpcount}% + \ifnum\colindex<\colmax + \advance\colindex 1 + \repeat }% + \ifnum\rowindex<\rowmax + \advance\rowindex 1 + \repeat + \expandafter\edef\csname\string#3{I}\endcsname{\the\rowmax}% + \expandafter\edef\csname\string#3{J}\endcsname{\the\colmax}% + \def #3##1{\ifx[##1\expandafter\Matrix@helper@size + \else\expandafter\Matrix@helper@entry\fi #3{##1}}% +}% +\def\Matrix@helper@size #1#2#3]{\csname\string#1{#3}\endcsname }% +\def\Matrix@helper@entry #1#2#3% + {\csname\string#1{\the\numexpr#2.\the\numexpr#3}\endcsname }% +\def\A #1{\ifx[#1\expandafter\A@size + \else\expandafter\A@entry\fi {#1}}% +\def\A@size #1#2]{\ifx I#23\else4\fi}% 3rows, 4columns +\def\A@entry #1#2{\the\numexpr #1+#2-1\relax}% not pre-computed... +\def\B #1{\ifx[#1\expandafter\B@size + \else\expandafter\B@entry\fi {#1}}% +\def\B@size #1#2]{\ifx I#24\else3\fi}% 4rows, 3columns +\def\B@entry #1#2{\the\numexpr #1-#2\relax}% not pre-computed... +\makeatother +\MatrixMultiplication\A\B\C \MatrixMultiplication\C\C\D +\setlength{\unitlength}{1cm} +% le picture de LaTeX est tout de même assez génial! +\begin{picture}(0,0) +\put(6,10){\vtop{\hsize8cm +\[\begin{pmatrix} + \A11&\A12&\A13&\A14\\ + \A21&\A22&\A23&\A24\\ + \A31&\A32&\A33&\A34 + \end{pmatrix} +\times + \begin{pmatrix} + \B11&\B12&\B13\\ + \B21&\B22&\B23\\ + \B31&\B32&\B33\\ + \B41&\B42&\B43 + \end{pmatrix} += +\begin{pmatrix} + \C11&\C12&\C13\\ + \C21&\C22&\C23\\ + \C31&\C32&\C33 +\end{pmatrix}\] +\[\begin{pmatrix} + \C11&\C12&\C13\\ + \C21&\C22&\C23\\ + \C31&\C32&\C33 +\end{pmatrix}^2 = \begin{pmatrix} + \D11&\D12&\D13\\ + \D21&\D22&\D23\\ + \D31&\D32&\D33 +\end{pmatrix}\]\MatrixMultiplication\C\D\E +\[\begin{pmatrix} + \C11&\C12&\C13\\ + \C21&\C22&\C23\\ + \C31&\C32&\C33 +\end{pmatrix}^3 = \begin{pmatrix} + \E11&\E12&\E13\\ + \E21&\E22&\E23\\ + \E31&\E32&\E33 +\end{pmatrix}\]\MatrixMultiplication\C\E\F +\[\begin{pmatrix} + \C11&\C12&\C13\\ + \C21&\C22&\C23\\ + \C31&\C32&\C33 +\end{pmatrix}^4 = \begin{pmatrix} + \F11&\F12&\F13\\ + \F21&\F22&\F23\\ + \F31&\F32&\F33 +\end{pmatrix}\]}} +\end{picture} +\endgroup + +\vskip-\baselineskip + +\subsection{\csbh{xintiloop}, \csbh{xintiloopindex}, \csbh{xintouteriloopindex}, + \csbh{xintbreakiloop}, \csbh{xintbreakiloopanddo}, \csbh{xintiloopskiptonext}, +\csbh{xintiloopskipandredo}} +\label{xintiloop} +\label{xintbreakiloop} +\label{xintbreakiloopanddo} +\label{xintiloopskiptonext} +\label{xintiloopskipandredo} +\label{xintiloopindex} +\label{xintouteriloopindex} +{\small New with release |1.09g|.\par} + +\csa{xintiloop}|[start+delta]|\meta{stuff}|\iftest ... \repeat| is a completely +expandable nestable loop having access via \csbxint{iloopindex} to the integer +index of the iteration, with starting value |start| (which may be a |\count|) +and increment |delta| (\emph{id.}). Currently |[start+delta]| is a +\emph{mandatory argument}, it is an error to omit it; perhaps a future release +will make it optional with default |1+1|. A space after the closing square +bracket is not significant, it will be ignored. Spaces inside the square +brackets will also be ignored as the two arguments are first given to a +|\numexpr...\relax|. + +As with \csbxint{loop}, this tool will mostly be of interest to advanced users. +As is the case for its variant, it is declared short and can not handle directly +|\par| tokens or empty lines. For nesting, one puts inside braces all the +material from the start (immediately after |[start+delta]|) and up to and +inclusive of the inner loop, these braces will be removed and do not create a +loop. In case of nesting, \csbxint{outeriloopindex} gives access to the index of +the outer loop. If needed one could write on its model a macro giving access to +the index of the outer outer loop (or even to the |nth| outer loop). + + +The \csa{xintiloopindex} and \csa{xintouteriloopindex} can not be used inside +braces, and generally speaking this means they should be expanded first when +given as argument to a macro, and that this macro receives them as delimited +arguments, not braced ones. Or, but naturally this will break expandability, one +can assign the value of \csa{xintiloopindex} to some |\count|. Both +\csa{xintiloopindex} and \csa{xintouteriloopindex} extend to the litteral +representation of the index, thus in |\ifnum| tests, if it comes last one has to +correctly end the macro with a |\space|, or encapsulate it in a +|\numexpr..\relax|. + +When the repeat-test of the loop is, for example, |\ifnum\xintiloopindex<10 +\repeat|, this means that the last iteration will be with |\xintiloopindex=10| +(assuming |delta=1|). There is also |\ifnum\xintiloopindex=10 \else\repeat| to +get the last iteration to be the one with |\xintiloopindex=10|. + +One has \csbxint{breakiloop} and \csbxint{breakiloopanddo} to abort the +loop, \csbxint{iloopskiptonext} to abort the current iteration and skip to the +next, \hyperref[xintiloopskipandredo]{\ttfamily\hyphenchar\font45 \char92 + xintiloopskip\-and\-redo} to skip to the end of the current iteration and redo +it with the same value of the index (something else will have to change for this +not to become an eternal loop\dots ). + +Inside alignments, if the looped-over text contains a |&| or a |\cr|, any +un-expandable material before a \csbxint{iloopindex} will make it fail because +of |\endtemplate|; in such cases one can always either replace |&| by a macro +expanding to it or replace it by a suitable |\firstofone{&}|, and similarly for +|\cr|. + +As an example, let us construct an |\edef\z{...}| which will define |\z| to be a +list of prime numbers: +\dverb|@ +\edef\z +{\xintiloop [10001+2]% + {\xintiloop [3+2]% + \ifnum\xintouteriloopindex<\numexpr\xintiloopindex*\xintiloopindex\relax + \xintouteriloopindex, + \expandafter\xintbreakiloop + \fi + \ifnum\xintouteriloopindex=\numexpr + (\xintouteriloopindex/\xintiloopindex)*\xintiloopindex\relax + \else + \repeat + }% no space here + \ifnum \xintiloopindex < 10999 \repeat }% +\meaning\z| +\begingroup%\ttfamily +\edef\z +{\xintiloop [10001+2]% + {\xintiloop [3+2]% + \ifnum\xintouteriloopindex<\numexpr\xintiloopindex*\xintiloopindex\relax + \xintouteriloopindex, + \expandafter\xintbreakiloop + \fi + \ifnum\xintouteriloopindex=\numexpr + (\xintouteriloopindex/\xintiloopindex)*\xintiloopindex\relax + \else + \repeat + }% no space here + \ifnum \xintiloopindex < 10999 \repeat }% +\meaning\z and we should have taken some steps to not have a trailing comma, but +the point was to show that one can do that in an |\edef|\,! +\endgroup + +Let us create an alignment where each row will contain all divisors of its +first entry. +\dverb|@ +\tabskip1ex +\halign{&\hfil#\hfil\cr + \xintiloop [1+1] + {\expandafter\bfseries\xintiloopindex & + \xintiloop [1+1] + \ifnum\xintouteriloopindex=\numexpr + (\xintouteriloopindex/\xintiloopindex)*\xintiloopindex\relax + \xintiloopindex&\fi + \ifnum\xintiloopindex<\xintouteriloopindex\space % \space is CRUCIAL + \repeat \cr }% + \ifnum\xintiloopindex<30 + \repeat }| + +% +\noindent We wanted this first entry in bold face, but |\bfseries| leads to +unexpandable tokens, so the |\expandafter| was necessary for |\xintiloopindex| +and |\xintouteriloopindex| not to be confronted with a hard to digest +|\endtemplate|. An alternative way of coding is: +% +\dverb|@ \tabskip1ex +\def\firstofone #1{#1}% +\halign{&\hfil#\hfil\cr + \xintiloop [1+1] + {\bfseries\xintiloopindex\firstofone{&}% + \xintiloop [1+1] \ifnum\xintouteriloopindex=\numexpr + (\xintouteriloopindex/\xintiloopindex)*\xintiloopindex\relax + \xintiloopindex\firstofone{&}\fi + \ifnum\xintiloopindex<\xintouteriloopindex\space % \space is CRUCIAL + \repeat \firstofone{\cr}}% + \ifnum\xintiloopindex<30 \repeat }| + +\noindent +Here is the output, thus obtained without any count register: +\begingroup\catcode`_ 11 +\begin{multicols}2 +\tabskip1ex +\halign{&\hfil#\hfil\cr + \xintiloop [1+1] + {\expandafter\bfseries\xintiloopindex & + \xintiloop [1+1] + \ifnum\xintouteriloopindex=\numexpr + (\xintouteriloopindex/\xintiloopindex)*\xintiloopindex\relax + \xintiloopindex&\fi + \ifnum\xintiloopindex<\xintouteriloopindex\space % CRUCIAL \space HERE + \repeat \cr }% + \ifnum\xintiloopindex<30 + \repeat +} +\end{multicols} +\endgroup + +\subsection{A table of factorizations} + +As one more example with \csbxint{iloop} let us use an alignment to display the +factorization of some numbers. The loop will actually only play a minor r\^ole +here, just handling the row index, the row contents being almost entirely +produced via a macro |\factorize|. The factorizing macro does not use +|\xintiloop| as it didn't appear to be the convenient tool. As |\factorize| will +have to be used on |\xintiloopindex|, it has been defined as a delimited macro. + +To spare some fractions of a second in the compilation time of this document +(which has many many other things to do), \number"7FFFFFED{} and +\number"7FFFFFFF, which turn out to be prime numbers, are not given to +|factorize| but just typeset directly; this illustrates use of +\csbxint{iloopskiptonext}. + +\begingroup +\def\MacroFont{\ttfamily\baselineskip12pt\relax \catcode`\" 12 } +\dverb|@ +\tabskip1ex +\halign {&\hfil\strut#\hfil\cr\noalign{\hrule} + \xintiloop ["7FFFFFE0+1] + \expandafter\bf\xintiloopindex & + \ifnum\xintiloopindex="7FFFFFED + \number"7FFFFFED\cr\noalign{\hrule} + \expandafter\xintiloopskiptonext + \fi + \expandafter\factorize\xintiloopindex.\cr\noalign{\hrule} + \ifnum\xintiloopindex<"7FFFFFFE + \repeat + \bf \number"7FFFFFFF&\number "7FFFFFFF\cr\noalign{\hrule} +}|\par\smallskip +\endgroup + +The \hyperref[floatfactorize]{table} has been made into a float which appears +\vpageref{floatfactorize}. Here is now the code for factorization; the +conditionals use +the package provided |\xint_firstoftwo| and |\xint_secondoftwo|, one could have +employed rather \LaTeX{}'s own \texttt{\char92\string@firstoftwo} and +\texttt{\char92\string@secondoftwo}, or, simpler still in \LaTeX{} context, the +|\ifnumequal|, |\ifnumless| \dots, utilities from the package |etoolbox| which +do exactly that under the hood. Only \TeX{} acceptable numbers are treated here, +but it would be easy to make a translation and use the \xintname macros, thus +extending the scope to big numbers; naturally up to a cost in speed. + +The reason for some strange looking expressions is to avoid arithmetic overflow. + +\begingroup +\def\MacroFont{\ttfamily\baselineskip12pt\relax \catcode`\" 12 } +\dverb|@ +\catcode`_ 11 +\def\abortfactorize #1\xint_secondoftwo\fi #2#3{\fi} + +\def\factorize #1.{\ifnum#1=1 \abortfactorize\fi + % avoid overflow if #1="7FFFFFFF + \ifnum\numexpr #1-2=\numexpr ((#1/2)-1)*2\relax + \expandafter\xint_firstoftwo + \else\expandafter\xint_secondoftwo + \fi + {2&\expandafter\factorize\the\numexpr#1/2.}% + {\factorize_b #1.3.}}% + +\def\factorize_b #1.#2.{\ifnum#1=1 \abortfactorize\fi + % this will avoid overflow which could result from #2*#2 + \ifnum\numexpr #1-(#2-1)*#2<#2 + #1\abortfactorize % this #1 is prime + \fi + % again, avoiding overflow as \numexpr integer division + % rounds rather than truncates. + \ifnum \numexpr #1-#2=\numexpr ((#1/#2)-1)*#2\relax + \expandafter\xint_firstoftwo + \else\expandafter\xint_secondoftwo + \fi + {#2&\expandafter\factorize_b\the\numexpr#1/#2.#2.}% + {\expandafter\factorize_b\the\numexpr #1\expandafter.% + \the\numexpr #2+2.}}% +\catcode`_ 8| +\endgroup + +\catcode`_ 11 +\def\abortfactorize #1\xint_secondoftwo\fi #2#3{\fi} + +\def\factorize #1.{\ifnum#1=1 \abortfactorize\fi + \ifnum\numexpr #1-2=\numexpr ((#1/2)-1)*2\relax + \expandafter\xint_firstoftwo + \else\expandafter\xint_secondoftwo + \fi + {2&\expandafter\factorize\the\numexpr#1/2.}% + {\factorize_b #1.3.}}% + +\def\factorize_b #1.#2.{\ifnum#1=1 \abortfactorize\fi + \ifnum\numexpr #1-(#2-1)*#2<#2 + #1\abortfactorize + \fi + \ifnum \numexpr #1-#2=\numexpr ((#1/#2)-1)*#2\relax + \expandafter\xint_firstoftwo + \else\expandafter\xint_secondoftwo + \fi + {#2&\expandafter\factorize_b\the\numexpr#1/#2.#2.}% + {\expandafter\factorize_b\the\numexpr #1\expandafter.% + \the\numexpr #2+2.}}% +\catcode`_ 8 +\begin{figure*}[ht!] +\centering\phantomsection\label{floatfactorize} +\tabskip1ex +\centeredline{\vbox{\halign {&\hfil\strut#\hfil\cr\noalign{\hrule} + \xintiloop ["7FFFFFE0+1] + \expandafter\bf\xintiloopindex & + \ifnum\xintiloopindex="7FFFFFED + \number"7FFFFFED\cr\noalign{\hrule} + \expandafter\xintiloopskiptonext + \fi + \expandafter\factorize\xintiloopindex.\cr\noalign{\hrule} + \ifnum\xintiloopindex<"7FFFFFFE + \repeat + \bf \number"7FFFFFFF&\number "7FFFFFFF\cr\noalign{\hrule} +}}} +\centeredline{A table of factorizations} +\end{figure*} + \begin{framed} The next utilities are not compatible with expansion-only context. @@ -4056,9 +3875,13 @@ where it was reasonable to stop. \begin{framed} A macro |\macro| whose definition uses internally an \csbxint{For} loop may be used inside another \csbxint{For} loop even if the two loops both use the same - macro parameter. By the way the loop definition inside |\macro| must double + macro parameter. Note: the loop definition inside |\macro| must double the character |#| as is the general rule in \TeX{} with definitions done inside macros. + + The macros \csa{xintFor} and \csa{xintFor*} are not expandable, one can not + use them inside an |\edef|. But they may be used inside alignments (such as a + \LaTeX{} |tabular|), as will be shown in examples. \end{framed} The spaces between the various declarative elements are all optional; @@ -4093,7 +3916,7 @@ which encapsulate the item in a macro expanding to that item. replacement text, just the token |\x|). Input such as |<stuff>,,<stuff>| creates an empty |#1|, the iteration is not skipped. An empty list does lead to the use of the replacement text, once, with an empty |#1| (or |#n|). Except - if the entire list is represented as a single macro (with no parameters), + if the entire list is represented as a single macro with no parameters, \fbox{it must be braced.} \end{framed} @@ -4108,24 +3931,9 @@ which encapsulate the item in a macro expanding to that item. \makeatletter\hbox {\@textsuperscript {\normalfont \thefootnote }}\makeatother. Spaces at the start, end, or in-between items are gobbled (but naturally not the spaces which may be inside \emph{braced} items). Except - if the list argument is a single macro (with no parameters), \fbox{it must be + if the list argument is a single macro with no parameters, \fbox{it must be braced.} Each item which is not braced will be fully expanded (as the |\x| and |\y| in the example above). An empty list leads to an empty result. - - The macro \csbxint{Seq} which generates arithmetic sequences may only be used - with \csbxint{For*} (numbers from output of |\xintSeq| are braced, not - separated by commas). \centeredline{|\xintFor* #1 in {\xintSeq - [+2]{-7}{+2}}\do {stuff with #1}|} will have |#1=-7,-5,-3,-1, and 1|. The - |#1| as issued from the list produced by \csbxint{Seq} is the litteral - representation as would be produced by |\arabic| on a \LaTeX{} counter, it is - not a count register. When used in |\ifnum| tests or other contexts where - \TeX{} looks for a number it is recommended to use - |#1\space|\stepcounter{footnote}% - \makeatletter\hbox {\@textsuperscript {\normalfont \thefootnote - }}\makeatother, or |#1\relax| if expandability of the process is not an - issue (for example if the iterated commands do an |\edef| using such a test, - |\relax| is not a good choice as it will be kept in the complete expansion if - it is in the true branch of the conditional, whereas |\space| will disappear). \end{framed} \begingroup\makeatletter \def\@footnotetext #1{\insert\footins {\reset@font \footnotesize \interlinepenalty \interfootnotelinepenalty \splittopskip \footnotesep \splitmaxdepth \dp \strutbox \floatingpenalty \@MM \hsize \columnwidth \@parboxrestore \color@begingroup \@makefntext {\rule \z@ \footnotesep \ignorespaces #1\@finalstrut \strutbox }\color@endgroup }} @@ -4133,14 +3941,53 @@ which encapsulate the item in a macro expanding to that item. \edef\@thefnmark {\thefootnote} \@footnotetext{braces around single token items are optional so this is the same as \texttt{\{123456\}}.} -\stepcounter{footnote} -\edef\@thefnmark {\thefootnote} -\@footnotetext{the \csa{space} will stop the \TeX{} scanning of a number and be - gobbled in the process; the \csa{relax} stops the scanning but is not - gobbled. Or one may do \csa{numexpr}\texttt{\#1}\csa{relax}, and then the - \csa{relax} is gobbled.} +% \stepcounter{footnote} +% \edef\@thefnmark {\thefootnote} +% \@footnotetext{the \csa{space} will stop the \TeX{} scanning of a number and be +% gobbled in the process; the \csa{relax} stops the scanning but is not +% gobbled. Or one may do \csa{numexpr}\texttt{\#1}\csa{relax}, and then the +% \csa{relax} is gobbled.} \endgroup -\addtocounter{Hfootnote}{2} +%\addtocounter{Hfootnote}{2} +\addtocounter{Hfootnote}{1} + +The macro \csbxint{Seq} which generates arithmetic sequences may only be used +with \csbxint{For*} (numbers from output of |\xintSeq| are braced, not separated +by commas). \centeredline{|\xintFor* #1 in {\xintSeq [+2]{-7}{+2}}\do {stuff + with #1}|} will have |#1=-7,-5,-3,-1, and 1|. The |#1| as issued from the +list produced by \csbxint{Seq} is the litteral representation as would be +produced by |\arabic| on a \LaTeX{} counter, it is not a count register. When +used in |\ifnum| tests or other contexts where \TeX{} looks for a number it is +recommended to use |#1\space|\footnote{the \csa{space} will stop the \TeX{} + scanning of a number and be gobbled in the process; the \csa{relax} stops the + scanning but is not gobbled. Or one may do + \csa{numexpr}\texttt{\#1}\csa{relax}, and then the \csa{relax} is gobbled.}, +or |#1\relax| if expandability of the process is not an issue (for example if +the iterated commands do an |\edef| using such a test, |\relax| is not a good +choice as it will be kept in the complete expansion if it is in the true branch +of the conditional, whereas |\space| will disappear). + +When nesting \csa{xintFor*} loops, using \csa{xintSeq} in the inner loops is +inefficient, as the arithmetic sequence will be re-created each time. A more +efficient style is: +% +\dverb|@ + \edef\innersequence {\xintSeq[+2]{-50}{50}}% + \xintFor* #1 in {\xintSeq {13}{27}} \do + {\xintFor* #2 in \innersequence \do {stuff with #1 and #2}% + .. some other macros .. }| + +This is a general remark applying for any nesting of loops, one should avoid +recreating the inner lists of arguments at each iteration of the outer loop. +However, in the example above, if the |.. some other macros ..| part +closes a group which was opened before the |\edef\innersequence|, then +this definition will be lost. An alternative to |\edef|, also efficient, +exists when dealing with arithmetic sequences: it is to use the +\csbxint{integers} keyword (described later) which simulates infinite +arithmetic sequences; the loops will then be terminated via a test |#1| +(or |#2| etc\dots) and subsequent use of \csbxint{BreakFor}. + + The \csbxint{For} loops are not completely expandable; but they may be nested and used inside alignments or other contexts where the replacement text closes @@ -4219,6 +4066,11 @@ Designed to work as expected under nesting. Don't forget an empty brace pair |{}| if a branch is to do nothing. May be used multiple times in the replacement text of the loop. +There is no such thing as an iteration counter provided by the \csa{xintFor} +loops; the user is invited to define if needed his own count register or +\LaTeX{} counter, for example with a suitable |\stepcounter| inside the +replacement text of the loop to update it. + \subsection{ \csbh{xintBreakFor}, \csbh{xintBreakForAndDo}} \label{xintBreakFor}\label{xintBreakForAndDo} {\small New in |1.09e|.\par} @@ -4248,22 +4100,22 @@ in the next section which is devoted to ``forever'' loops. \label{xintdimensions}\label{xintrationals} {\small New in |1.09e|.\par} -If the list argument to \csbxint{For} (or \csbxint{For*}, the two are here -completely equivalent) is \csbxint{integers} (equivalently \csbxint{egers}) or -more generally \csbxint{integers}|[||start|\allowbreak|+|\allowbreak|delta||]| +If the list argument to \csbxint{For} (or \csbxint{For*}, both are equivalent in +this context) is \csbxint{integers} (equivalently \csbxint{egers}) or more +generally \csbxint{integers}|[||start|\allowbreak|+|\allowbreak|delta||]| (\emph{the whole within braces}!)\footnote{the |start+delta| optional specification may have extra spaces around the plus sign of near the square brackets, such spaces are removed. The same applies with \csa{xintdimensions} - and \csa{xintrationals}.}, then \csbxint{For} does an infinite -iteration where |#1| (or |#2|, \dots, |#9|) will run through the arithmetic -sequence of (short) integers with initial value |start| and increment |delta| -(default values: |start=1|, |delta=1|; if the optional argument is present it -must contains both of them, and they may be explicit integers, or macros or -count registers. The |#1| (or |#2|, \dots, |#9|) will stand for |\numexpr <opt -sign><digits>\relax|, and the litteral representation as a string of digits can -thus be obtained as \fbox{\csa{the\#1}} or |\number#1|. Such a |#1| can be used -in an |\ifnum| test with no need to be postfixed with a space or a |\relax| and -one should \emph{not} add them. + and \csa{xintrationals}.}, then \csbxint{For} does an infinite iteration where +|#1| (or |#2|, \dots, |#9|) will run through the arithmetic sequence of (short) +integers with initial value |start| and increment |delta| (default values: +|start=1|, |delta=1|; if the optional argument is present it must contains both +of them, and they may be explicit integers, or macros or count registers. The +|#1| (or |#2|, \dots, |#9|) will stand for |\numexpr <opt sign><digits>\relax|, +and the litteral representation as a string of digits can thus be obtained as +\fbox{\csa{the\#1}} or |\number#1|. Such a |#1| can be used in an |\ifnum| test +with no need to be postfixed with a space or a |\relax| and one should +\emph{not} add them. If the list argument is \csbxint{dimensions} or more generally \csbxint{dimensions}|[||start|\allowbreak|+|\allowbreak|delta||]| (\emph{within @@ -4591,11 +4443,11 @@ commas. Spaces around commas and parentheses are ignored. \end{tabular}$\Biggr)$&}\\\noalign{\vskip1\jot}}% \end{tabular}} -\smallskip Only |#1#2|, |#2#3|, \dots, |#8#9| are valid (no error check is -done on the input syntax\dots). One can nest with -\csbxint{For}, for disjoint sets of macro parameters. There is also -\csa{xintForthree} (from |#1#2#3| to |#7#8#9|) and \csa{xintForfour} -(from |#1#2#3#4| to |#6#7#8#9|). +\smallskip Only |#1#2|, |#2#3|, |#3#4|, \dots, |#8#9| are valid (no error check +is done on the input syntax, |#1#3| or similar all end up in errors). +One can nest with \csbxint{For}, for disjoint sets of macro parameters. There is +also \csa{xintForthree} (from |#1#2#3| to |#7#8#9|) and \csa{xintForfour} (from +|#1#2#3#4| to |#6#7#8#9|). % These three macros |\xintForpair|, |\xintForthree| and |\xintForfour| are to % be considered in experimental status, and may be removed, replaced or @@ -4998,7 +4850,745 @@ then one should use the following variants: It is possible to modify this code to let it do \csa{QSonestep} repeatedly and stop automatically when the sort is finished. -\section{Commands of the \xintfracname package}\label{sec:comfrac} +\section{Commands of the \xintname package} +\label{sec:xint} + +\def\n{\string{N\string}} +\def\m{\string{M\string}} +\def\x{\string{x\string}} + +In the description of the macros \texttt{\n} (or also \texttt{\m}) stands +(except if mentioned otherwise) for a (long) number within braces or for a +control sequence possibly within braces and \hyperref[sec:expansions]{\fexpan + ding} to such a number +(without the braces!), or for material within braces which \fexpan ds to such +a number, as is acceptable on input by the \csbxint{Num} macro: a sequence of +plus and minus signs, followed by some string of zeros, followed by digits. + +The letter \texttt{x} stands for something which will be inserted in-between a +|\numexpr| and a |\relax|. It will thus be completely expanded and must give an +integer obeying the \TeX{} bounds. Thus, it may be for example a count register, +or itself a \csa{numexpr} expression, or just a number written explicitely with +digits or something like |4*\count 255 + 17|, etc... + +For the rules regarding direct use of count registers or \csa{numexpr} +expression, in the argument to the package macros, see the +\hyperlink{useofcount}{use of count section} in \autoref{sec:inputs}. + +Some of these macros are extended by \xintfracname to accept fractions on input, +and, generally, to output a fraction. But this means that additions, +subtractions, multiplications output fractions and not integers; to guarantee +the integer format on output when the inputs are integers, the original +integer-only macros \csa{xintAdd}, \csa{xintSub}, \csa{xintMul} remain available +under the names \csa{xintiAdd}, \csa{xintiSub}, \csa{xintiMul}. Even the +original integer-only macros may now accept fractions on input as long as they +are integers in disguise; they still produce on output integers without any +forward slash mark nor trailing |[n]|. On the other hand macros such as +|\xintAdd| will output fractions |A/B[n]|, with |B| present even if its value is +one. To remove this unit denominator and convert the |[n]| part into explicit +zeros, one has \csbxint{Num} (if one is certain to deal with an integer; see +also \csbxint{PRaw}). This is mandatory when the computation result is fetched +into a context where \TeX{} expects a number (assuming it does not exceed +@2^31@). See the also the \xintfracname \hyperref[sec:frac]{documentation} +for more information on how macros of \xintname are modified after loading +\xintfracname (or \xintexprname). + + +% Package \xintname also provides some general macro programming or token +% manipulation utilities (expandable as well as non-expandable), which are +% described in the next section (\autoref{sec:tools}). + +\localtableofcontents + +\subsection{\csbh{xintRev}} \label{xintRev} + +\csa{xintRev\n} will revert the order of the digits of the number, +keeping the optional sign. Leading zeros +resulting from the operation are not removed (see the +\csa{xintNum} macro for this). This macro and all other +macros dealing with numbers first expand `fully' their arguments. +\centeredline{|\xintRev{-123000}|\digitstt{=\xintRev{-123000}}} +\centeredline{|\xintNum{\xintRev{-123000}}|% + \digitstt{=\xintNum{\xintRev{-123000}}}} + + +\subsection{\csbh{xintLen}}\label{xintiLen} + +\csa{xintLen\n} returns the length of the number, not counting the sign. +\centeredline{|\xintLen{-12345678901234567890123456789}|\digitstt + {=\xintLen{-12345678901234567890123456789}}} Extended by \xintfracname to +fractions: the length of |A/B[n]| is the length of |A| plus the length of |B| +plus the absolute value of |n| and minus one (an integer input as |N| is +internally represented in a form equivalent to |N/1[0]| so the minus one means +that the extended \csa{xintLen} +behaves the same as the original for integers). +\centeredline{|\xintLen{-1e3/5.425}|\digitstt + {=\xintLen{-1e3/5.425}}} +The length is computed on the |A/B[n]| which would have been returned by +\csbxint{Raw}: |\xintRaw {-1e3/5.425}|\digitstt{=\xintRaw {-1e3/5.425}}. + +Let's point out that the whole thing should sum up to +less than circa @2^{31}@, but this is a bit theoretical. + +|\xintLen| is only for numbers or fractions. See \csbxint{Length} for counting +tokens (or rather braced groups), more generally. + +\subsection{\csbh{xintDigitsOf}}\label{xintDigitsOf} + +This is a synonym for \csbxint{AssignArray}, to be used to define +an array giving all the digits of a given (positive, else the minus sign will +be treated as first item) number. +\begingroup\xintDigitsOf\xintiPow {7}{500}\to\digits +\centeredline{|\xintDigitsOf\xintiPow {7}{500}\to\digits|} +\noindent @7^500@ has |\digits{0}=|\digits{0} digits, and the 123rd among them +(starting from the most significant) is +|\digits{123}=|\digits{123}. +\endgroup + +\subsection{\csbh{xintNum}}\label{xintiNum} + +\csa{xintNum\n} removes chains of plus or minus signs, followed by zeros. +\centeredline{|\xintNum{+---++----+--000000000367941789479}|\digitstt + {=\xintNum{+---++----+--000000000367941789479}}} Extended by \xintfracname to +accept also a fraction on input, as long as it reduces to an integer after +division of the numerator by the denominator. +\centeredline{|\xintNum{123.48/-0.03}|\digitstt{=\xintNum{123.48/-0.03}}} + + +\subsection{\csbh{xintSgn}}\label{xintiSgn} + +\csa{xintSgn\n} returns 1 if the number is positive, 0 if it is +zero and -1 if it is negative. Extended by \xintfracname to fractions. + +\subsection{\csbh{xintOpp}}\label{xintiOpp} + +\csa{xintOpp\n} returns the opposite |-N| of the number |N|. +Extended by \xintfracname to fractions. + + +\subsection{\csbh{xintAbs}}\label{xintiAbs} + +\csa{xintAbs\n} returns the absolute value of the number. Extended +by \xintfracname to fractions. + +\subsection{\csbh{xintAdd}}\label{xintiAdd} + +\csa{xintAdd\n\m} returns the sum of the two numbers. Extended by +\xintfracname to fractions. + +\subsection{\csbh{xintSub}}\label{xintiSub} + +\csa{xintSub\n\m} returns the difference |N-M|. Extended by +\xintfracname to fractions. + +\subsection{\csbh{xintCmp}}\label{xintiCmp} + +\csa{xintCmp\n\m} returns 1 if |N>M|, 0 if |N=M|, and -1 if |N<M|. +Extended by \xintfracname to fractions. + +\subsection{\csbh{xintEq}}\label{xintEq} +{\small New with release |1.09a|.\par} + +\csa{xintEq\n\m} returns 1 if |N=M|, 0 otherwise. +Extended by \xintfracname to fractions. + +\subsection{\csbh{xintGt}}\label{xintGt} +{\small New with release |1.09a|.\par} + +% attention dans la doc du 9 octobre j'avais écrit \geq au lieu de > + +\csa{xintGt\n\m} returns 1 if |N|$>$|M|, 0 otherwise. +Extended by \xintfracname to fractions. + +\subsection{\csbh{xintLt}}\label{xintLt} +{\small New with release |1.09a|.\par} + +% attention dans la doc du 9 octobre j'avais écrit \leq au lieu de < + +\csa{xintLt\n\m} returns 1 if |N|$<$|M|, 0 otherwise. +Extended by \xintfracname to fractions. + +\subsection{\csbh{xintIsZero}}\label{xintIsZero} +{\small New with release |1.09a|.\par} + +\csa{xintIsZero\n} returns 1 if |N=0|, 0 otherwise. +Extended by \xintfracname to fractions. + +\subsection{\csbh{xintNot}}\label{xintNot} +{\small New with release |1.09c|.\par} + +\csa{xintNot} is a synonym for \csa{xintIsZero}. + +\subsection{\csbh{xintIsNotZero}}\label{xintIsNotZero} +{\small New with release |1.09a|.\par} + +\csa{xintIsNotZero\n} returns 1 if |N<>0|, 0 otherwise. +Extended by \xintfracname to fractions. + +\subsection{\csbh{xintIsOne}}\label{xintIsOne} +{\small New with release |1.09a|.\par} + +\csa{xintIsOne\n} returns 1 if |N=1|, 0 otherwise. +Extended by \xintfracname to fractions. + +\subsection{\csbh{xintAND}}\label{xintAND} +{\small New with release |1.09a|.\par} + +\csa{xintAND\n\m} returns 1 if |N<>0| and |M<>0| and zero otherwise. + Extended by \xintfracname to fractions. + +\subsection{\csbh{xintOR}}\label{xintOR} +{\small New with release |1.09a|.\par} + +\csa{xintOR\n\m} returns 1 if |N<>0| or |M<>0| and zero otherwise. + Extended by \xintfracname to fractions. + + +\subsection{\csbh{xintXOR}}\label{xintXOR} +{\small New with release |1.09a|.\par} + +\csa{xintXOR\n\m} returns 1 if exactly one of |N| or |M| is true (i.e. +non-zero). + Extended by \xintfracname to fractions. + +\subsection{\csbh{xintANDof}}\label{xintANDof} +{\small New with release |1.09a|.\par} + +\csa{xintANDof}|{{a}{b}{c}...}| returns 1 if all are true (i.e. non +zero) and zero otherwise. The list argument +may be a macro, it (or rather its first token) is \fexpan ded first (each +item also is \fexpan ded). Extended by \xintfracname to fractions. + + +\subsection{\csbh{xintORof}}\label{xintORof} +{\small New with release |1.09a|.\par} + +\csa{xintORof}|{{a}{b}{c}...}| returns 1 if at least one is true +(i.e. does not vanish). The list argument +may be a macro, it is \fexpan ded first. Extended by \xintfracname to fractions. + + +\subsection{\csbh{xintXORof}}\label{xintXORof} +{\small New with release |1.09a|.\par} + +\csa{xintXORof}|{{a}{b}{c}...}| returns 1 if an odd number of them are +true (i.e. does not vanish). The list argument may be a macro, it is +\fexpan ded first. Extended by \xintfracname to fractions. + + +\subsection{\csbh{xintGeq}}\label{xintiGeq} + +\csa{xintGeq\n\m} returns 1 if the \emph{absolute value} of the first number is +at least equal to the absolute value of the second number. If \verb+|N|<|M|+ it +returns 0. Extended by \xintfracname to fractions (starting with release +|1.07|). Please note that the macro compares \emph{absolute values}. + +\subsection{\csbh{xintMax}}\label{xintiMax} + +\csa{xintMax\n\m} returns the largest of the two in the sense of the order +structure on the relative integers (\emph{i.e.} the right-most number if they +are put on a line with positive numbers on the right): |\xintiMax +{-5}{-6}|\digitstt{=\xintiMax{-5}{-6}}. Extended by \xintfracname to fractions. + +\subsection{\csbh{xintMaxof}}\label{xintMaxof} +{\small New with release |1.09a|.\par} + +\csa{xintMaxof}|{{a}{b}{c}...}| returns the maximum. The list argument +may be a macro, it is \fexpan ded first. Extended by \xintfracname to +fractions. + + +\subsection{\csbh{xintMin}}\label{xintiMin} + +\csa{xintMin\n\m} returns the smallest of the two in the sense of the order +structure on the relative integers (\emph{i.e.} the left-most number if they are +put on a line with positive numbers on the right): |\xintiMin +{-5}{-6}|\digitstt{=\xintiMin{-5}{-6}}. Extended by \xintfracname to fractions. + +\subsection{\csbh{xintMinof}}\label{xintMinof} +{\small New with release |1.09a|.\par} + +\csa{xintMinof}|{{a}{b}{c}...}| returns the minimum. The list argument +may be a macro, it is \fexpan ded first. Extended by \xintfracname to +fractions. + +\subsection{\csbh{xintSum}}\label{xintiSum} + +\csa{xintSum}\marg{braced things} after expanding its argument +expects to find a sequence of tokens (or braced material). +Each is expanded (with the usual meaning), and the sum of all these numbers is +returned. +\centeredline{% + \csa{xintiSum}|{{123}{-98763450}{\xintFac{7}}{\xintiMul{3347}{591}}}|% + \digitstt{=\xintiSum{{123}{-98763450}{\xintFac{7}}{\xintiMul{3347}{591}}}}} +\centeredline{\csa{xintiSum}|{1234567890}|\digitstt{=\xintiSum{1234567890}}} +An empty sum is no error and returns zero: |\xintiSum +{}|\digitstt{=\xintiSum {}}. A sum with only one +term returns that number: |\xintiSum {{-1234}}|\digitstt{=\xintiSum + {{-1234}}}. Attention that |\xintiSum {-1234}| is not legal input +and will make the \TeX{} run fail. On the other hand |\xintiSum +{1234}|\digitstt{=\xintiSum{1234}}. Extended by \xintfracname +to fractions. + +% retiré de la doc le 22 octobre 2013 + +% \subsection{\csbh{xintSumExpr}}\label{xintiSumExpr} + +% \csa{xintSumExpr}\meta{braced things}\csa{relax} is to what \csa{xintSum} +% expands. The argument is then expanded (with the usual meaning) and should give +% a list of braced quantities or macros, each one will be expanded in turn. +% \centeredline{% +% \csa{xintiSumExpr}| {123}{-98763450}|% +% |{\xintFac{7}}{\xintiMul{3347}{591}}\relax|\digitstt{=% +% \xintiSumExpr {123}{-98763450}{\xintFac{7}}{\xintiMul{3347}{591}}\relax}} + +% Note: I am not so happy with the name which seems to suggest that the +% |+| sign should be used instead of braces. Perhaps this will change +% in the future. + +% Extended by \xintfracname to fractions. + +\subsection{\csbh{xintMul}}\label{xintiMul} +{\small Modified in release |1.03|.\par} + +\csa{xintMul\n\m} returns the product of the two numbers. Starting +with release |1.03| of \xintname, the macro checks the lengths of +the two numbers and then activates its algorithm with the best (or +at least, hoped-so) choice of which one to put first. This makes +the macro a bit slower for numbers up to 50 digits, but may give +substantial speed gain when one of the number has 100 digits or more. +Extended by \xintfracname to fractions. + +\subsection{\csbh{xintSqr}}\label{xintiSqr} + +\csa{xintSqr\n} returns the square. Extended by \xintfracname to fractions. + +\subsection{\csbh{xintPrd}}\label{xintiPrd} + +\csa{xintPrd}\marg{braced things} after expanding its argument expects to find a +sequence of tokens (or braced material). Each is expanded (with the usual +meaning), and the product of all these numbers is returned. +\centeredline{% + \csa{xintiPrd}|{{-9876}{\xintFac{7}}{\xintiMul{3347}{591}}}|% + \digitstt{=% + \xintiPrd{{-9876}{\xintFac{7}}{\xintiMul{3347}{591}}}}} +\centeredline{\csa{xintiPrd}|{123456789123456789}|\digitstt{=% + \xintiPrd{123456789123456789}}} An empty product is no error and returns 1: +|\xintiPrd {}|\digitstt{=\xintiPrd {}}. A product reduced to a single term returns +this number: |\xintiPrd {{-1234}}|\digitstt{=\xintiPrd {{-1234}}}. Attention that +|\xintiPrd {-1234}| is not legal input and will make the \TeX{} compilation +fail. On the other hand |\xintiPrd {1234}|\digitstt{=\xintiPrd {1234}}. +\centeredline{$\displaystyle 2^{200}3^{100}7^{100}$} \centeredline{|=\xintiPrd + {{\xintiPow {2}{200}}{\xintiPow {3}{100}}{\xintiPow {7}{100}}}|} +\digitstt{=\printnumber{\xintNum {\xinttheexpr 2^200*3^100*7^100\relax }}} + +Extended by \xintfracname to fractions. + +With \xintexprname, the above would be coded simply as \centeredline +{|\xintthenumexpr 2^200*3^100*7^100\relax |} + +% I temporarily remove mention of \xintPrdExpr from the documentation; I +% really dislike the name now. + +% \subsection{\csbh{xintPrdExpr}}\label{xintiPrdExpr} + +% {\small Name change in |1.06a|! I apologize, but I suddenly decided that +% \csa{xintProductExpr} was a bad choice; so I just replaced it by the current +% name. \par} + +% \csa{xintPrdExpr}\marg{argument}\csa{relax} is to what \csa{xintPrd} expands +% ; its argument is expanded (with the usual meaning) and should give a list of +% braced numbers or macros. Each will be expanded when it is its turn. +% \centeredline{\csa{xintiPrdExpr}| 123456789123456789\relax|\digitstt{=% +% \xintiPrdExpr 123456789123456789\relax}} + +% Note: I am not so happy with the name which seems to suggest that the +% |*| sign should be used instead of braces. Perhaps this will change +% in the future. + +% Extended by \xintfracname to fractions. + +\subsection{\csbh{xintPow}}\label{xintiPow} + +\csa{xintPow\n\x} returns |N^x|. When |x| is zero, this is 1. If |N| is zero and +|x<0|, if \verb+|N|>1+ and |x<0| negative, or if \verb+|N|>1+ and |x>999999999|, +then an error is raised. |2^999999999| has \np{301029996} digits; each exact +multiplication of two one thousand digits numbers already takes a few seconds, +so needless to say this bound is completely irrealistic. Already |2^9999| has +\np{3010} digits,\footnote{on my laptop |\string\xintiPow \{2\}\{9999\}| + obtains all |3010| digits in about ten or eleven seconds. In contrast, the + float versions for + |8|, |16|, |24|, or even more significant figures, do their jobs in circa one + hundredth of a second (|1.08b|). This is done without |log|/|exp| which are + not (yet?) implemented in \xintfracname. The \LaTeX3 + \href{http://www.ctan.org/tex-archive/macros/latex/contrib/l3kernel}{l3fp} + does this with |log|/|exp| and is ten times faster (|16| figures only).} so I +should perhaps lower the bound to |99999|. + +Extended by \xintfracname to fractions (\csbxint{Pow}) and also to floats +(\csbxint{FloatPow}). Negative +exponents do not then cause errors anymore. The float version is able to deal +with things such as +|2^999999999| without any problem. For example +|\xintFloatPow[4]{2}{9999}|\digitstt{=\xintFloatPow[4]{2}{9999}} and +|\xintFloatPow[4]{2}{999999999}| +\digitstt{=\xintFloatPow[4]{2}{999999999}}. + +\subsection{\csbh{xintSgnFork}}\label{xintSgnFork} +{\small New with release |1.07|. See also \csbxint{ifSgn}.\par} + +\csa{xintSgnFork}\verb+{-1|0|1}+\marg{A}\marg{B}\marg{C} expandably +chooses to execute either the \meta{A}, \meta{B} or \meta{C} code, +depending on its first argument. This first argument should be anything +expanding to either |-1|, |0| or |1| (a count register should be +prefixed by |\the| and a |\numexpr...\relax| also should be prefixed by +|\the|). This utility is provided to help construct expandable macros +choosing depending on a condition which one of the package macros to +use, or which values to confer to their arguments. + +\subsection{\csbh{xintifSgn}}\label{xintifSgn} +{\small New with release |1.09a|.\par} + +Similar to \csa{xintSgnFork} except that the first argument may expand to a +(big) integer (or a fraction if \xintfracname is loaded), and it is its sign +which decides which of the three branches is taken. Furthermore this first +argument may be a count register, with no |\the| or |\number| prefix. + +\subsection{\csbh{xintifZero}}\label{xintifZero} +{\small New with release |1.09a|.\par} + +\csa{xintifZero}\marg{N}\marg{IsZero}\marg{IsNotZero} expandably checks +if the first mandatory argument |N| (a number, possibly a fraction if +\xintfracname is loaded, or a macro expanding to one such) is zero or +not. It then either executes the first or the second branch. + +\subsection{\csbh{xintifNotZero}}\label{xintifNotZero} +{\small New with release |1.09a|.\par} + +\csa{xintifNotZero}\marg{N}\marg{IsNotZero}\marg{IsZero} expandably checks +if the first mandatory argument |N| (a number, possibly a fraction if +\xintfracname is loaded, or a macro expanding to one such) is not zero or +is zero. It then either executes the first or the second branch. + +\subsection{\csbh{xintifTrueFalse}}\label{xintifTrueFalse} +{\small New with release |1.09c|, renamed in |1.09e|.\par} + +\csa{xintifTrueFalse}\marg{N}\marg{true branch}\marg{false branch} is a synonym +for \csbxint{ifNotZero}. It is also available as \csa{xintifTrue} but this later +name is a bit misleading as the macro must always have a |false| branch, +possibly an empty brace pair |{}|. + +\subsection{\csbh{xintifCmp}}\label{xintifCmp} +{\small New with release |1.09e|.\par} + +\csa{xintifCmp}\marg{A}\marg{B}\marg{if A<B}\marg{if A=B}\marg{if A>B} compares +its arguments and chooses accordingly the correct branch. + +\subsection{\csbh{xintifEq}}\label{xintifEq} +{\small New with release |1.09a|.\par} + +\csa{xintifEq}\marg{A}\marg{B}\marg{YES}\marg{NO} checks equality of its +two first arguments (numbers, or fractions if \xintfracname is loaded) and does the |YES| or the |NO| branch. + +\subsection{\csbh{xintifGt}}\label{xintifGt} +{\small New with release |1.09a|.\par} + +% attention dans la doc du 9 octobre j'avais écrit \geq au lieu de < +\csa{xintifGt}\marg{A}\marg{B}\marg{YES}\marg{NO} checks if $A>B$ and in that +case executes the |YES| branch. Extended to fractions (in particular decimal +numbers) by \xintfracname. + +\subsection{\csbh{xintifLt}}\label{xintifLt} +{\small New with release |1.09a|.\par} + +% attention dans la doc du 9 octobre j'avais écrit \leq au lieu de < +\csa{xintifLt}\marg{A}\marg{B}\marg{YES}\marg{NO} checks if $A<B$ and in that +case executes the |YES| branch. Extended to fractions (in particular decimal +numbers) by \xintfracname. + +\begin{framed} + The macros described next are all integer-only on input. With \xintfracname + loaded their argument is first given to \csbxint{Num} and may thus be + a fraction, as long as it is in fact an integer in disguise. +\end{framed} + +\subsection{\csbh{xintifOdd}}\label{xintifOdd} +{\small New with release |1.09e|.\par} + +\csa{xintifOdd}\marg{A}\marg{YES}\marg{NO} checks if $A$ is and odd integer +and in that case executes the |YES| branch. + + +\subsection{\csbh{xintFac}}\label{xintiFac} + +\csa{xintFac\x} returns the factorial. It is an error if the +argument is negative or at least @10^6@. It is not recommended to +launch the computation of things such as @100000!@, if you need +your computer for other tasks. Note that the argument is of the |x| type, it +must obey the \TeX{} bounds, but on the other hand may involve count registers +and even arithmetic operations as it will be completely expanded inside a +|\numexpr|. + +With \xintfracname loaded, the macro also +accepts a fraction as argument, as long as this fraction turns out to be an +integer: |\xintFac {66/3}|\digitstt{=\xintFac {66/3}}. + +% the construct |\xintFac{\xintAdd {2}{3}}| will fail, +% use either |\xintFac{\xintiAdd {2}{3}}| or |\xintFac{\xintNum{\xintAdd +% {2}{3}}}|. + +% temps obsolètes, mettre à jour +% On my laptop @1000!@ (2568 digits) +% is computed in a little less than ten seconds, @2000!@ (5736 +% digits) is computed in a little less than one hundred seconds, and +% @3000!@ (which has 9131 digits) needs close to seven minutes\dots +% I have no idea how much time @10000!@ would need (do rather +% @9999!@ if you can, the algorithm has some overhead at the +% transition from @N=9999@ to @10000@ and higher; @10000!@ has 35660 +% digits). Not to mention @100000!@ which, from the Stirling formula, +% should have 456574 digits. + +\subsection{\csbh{xintDivision}}\label{xintDivision} + +\csa{xintDivision\n\m} returns |{quotient Q}{remainder R}|. This +is euclidean division: |N = QM + R|, |0|${}\leq{}$\verb+R < |M|+. So the +remainder is always non-negative and the formula |N = QM + R| +always holds independently of the signs of |N| or |M|. Division by +zero is an error (even if |N| vanishes) and returns |{0}{0}|. + +This macro is integer only (with \xintfracname loaded it accepts +fractions on input, but they must be integers in disguise) and not to be +confused with the \xintfracname macro \csbxint{Div} which divides one +fraction by another. + +\subsection{\csbh{xintQuo}}\label{xintQuo} + +\csa{xintQuo\n\m} returns the quotient from the euclidean division. When +both |N| and |M| are positive one has \csa{xintQuo\n\m}|=\xintiTrunc +{0}{N/M}| (using package \xintfracname). With \xintfracname loaded it +accepts fractions on input, but they must be integers in disguise. + +\subsection{\csbh{xintRem}}\label{xintRem} + +\csa{xintRem\n\m} returns the remainder from the euclidean division. +With \xintfracname loaded it accepts fractions on input, but they must +be integers in disguise. + + + +\subsection{\csbh{xintFDg}}\label{xintFDg} + +\csa{xintFDg\n} returns the first digit (most significant) of the +decimal expansion. + +\subsection{\csbh{xintLDg}}\label{xintLDg} + +\csa{xintLDg\n} returns the least significant digit. When the +number is positive, this is the same as the remainder in the +euclidean division by ten. + +\subsection{\csbh{xintMON}, \csbh{xintMMON}}\label{xintMON}\label{xintMMON} +{\small New in version |1.03|.\par} + +\csa{xintMON\n} returns |(-1)^N| and \csa{xintMMON\n} returns +|(-1)^{N-1}|. \centeredline{|\xintMON {-280914019374101929}|\digitstt{=\xintMON + {280914019374101929}}, |\xintMMON +{-280914019374101929}|\digitstt{=\xintMMON {280914019374101929}}} + +\subsection{\csbh{xintOdd}}\label{xintOdd} + +\csa{xintOdd\n} is 1 if the number is odd and 0 otherwise. + + +\subsection{\csbh{xintiSqrt}, \csbh{xintiSquareRoot}}\label{xintiSqrt} +\label{xintiSquareRoot} +{\small New with |1.08|.\par} +\xintAssign\xintiSquareRoot {17000000000000000000000000}\to\A\B + +\noindent\csa{xintiSqrt\n} returns the largest integer whose square is +at most equal to |N|. +\centeredline{|\xintiSqrt {2000000000000000000000000000000000000}=|% +\digitstt{\xintiSqrt{2000000000000000000000000000000000000}}} +\centeredline{|\xintiSqrt {3000000000000000000000000000000000000}=|% +\digitstt{\xintiSqrt{3000000000000000000000000000000000000}}} +\centeredline{|\xintiSqrt {\xintDSH {-120}{2}}=|}% +\centeredline{\digitstt{\xintiSqrt {\xintDSH {-120}{2}}}} +\csa{xintiSquareRoot\n} returns |{M}{d}| with |d>0|, |M^2-d=N| and |M| +smallest (hence |=1+|\csa{xint\-iSqrt}|{N}|). +\centeredline{|\xintAssign\xintiSquareRoot + {17000000000000000000000000}\to\A\B|}% +\centeredline{|\xintiSub{\xintiSqr\A}\B=\A^2-\B|}% +\centeredline{\digitstt{\xintiSub{\xintiSqr\A}\B=\A\string^2-\B}} +A rational approximation to +$\sqrt{|N|}$ is $|M|-\frac{|d|}{|2M|}$ (this is a majorant and the error is at +most |1/2M|; if |N| is a perfect square |k^2| then |M=k+1| and this gives +|k+1/(2k+2)|, not |k|). + +Package \xintfracname has \csbxint{FloatSqrt} for square +roots of floating point numbers. + + +\begin{framed} + The macros described next are strictly for integer-only arguments. These + arguments are \emph{not} filtered via \csbxint{Num}. +\end{framed} + +\subsection{\csbh{xintInc}, \csbh{xintDec}} +\label{xintInc} +\label{xintDec} +{\small New with |1.08|.\par} + +\csa{xintInc\n} is |N+1| and \csa{xintDec\n} is |N-1|. These macros remain +integer-only, even with \xintfracname loaded. + +\subsection{\csbh{xintDouble}, \csbh{xintHalf}} +\label{xintDouble} +\label{xintHalf} +{\small New with |1.08|.\par} + +\csa{xintDouble\n} returns |2N| and \csa{xintHalf\n} is |N/2| rounded +towards zero. These macros remain integer-only, even with \xintfracname loaded. + +\subsection{\csbh{xintDSL}}\label{xintDSL} + +\csa{xintDSL\n} is decimal shift left, \emph{i.e.} multiplication +by ten. + +\subsection{\csbh{xintDSR}}\label{xintDSR} + +\csa{xintDSR\n} is decimal shift right, \emph{i.e.} it removes the last digit +(keeping the sign), equivalently it is the closest integer to |N/10| when +starting at zero. + +\subsection{\csbh{xintDSH}}\label{xintDSH} + +\csa{xintDSH\x\n} is parametrized decimal shift. When |x| is +negative, it is like iterating \csa{xintDSL} \verb+|x|+ times +(\emph{i.e.} multiplication by @10^{-@|x|@}@). When |x| positive, +it is like iterating \csa{DSR} |x| times (and is more efficient), and for a +non-negative |N| this is thus the same as the +quotient from the euclidean division by |10^x|. + +\subsection{\csbh{xintDSHr}, \csbh{xintDSx}}\label{xintDSHr}\label{xintDSx} +{\small New in release |1.01|.\par} + +\csa{xintDSHr\x\n} expects |x| to be zero or positive and it returns +then a value |R| which is correlated to the value |Q| returned by +\csa{xintDSH\x\n} in the following manner: +\begin{itemize} +\item if |N| is + positive or zero, |Q| and |R| are the quotient and remainder in + the euclidean division by |10^x| (obtained in a more efficient + manner than using \csa{xintDivision}), +\item if |N| is negative let + |Q1| and |R1| be the quotient and remainder in the euclidean + division by |10^x| of the absolute value of |N|. If |Q1| + does not vanish, then |Q=-Q1| and |R=R1|. If |Q1| vanishes, then + |Q=0| and |R=-R1|. +\item for |x=0|, |Q=N| and |R=0|. +\end{itemize} +So one has |N = 10^x Q + R| if |Q| turns out to be zero or +positive, and |N = 10^x Q - R| if |Q| turns out to be negative, +which is exactly the case when |N| is at most |-10^x|. + + +\csa{xintDSx\x\n} for |x| negative is exactly as +\csa{xintDSH\x\n}, \emph{i.e.} multiplication by @10^{-@|x|@}@. +For |x| zero or positive it returns the two numbers |{Q}{R}| +described above, each one within braces. So |Q| is +\csa{xintDSH\x\n}, and |R| is \csa{xintDSHr\x\n}, but computed +simultaneously. + +\begin{flushleft} + \xintAssign\xintDSx {-1}{-123456789}\to\M + \noindent{|\xintAssign\xintDSx {-1}{-123456789}\to\M|}\\ + |\meaning\M: |\digitstt{\meaning\M}.\\ + \xintAssign\xintDSx {-20}{1234567689}\to\M + {|\xintAssign\xintDSx {-20}{123456789}\to\M|}\\ + |\meaning\M: |\digitstt{\meaning\M}.\\ + \xintAssign\xintDSx{0}{-123004321}\to\Q\R + {|\xintAssign\xintDSx {0}{-123004321}\to\Q\R|}\\ + \noindent|\meaning\Q: |\digitstt{\meaning\Q}, |\meaning\R: + |\digitstt{\meaning\R.}\\ + |\xintDSH {0}{-123004321}|\digitstt{=\xintDSH {0}{-123004321}}, + |\xintDSHr {0}{-123004321}|\digitstt{=\xintDSHr {0}{-123004321}}\\ + \xintAssign\xintDSx {6}{-123004321}\to\Q\R + {|\xintAssign\xintDSx {6}{-123004321}\to\Q\R|}\\ + |\meaning\Q: |\digitstt{\meaning\Q}, + |\meaning\R: |\digitstt{\meaning\R.}\\ + |\xintDSH {6}{-123004321}|\digitstt{=\xintDSH {6}{-123004321}}, + |\xintDSHr {6}{-123004321}|\digitstt{=\xintDSHr {6}{-123004321}}\\ + \xintAssign\xintDSx {8}{-123004321}\to\Q\R + {|\xintAssign\xintDSx {8}{-123004321}\to\Q\R|}\\ + |\meaning\Q: |\digitstt{\meaning\Q}, + |\meaning\R: |\digitstt{\meaning\R.} \\ + |\xintDSH {8}{-123004321}|\digitstt{=\xintDSH {8}{-123004321}}, + |\xintDSHr {8}{-123004321}|\digitstt{=\xintDSHr {8}{-123004321}}\\ + \xintAssign\xintDSx {9}{-123004321}\to\Q\R + {|\xintAssign\xintDSx {9}{-123004321}\to\Q\R|}\\ + |\meaning\Q: |\digitstt{\meaning\Q}, + |\meaning\R: |\digitstt{\meaning\R.}\\ + |\xintDSH {9}{-123004321}|\digitstt{=\xintDSH {9}{-123004321}}, + |\xintDSHr {9}{-123004321}|\digitstt{=\xintDSHr {9}{-123004321}}\\ +\end{flushleft} + +\subsection{\csbh{xintDecSplit}}\label{xintDecSplit} + +{\small This has been modified in release |1.01|.\par} + +\csa{xintDecSplit\x\n} cuts the number into two pieces (each one within a +pair of enclosing braces). First the sign if present is \emph{removed}. +Then, for |x| positive or null, the second piece contains the |x| least +significant digits (\emph{empty} if |x=0|) and the first piece the remaining +digits (\emph{empty} when |x| equals or exceeds the length of |N|). +Leading zeros in the second piece are not removed. When |x| is negative +the first piece contains the \verb+|x|+ most significant digits and the +second piece the remaining digits (\emph{empty} if @|x|@ equals or exceeds +the length of |N|). Leading zeros in this second piece are not removed. +So the absolute value of the original number is always the concatenation +of the first and second piece. + +{\footnotesize This macro's behavior for |N| non-negative is final and will not + change. I am still hesitant about what to do with the sign of a + negative |N|.\par} + + +\xintAssign\xintDecSplit {0}{-123004321}\to\L\R +\centeredline{|\xintAssign\xintDecSplit {0}{-123004321}\to\L\R|} +\noindent|\meaning\L: |\digitstt{\meaning\L}, |\meaning\R: |\digitstt{\meaning\R.} +\xintAssign\xintDecSplit {5}{-123004321}\to\L\R +\centeredline{|\xintAssign\xintDecSplit {5}{-123004321}\to\L\R|} +|\meaning\L: |\digitstt{\meaning\L}, |\meaning\R: |\digitstt{\meaning\R.} +\xintAssign\xintDecSplit {9}{-123004321}\to\L\R +\centeredline{|\xintAssign\xintDecSplit {9}{-123004321}\to\L\R|} +|\meaning\L: |\digitstt{\meaning\L}, |\meaning\R: |\digitstt{\meaning\R.} +\xintAssign\xintDecSplit {10}{-123004321}\to\L\R +\centeredline{|\xintAssign\xintDecSplit {10}{-123004321}\to\L\R|} +|\meaning\L: |\digitstt{\meaning\L}, |\meaning\R: |\digitstt{\meaning\R.} +\xintAssign\xintDecSplit {-5}{-12300004321}\to\L\R +\centeredline{|\xintAssign\xintDecSplit {-5}{-12300004321}\to\L\R|} +|\meaning\L: |\digitstt{\meaning\L}, |\meaning\R: |\digitstt{\meaning\R.} +\xintAssign\xintDecSplit {-11}{-12300004321}\to\L\R +\centeredline{|\xintAssign\xintDecSplit {-11}{-12300004321}\to\L\R|} +|\meaning\L: |\digitstt{\meaning\L}, |\meaning\R: |\digitstt{\meaning\R.} +\xintAssign\xintDecSplit {-15}{-12300004321}\to\L\R +\centeredline{|\xintAssign\xintDecSplit {-15}{-12300004321}\to\L\R|} +|\meaning\L: |\digitstt{\meaning\L}, |\meaning\R: |\digitstt{\meaning\R.} + +\subsection{\csbh{xintDecSplitL}}\label{xintDecSplitL} + +\csa{xintDecSplitL\x\n} returns the first piece after the action +of \csa{xintDecSplit}. + +\subsection{\csbh{xintDecSplitR}}\label{xintDecSplitR} + +\csa{xintDecSplitR\x\n} returns the second piece after the action +of \csa{xintDecSplit}. + + + +\section{Commands of the \xintfracname package} +\label{sec:frac} \def\x{\string{x\string}} @@ -5014,7 +5604,7 @@ registers and even expressions with infix arithmetic operators, under some rules which are explained in the previous \hyperlink{useofcount}{Use of count registers} section. -As in the \hyperref[sec:comxint]{xint.sty} documentation, |x| +As in the \hyperref[sec:xint]{xint.sty} documentation, |x| stands for something which will internally be embedded in a \csa{numexpr}. It may thus be a count register or something like |4*\count 255 + 17|, etc..., but @@ -5675,7 +6265,7 @@ with (big) integers. \etocdepthtag.toc {xintexpr} \section{Expandable expressions with the \xintexprname package}% -\label{sec:comexpr} +\label{sec:expr} @@ -6325,7 +6915,8 @@ principles are necessarily different due to the aim of achieving expandability. \etocdepthtag.toc {commandsB} -\section{Commands of the \xintbinhexname package}\label{sec:combinhex} +\section{Commands of the \xintbinhexname package} +\label{sec:binhex} This package was first included in the |1.08| release of \xintname. It provides expandable conversions of arbitrarily long numbers @@ -6403,7 +6994,7 @@ one hundred hexadecimal digits. \section{Commands of the \xintgcdname package} - +\label{sec:gcd} This package was included in the original release |1.0| of the \xintname bundle. @@ -6549,7 +7140,8 @@ and modify it to what is needed. \xintTypesetBezoutAlgorithm {10000}{1113} -\section{Commands of the \xintseriesname package}\label{sec:series} +\section{Commands of the \xintseriesname package} +\label{sec:series} Some arguments to the package commands are macros which are expanded only later, when given their parameters. The arguments serving as indices are systematically @@ -7694,7 +8286,8 @@ always do it on a value computed with |D+1| truncation. % \clearpage -\section{Commands of the \xintcfracname package} +\section{Commands of the \xintcfracname package} +\label{sec:cfrac} This package was first included in release |1.04| of the \xintname bundle. @@ -8299,7 +8892,8 @@ first place. \StopEventually{\end{document}\endinput} \def\storedlinecounts {} -\def\StoreCodelineNo #1{\edef\storedlinecounts{\storedlinecounts +\def\StoreCodelineNo #1{\edef\storedlinecounts{% + \unexpanded\expandafter{\storedlinecounts}% {{#1}{\the\c@CodelineNo}}}\c@CodelineNo\z@ } \makeatother @@ -8323,45 +8917,40 @@ first place. % % \catcode`\<=0 \catcode`\>=11 \catcode`\*=11 \catcode`\/=11 % \let</doc>\relax -% \def<*xint>{\catcode`\<=12 \catcode`\>=12 \catcode`\*=12 \catcode`\/=12 } -% +% \def<*xinttools>{\catcode`\<=12 \catcode`\>=12 \catcode`\*=12 \catcode`\/=12 } %</doc> -%<*xint> -% \section {Package \xintname implementation} -% -% With release |1.09a| all macros doing arithmetic operations and a few more -% apply systematically |\xintnum| to their arguments; this adds a little -% overhead but this is more convenient for using count registers even with infix -% notation; also this is what |xintfrac.sty| did all along. Simplifies the -% discussion in the documentation too. +%<*xinttools> % \def\MARGEPAGENO{2.5em} +% \section {Package \xinttoolsnameimp implementation} +% \label{sec:toolsimp} +% +% Release |1.09g| splits off |xinttools.sty| from |xint.sty| % % \localtableofcontents +% % \subsection{Catcodes, \protect\eTeX{} and reload detection} % % The method for package identification and reload detection is copied verbatim % from the packages by \textsc{Heiko Oberdiek} (with some modifications starting -% with -% release |1.09b|). +% with release |1.09b|). % % The method for catcodes was also inspired by these packages, we proceed -% slightly differently. +% slightly differently. % % Starting with version |1.06| of the package, also |`| must be -% catcode-protected, -% because we replace everywhere in the code the twice-expansion done with -% |\expandafter| by the systematic use of |\romannumeral-`0|. +% catcode-protected, because we replace everywhere in the code the +% twice-expansion done with |\expandafter| by the systematic use of +% |\romannumeral-`0|. % % Starting with version |1.06b| I decide that I suffer from an indigestion of @ % signs, so I replace them all with underscores |_|, \`a la \LaTeX 3. % % Release |1.09b| is more economical: some macros are defined already in -% |xint.sty| and re-used in other modules. All catcode changes have been unified -% and \csa{XINT_storecatcodes} will be used by each module -% to redefine |\XINT_restorecatcodes_endinput| in case catcodes have changed -% in-between the loading of |xint.sty| and the module (not very probable -% anyhow...). -% +% |xint.sty| (now |xinttools.sty|) and re-used in other modules. All catcode +% changes have been unified and \csa{XINT_storecatcodes} will be used by each +% module to redefine |\XINT_restorecatcodes_endinput| in case catcodes have +% changed in-between the loading of |xint.sty| (now |xinttools.sty|) and the +% module (not very probable but...). % \begin{macrocode} \begingroup\catcode61\catcode48\catcode32=10\relax% \catcode13=5 % ^^M @@ -8384,7 +8973,7 @@ first place. \fi \expandafter \ifx\csname numexpr\endcsname\relax - \y{xint}{\numexpr not available, aborting input}% + \y{xinttools}{\numexpr not available, aborting input}% \aftergroup\endinput \else \ifx\x\relax % plain-TeX, first loading @@ -8393,7 +8982,7 @@ first place. \ifx\x\empty % LaTeX, first loading, % variable is initialized, but \ProvidesPackage not yet seen \else - \y{xint}{I was already loaded, aborting input}% + \y{xinttools}{I was already loaded, aborting input}% \aftergroup\endinput \fi \fi @@ -8488,7 +9077,7 @@ first place. % escaping me (compatibility with LaTeX 2.09 or other things ??) seems to set % extra precautions. % -% |1.09c| uses e-\TeX{} |\ifdefined|. No |firstoftwo| etc.. yet here. +% |1.09c| uses e-\TeX{} |\ifdefined|. % \begin{macrocode} \ifdefined\ProvidesPackage \let\XINT_providespackage\relax @@ -8498,8 +9087,8 @@ first place. \expandafter\xdef\csname ver@#2.sty\endcsname{#3}}% \fi \XINT_providespackage -\ProvidesPackage {xint}% - [2013/11/04 v1.09f Expandable operations on long numbers (jfB)]% +\ProvidesPackage {xinttools}% + [2013/11/22 v1.09g Expandable and non-expandable utilities (jfB)]% % \end{macrocode} % \subsection{Token management, constants} % \lverb|In 1.09e \xint_undef replaced everywhere by \xint_bye.| @@ -8513,75 +9102,31 @@ first place. \def\xint_gobble_vi #1#2#3#4#5#6{}% \def\xint_gobble_vii #1#2#3#4#5#6#7{}% \def\xint_gobble_viii #1#2#3#4#5#6#7#8{}% -\long\def\xint_firstofone #1{#1}% becomes long in 1.09f, 2013/11/01 +\long\def\xint_firstofone #1{#1}% long since 1.09f, 2013/11/01 \xint_firstofone{\let\XINT_sptoken= } % 1.09d, 2013/10/22 -\long\def\xint_firstoftwo #1#2{#1}% made long in 1.09e, 2013/10/28 -\long\def\xint_secondoftwo #1#2{#2}% +\long\def\xint_firstoftwo #1#2{#1}% long since 1.09e, 2013/10/28 +\long\def\xint_secondoftwo #1#2{#2}% idem \def\xint_firstoftwo_andstop #1#2{ #1}% \def\xint_secondoftwo_andstop #1#2{ #2}% -\def\xint_exchangetwo_keepbraces_andstop #1#2{ {#2}{#1}}% -\def\xint_firstofthree #1#2#3{#1}% -\def\xint_secondofthree #1#2#3{#2}% -\def\xint_thirdofthree #1#2#3{#3}% \def\xint_minus_andstop { -}% -\long\def\xint_bye #1\xint_bye {}% becomes long in 1.09f \def\xint_gob_til_R #1\R {}% \def\xint_gob_til_W #1\W {}% \def\xint_gob_til_Z #1\Z {}% -\def\xint_gob_til_zero #10{}% -\def\xint_gob_til_one #11{}% -\def\xint_gob_til_G #1G{}% -\def\xint_gob_til_minus #1-{}% -\def\xint_gob_til_zeros_iii #1000{}% -\def\xint_gob_til_zeros_iv #10000{}% +\long\def\xint_bye #1\xint_bye {}% long since 1.09f \let\xint_relax\relax \def\xint_brelax {\xint_relax }% -\def\xint_gob_til_relax #1\relax {}% -\long\def\xint_gob_til_xint_relax #1\xint_relax {}% becomes long in 1.09f -\def\xint_UDzerofork #10\dummy #2#3\krof {#2}% -\def\xint_UDsignfork #1-\dummy #2#3\krof {#2}% -\def\xint_UDwfork #1\W\dummy #2#3\krof {#2}% -\def\xint_UDzerosfork #100\dummy #2#3\krof {#2}% -\def\xint_UDonezerofork #110\dummy #2#3\krof {#2}% -\def\xint_UDzerominusfork #10-\dummy #2#3\krof {#2}% -\def\xint_UDsignsfork #1--\dummy #2#3\krof {#2}% +\long\def\xint_gob_til_xint_relax #1\xint_relax {}% long since 1.09f \def\xint_afterfi #1#2\fi {\fi #1}% \chardef\xint_c_ 0 -\chardef\xint_c_i 1 -\chardef\xint_c_ii 2 -\chardef\xint_c_iii 3 -\chardef\xint_c_iv 4 -\chardef\xint_c_v 5 \chardef\xint_c_viii 8 -\chardef\xint_c_ix 9 -\chardef\xint_c_x 10 -\newcount\xint_c_x^viii \xint_c_x^viii 100000000 \newtoks\XINT_toks +\newcount\XINT_count % 1.09g: \xintFor from 1.09f modified \count 255 :-( % \end{macrocode} -% \subsection{\csh{xintRev}, \csh{xintReverseOrder}} -% \lverb|& -% \xintRev: fait l'expansion avec \romannumeral-`0, vérifie le signe.$\ -% \xintReverseOrder: ne fait PAS l'expansion, ne regarde PAS le signe.| +% \subsection{ \csh{xintReverseOrder}} +% \lverb|\xintReverseOrder: does NOT expand its argument| % \begin{macrocode} -\def\xintRev {\romannumeral0\xintrev }% -\def\xintrev #1% -{% - \expandafter\XINT_rev_fork - \romannumeral-`0#1\xint_relax % empty #1 ok, \xint_relax stops expansion - \xint_bye\xint_bye\xint_bye\xint_bye - \xint_bye\xint_bye\xint_bye\xint_bye - \xint_relax -}% -\def\XINT_rev_fork #1% -{% - \xint_UDsignfork - #1\dummy {\expandafter\xint_minus_andstop\romannumeral0\XINT_rord_main {}}% - -\dummy {\XINT_rord_main {}#1}% - \krof -}% -\def\XINT_Rev {\romannumeral0\XINT_rev }% -\def\xintReverseOrder {\romannumeral0\XINT_rev }% -\def\XINT_rev #1% +\def\xintReverseOrder {\romannumeral0\xintreverseorder }% +\def\xintreverseorder #1% {% \XINT_rord_main {}#1% \xint_relax @@ -8601,8 +9146,7 @@ first place. % \end{macrocode} % \subsection{\csh{xintRevWithBraces}} % \lverb|New with 1.06. Makes the expansion of its argument and then reverses -% the -% resulting tokens or braced tokens, adding a pair of braces to each (thus, +% the resulting tokens or braced tokens, adding a pair of braces to each (thus, % maintaining it when it was already there. % % As in some other places, 1.09e replaces \Z by \xint_bye, although here it is @@ -8652,44 +9196,22 @@ first place. \csname xint_gobble_\romannumeral #1\endcsname }% % \end{macrocode} -% \subsection{\csh{xintLen}, \csh{xintLength}} -% \lverb|& -% \xintLen -> fait l'expansion, ne compte PAS le signe.$\ -% \xintLength -> ne fait PAS l'expansion, compte le signe.$\ +% \subsection{\csh{xintLength}} +% \lverb|\xintLength does NOT expand its argument.$\ +% 1.09g adds the missing \xintlength, which was previously called \XINT_length, +% and suppresses \XINT_Length$\ % 1.06: improved code is roughly 20$% faster than the one from earlier % versions. 1.09a, \xintnum inserted. 1.09e: \Z->\xint_bye as this is called % from \xintNthElt, and there it was necessary not to use \Z. Later use of \Z % and \W perfectly safe here.| % \begin{macrocode} -\def\xintLen {\romannumeral0\xintlen }% -\def\xintlen #1% -{% - \expandafter\XINT_length_fork - \romannumeral0\xintnum{#1}\xint_relax\xint_relax\xint_relax\xint_relax - \xint_relax\xint_relax\xint_relax\xint_relax\xint_bye -}% -\def\XINT_Len #1% -{% - \romannumeral0\XINT_length_fork - #1\xint_relax\xint_relax\xint_relax\xint_relax - \xint_relax\xint_relax\xint_relax\xint_relax\xint_bye -}% -\def\XINT_length_fork #1% -{% - \expandafter\XINT_length_loop - \xint_UDsignfork - #1\dummy {{0}}% - -\dummy {{0}#1}% - \krof -}% -\def\XINT_Length {\romannumeral0\XINT_length }% -\def\XINT_length #1% +\def\xintLength {\romannumeral0\xintlength }% +\def\xintlength #1% {% \XINT_length_loop {0}#1\xint_relax\xint_relax\xint_relax\xint_relax \xint_relax\xint_relax\xint_relax\xint_relax\xint_bye }% -\let\xintLength\XINT_Length \def\XINT_length_loop #1#2#3#4#5#6#7#8#9% {% \xint_gob_til_xint_relax #9\XINT_length_finish_a\xint_relax @@ -9245,6 +9767,43 @@ first place. }% \def\XINT_seqo_nd #1#2#3#4{\XINT_seqo_nb {#1}{#2}{#3}{#4{#1}}}% % \end{macrocode} +%\subsection{\csh{xintloop}, \csh{xintbreakloop}, \csh{xintbreakloopanddo}, +% \csh{xintloopskiptonext}} +% \lverb|1.09g [2013/11/22]| +% \begin{macrocode} +\def\xintloop #1#2\repeat {#1#2\xintloop_again\fi\xint_gobble_i {#1#2}}% +\def\xintloop_again\fi\xint_gobble_i #1{\fi + #1\xintloop_again\fi\xint_gobble_i {#1}}% +\def\xintbreakloop #1\xintloop_again\fi\xint_gobble_i #2{}% +\def\xintbreakloopanddo #1#2\xintloop_again\fi\xint_gobble_i #3{#1}% +\def\xintloopskiptonext #1\xintloop_again\fi\xint_gobble_i #2{% + #2\xintloop_again\fi\xint_gobble_i {#2}}% +% \end{macrocode} +% \subsection{\csh{xintiloop}, \csh{xintiloopindex}, \csh{xintouteriloopindex}, +% \csh{xintbreakiloop}, \csh{xintbreakiloopanddo}, \csh{xintiloopskiptonext}, +% \csh{xintiloopskipandredo}} +% \lverb|1.09g [2013/11/22]| +% \begin{macrocode} +\def\xintiloop [#1+#2]{% + \expandafter\xintiloop_a\the\numexpr #1\expandafter.\the\numexpr #2.}% +\def\xintiloop_a #1.#2.#3#4\repeat{% + #3#4\xintiloop_again\fi\xint_gobble_iii {#1}{#2}{#3#4}}% +\def\xintiloop_again\fi\xint_gobble_iii #1#2{% + \fi\expandafter\xintiloop_again_b\the\numexpr#1+#2.#2.}% +\def\xintiloop_again_b #1.#2.#3{% + #3\xintiloop_again\fi\xint_gobble_iii {#1}{#2}{#3}}% +\def\xintbreakiloop #1\xintiloop_again\fi\xint_gobble_iii #2#3#4{}% +\def\xintbreakiloopanddo #1.#2\xintiloop_again\fi\xint_gobble_iii #3#4#5{#1}% +\def\xintiloopindex #1\xintiloop_again\fi\xint_gobble_iii #2% + {#2#1\xintiloop_again\fi\xint_gobble_iii {#2}}% +\def\xintouteriloopindex #1\xintiloop_again + #2\xintiloop_again\fi\xint_gobble_iii #3% + {#3#1\xintiloop_again #2\xintiloop_again\fi\xint_gobble_iii {#3}}% +\def\xintiloopskiptonext #1\xintiloop_again\fi\xint_gobble_iii #2#3{% + \expandafter\xintiloop_again_b \the\numexpr#2+#3.#3.}% +\def\xintiloopskipandredo #1\xintiloop_again\fi\xint_gobble_iii #2#3#4{% + #4\xintiloop_again\fi\xint_gobble_iii {#2}{#3}{#4}}% +% \end{macrocode} % \subsection{\csh{XINT\_xflet}} % \lverb|1.09e [2013/10/29]: we expand fully unbraced tokens and swallow arising % space tokens until the dust settles. For treating cases @@ -9314,14 +9873,15 @@ first place. % expand unbraced item elements and this is in fact convenient to simulate % insertion of lists in others. % -% 1.09e: the applied macro is allowed to be long, with items containing -% explicit \par's. +% 1.09e: the applied macro is allowed to be long, with items (or the first fixed +% arguments of he macro, passed together with it as #1 to \xintApplyInline) +% containing explicit \par's. (1.09g: some missing \long's added) % -% 1.09f: terminator used to be z, now Z (still catcode 3). +% 1.09f: terminator used to be z, now Z (still catcode 3). %| % \begin{macrocode} -\catcode`Z 3% -\def\xintApplyInline #1#2% +\catcode`Z 3 +\long\def\xintApplyInline #1#2% {% \long\expandafter\def\expandafter\XINT_inline_macro \expandafter ##\expandafter 1\expandafter {#1{##1}}% @@ -9330,24 +9890,22 @@ first place. \def\XINT_inline_b {% \ifx\XINT_token Z\expandafter\xint_gobble_i - \else\expandafter\XINT_inline_d - \fi + \else\expandafter\XINT_inline_d\fi }% -\def\XINT_inline_d #1% +\long\def\XINT_inline_d #1% {% - \def\XINT_item{{#1}}\XINT_xflet\XINT_inline_e + \long\def\XINT_item{{#1}}\XINT_xflet\XINT_inline_e }% \def\XINT_inline_e {% \ifx\XINT_token Z\expandafter\XINT_inline_w - \else\expandafter\XINT_inline_f - \fi + \else\expandafter\XINT_inline_f\fi }% \def\XINT_inline_f {% \expandafter\XINT_inline_g\expandafter{\XINT_inline_macro {##1}}% }% -\def\XINT_inline_g #1% +\long\def\XINT_inline_g #1% {% \expandafter\XINT_inline_macro\XINT_item \long\def\XINT_inline_macro ##1{#1}\XINT_inline_d @@ -9401,8 +9959,11 @@ first place. % If the \XINT_forever branch is taken, the added space will not be a problem % there. % -% [2013/11/03]: 1.09f rewrites the code to allow all macro parameters from #1 to -% #9 in \xintFor, \xintFor*, and \XINT_forever. | +% 1.09f rewrites (2013/11/03) the code which now allows all macro parameters +% from #1 to #9 in \xintFor, \xintFor*, and \XINT_forever. +% +% 1.09g \xintFor and \xintFor* modified the value of \count 255, now uses +% \XINT_count. | % \begin{macrocode} \def\XINT_tmpa #1#2{\ifnum #2<#1 \xint_afterfi {{#########2}}\fi}% \def\XINT_tmpb #1#2{\ifnum #1<#2 \xint_afterfi {{#########2}}\fi}% @@ -9440,9 +10001,9 @@ first place. }% \long\def\XINT_for #1#2in#3#4#5% {% - \count 255 #2\relax + \XINT_count #2\relax \expandafter\XINT_toks\expandafter - {\expandafter\XINT_for_d\the\count 255{#5}}% + {\expandafter\XINT_for_d\the\XINT_count{#5}}% \def\XINT_flet_macro {\expandafter\XINT_for_forever?\space}% \expandafter\XINT_flet_zapsp #3Z% }% @@ -9456,9 +10017,9 @@ first place. \def\XINT_to_forever\fi #1\xintcsvtolist #2{\fi \XINT_forever #2}% \long\def\XINT_forx *#1#2in#3#4#5% {% - \count 255 #2\relax + \XINT_count #2\relax \expandafter\XINT_toks\expandafter - {\expandafter\XINT_forx_d\the\count 255{#5}}% + {\expandafter\XINT_forx_d\the\XINT_count{#5}}% \XINT_xflet\XINT_forx_forever? #3Z% }% \def\XINT_forx_forever? @@ -9725,12 +10286,12 @@ first place. \XINT_restoreescapechar \expandafter\let\expandafter\xint_temp \csname\xint_arrayname 0\endcsname - \count 255 0 + \XINT_count 0 \loop \global\expandafter\let - \csname\xint_arrayname\the\count255\endcsname\relax - \ifnum \count 255 < \xint_temp - \advance\count 255 1 + \csname\xint_arrayname\the\XINT_count\endcsname\relax + \ifnum \XINT_count < \xint_temp + \advance\XINT_count 1 \repeat \global\expandafter\let\csname\xint_arrayname 00\endcsname\relax \global\let #1\relax @@ -9741,7 +10302,7 @@ first place. \escapechar -1 \edef\xint_arrayname {\string #2}% \XINT_restoreescapechar - \count 255 0 + \XINT_count 0 \expandafter\XINT_assignarray_loop \romannumeral-`0#1\xint_relax \csname\xint_arrayname 00\endcsname \csname\xint_arrayname 0\endcsname @@ -9752,12 +10313,12 @@ first place. {% \def\xint_temp {#1}% \ifx\xint_brelax\xint_temp - \expandafter\edef\csname\xint_arrayname 0\endcsname{\the\count 255 }% + \expandafter\edef\csname\xint_arrayname 0\endcsname{\the\XINT_count }% \expandafter\expandafter\expandafter\XINT_assignarray_end_a \else - \advance\count 255 1 + \advance\XINT_count 1 \expandafter\edef - \csname\xint_arrayname\the\count 255\endcsname{\xint_temp }% + \csname\xint_arrayname\the\XINT_count\endcsname{\xint_temp }% \expandafter\XINT_assignarray_loop \fi }% @@ -9793,6 +10354,205 @@ first place. }% }% \let\xintDigitsOf\xintAssignArray +\XINT_restorecatcodes_endinput% +% \end{macrocode} +%\catcode`\<=0 \catcode`\>=11 \catcode`\*=11 \catcode`\/=11 +%\let</xinttools>\relax +%\def<*xint>{\catcode`\<=12 \catcode`\>=12 \catcode`\*=12 \catcode`\/=12 } +%</xinttools> +%<*xint> +% +% \StoreCodelineNo {xinttools} +% +% \section{Package \xintnameimp implementation} +% \label{sec:xintimp} +% +% With release |1.09a| all macros doing arithmetic operations and a few more +% apply systematically |\xintnum| to their arguments; this adds a little +% overhead but this is more convenient for using count registers even with infix +% notation; also this is what |xintfrac.sty| did all along. Simplifies the +% discussion in the documentation too. +% +% \localtableofcontents +% +% \subsection{Catcodes, \protect\eTeX{} and reload detection} +% +% The code for reload detection is copied from \textsc{Heiko +% Oberdiek}'s packages, and adapted here to check for previous +% loading of the master \xintname package. +% +% The method for catcodes is slightly different, but still +% directly inspired by these packages. +% +% \begin{macrocode} +\begingroup\catcode61\catcode48\catcode32=10\relax% + \catcode13=5 % ^^M + \endlinechar=13 % + \catcode123=1 % { + \catcode125=2 % } + \catcode64=11 % @ + \catcode35=6 % # + \catcode44=12 % , + \catcode45=12 % - + \catcode46=12 % . + \catcode58=12 % : + \def\space { }% + \let\z\endgroup + \expandafter\let\expandafter\x\csname ver@xint.sty\endcsname + \expandafter\let\expandafter\w\csname ver@xinttools.sty\endcsname + \expandafter + \ifx\csname PackageInfo\endcsname\relax + \def\y#1#2{\immediate\write-1{Package #1 Info: #2.}}% + \else + \def\y#1#2{\PackageInfo{#1}{#2}}% + \fi + \expandafter + \ifx\csname numexpr\endcsname\relax + \y{xint}{\numexpr not available, aborting input}% + \aftergroup\endinput + \else + \ifx\x\relax % plain-TeX, first loading of xint.sty + \ifx\w\relax % but xinttools.sty not yet loaded. + \y{xint}{Package xinttools is required}% + \y{xint}{Will try \string\input\space xinttools.sty}% + \def\z{\endgroup\input xinttools.sty\relax}% + \fi + \else + \def\empty {}% + \ifx\x\empty % LaTeX, first loading, + % variable is initialized, but \ProvidesPackage not yet seen + \ifx\w\relax % xinttools.sty not yet loaded. + \y{xint}{Package xinttools is required}% + \y{xint}{Will try \string\RequirePackage{xinttools}}% + \def\z{\endgroup\RequirePackage{xinttools}}% + \fi + \else + \y{xint}{I was already loaded, aborting input}% + \aftergroup\endinput + \fi + \fi + \fi +\z% +% \end{macrocode} +% \subsection{Confirmation of \xinttoolsname loading} +% \begin{macrocode} +\begingroup\catcode61\catcode48\catcode32=10\relax% + \catcode13=5 % ^^M + \endlinechar=13 % + \catcode123=1 % { + \catcode125=2 % } + \catcode64=11 % @ + \catcode35=6 % # + \catcode44=12 % , + \catcode45=12 % - + \catcode46=12 % . + \catcode58=12 % : + \ifdefined\PackageInfo + \def\y#1#2{\PackageInfo{#1}{#2}}% + \else + \def\y#1#2{\immediate\write-1{Package #1 Info: #2.}}% + \fi + \def\empty {}% + \expandafter\let\expandafter\w\csname ver@xinttools.sty\endcsname + \ifx\w\relax % Plain TeX, user gave a file name at the prompt + \y{xint}{Loading of package xinttools failed, aborting input}% + \aftergroup\endinput + \fi + \ifx\w\empty % LaTeX, user gave a file name at the prompt + \y{xint}{Loading of package xinttools failed, aborting input}% + \aftergroup\endinput + \fi +\endgroup% +% \end{macrocode} +% \subsection{Catcodes} +% \begin{macrocode} +\XINTsetupcatcodes% +% \end{macrocode} +% \subsection{Package identification} +% \begin{macrocode} +\XINT_providespackage +\ProvidesPackage{xint}% + [2013/11/22 v1.09g Expandable operations on long numbers (jfB)]% +% \end{macrocode} +% \subsection{Token management, constants} +% \begin{macrocode} +\def\xint_firstofthree #1#2#3{#1}% +\def\xint_secondofthree #1#2#3{#2}% +\def\xint_thirdofthree #1#2#3{#3}% +\def\xint_gob_til_zero #10{}% +\def\xint_gob_til_zeros_iii #1000{}% +\def\xint_gob_til_zeros_iv #10000{}% +\def\xint_gob_til_one #11{}% +\def\xint_gob_til_G #1G{}% +\def\xint_gob_til_minus #1-{}% +\def\xint_gob_til_relax #1\relax {}% +\def\xint_exchangetwo_keepbraces_andstop #1#2{ {#2}{#1}}% +\def\xint_UDzerofork #10\dummy #2#3\krof {#2}% +\def\xint_UDsignfork #1-\dummy #2#3\krof {#2}% +\def\xint_UDwfork #1\W\dummy #2#3\krof {#2}% +\def\xint_UDzerosfork #100\dummy #2#3\krof {#2}% +\def\xint_UDonezerofork #110\dummy #2#3\krof {#2}% +\def\xint_UDzerominusfork #10-\dummy #2#3\krof {#2}% +\def\xint_UDsignsfork #1--\dummy #2#3\krof {#2}% +\chardef\xint_c_i 1 % 0 and 8 in xinttools +\chardef\xint_c_ii 2 +\chardef\xint_c_iii 3 +\chardef\xint_c_iv 4 +\chardef\xint_c_v 5 +\chardef\xint_c_ix 9 +\chardef\xint_c_x 10 +\newcount\xint_c_x^viii \xint_c_x^viii 100000000 +% \end{macrocode} +% \subsection{\csh{xintRev}} +% \lverb|& +% \xintRev: expands fully its argument \romannumeral-`0, and checks the sign. +% However this last aspect does not appear like a very useful thing. And despite +% the fact that a special check is made for a sign, actually the input is not +% given to \xintnum, contrarily to \xintLen. This is all a bit incoherent. +% Should be fixed.| +% \begin{macrocode} +\def\xintRev {\romannumeral0\xintrev }% +\def\xintrev #1% +{% + \expandafter\XINT_rev_fork + \romannumeral-`0#1\xint_relax % empty #1 ok, \xint_relax stops expansion + \xint_bye\xint_bye\xint_bye\xint_bye + \xint_bye\xint_bye\xint_bye\xint_bye + \xint_relax +}% +\def\XINT_rev_fork #1% +{% + \xint_UDsignfork + #1\dummy {\expandafter\xint_minus_andstop\romannumeral0\XINT_rord_main {}}% + -\dummy {\XINT_rord_main {}#1}% + \krof +}% +% \end{macrocode} +% \subsection{\csh{xintLen}} +% \lverb|\xintLen is ONLY for (possibly long) integers. Gets extended to +% fractions by xintfrac.sty| +% \begin{macrocode} +\def\xintLen {\romannumeral0\xintlen }% +\def\xintlen #1% +{% + \expandafter\XINT_len_fork + \romannumeral0\xintnum{#1}\xint_relax\xint_relax\xint_relax\xint_relax + \xint_relax\xint_relax\xint_relax\xint_relax\xint_bye +}% +\def\XINT_Len #1% variant which does not expand via \xintnum. +{% + \romannumeral0\XINT_len_fork + #1\xint_relax\xint_relax\xint_relax\xint_relax + \xint_relax\xint_relax\xint_relax\xint_relax\xint_bye +}% +\def\XINT_len_fork #1% +{% + \expandafter\XINT_length_loop + \xint_UDsignfork + #1\dummy {{0}}% + -\dummy {{0}#1}% + \krof +}% % \end{macrocode} % \subsection{\csh{XINT\_RQ}} % \lverb|& @@ -11640,28 +12400,28 @@ first place. \def\XINT_mul_minusminus #1#2% {% \expandafter\XINT_mul_choice_a - \expandafter{\romannumeral0\XINT_length {#2}}% - {\romannumeral0\XINT_length {#1}}{#1}{#2}% + \expandafter{\romannumeral0\xintlength {#2}}% + {\romannumeral0\xintlength {#1}}{#1}{#2}% }% \def\XINT_mul_minusplus #1#2#3% {% \expandafter\xint_minus_andstop\romannumeral0\expandafter \XINT_mul_choice_a - \expandafter{\romannumeral0\XINT_length {#1#3}}% - {\romannumeral0\XINT_length {#2}}{#2}{#1#3}% + \expandafter{\romannumeral0\xintlength {#1#3}}% + {\romannumeral0\xintlength {#2}}{#2}{#1#3}% }% \def\XINT_mul_plusminus #1#2#3% {% \expandafter\xint_minus_andstop\romannumeral0\expandafter \XINT_mul_choice_a - \expandafter{\romannumeral0\XINT_length {#3}}% - {\romannumeral0\XINT_length {#1#2}}{#1#2}{#3}% + \expandafter{\romannumeral0\xintlength {#3}}% + {\romannumeral0\xintlength {#1#2}}{#1#2}{#3}% }% \def\XINT_mul_plusplus #1#2#3#4% {% \expandafter\XINT_mul_choice_a - \expandafter{\romannumeral0\XINT_length {#2#4}}% - {\romannumeral0\XINT_length {#1#3}}{#1#3}{#2#4}% + \expandafter{\romannumeral0\xintlength {#2#4}}% + {\romannumeral0\xintlength {#1#3}}{#1#3}{#2#4}% }% \def\XINT_mul_choice_a #1#2% {% @@ -11826,7 +12586,7 @@ first place. \def\XINT_mul_M_zero #1\Z\Z\Z\Z { 0}% \def\XINT_mul_M_one #1#2#3#4\Z\Z\Z\Z {% - \expandafter\xint_cleanupzeros_andstop\romannumeral0\XINT_rev{#4}% + \expandafter\xint_cleanupzeros_andstop\romannumeral0\xintreverseorder{#4}% }% \def\XINT_mul_N #1#2#3#4#5#6#7% {% @@ -11958,7 +12718,7 @@ first place. }% \def\XINT_mul_finish_c #1\XINT_mul_finish_ciii \W\W\W\W #2#3\Z\Z\Z\Z {% - \expandafter\xint_cleanupzeros_andstop\romannumeral0\XINT_rev{#2}% + \expandafter\xint_cleanupzeros_andstop\romannumeral0\xintreverseorder{#2}% }% % \end{macrocode} % \lverb|& @@ -12122,8 +12882,8 @@ first place. % Modified with 1.02 and again in 1.03 for greater efficiency. I am % tempted, % here and elsewhere, to use \ifcase\XINT_Geq {#1}{1000000000} rather than -% \ifnum\XINT_Length {#1}>9 but for the time being I leave things as they stand. -% With release 1.05, rather than using \XINT_Length I opt finally for direct use +% \ifnum\xintLength {#1}>9 but for the time being I leave things as they stand. +% With release 1.05, rather than using \xintLength I opt finally for direct use % of \numexpr (which will throw a suitable number too big message), and to raise % the \xintError:$\ FactorialOfTooBigNumber for argument larger than 1000000 % (rather than 1000000000). With 1.09a, \xintFac uses \xintnum.| @@ -12402,7 +13162,7 @@ first place. \def\XINT_pow_pprod_end\relax\XINT_pow_pprod_compute #1\Z #2% {% \expandafter\xint_cleanupzeros_andstop - \romannumeral0\XINT_rev {#2}% + \romannumeral0\xintreverseorder {#2}% }% % \end{macrocode} % \subsection{\csh{xintDivision}, \csh{xintQuo}, \csh{xintRem}} @@ -12546,7 +13306,7 @@ first place. \def\XINT_div_prepare #1% {% \expandafter \XINT_div_prepareB_aa \expandafter - {\romannumeral0\XINT_length {#1}}{#1}% B > 0 ici + {\romannumeral0\xintlength {#1}}{#1}% B > 0 ici }% \def\XINT_div_prepareB_aa #1% {% @@ -12607,7 +13367,7 @@ first place. \def\XINT_div_prepareB_f #1#2#3#4#5\Z {% \expandafter \XINT_div_prepareB_g \expandafter - {\romannumeral0\XINT_rev {#1#2#3#4#5}}{#1#2#3#4}% + {\romannumeral0\xintreverseorder {#1#2#3#4#5}}{#1#2#3#4}% }% % \end{macrocode} % \lverb|& @@ -12627,7 +13387,7 @@ first place. \def\XINT_div_prepareA_a #1% {% \expandafter \XINT_div_prepareA_b \expandafter - {\romannumeral0\XINT_length {#1}}{#1}% A >0 ici + {\romannumeral0\xintlength {#1}}{#1}% A >0 ici }% % \end{macrocode} % \lverb|& @@ -12907,7 +13667,7 @@ first place. {% \expandafter \XINT_div_body_l \expandafter {\romannumeral0\XINT_div_sub_xpxp - {\romannumeral0\XINT_mul_Mr {#1}#4\Z\Z\Z\Z }{\XINT_Rev{#2}}}% + {\romannumeral0\XINT_mul_Mr {#1}#4\Z\Z\Z\Z }{\xintReverseOrder{#2}}}% {#3+#1}% }% % \end{macrocode} @@ -13144,7 +13904,7 @@ first place. \def\XINT_LDg #1{\romannumeral0\XINT_ldg {#1}}% \def\XINT_ldg #1% {% - \expandafter\XINT_ldg_\romannumeral0\XINT_rev {#1}\Z + \expandafter\XINT_ldg_\romannumeral0\xintreverseorder {#1}\Z }% \def\XINT_ldg_ #1#2\Z{ #1}% % \end{macrocode} @@ -13246,16 +14006,16 @@ first place. \def\XINT_DSR #1{\romannumeral0\XINT_dsr_a {#1}\W\Z }% \def\XINT_dsr_a {% - \expandafter\XINT_dsr_b\romannumeral0\XINT_rev + \expandafter\XINT_dsr_b\romannumeral0\xintreverseorder }% \def\XINT_dsr_b #1#2#3\Z {% \xint_gob_til_W #2\xint_dsr_onedigit\W \xint_gob_til_minus #2\xint_dsr_onedigit-% \expandafter\XINT_dsr_removew - \romannumeral0\XINT_rev {#2#3}% + \romannumeral0\xintreverseorder {#2#3}% }% -\def\xint_dsr_onedigit #1\XINT_rev #2{ 0}% +\def\xint_dsr_onedigit #1\xintreverseorder #2{ 0}% \def\XINT_dsr_removew #1\W { }% % \end{macrocode} % \subsection{\csh{xintDSH}, \csh{xintDSHr}} @@ -13583,7 +14343,7 @@ first place. \def\XINT_split_fromright #1\Z #2% {% \expandafter \XINT_split_fromright_a \expandafter - {\romannumeral0\XINT_rev {#2}}{#1}{#2}% + {\romannumeral0\xintreverseorder {#2}}{#1}{#2}% }% \def\XINT_split_fromright_a #1#2% {% @@ -13611,7 +14371,7 @@ first place. }% \def\XINT_split_fromright_endsplit_ #1#2\W #3\Z #4% {% - \expandafter\space\expandafter {\romannumeral0\XINT_rev{#2}}{#1}% + \expandafter\space\expandafter {\romannumeral0\xintreverseorder {#2}}{#1}% }% \def\XINT_split_fromright_endsplit_i #1#2% {\XINT_split_fromright_checkiftoofar #2{#2#1}}% @@ -13853,7 +14613,7 @@ first place. \def\XINT_sqrt #1\Z {% \expandafter\XINT_sqrt_start\expandafter - {\romannumeral0\XINT_length {#1}}{#1}% + {\romannumeral0\xintlength {#1}}{#1}% }% \def\XINT_sqrt_start #1% {% @@ -14040,7 +14800,8 @@ first place. % % \StoreCodelineNo {xint} % -% \section{Package \xintbinhexname implementation} +% \section{Package \xintbinhexnameimp implementation} +% \label{sec:binheximp} % % The commenting is currently (\docdate) very sparse. % @@ -14135,11 +14896,6 @@ first place. \endgroup% % \end{macrocode} % \subsection{Catcodes} -% -% Perhaps catcodes have changed after the loading of \xintname -% and prior to the current loading of \xintbinhexname, so we redefine -% the |\XINT_restorecatcodes_endinput| in this style file. -% % \begin{macrocode} \XINTsetupcatcodes% % \end{macrocode} @@ -14147,7 +14903,7 @@ first place. % \begin{macrocode} \XINT_providespackage \ProvidesPackage{xintbinhex}% - [2013/11/04 v1.09f Expandable binary and hexadecimal conversions (jfB)]% + [2013/11/22 v1.09g Expandable binary and hexadecimal conversions (jfB)]% % \end{macrocode} % \subsection{Constants, etc...} % \lverb!v1.08! @@ -14748,7 +15504,8 @@ first place. % % \StoreCodelineNo {xintbinhex} % -% \section{Package \xintgcdname implementation} +% \section{Package \xintgcdnameimp implementation} +% \label{sec:gcdimp} % % The commenting is currently (\docdate) very sparse. % @@ -14850,7 +15607,7 @@ first place. % \begin{macrocode} \XINT_providespackage \ProvidesPackage{xintgcd}% - [2013/11/04 v1.09f Euclide algorithm with xint package (jfB)]% + [2013/11/22 v1.09g Euclide algorithm with xint package (jfB)]% % \end{macrocode} % \subsection{\csh{xintGCD}} % The macros of |1.09a| benefits from the |\xintnum| which has been inserted @@ -15396,15 +16153,15 @@ first place. \edef\A{\U2}\edef\B{\U4}\edef\N{\U1}% \setbox 0 \vbox{\halign {$##$\cr \A\cr \B \cr}}% \noindent - \count 255 1 + \XINT_count 1 \loop - \hbox to \wd 0 {\hfil$\U{\numexpr 2*\count 255\relax}$}% - ${} = \U{\numexpr 2*\count 255 + 3\relax} - \times \U{\numexpr 2*\count 255 + 2\relax} - + \U{\numexpr 2*\count 255 + 4\relax}$% - \ifnum \count 255 < \N + \hbox to \wd 0 {\hfil$\U{\numexpr 2*\XINT_count\relax}$}% + ${} = \U{\numexpr 2*\XINT_count + 3\relax} + \times \U{\numexpr 2*\XINT_count + 2\relax} + + \U{\numexpr 2*\XINT_count + 4\relax}$% + \ifnum \XINT_count < \N \hfill\break - \advance \count 255 1 + \advance \XINT_count 1 \repeat \par \endgroup @@ -15429,24 +16186,24 @@ first place. \xintAssignArray\xintBezoutAlgorithm {#1}{#2}\to\BEZ \edef\A{\BEZ2}\edef\B{\BEZ6}\edef\N{\BEZ1}% A = |#1|, B = |#2| \setbox 0 \vbox{\halign {$##$\cr \A\cr \B \cr}}% - \count 255 1 + \XINT_count 1 \loop \noindent - \hbox to \wd 0 {\hfil$\BEZ{4*\count 255 - 2}$}% - ${} = \BEZ{4*\count 255 + 5} - \times \BEZ{4*\count 255 + 2} - + \BEZ{4*\count 255 + 6}$\hfill\break - \hbox to \wd 0 {\hfil$\BEZ{4*\count 255 +7}$}% - ${} = \BEZ{4*\count 255 + 5} - \times \BEZ{4*\count 255 + 3} - + \BEZ{4*\count 255 - 1}$\hfill\break - \hbox to \wd 0 {\hfil$\BEZ{4*\count 255 +8}$}% - ${} = \BEZ{4*\count 255 + 5} - \times \BEZ{4*\count 255 + 4} - + \BEZ{4*\count 255 }$ + \hbox to \wd 0 {\hfil$\BEZ{4*\XINT_count - 2}$}% + ${} = \BEZ{4*\XINT_count + 5} + \times \BEZ{4*\XINT_count + 2} + + \BEZ{4*\XINT_count + 6}$\hfill\break + \hbox to \wd 0 {\hfil$\BEZ{4*\XINT_count +7}$}% + ${} = \BEZ{4*\XINT_count + 5} + \times \BEZ{4*\XINT_count + 3} + + \BEZ{4*\XINT_count - 1}$\hfill\break + \hbox to \wd 0 {\hfil$\BEZ{4*\XINT_count +8}$}% + ${} = \BEZ{4*\XINT_count + 5} + \times \BEZ{4*\XINT_count + 4} + + \BEZ{4*\XINT_count }$ \endgraf - \ifnum \count 255 < \N - \advance \count 255 1 + \ifnum \XINT_count < \N + \advance \XINT_count 1 \repeat \par \edef\U{\BEZ{4*\N + 4}}% @@ -15470,7 +16227,8 @@ first place. % % \StoreCodelineNo {xintgcd} % -% \section{Package \xintfracname implementation} +% \section{Package \xintfracnameimp implementation} +% \label{sec:fracimp} % % The commenting is currently (\docdate) very sparse. % @@ -15572,7 +16330,7 @@ first place. % \begin{macrocode} \XINT_providespackage \ProvidesPackage{xintfrac}% - [2013/11/04 v1.09f Expandable operations on fractions (jfB)]% + [2013/11/22 v1.09g Expandable operations on fractions (jfB)]% \chardef\xint_c_vi 6 \chardef\xint_c_vii 7 \chardef\xint_c_xviii 18 @@ -15733,7 +16491,7 @@ first place. \def\XINT_frac_Bb #1.\W\Z #2\Z {% \expandafter \XINT_frac_T \expandafter - {\romannumeral0\XINT_length {#1}}{#2#1}% + {\romannumeral0\xintlength {#1}}{#2#1}% }% \def\XINT_frac_A e\W\Z {\XINT_frac_T {0}{1}{0}}% \def\XINT_frac_T #1#2#3#4e#5#6\Z @@ -15758,7 +16516,7 @@ first place. \def\XINT_frac_Cb #1.\W\Z #2\Z {% \expandafter\XINT_frac_D\expandafter - {\romannumeral0\XINT_length {#1}}{#2#1}% + {\romannumeral0\xintlength {#1}}{#2#1}% }% \def\XINT_frac_D #1#2#3#4#5#6% {% @@ -16440,7 +17198,7 @@ first place. {% \xint_gob_til_zero #2\XINT_trunc_zero 0% \expandafter\XINT_trunc_H\expandafter - {\the\numexpr\romannumeral0\XINT_length {#1}-#3}{#3}{#1}#2% + {\the\numexpr\romannumeral0\xintlength {#1}-#3}{#3}{#1}#2% }% \def\XINT_trunc_zero 0#10{ 0}% \def\XINT_trunc_H #1#2% @@ -16634,7 +17392,7 @@ first place. \def\XINT_float_Mc #1#2#3#4#5#6% {% \expandafter\XINT_float_N\expandafter - {\romannumeral0\XINT_length{#6}}{#2}{#5}{#6}{#1}{#3}{#4}% + {\romannumeral0\xintlength{#6}}{#2}{#5}{#6}{#1}{#3}{#4}% }% long de B, P+2, n, B, |A|, A, P \def\XINT_float_N #1#2% {% @@ -17733,12 +18491,12 @@ first place. \def\XINT_flpow_checkB_b #1#2\Z #3% {% \expandafter\XINT_flpow_checkB_c \expandafter - {\romannumeral0\XINT_length{#2}}{#3}{#2}#1% + {\romannumeral0\xintlength{#2}}{#3}{#2}#1% }% \def\XINT_flpow_checkB_c #1#2% {% \expandafter\XINT_flpow_checkB_d \expandafter - {\the\numexpr \expandafter\XINT_Length\expandafter + {\the\numexpr \expandafter\xintLength\expandafter {\the\numexpr #1*20/3}+#1+#2+1}% }% \def\XINT_flpow_checkB_d #1#2#3#4% @@ -17876,12 +18634,12 @@ first place. \def\XINT_flpower_checkB_b #1#2\Z #3% {% \expandafter\XINT_flpower_checkB_c \expandafter - {\romannumeral0\XINT_length{#2}}{#3}{#2}#1% + {\romannumeral0\xintlength{#2}}{#3}{#2}#1% }% \def\XINT_flpower_checkB_c #1#2% {% \expandafter\XINT_flpower_checkB_d \expandafter - {\the\numexpr \expandafter\XINT_Length\expandafter + {\the\numexpr \expandafter\xintLength\expandafter {\the\numexpr #1*20/3}+#1+#2+1}% }% \def\XINT_flpower_checkB_d #1#2#3#4% @@ -18000,7 +18758,7 @@ first place. \def\XINT_flsqrt #1#2% {% \expandafter\XINT_sqrt_a - \expandafter{\romannumeral0\XINT_length {#2}}\XINT_flsqrt_big_d {#2}{#1}% + \expandafter{\romannumeral0\xintlength {#2}}\XINT_flsqrt_big_d {#2}{#1}% }% \def\XINT_flsqrt_big_d #1\or #2\fi #3% {% @@ -18131,7 +18889,8 @@ first place. % % \StoreCodelineNo {xintfrac} % -% \section{Package \xintseriesname implementation} +% \section{Package \xintseriesnameimp implementation} +% \label{sec:seriesimp} % % The commenting is currently (\docdate) very sparse. % @@ -18233,7 +18992,7 @@ first place. % \begin{macrocode} \XINT_providespackage \ProvidesPackage{xintseries}% - [2013/11/04 v1.09f Expandable partial sums with xint package (jfB)]% + [2013/11/22 v1.09g Expandable partial sums with xint package (jfB)]% % \end{macrocode} % \subsection{\csh{xintSeries}} % \lverb|& @@ -18667,7 +19426,8 @@ first place. % % \StoreCodelineNo {xintseries} % -% \section{Package \xintcfracname implementation} +% \section{Package \xintcfracnameimp implementation} +% \label{sec:cfracimp} % % The commenting is currently (\docdate) very sparse. % @@ -18769,7 +19529,7 @@ first place. % \begin{macrocode} \XINT_providespackage \ProvidesPackage{xintcfrac}% - [2013/11/04 v1.09f Expandable continued fractions with xint package (jfB)]% + [2013/11/22 v1.09g Expandable continued fractions with xint package (jfB)]% % \end{macrocode} % \subsection{\csh{xintCFrac}} % \begin{macrocode} @@ -19733,7 +20493,8 @@ first place. % % \StoreCodelineNo {xintcfrac} % -% \section{Package \xintexprname implementation} +% \section{Package \xintexprnameimp implementation} +% \label{sec:exprimp} % % The first version was released in June 2013. I was greatly helped in % this task of writing an expandable parser of infix operations by the @@ -19921,7 +20682,7 @@ first place. % \begin{macrocode} \XINT_providespackage \ProvidesPackage{xintexpr}% - [2013/11/04 v1.09f Expandable expression parser (jfB)]% + [2013/11/22 v1.09g Expandable expression parser (jfB)]% % \end{macrocode} % \subsection{Helper macros} % \begin{macrocode} @@ -20921,11 +21682,11 @@ first place. \xintApplyInline\mymacro\storedlinecounts \end{tabular} \def\mymacroaux #1#2{#2}% +% \parbox[t]{10cm}{Total number of code lines: \digitstt{\xintiSum{\xintApply\mymacro\storedlinecounts}}. Each package starts - with circa \digitstt{80} lines dealing - with catcodes, package identification and reloading management, also for Plain - \TeX\strut. Version + with circa \digitstt{80} lines dealing with catcodes, package identification + and reloading management, also for Plain \TeX\strut. Version \texttt{\pkgversion} of \texttt{\pkgdate}.\par} @@ -20944,7 +21705,7 @@ first place. Right bracket \] Circumflex \^ Underscore \_ Grave accent \` Left brace \{ Vertical bar \| Right brace \} Tilde \~} -\CheckSum {19898} +\CheckSum {20159} \makeatletter\check@checksum\makeatother \Finale %% diff --git a/Master/texmf-dist/source/generic/xint/xint.ins b/Master/texmf-dist/source/generic/xint/xint.ins index 9d8b5299c2f..717d1ac7adb 100644 --- a/Master/texmf-dist/source/generic/xint/xint.ins +++ b/Master/texmf-dist/source/generic/xint/xint.ins @@ -1,13 +1,14 @@ %% %%---------------------------------------------------------------- -%% The xint bundle (version 1.09f of November 4, 2013) +%% The xint bundle (version 1.09g of November 22, 2013) %% Copyright (C) 2013 by Jean-Francois Burnol %%---------------------------------------------------------------- %% %% %% This is a generated file. Run tex or latex on this file to -%% extract xint.sty, xintfrac.sty, xintexpr.sty, xintbinhex.sty, -%% xintgcd.sty, xintseries.sty and xintcfrac.sty from xint.dtx +%% extract xinttools.sty, xint.sty, xintfrac.sty, xintexpr.sty, +%% xintbinhex.sty, xintgcd.sty, xintseries.sty and xintcfrac.sty +%% from xint.dtx %% %% See xint.dtx for the copyright and the conditions for %% distribution and/or modification of this work. @@ -15,6 +16,7 @@ \input docstrip.tex \askforoverwritefalse \generate{\usepreamble\defaultpreamble +\file{xinttools.sty}{\from{xint.dtx}{xinttools}} \file{xint.sty}{\from{xint.dtx}{xint}} \file{xintbinhex.sty}{\from{xint.dtx}{xintbinhex}} \file{xintgcd.sty}{\from{xint.dtx}{xintgcd}} |