summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/expl3/l3int.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/latex/expl3/l3int.dtx')
-rw-r--r--Master/texmf-dist/source/latex/expl3/l3int.dtx2453
1 files changed, 0 insertions, 2453 deletions
diff --git a/Master/texmf-dist/source/latex/expl3/l3int.dtx b/Master/texmf-dist/source/latex/expl3/l3int.dtx
deleted file mode 100644
index 4bb794a4b82..00000000000
--- a/Master/texmf-dist/source/latex/expl3/l3int.dtx
+++ /dev/null
@@ -1,2453 +0,0 @@
-% \iffalse
-%% File: l3int.dtx Copyright (C) 1990-2011 LaTeX3 project
-%%
-%% It may be distributed and/or modified under the conditions of the
-%% LaTeX Project Public License (LPPL), either version 1.3c of this
-%% license or (at your option) any later version. The latest version
-%% of this license is in the file
-%%
-%% http://www.latex-project.org/lppl.txt
-%%
-%% This file is part of the ``expl3 bundle'' (The Work in LPPL)
-%% and all files in that bundle must be distributed together.
-%%
-%% The released version of this bundle is available from CTAN.
-%%
-%% -----------------------------------------------------------------------
-%%
-%% The development version of the bundle can be found at
-%%
-%% http://www.latex-project.org/svnroot/experimental/trunk/
-%%
-%% for those people who are interested.
-%%
-%%%%%%%%%%%
-%% NOTE: %%
-%%%%%%%%%%%
-%%
-%% Snapshots taken from the repository represent work in progress and may
-%% not work or may contain conflicting material! We therefore ask
-%% people _not_ to put them into distributions, archives, etc. without
-%% prior consultation with the LaTeX Project Team.
-%%
-%% -----------------------------------------------------------------------
-%
-%<*driver|package>
-\RequirePackage{l3names}
-%</driver|package>
-%\fi
-\GetIdInfo$Id: l3int.dtx 2229 2011-04-11 17:37:05Z joseph $
- {L3 Experimental Integer module}
-%\iffalse
-%<*driver>
-%\fi
-\ProvidesFile{\filename.\filenameext}
- [\filedate\space v\fileversion\space\filedescription]
-%\iffalse
-\documentclass[full]{l3doc}
-\begin{document}
-\DocInput{l3int.dtx}
-\end{document}
-%</driver>
-% \fi
-%
-%
-% \title{The \textsf{l3int} package\thanks{This file
-% has version number \fileversion, last
-% revised \filedate.}\\
-% Integers/counters}
-% \author{\Team}
-% \date{\filedate}
-% \maketitle
-%
-% \begin{documentation}
-%
-%\section{Integer values}
-%
-%
-% Calculation and comparison of integer values can be carried out
-% using literal numbers, \texttt{int} registers, constants and
-% integers stored in token list variables. The standard operators
-% \texttt{+}, \texttt{-}, \texttt{/} and \texttt{*} and
-% parentheses can be used within such expressions to carry
-% arithmetic operations. This module carries out these functions
-% on \emph{integer expressions} (`\texttt{int expr}').
-%
-%\subsection{Integer expressions}
-%
-%\begin{function}{
-% \int_eval:n / (EXP) |
-%}
-% \begin{syntax}
-% \cs{int_eval:n} \Arg{integer expression}
-% \end{syntax}
-% Evaluates the \meta{integer expression}, expanding any
-% integer and token list variables within the \meta{expression}
-% to their content (without requiring \cs{int_use:N}/\cs{tl_use:N})
-% and applying the standard mathematical rules. For example both
-% \begin{verbatim}
-% \int_eval:n { 5 + 4 * 3 - ( 3 + 4 * 5 ) }
-% \end{verbatim}
-% and
-% \begin{verbatim}
-% \tl_new:N \l_my_tl
-% \tl_set:Nn \l_my_tl { 5 }
-% \int_new:N \l_my_int
-% \int\set:Nn \l_my_int { 4 }
-% \int_eval:n { \l_my_tl + \l_my_int * 3 - ( 3 + 4 * 5 ) }
-% \end{verbatim}
-% both evaluate to \( -6 \). The \Arg{integer expression} may
-% contain the operators \texttt{+}, \texttt{-}, \texttt{*} and
-% \texttt{/}, along with parenthesis \texttt{(} and \texttt{)}.
-% After two expansions, \cs{int_eval:n} yields a
-% \meta{integer donation} which is left in the input stream. This is
-% \emph{not} an \meta{internal integer}, and therefore requires
-% suitable termination if used in a \TeX-style integer assignment.
-%\end{function}
-%
-%\begin{function}{
-% \int_abs:n / (EXP) |
-%}
-% \begin{syntax}
-% \cs{int_abs:n} \Arg{integer expression}
-% \end{syntax}
-% Evaluates the \meta{integer expression} as described for
-% \cs{int_eval:n} and leaves the absolute value of the result in
-% the input stream as an \meta{integer denotation} after two
-% expansions.
-%\end{function}
-%
-%\begin{function}{ \int_div_round:nn / (EXP) }
-% \begin{syntax}
-% \cs{int_div_round:nn} \Arg{intexpr1} \Arg{intexpr2}
-% \end{syntax}
-% Evaluates the two \meta{integer expressions} as described earlier,
-% then calculates the result of dividing the first value by the
-% second, rounding any remainder. Note that division using "/"
-% is identical to this function. The result is left in the input
-% stream as a \meta{integer denotation} after two expansions.
-%\end{function}
-%
-%\begin{function}{
-% \int_div_truncate:nn / (EXP) |
-%}
-% \begin{syntax}
-% \cs{int_div_truncate:nn} \Arg{intexpr1} \Arg{intexpr2}
-% \end{syntax}
-% Evaluates the two \meta{integer expressions} as described earlier,
-% then calculates the result of dividing the first value by the
-% second, truncating any remainder. Note that division using "/"
-% rounds the result. The result is left in the input stream as a
-% \meta{integer denotation} after two expansions.
-%\end{function}
-%
-%\begin{function}{
-% \int_max:nn / (EXP) |
-% \int_min:nn / (EXP) |
-%}
-% \begin{syntax}
-% \cs{int_max:nn} \Arg{intexpr1} \Arg{intexpr2}
-% \cs{int_min:nn} \Arg{intexpr1} \Arg{intexpr2}
-% \end{syntax}
-% Evaluates the \meta{integer expressions} as described for
-% \cs{int_eval:n} and leaves either the larger or smaller value
-% in the input stream as an \meta{integer denotation} after two
-% expansions.
-%\end{function}
-%
-%\begin{function}{
-% \int_mod:nn / (EXP) |
-%}
-% \begin{syntax}
-% \cs{int_mod:nn} \Arg{intexpr1} \Arg{intexpr2}
-% \end{syntax}
-% Evaluates the two \meta{integer expressions} as described earlier,
-% then calculates the integer remainder of dividing the first
-% expression by the second. This is left in the input stream as an
-% \meta{integer denotation} after two expansions.
-%\end{function}
-%
-%\subsection{Integer variables}
-%
-%\begin{function}{
-% \int_new:N |
-% \int_new:c |
-%}
-% \begin{syntax}
-% \cs{int_new:N} \meta{integer}
-% \end{syntax}
-% Creates a new \meta{inter} or raises an error if the name is
-% already taken. The declaration is global. The \meta{integer} will
-% initially be equal to \( 0 \).
-%\end{function}
-%
-%\begin{function}{
-% \int_set_eq:NN |
-% \int_set_eq:cN |
-% \int_set_eq:Nc |
-% \int_set_eq:cc |
-%}
-% \begin{syntax}
-% \cs{int_set_eq:NN} \meta{integer1} \meta{integer 2}
-% \end{syntax}
-% Sets the content of \meta{integer1} equal to that of
-% \meta{integer 2}. This assignment is restricted to the current
-% \TeX\ group level.
-%\end{function}
-%
-%\begin{function}{
-% \int_gset_eq:NN |
-% \int_gset_eq:cN |
-% \int_gset_eq:Nc |
-% \int_gset_eq:cc |
-%}
-% \begin{syntax}
-% \cs{int_gset_eq:NN} \meta{integer1} \meta{integer2}
-% \end{syntax}
-% Sets the content of \meta{integer1} equal to that of \meta{integer2}.
-% This assignment is global and so is not limited by the current
-% \TeX\ group level.
-%\end{function}
-%
-%\begin{function}{
-% \int_add:Nn |
-% \int_add:cn |
-%}
-% \begin{syntax}
-% \cs{int_add:Nn} \meta{integer} \Arg{integer expression}
-% \end{syntax}
-% Adds the result of the \meta{integer expression} to the current
-% content of the \meta{integer}. This assignment is local.
-%\end{function}
-%
-%\begin{function}{
-% \int_gadd:Nn |
-% \int_gadd:cn |
-%}
-% \begin{syntax}
-% \cs{int_gadd:Nn} \meta{integer} \Arg{integer expression}
-% \end{syntax}
-% Adds the result of the \meta{integer expression} to the current
-% content of the \meta{integer}. This assignment is global.
-%\end{function}
-%
-%\begin{function}{
-% \int_decr:N |
-% \int_decr:c |
-%}
-% \begin{syntax}
-% \cs{int_decr:N} \meta{integer}
-% \end{syntax}
-% Decreases the value stored in \meta{integer} by \( 1 \) within
-% the scope of the current \TeX\ group.
-%\end{function}
-%
-%\begin{function}{
-% \int_gdecr:N |
-% \int_gdecr:c |
-%}
-% \begin{syntax}
-% \cs{int_incr:N} \meta{integer}
-% \end{syntax}
-% Decreases the value stored in \meta{integer} by \( 1 \) globally
-% (\emph{i.e}.~not limited by the current group level).
-%\end{function}
-%
-%\begin{function}{
-% \int_incr:N |
-% \int_incr:c |
-%}
-% \begin{syntax}
-% \cs{int_incr:N} \meta{integer}
-% \end{syntax}
-% Increases the value stored in \meta{integer} by \( 1 \) within
-% the scope of the current \TeX\ group.
-%\end{function}
-%
-%\begin{function}{
-% \int_gincr:N |
-% \int_gincr:c |
-%}
-% \begin{syntax}
-% \cs{int_incr:N} \meta{integer}
-% \end{syntax}
-% Increases the value stored in \meta{integer} by \( 1 \) globally
-% (\emph{i.e}.~not limited by the current group level).
-%\end{function}
-%
-%\begin{function}{
-% \int_set:Nn |
-% \int_set:cn |
-%}
-% \begin{syntax}
-% \cs{int_set:Nn} \meta{integer} \Arg{integer expression}
-% \end{syntax}
-% Sets \meta{integer} to the value of \meta{integer expression},
-% which must evaluate to an integer (as described for
-% \cs{int_eval:n}). This assignment is restricted to the
-% current \TeX\ group.
-%\end{function}
-%
-%\begin{function}{
-% \int_gset:Nn |
-% \int_gset:cn |
-%}
-% \begin{syntax}
-% \cs{int_gset:Nn} \meta{integer} \Arg{integer expression}
-% \end{syntax}
-% Sets \meta{integer} to the value of \meta{integer expression},
-% which must evaluate to an integer (as described for
-% \cs{int_eval:n}). This assignment is global and is not limited
-% to the current \TeX\ group level.
-%\end{function}
-%
-%\begin{function}{
-% \int_sub:Nn |
-% \int_sub:cn |
-%}
-% \begin{syntax}
-% \cs{int_sub:Nn} \meta{integer} \Arg{integer expression}
-% \end{syntax}
-% Subtracts the result of the \meta{integer expression} to the
-% current content of the \meta{integer}. This assignment is local.
-%\end{function}
-%
-%\begin{function}{
-% \int_gsub:Nn |
-% \int_gsub:cn |
-%}
-% \begin{syntax}
-% \cs{int_gsub:Nn} \meta{integer} \Arg{integer expression}
-% \end{syntax}
-% Subtracts the result of the \meta{integer expression} to the
-% current content of the \meta{integer}. This assignment is global.
-%\end{function}
-%
-%\begin{function}{
-% \int_zero:N |
-% \int_zero:c |
-%}
-% \begin{syntax}
-% \cs{int_zero:N} \meta{integer}
-% \end{syntax}
-% Sets \meta{integer} to \( 0 \) within the scope of the current
-% \TeX\ group.
-%\end{function}
-%
-%\begin{function}{
-% \int_gzero:N |
-% \int_gzero:c |
-%}
-% \begin{syntax}
-% \cs{int_gzero:N} \meta{integer}
-% \end{syntax}
-% Sets \meta{integer} to \( 0 \) globally, \emph{i.e}.~not
-% restricted by the current \TeX\ group level.
-%\end{function}
-%
-%\begin{function}{
-% \int_show:N |
-% \int_show:c |
-%}
-% \begin{syntax}
-% \cs{int_show:N} \meta{integer}
-% \end{syntax}
-% Displays the value of the \meta{integer} on the terminal.
-%\end{function}
-%
-%\begin{function}{
-% \int_use:N / (EXP) |
-% \int_use:c / (EXP) |
-%}
-% \begin{syntax}
-% \cs{int_use:N} \meta{integer}
-% \end{syntax}
-% Recovers the content of a \meta{integer} and places it directly
-% in the input stream. An error will be raised if the variable does
-% not exist or if it is invalid. Can be omitted in places where a
-% \meta{integer} is required (such as in the first and third arguments
-% of \cs{int_compare:nNnTF}).
-%\end{function}
-%
-%\subsection{Comparing integer expressions}
-%
-%\begin{function}{
-% \int_compare:nNn / (EXP) (pTF) |
-%}
-% \begin{syntax}
-% \cs{int_compare_p:nNn}
-% ~~\Arg{intexpr1} \meta{relation} \Arg{intexpr2}
-% \cs{int_compare:nNnTF}
-% ~~\Arg{intexpr1} \meta{relation} \Arg{intexpr2}
-% ~~\Arg{true code} \Arg{false code}
-% \end{syntax}
-% This function first evaluates each of the \meta{integer expressions}
-% as described for \cs{int_eval:n}. The two results are then
-% compared using the \meta{relation}:
-% \begin{center}
-% \begin{tabular}{ll}
-% Equal & "=" \\
-% Greater than & ">" \\
-% Less than & "<" \\
-% \end{tabular}
-% \end{center}
-% The branching versions then leave either \meta{true code} or
-% \meta{false code} in the input stream, as appropriate to the truth
-% of the test and the variant of the function chosen. The logical
-% truth of the test is left in the input stream by the predicate
-% version.
-%\end{function}
-%
-%\begin{function}{
-% \int_compare:n / (EXP) (pTF) |
-%}
-% \begin{syntax}
-% \cs{int_compare_p:n}
-% ~~\{ \meta{intexpr1} \meta{relation} \meta{intexpr2} \}
-% \cs{int_compare:nTF}
-% ~~\{ \meta{intexpr1} \meta{relation} \meta{intexpr2} \}
-% ~~\Arg{true code} \Arg{false code}
-% \end{syntax}
-% This function first evaluates each of the \meta{integer expressions}
-% as described for \cs{int_eval:n}. The two results are then
-% compared using the \meta{relation}:
-% \begin{center}
-% \begin{tabular}{ll}
-% Equal & "=" or "==" \\
-% Greater than or equal to & "=>" \\
-% Greater than & ">" \\
-% Less than or equal to & "=<" \\
-% Less than & "<" \\
-% Not equal & "!=" \\
-% \end{tabular}
-% \end{center}
-% The branching versions then leave either \meta{true code} or
-% \meta{false code} in the input stream, as appropriate to the truth
-% of the test and the variant of the function chosen. The logical
-% truth of the test is left in the input stream by the predicate
-% version.
-%\end{function}
-%
-%\begin{function}{
-% \int_if_even:n / (EXP) (pTF) |
-% \int_if_odd:n / (EXP) (pTF) |
-%}
-% \begin{syntax}
-% \cs{int_if_odd_p:n} \Arg{integer expression}
-% \cs{int_if_odd:nTF} \Arg{integer expression}
-% ~~\Arg{true code} \Arg{false code}
-% \end{syntax}
-% This function first evaluates the \meta{integer expression}
-% as described for \cs{int_eval:n}. It then evaluates if this
-% is odd or even, as appropriate. The branching versions then leave
-% either \meta{true code} or \meta{false code} in the input stream,
-% as appropriate to the truth of the test and the variant of the
-% function chosen. The logical truth of the test is left in the input
-% stream by the predicate version.
-%\end{function}
-%
-%\begin{function}{ \int_do_while:nNnn / (EXP) }
-% \begin{syntax}
-% \cs{int_do_while:nNnn}
-% ~~\Arg{intexpr1} \meta{relation} \Arg{intexpr2} \Arg{code}
-% \end{syntax}
-% Evaluates the relationship between the two \meta{integer expressions}
-% as described for \cs{int_compare:nNnTF}, and then places the
-% \meta{code} in the input stream if the \meta{relation} is
-% \texttt{true}. After the \meta{code} has been processed by \TeX\ the
-% test will be repeated, and a loop will occur until the test is
-% \texttt{false}.
-% \end{function}
-%
-%\begin{function}{ \int_do_until:nNnn / (EXP) }
-% \begin{syntax}
-% \cs{int_do_until:nNnn}
-% ~~\Arg{intexpr1} \meta{relation} \Arg{intexpr2} \Arg{code}
-% \end{syntax}
-% Evaluates the relationship between the two \meta{integer expressions}
-% as described for \cs{int_compare:nNnTF}, and then places the
-% \meta{code} in the input stream if the \meta{relation} is
-% \texttt{false}. After the \meta{code} has been processed by \TeX\ the
-% test will be repeated, and a loop will occur until the test is
-% \texttt{true}.
-% \end{function}
-%
-%\begin{function}{ \int_until_do:nNnn / (EXP) }
-% \begin{syntax}
-% \cs{int_until_do:nNnn}
-% ~~\Arg{intexpr1} \meta{relation} \Arg{intexpr2} \Arg{code}
-% \end{syntax}
-% Places the \meta{code} in the input stream for \TeX\ to process, and
-% then evaluates the relationship between the two
-% \meta{integer expressions} as described for \cs{int_compare:nNnTF}.
-% If the test is \texttt{false} then the \meta{code} will be inserted
-% into the input stream again and a loop will occur until the
-% \meta{relation} is \texttt{true}.
-% \end{function}
-%
-%\begin{function}{ \int_while_do:nNnn / (EXP) }
-% \begin{syntax}
-% \cs{int_while_do:nNnn} \
-% ~~\Arg{intexpr1} \meta{relation} \Arg{intexpr2} \Arg{code}
-% \end{syntax}
-% Places the \meta{code} in the input stream for \TeX\ to process, and
-% then evaluates the relationship between the two
-% \meta{integer expressions} as described for \cs{int_compare:nNnTF}.
-% If the test is \texttt{true} then the \meta{code} will be inserted
-% into the input stream again and a loop will occur until the
-% \meta{relation} is \texttt{false}.
-% \end{function}
-%
-%\begin{function}{ \int_do_while:nn / (EXP) }
-% \begin{syntax}
-% \cs{int_do_while:nNnn}
-% ~~\{ \meta{intexpr1} \meta{relation} \meta{intexpr2} \} \Arg{code}
-% \end{syntax}
-% Evaluates the relationship between the two \meta{integer expressions}
-% as described for \cs{int_compare:nTF}, and then places the
-% \meta{code} in the input stream if the \meta{relation} is
-% \texttt{true}. After the \meta{code} has been processed by \TeX\ the
-% test will be repeated, and a loop will occur until the test is
-% \texttt{false}.
-% \end{function}
-%
-%\begin{function}{ \int_do_until:nn / (EXP) }
-% \begin{syntax}
-% \cs{int_do_until:nn}
-% ~~\{ \meta{intexpr1} \meta{relation} \meta{intexpr2} \} \Arg{code}
-% \end{syntax}
-% Evaluates the relationship between the two \meta{integer expressions}
-% as described for \cs{int_compare:nTF}, and then places the
-% \meta{code} in the input stream if the \meta{relation} is
-% \texttt{false}. After the \meta{code} has been processed by \TeX\ the
-% test will be repeated, and a loop will occur until the test is
-% \texttt{true}.
-% \end{function}
-%
-%\begin{function}{ \int_until_do:nn / (EXP) }
-% \begin{syntax}
-% \cs{int_until_do:nn}
-% ~~\{ \meta{intexpr1} \meta{relation} \meta{intexpr2} \} \Arg{code}
-% \end{syntax}
-% Places the \meta{code} in the input stream for \TeX\ to process, and
-% then evaluates the relationship between the two
-% \meta{integer expressions} as described for \cs{int_compare:nTF}.
-% If the test is \texttt{false} then the \meta{code} will be inserted
-% into the input stream again and a loop will occur until the
-% \meta{relation} is \texttt{true}.
-% \end{function}
-%
-%\begin{function}{ \int_while_do:nn / (EXP) }
-% \begin{syntax}
-% \cs{int_while_do:nn} \
-% ~~\{ \meta{intexpr1} \meta{relation} \meta{intexpr2} \} \Arg{code}
-% \end{syntax}
-% Places the \meta{code} in the input stream for \TeX\ to process, and
-% then evaluates the relationship between the two
-% \meta{integer expressions} as described for \cs{int_compare:nTF}.
-% If the test is \texttt{true} then the \meta{code} will be inserted
-% into the input stream again and a loop will occur until the
-% \meta{relation} is \texttt{false}.
-% \end{function}
-%
-%\subsection{Formatting integers}
-%
-% Integers can be placed into the output stream with formatting. These
-% conversions apply to any integer expressions.
-%
-%\begin{function}{ \int_to_arabic:n / (EXP) }
-% \begin{syntax}
-% \cs{int_to_arabic:n} \Arg{integer expression}
-% \end{syntax}
-% Places the value of the \meta{integer expression} in the input
-% stream as digits, with category code \( 12 \) (other).
-%\end{function}
-%
-%\begin{function}{
-% \int_to_alph:n / (EXP) |
-% \int_to_Alph:n / (EXP) |
-%}
-% \begin{syntax}
-% \cs{int_to_alph:n} \Arg{integer expression}
-% \end{syntax}
-% Evaluates the \meta{integer expression} and converts the result
-% into a series of letters, which are then left in the input stream.
-% The conversion rule uses the \( 26 \) letters of the English
-% alphabet, in order. Thus
-% \begin{verbatim}
-% \int_to_alph:n { 1 }
-% \end{verbatim}
-% places "a" in the input stream,
-% \begin{verbatim}
-% \int_to_alph:n { 26 }
-% \end{verbatim}
-% is represented as "z" and
-% \begin{verbatim}
-% \int_to_alph:n { 27 }
-% \end{verbatim}
-% is converted to `aa'. For conversions using other alphabets, use
-% \cs{int_convert_to_symbols:nnn} to define an alphabet-specific
-% function. The basic \cs{int_to_alph:n} and \cs{int_to_Alph:n}
-% functions should not be modified.
-%\end{function}
-%
-%\begin{function}{ \int_to_binary:n / (EXP) }
-% \begin{syntax}
-% \cs{int_to_binary:n} \Arg{integer expression}
-% \end{syntax}
-% Calculates the value of the \meta{integer expression} and places
-% the binary representation of the result in the input stream.
-%\end{function}
-%
-%\begin{function}{ \int_to_hexadecimal:n / (EXP) }
-% \begin{syntax}
-% \cs{int_to_binary:n} \Arg{integer expression}
-% \end{syntax}
-% Calculates the value of the \meta{integer expression} and places
-% the hexadecimal (base~\( 16 \)) representation of the result in the
-% input stream. Upper case letters are used for digits beyond \( 9 \).
-%\end{function}
-%
-%\begin{function}{ \int_to_octal:n / (EXP) }
-% \begin{syntax}
-% \cs{int_to_octal:n} \Arg{integer expression}
-% \end{syntax}
-% Calculates the value of the \meta{integer expression} and places
-% the octal (base~\( 8 \)) representation of the result in the input
-% stream.
-%\end{function}
-%
-%\begin{function}{
-% \int_to_roman:n / (EXP) |
-% \int_to_Roman:n / (EXP) |
-%}
-% \begin{syntax}
-% \cs{int_to_roman:n} \Arg{integer expression}
-% \end{syntax}
-% Places the value of the \meta{integer expression} in the input
-% stream as Roman numerals, either lower case (\cs{int_to_roman:n})
-% or upper case (\cs{int_to_Roman:n}). The numerals are letters
-% with category code \( 11 \) (letter).
-%\end{function}
-%
-%\begin{function}{ \int_to_symbol:n / (EXP) }
-% \begin{syntax}
-% \cs{int_to_symbol:n} \Arg{integer expression}
-% \end{syntax}
-% Calculates the value of the \meta{integer expression} and places
-% the symbol representation of the result in the input stream. The
-% list of symbols used is equivalent to \LaTeXe's \cs{@fnsymbol}
-% set.
-%\end{function}
-%
-%\subsection{Converting from other formats}
-%
-%\begin{function}{ \int_from_alph:n / (EXP) }
-% \begin{syntax}
-% \cs{int_from_alpa:n} \Arg{letters}
-% \end{syntax}
-% Converts the \meta{letters} into the integer (base~\( 10 \))
-% representation and leaves this in the input stream. The
-% \meta{letters} are treated using the English alphabet only, with
-% `a' equal to \( 1 \) through to `z' equal to \( 26 \). Either lower
-% or upper case letters may be used. This is the inverse function of
-% \cs{int_to_alph:n}.
-%\end{function}
-%
-%\begin{function}{ \int_from_binary:n / (EXP) }
-% \begin{syntax}
-% \cs{int_from_binary:n} \Arg{binary number}
-% \end{syntax}
-% Converts the \meta{binary number} into the integer (base~\( 10 \))
-% representation and leaves this in the input stream.
-%\end{function}
-%
-%\begin{function}{ \int_from_hexadecimal:n / (EXP) }
-% \begin{syntax}
-% \cs{int_from_binary:n} \Arg{hexadecimal number}
-% \end{syntax}
-% Converts the \meta{hexadecimal number} into the integer
-% (base~\( 10 \)) representation and leaves this in the input stream.
-% Digits greater than \( 9 \) may be represented in the
-% \meta{hexadecimal number} by upper or lower case letters.
-%\end{function}
-%
-%\begin{function}{ \int_from_octal:n / (EXP) }
-% \begin{syntax}
-% \cs{int_from_octal:n} \Arg{octal number}
-% \end{syntax}
-% Converts the \meta{octal number} into the integer (base~\( 10 \))
-% representation and leaves this in the input stream.
-%\end{function}
-%
-%\begin{function}{ \int_from_roman:n / (EXP) }
-% \begin{syntax}
-% \cs{int_from_roman:n} \Arg{roman numeral}
-% \end{syntax}
-% Converts the \meta{roman numeral} into the integer (base~\( 10 \))
-% representation and leaves this in the input stream. The
-% \meta{roman numeral} may be in upper or lower case; if the numeral
-% is not valid then the resulting value will be \( -1 \).
-%\end{function}
-%
-%\subsection{Low-level conversion functions}
-%
-% As well as the higher-level functions already documented, there
-% are a series of lower-level functions which can be used to carry out
-% generic conversions. These are used to create the higher-level
-% versions documented above.
-%
-%\begin{function}{ \int_convert_from_base_ten:nn / (EXP) }
-% \begin{syntax}
-% \cs{int_convert_from_base_ten:nn} \Arg{integer expression}
-% ~~\Arg{base}
-% \end{syntax}
-% Calculates the value of the \meta{integer expression} and
-% converts it into the appropriate representation in the \meta{base};
-% the later may be given as an integer expression. For bases greater
-% than \( 10 \) the higher `digits' are represented by the upper case
-% letters from the English alphabet (with normal category codes). The
-% maximum \meta{base} value is \( 36 \).
-%\end{function}
-%
-%\begin{function}{ \int_convert_to_base_ten:nn / (EXP) }
-% \begin{syntax}
-% \cs{int_convert_to_base_ten:nn} \Arg{number}
-% ~~\Arg{base}
-% \end{syntax}
-% Converts the \meta{number} in \meta{base} into the appropriate
-% value in base \( 10 \). The \meta{number} should consist of
-% digits and letters (either lower or upper case), plus optionally
-% a leading sign. The maximum \meta{base} value is \( 36 \).
-%\end{function}
-%
-%\begin{function}{ \int_convert_to_symbols:nnn / (EXP) }
-% \begin{syntax}
-% \cs{int_convert_to_symbols:nnn}
-% ~~\Arg{integer expression} \Arg{total symbols}
-% ~~\meta{value to symbol mapping}
-% \end{syntax}
-% This is the low-level function for conversion of an
-% \meta{integer expression} into a symbolic form (which will often
-% be letters). The \meta{total symbols} available should be given
-% as an integer expression. Values are actually converted to symbols
-% according to the \meta{value to symbol mapping}. This should be given
-% as \meta{total symbols} pairs of entries, a number and the
-% appropriate symbol. Thus the \cs{int_to_alph:n} function is defined
-% as
-% \begin{verbatim}
-% \cs_new:Npn \int_to_alph:n #1 {
-% \int_convert_to_sybols:nnn {#1} { 26 }
-% {
-% { 1 } { a }
-% { 2 } { b }
-% { 3 } { c }
-% { 4 } { d }
-% { 5 } { e }
-% { 6 } { f }
-% { 7 } { g }
-% { 8 } { h }
-% { 9 } { i }
-% { 10 } { j }
-% { 11 } { k }
-% { 12 } { l }
-% { 13 } { m }
-% { 14 } { n }
-% { 15 } { o }
-% { 16 } { p }
-% { 17 } { q }
-% { 18 } { r }
-% { 19 } { s }
-% { 20 } { t }
-% { 21 } { u }
-% { 22 } { v }
-% { 23 } { w }
-% { 24 } { x }
-% { 25 } { y }
-% { 26 } { z }
-% }
-% }
-% \end{verbatim}
-%\end{function}
-%
-%\section{Variables and constants}
-%
-% \begin{variable}{%
-% \l_tmpa_int |
-% \l_tmpb_int |
-% \l_tmpc_int |
-% \g_tmpa_int |
-% \g_tmpb_int |
-% }
-% Scratch register for immediate use. They are not used by conditionals
-% or predicate functions.
-% \end{variable}
-%
-%\begin{function}{
-% \int_const:Nn |
-% \int_const:cn |
-%}
-% \begin{syntax}
-% \cs{int_const:Nn} \meta{integer} \Arg{integer expression}
-% \end{syntax}
-% Creates a new constant \meta{integer} or raises an error if the name
-% is already taken. The value of the \meta{integer} will be set
-% globally to the \meta{integer expression}.
-%\end{function}
-%
-%\begin{variable}{ \c_max_int }
-% The maximum value that can be stored as an integer.
-%\end{variable}
-%
-%\begin{variable}{
-% \c_minus_one |
-% \c_zero |
-% \c_one |
-% \c_two |
-% \c_three |
-% \c_four |
-% \c_five |
-% \c_six |
-% \c_seven |
-% \c_eight |
-% \c_nine |
-% \c_ten |
-% \c_eleven |
-% \c_twelve |
-% \c_thirteen |
-% \c_fourteen |
-% \c_fifteen |
-% \c_sixteen |
-% \c_thirty_two |
-% \c_hundred_one |
-% \c_twohundred_fifty_five |
-% \c_twohundred_fifty_six |
-% \c_thousand |
-% \c_ten_thousand |
-% \c_ten_thousand_one |
-% \c_ten_thousand_two |
-% \c_ten_thousand_three |
-% \c_ten_thousand_four |
-% \c_twenty_thousand |
-%}
-% Integer values used with primitive tests and assignments:
-% self-terminating nature makes these more convenient and faster than
-% literal numbers.
-%\end{variable}
-%
-% \begin{variable}{\c_max_register_int}
-% Maximum number of registers.
-% \end{variable}
-%
-%\subsection{Internal functions}
-%
-% \begin{function}{\int_to_roman:w / (EXP)}
-% \begin{syntax}
-% "\int_to_roman:w" <integer> <space> \textit{or} <non-expandable token>
-% \end{syntax}
-% Converts <integer> to it lowercase roman representation. Note that
-% it produces a string of letters with catcode 12.
-% \begin{texnote}
-% This is the \TeX{} primitive \tn{romannumeral} renamed.
-% \end{texnote}
-% \end{function}
-%
-% \begin{function}{
-% \int_roman_lcuc_mapping:Nnn |
-% \int_to_roman_lcuc:NN |
-% }
-% \begin{syntax}
-% "\int_roman_lcuc_mapping:Nnn" <roman_char> \Arg{licr} \Arg{LICR}
-% "\int_to_roman_lcuc:NN" <roman_char> <char>
-% \end{syntax}
-% "\int_roman_lcuc_mapping:Nnn" specifies how the roman
-% numeral <roman\_ char> (i, v, x, l, c, d, or m) should be
-% interpreted when converting the number. <licr> is the lower case and
-% <LICR> is the uppercase mapping. "\int_to_roman_lcuc:NN" is a
-% recursive function converting the roman numerals.
-% \end{function}
-%
-%
-% \begin{function}{
-% \int_convert_number_with_rule:nnN |
-% \int_symbol_math_conversion_rule:n |
-% \int_symbol_text_conversion_rule:n |
-% }
-% \begin{syntax}
-% "\int_convert_number_with_rule:nnN" \Arg{int1} \Arg{int2} <function>
-% \end{syntax}
-% "\int_convert_number_with_rule:nnN" converts <int1> into letters,
-% symbols, whatever as defined by <function>. <int2> denotes the base
-% number for the conversion.
-% \end{function}
-%
-%\begin{function}{
-% \if_num:w / (EXP) |
-% \if_int_compare:w / (EXP)
-%}
-% \begin{syntax}
-% "\if_num:w" <number1> <rel> <number2> <true> "\else:" <false> "\fi:"
-% \end{syntax}
-% Compare two integers using <rel>, which must be one of
-% \texttt{=}, "<" or ">" with category code \(12\).
-% The \cs{else:} branch is optional.
-% \begin{texnote}
-% These are both names for the \TeX\ primitive \cs{ifnum}.
-% \end{texnote}
-%\end{function}
-%
-%\begin{function}{
-% \if_case:w / (EXP) |
-% \or: / (EXP)
-%}
-% \begin{syntax}
-% "\if_case:w" <number> <case0> "\or:" <case1> "\or:" "..." "\else:"
-% <default> "\fi:"
-% \end{syntax}
-% Selects a case to execute based on the value of <number>. The first
-% case (<case0>) is executed if <number> is \(0\), the second
-% (<case1>) if the <number> is \(1\), \emph{etc}. The
-% <number> may be a literal, a constant or an integer
-% expression (\emph{e.g}.~using \cs{int_eval:n}).
-% \begin{texnote}
-% These are the \TeX\ primitives \cs{ifcase} and \cs{or}.
-% \end{texnote}
-%\end{function}
-%
-%\begin{function}{\int_value:w / (EXP)}
-% \begin{syntax}
-% "\int_value:w" <integer>
-% "\int_value:w" <tokens> <optional space>
-% \end{syntax}
-% Expands <tokens> until an <integer> is formed. One space may be
-% gobbled in the process.
-% \begin{texnote}
-% This is the \TeX\ primitive \tn{number}.
-% \end{texnote}
-%\end{function}
-%
-%\begin{function}{
-% \int_eval:w / (EXP) |
-% \int_eval_end:
-%}
-% \begin{syntax}
-% "\int_eval:w" <int expr> "\int_eval_end:"
-% \end{syntax}
-% Evaluates <integer expression> as described for \cs{int_eval:n}.
-% The evalution stops when an unexpandable token with category code
-% other than \(12\) is read or when \cs{int_eval_end:} is
-% reached. The latter is gobbled by the scanner mechanism:
-% \cs{int_eval_end:} itself is unexpandable but used correctly
-% the entire construct is expandable.
-% \begin{texnote}
-% This is the \eTeX\ primitive \cs{numexpr}.
-% \end{texnote}
-%\end{function}
-%
-%\begin{function}{\if_int_odd:w / (EXP)}
-% \begin{syntax}
-% "\if_int_odd:w" <tokens> <true> "\else:" <false> "\fi:"
-% "\if_int_odd:w" <number> <true> "\else:" <false> "\fi:"
-% \end{syntax}
-% Expands <tokens> until a non-numeric tokens is found, and
-% tests whether the resulting <number> is odd. If so, <true code>
-% is executed. The \cs{else:} branch is optional.
-% \begin{texnote}
-% This is the \TeX\ primitive \cs{ifodd}.
-% \end{texnote}
-%\end{function}
-%
-% \end{documentation}
-%
-% \begin{implementation}
-%
-% \section{\pkg{l3int} implementation}
-%
-% \TestFiles{m3int001.lvt,m3int002.lvt,m3int03.lvt}
-%
-% \subsection{Internal functions and variables}
-%
-% \begin{function}{\int_advance:w}
-% \begin{syntax}
-% "\int_advance:w" <int register> <optional `\texttt{by}'> <number> <space>
-% \end{syntax}
-% Increments the count register by the specified amount.
-% \begin{texnote}
-% This is \TeX's \tn{advance}.
-% \end{texnote}
-% \end{function}
-%
-%
-% \begin{function}{\int_convert_number_to_letter:n / (EXP)}
-% \begin{syntax}
-% "\int_convert_number_to_letter:n" \Arg{integer expression}
-% \end{syntax}
-% Internal function for turning a number for a different base into a letter or digit.
-% \end{function}
-%
-% \begin{function}{\int_pre_eval_one_arg:Nn | \int_pre_eval_two_args:Nnn}
-% \begin{syntax}
-% "\int_pre_eval_one_arg:Nn" <function> \Arg{integer expression}
-% "\int_pre_eval_one_arg:Nnn" <function> \Arg{int~expr~1} \Arg{int~expr~2}
-% \end{syntax}
-% These are expansion helpers; they evaluate their integer expressions
-% before handing them off to the specified <function>.
-% \end{function}
-%
-% \begin{function}{ \int_get_sign_and_digits:n / (EXP) |
-% \int_get_sign:n / (EXP ) |
-% \int_get_digits:n / (EXP) }
-% \begin{syntax}
-% "\int_get_sign_and_digits:n" \Arg{number}
-% \end{syntax}
-% From an argument that may or may not include a "+" or "-" sign, these
-% functions expand to the respective components of the number.
-% \end{function}
-%
-% \subsection{Module loading and primitives definitions}
-%
-% We start by ensuring that the required packages are loaded.
-% \begin{macrocode}
-%<*package>
-\ProvidesExplPackage
- {\filename}{\filedate}{\fileversion}{\filedescription}
-\package_check_loaded_expl:
-%</package>
-%<*initex|package>
-% \end{macrocode}
-%
-% \begin{macro}{\int_value:w}
-% \begin{macro}{\int_eval:n,\int_eval:w,\int_eval_end:}
-% \begin{macro}{\if_int_compare:w}
-% \begin{macro}{\if_int_odd:w}
-% \begin{macro}{\if_num:w}
-% \begin{macro}{\if_case:w}
-% \begin{macro}{\int_to_roman:w}
-% \begin{macro}{\int_advance:w}
-% Here are the remaining primitives for number comparisons and
-% expressions.
-% \begin{macrocode}
-\cs_set_eq:NN \int_value:w \tex_number:D
-\cs_set_eq:NN \int_eval:w \etex_numexpr:D
-\cs_set_protected:Npn \int_eval_end: {\tex_relax:D}
-\cs_set_eq:NN \if_int_compare:w \tex_ifnum:D
-\cs_new_eq:NN \if_num:w \tex_ifnum:D
-\cs_set_eq:NN \if_int_odd:w \tex_ifodd:D
-\cs_new_eq:NN \if_case:w \tex_ifcase:D
-\cs_new_eq:NN \int_to_roman:w \tex_romannumeral:D
-\cs_new_eq:NN \int_advance:w \tex_advance:D
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-% \begin{macro}{\int_eval:n}
-% Wrapper for \cs{int_eval:w}. Can be used in an integer expression
-% or directly in the input stream.
-% \begin{macrocode}
-\cs_set:Npn \int_eval:n #1{
- \int_value:w \int_eval:w #1\int_eval_end:
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-% \subsection{Allocation and setting}
-%
-% \begin{macro}{\int_new:N,\int_new:c}
-% \UnitTested
-% For the \LaTeX3 format:
-% \begin{macrocode}
-%<*initex>
-\alloc_new:nnnN {int} {11} {\c_max_register_int} \tex_countdef:D
-%</initex>
-% \end{macrocode}
-% For `l3in2e':
-% \begin{macrocode}
-%<*package>
-\cs_new_protected_nopar:Npn \int_new:N #1 {
- \chk_if_free_cs:N #1
- \newcount #1
-}
-%</package>
-% \end{macrocode}
-% \begin{macrocode}
-\cs_generate_variant:Nn \int_new:N {c}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\int_set:Nn, \int_set:cn}
-% \UnitTested
-% \begin{macro}{\int_gset:Nn,\int_gset:cn}
-% \UnitTested
-% Setting counters is again something that I would like to make
-% uniform at the moment to get a better overview.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \int_set:Nn #1#2{#1 \int_eval:w #2\int_eval_end:
-%<*check>
-\chk_local_or_pref_global:N #1
-%</check>
-}
-\cs_new_protected_nopar:Npn \int_gset:Nn {
-%<*check>
- \pref_global_chk:
-%</check>
-%<-check> \pref_global:D
- \int_set:Nn }
-\cs_generate_variant:Nn\int_set:Nn {cn}
-\cs_generate_variant:Nn\int_gset:Nn {cn}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-%\begin{macro}{\int_set_eq:NN,\int_set_eq:cN,
-% \int_set_eq:Nc,\int_set_eq:cc}
-% \UnitTested
-%\begin{macro}{\int_gset_eq:NN,\int_gset_eq:cN,
-% \int_gset_eq:Nc,\int_gset_eq:cc}
-% \UnitTested
-% Setting equal means using one integer inside the set function of
-% another.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \int_set_eq:NN #1#2 {
- \int_set:Nn #1 {#2}
-}
-\cs_generate_variant:Nn \int_set_eq:NN { c }
-\cs_generate_variant:Nn \int_set_eq:NN { Nc }
-\cs_generate_variant:Nn \int_set_eq:NN { cc }
-\cs_new_protected_nopar:Npn \int_gset_eq:NN #1#2 {
- \int_gset:Nn #1 {#2}
-}
-\cs_generate_variant:Nn \int_gset_eq:NN { c }
-\cs_generate_variant:Nn \int_gset_eq:NN { Nc }
-\cs_generate_variant:Nn \int_gset_eq:NN { cc }
-% \end{macrocode}
-%\end{macro}
-%\end{macro}
-%
-%
-%
-%
-% \begin{macro}{\int_incr:N,\int_incr:c}
-% \UnitTested
-% \begin{macro}{\int_decr:N,\int_decr:c}
-% \UnitTested
-% \begin{macro}{\int_gincr:N,\int_gincr:c}
-% \UnitTested
-% \begin{macro}{\int_gdecr:N,\int_gdecr:c}
-% \UnitTested
-% Incrementing and decrementing of integer registers is done with
-% the following functions.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \int_incr:N #1{\int_advance:w#1\c_one
-%<*check>
- \chk_local_or_pref_global:N #1
-%</check>
-}
-\cs_new_protected_nopar:Npn \int_decr:N #1{\int_advance:w#1\c_minus_one
-%<*check>
- \chk_local_or_pref_global:N #1
-%</check>
-}
-\cs_new_protected_nopar:Npn \int_gincr:N {
-% \end{macrocode}
-% We make sure that a local variable is not updated globally by
-% changing the internal test (i.e.\ |\chk_local_or_pref_global:N|) before
-% making the assignment. This is done by |\pref_global_chk:| which also
-% issues the necessary |\pref_global:D|. This is not very efficient, but
-% this code will be only included for debugging purposes. Using
-% |\pref_global:D| in front of the local function is better in the
-% production versions.
-% \begin{macrocode}
-%<*check>
- \pref_global_chk:
-%</check>
-%<-check> \pref_global:D
- \int_incr:N}
-\cs_new_protected_nopar:Npn \int_gdecr:N {
-%<*check>
- \pref_global_chk:
-%</check>
-%<-check> \pref_global:D
- \int_decr:N}
-% \end{macrocode}
-% With the |\int_add:Nn| functions we can shorten the above code.
-% If this makes it too slow \ldots
-% \begin{macrocode}
-\cs_set_protected_nopar:Npn \int_incr:N #1{\int_add:Nn#1\c_one}
-\cs_set_protected_nopar:Npn \int_decr:N #1{\int_add:Nn#1\c_minus_one}
-\cs_set_protected_nopar:Npn \int_gincr:N #1{\int_gadd:Nn#1\c_one}
-\cs_set_protected_nopar:Npn \int_gdecr:N #1{\int_gadd:Nn#1\c_minus_one}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_generate_variant:Nn \int_incr:N {c}
-\cs_generate_variant:Nn \int_decr:N {c}
-\cs_generate_variant:Nn \int_gincr:N {c}
-\cs_generate_variant:Nn \int_gdecr:N {c}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-% \begin{macro}{\int_zero:N,\int_zero:c}
-% \UnitTested
-% \begin{macro}{\int_gzero:N,\int_gzero:c}
-% \UnitTested
-% Functions that reset an \m{int} register to zero.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \int_zero:N #1 {#1=\c_zero}
-\cs_generate_variant:Nn \int_zero:N {c}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \int_gzero:N #1 {\pref_global:D #1=\c_zero}
-\cs_generate_variant:Nn \int_gzero:N {c}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\int_add:Nn,\int_add:cn}
-% \UnitTested
-% \begin{macro}{\int_gadd:Nn,\int_gadd:cn}
-% \UnitTested
-% \begin{macro}{\int_sub:Nn,\int_sub:cn}
-% \UnitTested
-% \begin{macro}{\int_gsub:Nn,\int_gsub:cn}
-% \UnitTested
-% Adding and substracting to and from a counter \ldots
-% We should think of using these functions
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \int_add:Nn #1#2{
-% \end{macrocode}
-% We need to say |by| in case the first argument is a register
-% accessed by its number, e.g., |\count23|. Not that it should
-% ever happen but\dots
-% \begin{macrocode}
- \int_advance:w #1 by \int_eval:w #2\int_eval_end:
-%<*check>
- \chk_local_or_pref_global:N #1
-%</check>
-}
-\cs_new_nopar:Npn \int_sub:Nn #1#2{
- \int_advance:w #1-\int_eval:w #2\int_eval_end:
-%<*check>
-\chk_local_or_pref_global:N #1
-%</check>
-}
-\cs_new_protected_nopar:Npn \int_gadd:Nn {
-%<*check>
- \pref_global_chk:
-%</check>
-%<-check> \pref_global:D
- \int_add:Nn }
-\cs_new_protected_nopar:Npn \int_gsub:Nn {
-%<*check>
- \pref_global_chk:
-%</check>
-%<-check> \pref_global:D
- \int_sub:Nn }
-\cs_generate_variant:Nn \int_add:Nn {cn}
-\cs_generate_variant:Nn \int_gadd:Nn {cn}
-\cs_generate_variant:Nn \int_sub:Nn {cn}
-\cs_generate_variant:Nn \int_gsub:Nn {cn}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-% \begin{macro}{\int_use:N,\int_use:c}
-% \UnitTested
-% Here is how counters are accessed:
-% \begin{macrocode}
-\cs_new_eq:NN \int_use:N \tex_the:D
-\cs_new_nopar:Npn \int_use:c #1{\int_use:N \cs:w#1\cs_end:}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\int_show:N,\int_show:c}
-% \UnitTested
-% \begin{macrocode}
-\cs_new_eq:NN \int_show:N \kernel_register_show:N
-\cs_new_eq:NN \int_show:c \kernel_register_show:c
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-% \begin{macro}{\int_to_arabic:n}
-% \UnitTested
-% Nothing exciting here.
-% \begin{macrocode}
-\cs_new_nopar:Npn \int_to_arabic:n #1{ \int_eval:n{#1}}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-% \begin{macro}[aux]{\int_roman_lcuc_mapping:Nnn}
-% Using \TeX's built-in feature for producing roman numerals has some
-% surprising features. One is the the characters resulting from
-% |\int_to_roman:w| have category code~12 so they may fail in
-% certain comparison tests. Therefore we use a mapping from the
-% character \TeX{} produces to the character we actually want which
-% will give us letters with category code~11.%
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \int_roman_lcuc_mapping:Nnn #1#2#3{
- \cs_set_nopar:cpn {int_to_lc_roman_#1:}{#2}
- \cs_set_nopar:cpn {int_to_uc_roman_#1:}{#3}
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% Here are the default mappings. I haven't found any examples of say
-% Turkish doing the mapping |i \i I| but at least there is a
-% possibility for it if needed. Note: I have now asked a Turkish
-% person and he tells me they do the |i I| mapping.
-% \begin{macrocode}
-\int_roman_lcuc_mapping:Nnn i i I
-\int_roman_lcuc_mapping:Nnn v v V
-\int_roman_lcuc_mapping:Nnn x x X
-\int_roman_lcuc_mapping:Nnn l l L
-\int_roman_lcuc_mapping:Nnn c c C
-\int_roman_lcuc_mapping:Nnn d d D
-\int_roman_lcuc_mapping:Nnn m m M
-% \end{macrocode}
-% For the delimiter we cheat and let it gobble its arguments instead.
-% \begin{macrocode}
-\int_roman_lcuc_mapping:Nnn Q \use_none:nn \use_none:nn
-% \end{macrocode}
-%
-% \begin{macro}{\int_to_roman:n, \int_to_Roman:n}
-% \UnitTested
-% \TestMissing{output is catcode 11}
-% \begin{macro}[aux]{\int_to_roman_lcuc:NN}
-% The commands for producing the lower and upper case roman numerals
-% run a loop on one character at a time and also carries some
-% information for upper or lower case with it. We put it through
-% |\int_eval:n| first which is safer and more flexible.
-% \begin{macrocode}
-\cs_new_nopar:Npn \int_to_roman:n #1 {
- \exp_after:wN \int_to_roman_lcuc:NN \exp_after:wN l
- \int_to_roman:w \int_eval:n {#1} Q
-}
-\cs_new_nopar:Npn \int_to_Roman:n #1 {
- \exp_after:wN \int_to_roman_lcuc:NN \exp_after:wN u
- \int_to_roman:w \int_eval:n {#1} Q
-}
-\cs_new_nopar:Npn \int_to_roman_lcuc:NN #1#2{
- \use:c {int_to_#1c_roman_#2:}
- \int_to_roman_lcuc:NN #1
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-%\begin{macro}{\int_convert_to_symbols:nnn}
-%\UnitTested
-% For conversion of integers to arbitrary symbols the method is in
-% general as follows. The input number ("#1") is compared to the total
-% number of symbols available at each place ("#2"). If the input is larger
-% than the total number of symbols available then the modulus is needed,
-% with one added so that the positions don't have to number from
-% zero. Using an \texttt{f}-type expansion, this is done so that the system
-% is recursive. The actual conversion function therefore gets a `nice'
-% number at each stage. Of course, if the initial input was small enough
-% then there is no problem and everything is easy. This is more or less the
-% same as \cs{int_convert_number_with_rule:nnN} but `pre-packaged'.
-% \begin{macrocode}
-\cs_new_nopar:Npn \int_convert_to_symbols:nnn #1#2#3 {
- \int_compare:nNnTF {#1} > {#2}
- {
- \exp_args:Nf \int_convert_to_symbols:nnn
- { \int_div_truncate:nn { #1 - 1 } {#2} } {#2} {#3}
- \exp_args:Nf \prg_case_int:nnn
- { \int_eval:n { 1 + \int_mod:nn { #1 - 1 } {#2} } }
- {#3} { }
- }
- { \exp_args:Nf \prg_case_int:nnn { \int_eval:n {#1} } {#3} { } }
-}
-% \end{macrocode}
-%\end{macro}
-%
-%
-%
-% \begin{macro}{\int_convert_number_with_rule:nnN}
-% This is our major workhorse for conversions. |#1| is the number we
-% want converted, |#2| is the base number, and |#3| is the function
-% converting the number. This function expects to receive a
-% non-negative integer and as such is ideal for something using
-% |\if_case:w| internally.
-%
-% The basic example is this: We want to convert the number 50 (|#1|)
-% into an alphabetic equivalent |ax|. For the English language our
-% list contains 26 elements so this is our argument |#2| while the
-% function |#3| just turns |1| into |a|, |2| into |b|, etc. Hence our
-% goal is to turn 50 into the sequence |#3{1}#1{24}| so what we do is
-% to first divide 50 by 26 and truncating the result returning 1.
-% Then before we execute this we call the function again but this time
-% on the result of the remainder of the division. This goes on until
-% the remainder is less than or equal to the base number where we just
-% call the function |#3| directly on the number.
-%
-% We do a little pre-expansion of the arguments below as they
-% otherwise have a tendency to grow quite large.
-% \begin{macrocode}
-\cs_set_nopar:Npn \int_convert_number_with_rule:nnN #1#2#3{
- \int_compare:nNnTF {#1}>{#2}
- {
- \exp_args:Nf \int_convert_number_with_rule:nnN
- { \int_div_truncate:nn {#1-1}{#2} }{#2}
- #3
-% \end{macrocode}
-% Note that we have to nudge our modulus function so it won't
-% return~$0$ as that wouldn't work with |\if_case:w| when that
-% expects a positive number to produce a letter.
-% \begin{macrocode}
- \exp_args:Nf #3 { \int_eval:n{1+\int_mod:nn {#1-1}{#2}} }
- }
- { \exp_args:Nf #3{ \int_eval:n{#1} } }
-}
-% \end{macrocode}
-% As can be seen it is even simpler to convert to number systems
-% that contain 0, since then we don't have to add or subtract 1
-% here and there.
-% \end{macro}
-%
-%
-%\begin{macro}{\int_to_alph:n,\int_to_Alph:n}
-%\UnitTested
-% These both use the above function with input functions that make sense
-% for the alphabet in English.
-% \begin{macrocode}
-\cs_new_nopar:Npn \int_to_alph:n #1 {
- \int_convert_to_symbols:nnn {#1} { 26 }
- {
- { 1 } { a }
- { 2 } { b }
- { 3 } { c }
- { 4 } { d }
- { 5 } { e }
- { 6 } { f }
- { 7 } { g }
- { 8 } { h }
- { 9 } { i }
- { 10 } { j }
- { 11 } { k }
- { 12 } { l }
- { 13 } { m }
- { 14 } { n }
- { 15 } { o }
- { 16 } { p }
- { 17 } { q }
- { 18 } { r }
- { 19 } { s }
- { 20 } { t }
- { 21 } { u }
- { 22 } { v }
- { 23 } { w }
- { 24 } { x }
- { 25 } { y }
- { 26 } { z }
- }
-}
-\cs_new_nopar:Npn \int_to_Alph:n #1 {
- \int_convert_to_symbols:nnn {#1} { 26 }
- {
- { 1 } { A }
- { 2 } { B }
- { 3 } { C }
- { 4 } { D }
- { 5 } { E }
- { 6 } { F }
- { 7 } { G }
- { 8 } { H }
- { 9 } { I }
- { 10 } { J }
- { 11 } { K }
- { 12 } { L }
- { 13 } { M }
- { 14 } { N }
- { 15 } { O }
- { 16 } { P }
- { 17 } { Q }
- { 18 } { R }
- { 19 } { S }
- { 20 } { T }
- { 21 } { U }
- { 22 } { V }
- { 23 } { W }
- { 24 } { X }
- { 25 } { Y }
- { 26 } { Z }
- }
-}
-% \end{macrocode}
-%\end{macro}
-%
-%
-% \begin{macro}{\int_to_symbol:n}
-% \UnitTested
-% Turning a number into a symbol is also easy enough.
-% \begin{macrocode}
-\cs_new_nopar:Npn \int_to_symbol:n #1{
- \mode_if_math:TF
- {
- \int_convert_number_with_rule:nnN {#1}{9}
- \int_symbol_math_conversion_rule:n
- }
- {
- \int_convert_number_with_rule:nnN {#1}{9}
- \int_symbol_text_conversion_rule:n
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-% \begin{macro}{\int_symbol_math_conversion_rule:n}
-% \begin{macro}{\int_symbol_text_conversion_rule:n}
-% Nothing spectacular here.
-% \begin{macrocode}
-\cs_new_nopar:Npn \int_symbol_math_conversion_rule:n #1 {
- \if_case:w #1
- \or: *
- \or: \dagger
- \or: \ddagger
- \or: \mathsection
- \or: \mathparagraph
- \or: \|
- \or: **
- \or: \dagger\dagger
- \or: \ddagger\ddagger
- \fi:
-}
-\cs_new_nopar:Npn \int_symbol_text_conversion_rule:n #1 {
- \if_case:w #1
- \or: \textasteriskcentered
- \or: \textdagger
- \or: \textdaggerdbl
- \or: \textsection
- \or: \textparagraph
- \or: \textbardbl
- \or: \textasteriskcentered\textasteriskcentered
- \or: \textdagger\textdagger
- \or: \textdaggerdbl\textdaggerdbl
- \fi:
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[aux]{\l_tmpa_int}
-% \begin{macro}[aux]{\l_tmpb_int}
-% \begin{macro}[aux]{\l_tmpc_int}
-% \begin{macro}[aux]{\g_tmpa_int}
-% \begin{macro}[aux]{\g_tmpb_int}
-% We provide four local and two global scratch counters, maybe we
-% need more or less.
-% \begin{macrocode}
-\int_new:N \l_tmpa_int
-\int_new:N \l_tmpb_int
-\int_new:N \l_tmpc_int
-\int_new:N \g_tmpa_int
-\int_new:N \g_tmpb_int
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-% \begin{macro}{\int_pre_eval_one_arg:Nn}
-% \begin{macro}{\int_pre_eval_two_args:Nnn}
-% These are handy when handing down values to other
-% functions. All they do is evaluate the number in advance.
-% \begin{macrocode}
-\cs_set_nopar:Npn \int_pre_eval_one_arg:Nn #1#2{
- \exp_args:Nf#1{\int_eval:n{#2}}}
-\cs_set_nopar:Npn \int_pre_eval_two_args:Nnn #1#2#3{
- \exp_args:Nff#1{\int_eval:n{#2}}{\int_eval:n{#3}}
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-%
-%
-% \subsection{Scanning and conversion}
-%
-%
-% \begin{macro}{\int_from_roman:n}
-% \UnitTested
-% \TestMissing{boundary cases / wrong input?}
-%\begin{macro}[aux]{\int_from_roman_aux:NN}
-%\begin{macro}[aux]{\int_from_roman_end:w}
-%\begin{macro}[aux]{\int_from_roman_clean_up:w}
-% The method here is to iterate through the input, finding the
-% appropriate value for each letter and building up a sum. This is
-% then evaluated by \TeX.
-% \begin{macrocode}
-\cs_new_nopar:Npn \int_from_roman:n #1 {
- \tl_if_blank:nF {#1}
- {
- \tex_expandafter:D \int_from_roman_end:w
- \tex_number:D \etex_numexpr:D
- \int_from_roman_aux:NN #1 Q \q_stop
- }
-}
-\cs_new_nopar:Npn \int_from_roman_aux:NN #1#2 {
- \str_if_eq:nnTF {#1} { Q }
- {#1#2}
- {
- \str_if_eq:nnTF {#2} { Q }
- {
- \cs_if_exist:cF { c_int_from_roman_ #1 _int }
- { \int_from_roman_clean_up:w }
- +
- \use:c { c_int_from_roman_ #1 _int }
- #2
- }
- {
- \cs_if_exist:cF { c_int_from_roman_ #1 _int }
- { \int_from_roman_clean_up:w }
- \cs_if_exist:cF { c_int_from_roman_ #2 _int }
- { \int_from_roman_clean_up:w }
- \int_compare:nNnTF
- { \use:c { c_int_from_roman_ #1 _int } }
- <
- { \use:c { c_int_from_roman_ #2 _int } }
- {
- + \use:c { c_int_from_roman_ #2 _int }
- - \use:c { c_int_from_roman_ #1 _int }
- \int_from_roman_aux:NN
- }
- {
- + \use:c { c_int_from_roman_ #1 _int }
- \int_from_roman_aux:NN #2
- }
- }
- }
-}
-\cs_new_nopar:Npn \int_from_roman_end:w #1 Q #2 \q_stop {
- \tl_if_empty:nTF {#2} {#1} {#2}
-}
-\cs_new_nopar:Npn \int_from_roman_clean_up:w #1 Q { + 0 Q -1 }
-% \end{macrocode}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%
-%
-%
-%
-%\begin{macro}{\int_convert_from_base_ten:nn}
-% \UnitTested
-%\begin{macro}[aux]{\int_convert_from_base_ten_aux:nnn}
-%\begin{macro}{\int_convert_number_to_letter:n}
-% \UnitTested
-% Converting from base ten ("#1") to a second base ("#2") starts with
-% a simple sign check. As the input is base \( 10 \) \TeX\ can then
-% do the actual work with the sign itself.
-% \begin{macrocode}
-\cs_new:Npn \int_convert_from_base_ten:nn #1#2 {
- \int_compare:nNnTF {#1} < { 0 }
- {
- -
- \exp_args:Nnf \int_convert_from_base_ten_aux:nnn
- { } { \int_eval:n { 0 - ( #1 ) } } {#2}
- }
- {
- \exp_args:Nnf \int_convert_from_base_ten_aux:nnn
- { } { \int_eval:n {#1} } {#2}
- }
-}
-% \end{macrocode}
-% Here, the idea is to provide a recursive system to deal with the
-% input. The output is build up as argument "#1", which is why it
-% starts off empty in the above. At each pass, the value in "#2" is
-% checked to see if it is less than the new base ("#3"). If it is
-% the it is converted directly and the rest of the output is added in.
-% On the other hand, if the value to convert is greater than or equal
-% to the new base then the modulus and remainder values are found. The
-% modulus is converted to a symbol and the remainder is carried forward
-% to the next round.S
-% \begin{macrocode}
-\cs_new:Npn \int_convert_from_base_ten_aux:nnn #1#2#3 {
- \int_compare:nNnTF {#2} < {#3}
- {
- \int_convert_number_to_letter:n {#2}
- #1
- }
- {
- \exp_args:Nff \int_convert_from_base_ten_aux:nnn
- {
- \int_convert_number_to_letter:n
- { \int_mod:nn {#2} {#3} }
- #1
- }
- { \int_div_truncate:nn {#2} {#3} }
- {#3}
- }
-}
-% \end{macrocode}
-% Convert to a letter only if necessary, otherwise simply return the
-% value unchanged.
-% \begin{macrocode}
-\cs_new:Npn \int_convert_number_to_letter:n #1 {
- \prg_case_int:nnn { #1 - 9 }
- {
- { 1 } { A }
- { 2 } { B }
- { 3 } { C }
- { 4 } { D }
- { 5 } { E }
- { 6 } { F }
- { 7 } { G }
- { 8 } { H }
- { 9 } { I }
- { 10 } { J }
- { 11 } { K }
- { 12 } { L }
- { 13 } { M }
- { 14 } { N }
- { 15 } { O }
- { 16 } { P }
- { 17 } { Q }
- { 18 } { R }
- { 19 } { S }
- { 20 } { T }
- { 21 } { U }
- { 22 } { V }
- { 23 } { W }
- { 24 } { X }
- { 25 } { Y }
- { 26 } { Z }
- }
- {#1}
-}
-% \end{macrocode}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%
-%\begin{macro}{\int_convert_to_base_ten:nn}
-% \UnitTested
-%\begin{macro}[aux]{\int_convert_to_base_ten_aux:nn}
-%\begin{macro}[aux]{\int_convert_to_base_ten_aux:nnN}
-%\begin{macro}[aux]{\int_convert_to_base_ten_aux:N}
-%\begin{macro}{\int_get_sign_and_digits:n}
-%\begin{macro}{\int_get_sign:n}
-%\begin{macro}{\int_get_digits:n}
-%\begin{macro}[aux]{\int_get_sign_and_digits_aux:nNNN}
-%\begin{macro}[aux]{\int_get_sign_and_digits_aux:oNNN}
-% Conversion to base ten means stripping off the sign then iterating
-% through the input one token at a time. The total number is then added
-% up as the code loops.
-% \begin{macrocode}
-\cs_new:Npn \int_convert_to_base_ten:nn #1#2 {
- \int_eval:n
- {
- \int_get_sign:n {#1}
- \exp_args:Nf \int_convert_to_base_ten_aux:nn
- { \int_get_digits:n {#1} } {#2}
- }
-}
-\cs_new:Npn \int_convert_to_base_ten_aux:nn #1#2 {
- \int_convert_to_base_ten_aux:nnN { 0 } { #2 } #1 \q_nil
-}
-\cs_new:Npn \int_convert_to_base_ten_aux:nnN #1#2#3 {
- \quark_if_nil:NTF #3
- {#1}
- {
- \exp_args:Nf \int_convert_to_base_ten_aux:nnN
- { \int_eval:n { #1 * #2 + \int_convert_to_base_ten_aux:N #3 } }
- {#2}
- }
-}
-% \end{macrocode}
-% The conversion here will take lower or upper case letters and turn
-% them into the appropriate number, hence the two-part nature of the
-% function.
-% \begin{macrocode}
-\cs_new:Npn \int_convert_to_base_ten_aux:N #1 {
- \int_compare:nNnTF { `#1 } < { 58 }
- {#1}
- {
- \int_eval:n
- { `#1 - \int_compare:nNnTF { `#1 } < { 91 } { 55 } { 87 } }
- }
-}
-% \end{macrocode}
-% Finding a number and its sign requires dealing with an arbitrary
-% list of "+" and "-" symbols. This is done by working through token
-% by token until there is something else at the start of the input.
-% The sign of the input is tracked by the first Boolean used by the
-% auxiliary function.
-% \begin{macrocode}
-\cs_new:Npn \int_get_sign_and_digits:n #1 {
- \int_get_sign_and_digits_aux:nNNN {#1}
- \c_true_bool \c_true_bool \c_true_bool
-}
-\cs_new:Npn \int_get_sign:n #1 {
- \int_get_sign_and_digits_aux:nNNN {#1}
- \c_true_bool \c_true_bool \c_false_bool
-}
-\cs_new:Npn \int_get_digits:n #1 {
- \int_get_sign_and_digits_aux:nNNN {#1}
- \c_true_bool \c_false_bool \c_true_bool
-}
-% \end{macrocode}
-% The auxiliary loops through, finding sign tokens and removing them.
-% The sign itself is carried through as a flag.
-% \begin{macrocode}
-\cs_new:Npn \int_get_sign_and_digits_aux:nNNN #1#2#3#4 {
- \tl_if_head_eq_charcode:fNTF {#1} -
- {
- \bool_if:NTF #2
- {
- \int_get_sign_and_digits_aux:oNNN
- { \use_none:n #1 } \c_false_bool #3#4
- }
- {
- \int_get_sign_and_digits_aux:oNNN
- { \use_none:n #1 } \c_true_bool #3#4
- }
- }
- {
- \tl_if_head_eq_charcode:fNTF {#1} +
- { \int_get_sign_and_digits_aux:oNNN { \use_none:n #1 } #2#3#4 }
- {
- \bool_if:NT #3 { \bool_if:NF #2 - }
- \bool_if:NT #4 {#1}
- }
- }
-}
-\cs_generate_variant:Nn \int_get_sign_and_digits_aux:nNNN { o }
-% \end{macrocode}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%
-%\begin{macro}{\int_from_binary:n,\int_from_hexadecimal:n,\int_from_octal:n}
-% \UnitTested
-%\begin{macro}{\int_to_binary:n,\int_to_hexadecimal:n,\int_to_octal:n}
-% \UnitTested
-% Wrappers around the generic function.
-% \begin{macrocode}
-\cs_new:Npn \int_from_binary:n #1 {
- \int_convert_to_base_ten:nn {#1} { 2 }
-}
-\cs_new:Npn \int_from_hexadecimal:n #1 {
- \int_convert_to_base_ten:nn {#1} { 16 }
-}
-\cs_new:Npn \int_from_octal:n #1 {
- \int_convert_to_base_ten:nn {#1} { 8 }
-}
-\cs_new:Npn \int_to_binary:n #1 {
- \int_convert_from_base_ten:nn {#1} { 2 }
-}
-\cs_new:Npn \int_to_hexadecimal:n #1 {
- \int_convert_from_base_ten:nn {#1} { 16 }
-}
-\cs_new:Npn \int_to_octal:n #1 {
- \int_convert_from_base_ten:nn {#1} { 8 }
-}
-% \end{macrocode}
-%\end{macro}
-%\end{macro}
-%
-%
-%
-%\begin{macro}{\int_from_alph:n}
-% \UnitTested
-%\begin{macro}[aux]{\int_from_alph_aux:n}
-%\begin{macro}[aux]{\int_from_alph_aux:nN}
-%\begin{macro}[aux]{\int_from_alph_aux:N}
-% The aim here is to iterate through the input, converting one letter at
-% a time to a number. The same approach is also used for base
-% conversion, but this needs a different final auxiliary.
-% \begin{macrocode}
-\cs_new:Npn \int_from_alph:n #1 {
- \int_eval:n
- {
- \int_get_sign:n {#1}
- \exp_args:Nf \int_from_alph_aux:n
- { \int_get_digits:n {#1} }
- }
-}
-\cs_new:Npn \int_from_alph_aux:n #1 {
- \int_from_alph_aux:nN { 0 } #1 \q_nil
-}
-\cs_new:Npn \int_from_alph_aux:nN #1#2 {
- \quark_if_nil:NTF #2
- {#1}
- {
- \exp_args:Nf \int_from_alph_aux:nN
- { \int_eval:n { #1 * 26 + \int_from_alph_aux:N #2 } }
- }
-}
-\cs_new:Npn \int_from_alph_aux:N #1 {
- \int_eval:n
- { `#1 - \int_compare:nNnTF { `#1 } < { 91 } { 64 } { 96 } }
-}
-% \end{macrocode}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%
-%
-% \begin{macro}[pTF]{\int_compare:n}
-% Comparison tests using a simple syntax where only one set of braces
-% is required and additional operators such as "!=" and ">=" are
-% supported. First some notes on the idea behind this. We wish to
-% support writing code like
-% \begin{verbatim}
-% \int_compare_p:n { 5 + \l_tmpa_int != 4 - \l_tmpb_int }
-% \end{verbatim}
-% In other words, we want to somehow add the missing "\int_eval:w"
-% where required. We can start evaluating from the left using
-% "\int_eval:w", and we know that since the relation symbols "<", ">",
-% "=" and "!" are not allowed in such expressions, they will terminate
-% the expression. Therefore, we first let \TeX\ evaluate this left
-% hand side of the (in)equality.
-% \begin{macrocode}
-\prg_set_conditional:Npnn \int_compare:n #1{p,TF,T,F}{
- \exp_after:wN \int_compare_auxi:w \int_value:w
- \int_eval:w #1\q_stop
-}
-% \end{macrocode}
-% Then the next step is to figure out which relation we should use, so
-% we have to somehow get rid of the first evaluation so that we can
-% see what stopped it. "\tex_romannumeral:D" is handy here since its
-% expansion given a non-positive number is \m{null}. We therefore
-% simply check if the first token of the left hand side evaluation is
-% a minus. If not, we insert it and issue "\tex_romannumeral:D",
-% thereby ridding us of the left hand side evaluation. We do however
-% save it for later.
-% \begin{macrocode}
-\cs_set:Npn \int_compare_auxi:w #1#2\q_stop{
- \exp_after:wN \int_compare_auxii:w \tex_romannumeral:D
- \if:w #1- \else: -\fi: #1#2 \q_mark #1#2 \q_stop
-}
-% \end{macrocode}
-% This leaves the first relation symbol in front and assuming the
-% right hand side has been input, at least one other token as well. We
-% support the following forms: |=|, |<|, |>| and the extended |!=|,
-% |==|, |<=| and |>=|. All the extended forms have an extra |=| so we
-% check if that is present as well. Then use specific function to
-% perform the test.
-% \begin{macrocode}
-\cs_set:Npn \int_compare_auxii:w #1#2#3\q_mark{
- \use:c{
- int_compare_
- #1 \if_meaning:w =#2 = \fi:
- :w}
-}
-% \end{macrocode}
-% The actual comparisons are then simple function calls, using the
-% relation as delimiter for a delimited argument.
-% Equality is easy:
-% \begin{macrocode}
-\cs_set:cpn {int_compare_=:w} #1=#2\q_stop{
- \if_int_compare:w #1=\int_eval:w #2 \int_eval_end:
- \prg_return_true: \else: \prg_return_false: \fi:
-}
-% \end{macrocode}
-% So is the one using |==| -- we just have to use |==| in the
-% parameter text.
-% \begin{macrocode}
-\cs_set:cpn {int_compare_==:w} #1==#2\q_stop{
- \if_int_compare:w #1=\int_eval:w #2 \int_eval_end:
- \prg_return_true: \else: \prg_return_false: \fi:
-}
-% \end{macrocode}
-% Not equal is just about reversing the truth value.
-% \begin{macrocode}
-\cs_set:cpn {int_compare_!=:w} #1!=#2\q_stop{
- \if_int_compare:w #1=\int_eval:w #2 \int_eval_end:
- \prg_return_false: \else: \prg_return_true: \fi:
-}
-% \end{macrocode}
-% Less than and greater than are also straight forward.
-% \begin{macrocode}
-\cs_set:cpn {int_compare_<:w} #1<#2\q_stop{
- \if_int_compare:w #1<\int_eval:w #2 \int_eval_end:
- \prg_return_true: \else: \prg_return_false: \fi:
-}
-\cs_set:cpn {int_compare_>:w} #1>#2\q_stop{
- \if_int_compare:w #1>\int_eval:w #2 \int_eval_end:
- \prg_return_true: \else: \prg_return_false: \fi:
-}
-% \end{macrocode}
-% The less than or equal operation is just the opposite of the greater
-% than operation. Vice versa for less than or equal.
-% \begin{macrocode}
-\cs_set:cpn {int_compare_<=:w} #1<=#2\q_stop{
- \if_int_compare:w #1>\int_eval:w #2 \int_eval_end:
- \prg_return_false: \else: \prg_return_true: \fi:
-}
-\cs_set:cpn {int_compare_>=:w} #1>=#2\q_stop{
- \if_int_compare:w #1<\int_eval:w #2 \int_eval_end:
- \prg_return_false: \else: \prg_return_true: \fi:
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}[pTF]{\int_compare:nNn}
-% \UnitTested
-% More efficient but less natural in typing.
-% \begin{macrocode}
-\prg_set_conditional:Npnn \int_compare:nNn #1#2#3{p}{
- \if_int_compare:w \int_eval:w #1 #2 \int_eval:w #3
- \int_eval_end:
- \prg_return_true: \else: \prg_return_false: \fi:
-}
-\cs_set_nopar:Npn \int_compare:nNnT #1#2#3 {
- \tex_ifnum:D \etex_numexpr:D #1 #2 \etex_numexpr:D #3 \scan_stop:
- \tex_expandafter:D \use:n
- \tex_else:D
- \tex_expandafter:D \use_none:n
- \tex_fi:D
-}
-\cs_set_nopar:Npn \int_compare:nNnF #1#2#3 {
- \tex_ifnum:D \etex_numexpr:D #1 #2 \etex_numexpr:D #3 \scan_stop:
- \tex_expandafter:D \use_none:n
- \tex_else:D
- \tex_expandafter:D \use:n
- \tex_fi:D
-}
-\cs_set_nopar:Npn \int_compare:nNnTF #1#2#3 {
- \tex_ifnum:D \etex_numexpr:D #1 #2 \etex_numexpr:D #3 \scan_stop:
- \tex_expandafter:D \use_i:nn
- \tex_else:D
- \tex_expandafter:D \use_ii:nn
- \tex_fi:D
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\int_max:nn}
-% \UnitTested
-% \begin{macro}{\int_min:nn}
-% \UnitTested
-% \begin{macro}{\int_abs:n}
-% \UnitTested
-% Functions for $\min$, $\max$, and absolute value.
-% \begin{macrocode}
-\cs_set:Npn \int_abs:n #1{
- \int_value:w
- \if_int_compare:w \int_eval:w #1<\c_zero
- -
- \fi:
- \int_eval:w #1\int_eval_end:
-}
-\cs_set:Npn \int_max:nn #1#2{
- \int_value:w \int_eval:w
- \if_int_compare:w
- \int_eval:w #1>\int_eval:w #2\int_eval_end:
- #1
- \else:
- #2
- \fi:
- \int_eval_end:
-}
-\cs_set:Npn \int_min:nn #1#2{
- \int_value:w \int_eval:w
- \if_int_compare:w
- \int_eval:w #1<\int_eval:w #2\int_eval_end:
- #1
- \else:
- #2
- \fi:
- \int_eval_end:
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-% \begin{macro}{\int_div_truncate:nn}
-% \UnitTested
-% \begin{macro}{\int_div_round:nn}
-% \UnitTested
-% \begin{macro}{\int_mod:nn}
-% \UnitTested
-% As "\int_eval:w" rounds the result of a division we also
-% provide a version that truncates the result.
-% \begin{macrocode}
-% \end{macrocode}
-% Initial version didn't work correctly with e\TeX's implementation.
-% \begin{macrocode}
-%\cs_set:Npn \int_div_truncate_raw:nn #1#2 {
-% \int_eval:n{ (2*#1 - #2) / (2* #2) }
-%}
-% \end{macrocode}
-% New version by Heiko:
-% \begin{macrocode}
-\cs_set:Npn \int_div_truncate:nn #1#2 {
- \int_value:w \int_eval:w
- \if_int_compare:w \int_eval:w #1 = \c_zero
- 0
- \else:
- (#1
- \if_int_compare:w \int_eval:w #1 < \c_zero
- \if_int_compare:w \int_eval:w #2 < \c_zero
- -( #2 +
- \else:
- +( #2 -
- \fi:
- \else:
- \if_int_compare:w \int_eval:w #2 < \c_zero
- +( #2 +
- \else:
- -( #2 -
- \fi:
- \fi:
- 1)/2)
- \fi:
- /(#2)
- \int_eval_end:
-}
-% \end{macrocode}
-% For the sake of completeness:
-% \begin{macrocode}
-\cs_set:Npn \int_div_round:nn #1#2 {\int_eval:n{(#1)/(#2)}}
-% \end{macrocode}
-% Finally there's the modulus operation.
-% \begin{macrocode}
-\cs_set:Npn \int_mod:nn #1#2 {
- \int_value:w
- \int_eval:w
- #1 - \int_div_truncate:nn {#1}{#2} * (#2)
- \int_eval_end:
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-% \begin{macro}[pTF]{\int_if_odd:n}
-% \UnitTested
-% \begin{macro}[pTF]{\int_if_even:n}
-% \UnitTested
-% A predicate function.
-% \begin{macrocode}
-\prg_set_conditional:Npnn \int_if_odd:n #1 {p,TF,T,F} {
- \if_int_odd:w \int_eval:w #1\int_eval_end:
- \prg_return_true: \else: \prg_return_false: \fi:
-}
-\prg_set_conditional:Npnn \int_if_even:n #1 {p,TF,T,F} {
- \if_int_odd:w \int_eval:w #1\int_eval_end:
- \prg_return_false: \else: \prg_return_true: \fi:
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-% \begin{macro}{\int_while_do:nn}
-% \UnitTested
-% \TestMissing{Boundary cases}
-% \begin{macro}{\int_until_do:nn}
-% \UnitTested
-% \TestMissing{Boundary cases}
-% \begin{macro}{\int_do_while:nn}
-% \UnitTested
-% \TestMissing{Boundary cases}
-% \begin{macro}{\int_do_until:nn}
-% \UnitTested
-% \TestMissing{Boundary cases}
-% These are quite easy given the above functions. The "while" versions
-% test first and then execute the body. The "do_while" does it the
-% other way round.
-% \begin{macrocode}
-\cs_set:Npn \int_while_do:nn #1#2{
- \int_compare:nT {#1}{#2 \int_while_do:nn {#1}{#2}}
-}
-\cs_set:Npn \int_until_do:nn #1#2{
- \int_compare:nF {#1}{#2 \int_until_do:nn {#1}{#2}}
-}
-\cs_set:Npn \int_do_while:nn #1#2{
- #2 \int_compare:nT {#1}{\int_do_while:nNnn {#1}{#2}}
-}
-\cs_set:Npn \int_do_until:nn #1#2{
- #2 \int_compare:nF {#1}{\int_do_until:nn {#1}{#2}}
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-% \begin{macro}{\int_while_do:nNnn}
-% \begin{macro}{\int_until_do:nNnn}
-% \begin{macro}{\int_do_while:nNnn}
-% \begin{macro}{\int_do_until:nNnn}
-% As above but not using the more natural syntax.
-% \begin{macrocode}
-\cs_set:Npn \int_while_do:nNnn #1#2#3#4{
- \int_compare:nNnT {#1}#2{#3}{#4 \int_while_do:nNnn {#1}#2{#3}{#4}}
-}
-\cs_set:Npn \int_until_do:nNnn #1#2#3#4{
- \int_compare:nNnF {#1}#2{#3}{#4 \int_until_do:nNnn {#1}#2{#3}{#4}}
-}
-\cs_set:Npn \int_do_while:nNnn #1#2#3#4{
- #4 \int_compare:nNnT {#1}#2{#3}{\int_do_while:nNnn {#1}#2{#3}{#4}}
-}
-\cs_set:Npn \int_do_until:nNnn #1#2#3#4{
- #4 \int_compare:nNnF {#1}#2{#3}{\int_do_until:nNnn {#1}#2{#3}{#4}}
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-% \subsection{Defining constants}
-%
-% \begin{macro}{\int_const:Nn, \int_const:cn}
-% \UnitTested
-% As stated, most constants can be defined as |\tex_chardef:D| or
-% |\tex_mathchardef:D| but that's engine dependent.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \int_const:Nn #1#2 {
- \int_compare:nTF { #2 > \c_minus_one }
- {
- \int_compare:nTF { #2 > \c_max_register_int }
- {
- \int_new:N #1
- \int_gset:Nn #1 {#2}
- }
- {
- \chk_if_free_cs:N #1
- \tex_global:D \tex_mathchardef:D #1 =
- \etex_numexpr:D #2 \scan_stop:
- }
- }
- {
- \int_new:N #1
- \int_gset:Nn #1 {#2}
- }
-}
-\cs_generate_variant:Nn \int_const:Nn { c }
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\c_minus_one,
-% \c_zero, \c_one, \c_two, \c_three, \c_four, \c_five, \c_six,
-% \c_seven, \c_eight, \c_nine, \c_ten,
-% \c_eleven, \c_twelve, \c_thirteen, \c_fourteen, \c_fifteen,
-% \c_sixteen, \c_thirty_two,
-% \c_hundred_one,
-% \c_twohundred_fifty_five, \c_twohundred_fifty_six,
-% \c_thousand,
-% \c_ten_thousand,
-% \c_ten_thousand_one, \c_ten_thousand_two,
-% \c_ten_thousand_three, \c_ten_thousand_four,
-% \c_twenty_thousand}
-% \TestMissing{Too simple for tests, but they aren't aux, so perhaps we should
-% add a test that they actually represent their numbers after
-% all}
-% \UnitTested
-% And the usual constants, others are still missing. Please, make
-% every constant a real constant at least for the moment. We can
-% easily convert things in the end when we have found what
-% constants are used in critical places and what not.
-% \begin{macrocode}
- %% \tex_countdef:D \c_minus_one = 10 \scan_stop:
- %% \c_minus_one = -1 \scan_stop: %% in l3basics
-%\int_const:Nn \c_zero {0} %% in l3basics
-\int_const:Nn \c_one {1}
-\int_const:Nn \c_two {2}
-\int_const:Nn \c_three {3}
-\int_const:Nn \c_four {4}
-\int_const:Nn \c_five {5}
-%\int_const:Nn \c_six {6} %% in l3basics
-%\int_const:Nn \c_seven {7} %% in l3basics
-\int_const:Nn \c_eight {8}
-\int_const:Nn \c_nine {9}
-\int_const:Nn \c_ten {10}
-\int_const:Nn \c_eleven {11}
-%\int_const:Nn \c_twelve {12} %% in l3basics
-\int_const:Nn \c_thirteen {13}
-\int_const:Nn \c_fourteen {14}
-\int_const:Nn \c_fifteen {15}
- %% \tex_chardef:D \c_sixteen = 16\scan_stop: %% in l3basics
-\int_const:Nn \c_thirty_two {32}
-% \end{macrocode}
-% The next one may seem a little odd (obviously!) but is useful when
-% dealing with logical operators.
-% \begin{macrocode}
-\int_const:Nn \c_hundred_one {101}
-\int_const:Nn \c_twohundred_fifty_five{255}
-\int_const:Nn \c_twohundred_fifty_six {256}
-\int_const:Nn \c_thousand {1000}
-\int_const:Nn \c_ten_thousand {10000}
-\int_const:Nn \c_ten_thousand_one {10001}
-\int_const:Nn \c_ten_thousand_two {10002}
-\int_const:Nn \c_ten_thousand_three {10003}
-\int_const:Nn \c_ten_thousand_four {10004}
-\int_const:Nn \c_twenty_thousand {20000}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\c_max_int}
-% The largest number allowed is $2^{31}-1$
-% \begin{macrocode}
-\int_const:Nn \c_max_int {2147483647}
-% \end{macrocode}
-% \end{macro}
-%
-%\begin{macro}[aux]{\c_int_from_roman_i_int}
-%\begin{macro}[aux]{\c_int_from_roman_v_int}
-%\begin{macro}[aux]{\c_int_from_roman_x_int}
-%\begin{macro}[aux]{\l_int_from_roman_l_int}
-%\begin{macro}[aux]{\c_int_from_roman_c_int}
-%\begin{macro}[aux]{\c_int_from_roman_d_int}
-%\begin{macro}[aux]{\c_int_from_roman_m_int}
-%\begin{macro}[aux]{\c_int_from_roman_I_int}
-%\begin{macro}[aux]{\c_int_from_roman_V_int}
-%\begin{macro}[aux]{\c_int_from_roman_X_int}
-%\begin{macro}[aux]{\c_int_from_roman_L_int}
-%\begin{macro}[aux]{\c_int_from_roman_C_int}
-%\begin{macro}[aux]{\c_int_from_roman_D_int}
-%\begin{macro}[aux]{\c_int_from_roman_M_int}
-% Delayed from earlier.
-% \begin{macrocode}
-\int_const:cn { c_int_from_roman_i_int } { 1 }
-\int_const:cn { c_int_from_roman_v_int } { 5 }
-\int_const:cn { c_int_from_roman_x_int } { 10 }
-\int_const:cn { c_int_from_roman_l_int } { 50 }
-\int_const:cn { c_int_from_roman_c_int } { 100 }
-\int_const:cn { c_int_from_roman_d_int } { 500 }
-\int_const:cn { c_int_from_roman_m_int } { 1000 }
-\int_const:cn { c_int_from_roman_I_int } { 1 }
-\int_const:cn { c_int_from_roman_V_int } { 5 }
-\int_const:cn { c_int_from_roman_X_int } { 10 }
-\int_const:cn { c_int_from_roman_L_int } { 50 }
-\int_const:cn { c_int_from_roman_C_int } { 100 }
-\int_const:cn { c_int_from_roman_D_int } { 500 }
-\int_const:cn { c_int_from_roman_M_int } { 1000 }
-% \end{macrocode}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%
-% Needed from other modules:
-% \begin{macrocode}
-\int_new:N \g_tl_inline_level_int
-\int_new:N\g_prg_inline_level_int
-% \end{macrocode}
-%
-% \subsection{Backwards compatibility}
-% \begin{macrocode}
-\cs_set_eq:NN \intexpr_value:w \int_value:w
-\cs_set_eq:NN \intexpr_eval:w \int_eval:w
-\cs_set_eq:NN \intexpr_eval_end: \int_eval_end:
-\cs_set_eq:NN \if_intexpr_compare:w \if_int_compare:w
-\cs_set_eq:NN \if_intexpr_odd:w \if_int_odd:w
-\cs_set_eq:NN \if_intexpr_case:w \if_case:w
-\cs_set_eq:NN \intexpr_eval:n \int_eval:n
-
-\cs_set_eq:NN \intexpr_compare_p:n \int_compare_p:n
-\cs_set_eq:NN \intexpr_compare:nTF \int_compare:nTF
-\cs_set_eq:NN \intexpr_compare:nT \int_compare:nT
-\cs_set_eq:NN \intexpr_compare:nF \int_compare:nF
-
-\cs_set_eq:NN \intexpr_compare_p:nNn \int_compare_p:nNn
-\cs_set_eq:NN \intexpr_compare:nNnTF \int_compare:nNnTF
-\cs_set_eq:NN \intexpr_compare:nNnT \int_compare:nNnT
-\cs_set_eq:NN \intexpr_compare:nNnF \int_compare:nNnF
-
-\cs_set_eq:NN \intexpr_abs:n \int_abs:n
-\cs_set_eq:NN \intexpr_max:nn \int_max:nn
-\cs_set_eq:NN \intexpr_min:nn \int_min:nn
-
-\cs_set_eq:NN \intexpr_div_truncate:nn \int_div_truncate:nn
-\cs_set_eq:NN \intexpr_div_round:nn \int_div_round:nn
-\cs_set_eq:NN \intexpr_mod:nn \int_mod:nn
-
-\cs_set_eq:NN \intexpr_if_odd_p:n \int_if_odd_p:n
-\cs_set_eq:NN \intexpr_if_odd:nTF \int_if_odd:nTF
-\cs_set_eq:NN \intexpr_if_odd:nT \int_if_odd:nT
-\cs_set_eq:NN \intexpr_if_odd:nF \int_if_odd:nF
-
-\cs_set_eq:NN \intexpr_if_even_p:n \int_if_even_p:n
-\cs_set_eq:NN \intexpr_if_even:nTF \int_if_even:nTF
-\cs_set_eq:NN \intexpr_if_even:nT \int_if_even:nT
-\cs_set_eq:NN \intexpr_if_even:nF \int_if_even:nF
-
-\cs_set_eq:NN \intexpr_while_do:nn \int_while_do:nn
-\cs_set_eq:NN \intexpr_until_do:nn \int_until_do:nn
-\cs_set_eq:NN \intexpr_do_while:nn \int_do_while:nn
-\cs_set_eq:NN \intexpr_do_until:nn \int_do_until:nn
-
-\cs_set_eq:NN \intexpr_while_do:nNnn \int_while_do:nNnn
-\cs_set_eq:NN \intexpr_until_do:nNnn \int_until_do:nNnn
-\cs_set_eq:NN \intexpr_do_while:nNnn \int_do_while:nNnn
-\cs_set_eq:NN \intexpr_do_until:nNnn \int_do_until:nNnn
-% \end{macrocode}
-%
-% \begin{macrocode}
-%</initex|package>
-% \end{macrocode}
-%
-%
-% \end{implementation}
-% \PrintIndex
-%
-%
-% \endinput